From 4301342292d4ae2a278bfff56d9d3cfac2aca2b6 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 8 Apr 2020 12:58:39 +0200 Subject: [PATCH 01/39] Reload apps after successful upload to get a fresh list of apps and files --- js/comms.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/comms.js b/js/comms.js index eb453871d..305dd26d3 100644 --- a/js/comms.js +++ b/js/comms.js @@ -23,6 +23,8 @@ uploadApp : (app,skipReset) => { // expects an apps.json structure (i.e. with `s Puck.write(`\x10E.showMessage('Hold BTN3\\nto reload')\n`,(result) => { Progress.hide({sticky:true}); if (result===null) return reject(""); + // Reload apps to get a fresh list of apps and files + this.getInstalledApps(); resolve(app); }); return; From dfad1218d630bf0acb684e91f879924b6a0763c5 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 8 Apr 2020 13:02:36 +0200 Subject: [PATCH 02/39] Force reload --- js/comms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/comms.js b/js/comms.js index 305dd26d3..7010660f4 100644 --- a/js/comms.js +++ b/js/comms.js @@ -24,7 +24,7 @@ uploadApp : (app,skipReset) => { // expects an apps.json structure (i.e. with `s Progress.hide({sticky:true}); if (result===null) return reject(""); // Reload apps to get a fresh list of apps and files - this.getInstalledApps(); + this.getInstalledApps(true); resolve(app); }); return; From 0aad2a3082f47554b2094bbd3f2c4f7fd486cab1 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Thu, 9 Apr 2020 18:29:49 -0500 Subject: [PATCH 03/39] Added NATO Alphabet app files --- apps/nato/appsManifestEntry.txt | 13 ++++ apps/nato/nato-icon.js | 1 + apps/nato/nato.js | 116 ++++++++++++++++++++++++++++++++ apps/nato/nato.png | Bin 0 -> 2023 bytes 4 files changed, 130 insertions(+) create mode 100644 apps/nato/appsManifestEntry.txt create mode 100644 apps/nato/nato-icon.js create mode 100644 apps/nato/nato.js create mode 100644 apps/nato/nato.png diff --git a/apps/nato/appsManifestEntry.txt b/apps/nato/appsManifestEntry.txt new file mode 100644 index 000000000..2e8d840e0 --- /dev/null +++ b/apps/nato/appsManifestEntry.txt @@ -0,0 +1,13 @@ + { "id": "nato", + "name": "NATO Alphabet", + "shortName" : "NATOAlphabet", + "icon": "nato.png", + "version":"0.01", + "type": "app", + "description": "Learn the NATO Phonetic alphabet plus some numbers.", + "tags": "app,learn,visual", + "storage": [ + {"name":"nato.app.js","url":"nato.js"}, + {"name":"nato.img","url":"nato-icon.js","evaluate":true} + ], + }, \ No newline at end of file diff --git a/apps/nato/nato-icon.js b/apps/nato/nato-icon.js new file mode 100644 index 000000000..b1a6e0947 --- /dev/null +++ b/apps/nato/nato-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwgFCiIABiAGFiINJAAUS///CAgGEgMT//zBoYXFmIiCC40fEooXF+QXJn4lCC5ARDC4oFC//xMAoXDJAQXFBgY9DC4wKCC4p2CPA4XDCQQXEOwXxPA4XBEQJICC4p2BmICCC44KBJAIXEiIJBkMvPAwXCWgYXFAgQMBPAoXCBwUxC4jtDeI4XDJAQXDFYXxHAoXGJAYXDLYPykUieIwXDJAYXDG4IAEPAgXCRgJICPYoAEPAgXDZ4TcDmYXGMAgXDUAZiEPwIABCALEBC5BZC+YQCRwRsEC45ID+S5BCAkBEYJ4DC4hID+IbCIAYjCCIYXGEgMxXoJwEgI3CA4JQDAAwaBmQGDFIQ3CC5UzkSLBdwIIDmYXCWY4jBCAJBCPYQ0EC5bXGkLuDC5QtEAAXzPoZMCmZwB+YFCbYkykQFCVoZMDWALnDQwRjDeoZIDZAgJCWwYeBFATWFC5LuHawgXKdwyJDD4YXIOAMzH4gICmIXKEwQXXkQXFKAKQFC85HNO64XDU44XMX48Sa5zvCmJICA4YXLE4fziIACJ4PyM4gXHCAQwBCwI2GC5JADAApGFC5ERmYWFFwwXHDARJCMgYWFB4MTmYiFLgMjCwMyiIuGE4QABNIyPDBQgA==")) \ No newline at end of file diff --git a/apps/nato/nato.js b/apps/nato/nato.js new file mode 100644 index 000000000..7e1e06db7 --- /dev/null +++ b/apps/nato/nato.js @@ -0,0 +1,116 @@ +/** + * Teach a user the NATO Phonetic Alphabet + numbers +*/ + +/** + * Constants +*/ +const FONT_NAME = 'Vector12'; +const FONT_SIZE = 80; +const SCREEN_PIXELS = 240; +const UNIT = 100; +const NATO_MAP = { + A: 'ALFA', + B: 'BRAVO', + C: 'CHARLIE', + D: 'DELTA', + E: 'ECHO', + F: 'FOXTROT', + G: 'GOLF', + H: 'HOTEL', + I: 'INDIA', + J: 'JULIETT', + K: 'KILO', + L: 'LIMA', + M: 'MIKE', + N: 'NOVEMBER', + O: 'OSCAR', + P: 'PAPA', + Q: 'QUEBEC', + R: 'ROMEO', + S: 'SIERRA', + T: 'TANGO', + U: 'UNIFORM', + V: 'VICTOR', + W: 'WHISKEY', + X: 'X-RAY', + Y: 'YANKEE', + Z: 'ZULU', + '0': 'ZE-RO', + '1': 'WUN', + '2': 'TOO', + '3': 'TREE', + '4': 'FOW-ER', + '5': 'FIFE', + '6': 'SIX', + '7': 'SEV-EN', + '8': 'AIT', + '9': 'NIN-ER', +}; + +/** + * Set the local state +*/ +let INDEX = 0; +let showLetter = true; + +/** + * Utility functions for writing text, changing state +*/ +const writeText = (txt) => { + g.clear(); + g.setFont(FONT_NAME, FONT_SIZE); + + var width = g.stringWidth(txt); + + var fontFix = FONT_SIZE; + while(width > SCREEN_PIXELS-10){ + fontFix--; + g.setFont(FONT_NAME, fontFix); + width = g.stringWidth(txt); + } + g.drawString(txt, (SCREEN_PIXELS / 2) - (width / 2), SCREEN_PIXELS / 2); +}; +const writeLetter = () => { + writeText(Object.keys(NATO_MAP)[INDEX]); +}; +const writeCode = () => { + writeText(NATO_MAP[Object.keys(NATO_MAP)[INDEX]]); +}; +const toggle = () => { + showLetter = !showLetter; + if(showLetter){ + writeLetter(); + }else { + writeCode(); + } +}; + +/** + * Bootstrapping +*/ +g.clear(); +g.setFont(FONT_NAME, FONT_SIZE); +g.setColor(0, 1, 0); +g.setFontAlign(-1, 0, 0); + + +const step = (positive) => () => { + if (positive) { + INDEX = INDEX + 1; + if (INDEX > Object.keys(NATO_MAP).length - 1) INDEX = 0; + } else { + INDEX = INDEX - 1; + if (INDEX < 0) INDEX = Object.keys(NATO_MAP).length - 1; + } + showLetter = true; + writeLetter(); +}; + +writeLetter(); + +// Press the middle button to see the NATO Phonetic wording +setWatch(toggle, BTN2, { repeat: true }); +// Allow user to switch between letters +setWatch(step(true), BTN1, { repeat: true }); +setWatch(step(false), BTN3, { repeat: true }); diff --git a/apps/nato/nato.png b/apps/nato/nato.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4678c11f489649f765c47e73d04cd94cbe0a03 GIT binary patch literal 2023 zcmV^5HKn!Rq~;Y;-8uZY{ZHnw;Kf|H|4jzx6ID%-rbsu?R>i1*_nC2 zdB6AOy*DdJX^}|eH6g@r>NEAX5aQ!lEcUHezhM~CZ=95})3U73^!{)-ToDR|eonDo zNh}uo#jhXFg%^Ov#zxw)V~5imJOoSdA(M~@!;sZYuPZr!@&bltmmk5;c< zO@08P(P)d5vZ=4HkCrW4=8PK|8KI3EHA9AR)7iAtRyosyHY%O2U%yUORaLNq4$HFYvj)J6N|^#! zuwX&>@#Du9gn_q-L?X6amSs^;0x_Rz4R1Bs7L$R1wh+ zUQ|+rQ2_ufn(Bs?9reWE6)Wx8vxm-{IRh%aZdumvfi=JxStJta@S_q-bLrA0s;Q|V zFF`nTNVogCmX!#=Hs83S=c}_^>UgU+E+h6i6#^79cCb35@JdO=^+= zU@{N^!muXpd>r5iVH*pFZmM6nF@L%0X(5b$@o)dgKjKKR203_Qv zIXN$TNhGEG(5nc=0C1qFHv#-lQT zt9LpL)!YP;an=F&(G58*8Y*pm0h|heHL26+KLY^nqv81HWF(af^UDr7E91+L7p8%1 z0nl%K{;m2RNr*tQ*A)4D)`ZeZ*aVv0UQC}5@j6#FO2ZFqN2i) zPxV4Vh?ZC^)||=)xCpH0#C-L{b<(T@m^W`;0SdT!5`v(Ny-=dw?}P(75T=h;BEuy{ zzWmEN00@)n{!8KT)lew(iGB|Z;e`-i3L)OmcVDRsoit5ziz^mN zGp~FY{hX91);uAE7{_lZWib)Ghu=B{@hoj+E*r5B=1@ZczgpG z0HUD*7n9_ftfZnZE;q0N3BymiC!0|K34^w;R9Q$IOl#JxamD#w0FXBf4i0iEiB}r) z^76h)c}JGc2K00@kz648PPq|YU!}mnar0SNSm;`IY;4T_b^k^)6j%TN002ovPDHLk FV1jvc#zp`D literal 0 HcmV?d00001 From 866b6ca6355565ce51fcfb523a629064bdf88528 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Thu, 9 Apr 2020 18:46:32 -0500 Subject: [PATCH 04/39] Added NATO Alphabet to manifest --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index d85739aad..d432b861b 100644 --- a/apps.json +++ b/apps.json @@ -1159,4 +1159,17 @@ {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] } + { "id": "nato", + "name": "NATO Alphabet", + "shortName" : "NATOAlphabet", + "icon": "nato.png", + "version":"0.01", + "type": "app", + "description": "Learn the NATO Phonetic alphabet plus some numbers.", + "tags": "app,learn,visual", + "storage": [ + {"name":"nato.app.js","url":"nato.js"}, + {"name":"nato.img","url":"nato-icon.js","evaluate":true} + ], + }, ] From b833c39ac2d2fdfca70bdb41bb8d214e97b6bde4 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Thu, 9 Apr 2020 18:48:07 -0500 Subject: [PATCH 05/39] ...missed a comma --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index d432b861b..b18488bbc 100644 --- a/apps.json +++ b/apps.json @@ -1158,7 +1158,7 @@ {"name":"batchart.app.js","url":"app.js"}, {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] - } + }, { "id": "nato", "name": "NATO Alphabet", "shortName" : "NATOAlphabet", From a9c5b7341715de222f901909844ab5fe54fcb9e3 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Thu, 9 Apr 2020 18:49:00 -0500 Subject: [PATCH 06/39] more commas --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b18488bbc..c2377adcf 100644 --- a/apps.json +++ b/apps.json @@ -1171,5 +1171,5 @@ {"name":"nato.app.js","url":"nato.js"}, {"name":"nato.img","url":"nato-icon.js","evaluate":true} ], - }, + } ] From 6126a34bfa043fba7b1f606e2bc8346bb2b24a81 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Thu, 9 Apr 2020 18:50:19 -0500 Subject: [PATCH 07/39] , --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c2377adcf..2216f6671 100644 --- a/apps.json +++ b/apps.json @@ -1170,6 +1170,6 @@ "storage": [ {"name":"nato.app.js","url":"nato.js"}, {"name":"nato.img","url":"nato-icon.js","evaluate":true} - ], + ] } ] From 6d31f60055211a3179d3a7e8841c667c5730b79d Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Fri, 10 Apr 2020 07:30:38 -0500 Subject: [PATCH 08/39] allow emulator for NATO --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 2216f6671..20ef55e38 100644 --- a/apps.json +++ b/apps.json @@ -1167,6 +1167,7 @@ "type": "app", "description": "Learn the NATO Phonetic alphabet plus some numbers.", "tags": "app,learn,visual", + "allow_emulator":true, "storage": [ {"name":"nato.app.js","url":"nato.js"}, {"name":"nato.img","url":"nato-icon.js","evaluate":true} From 4072bb68697923bf3a9a7e86bf5c8ced381e9919 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Fri, 10 Apr 2020 07:36:40 -0500 Subject: [PATCH 09/39] Removing app manifest txt This has been added to the main manifest. --- apps/nato/appsManifestEntry.txt | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/nato/appsManifestEntry.txt diff --git a/apps/nato/appsManifestEntry.txt b/apps/nato/appsManifestEntry.txt deleted file mode 100644 index 2e8d840e0..000000000 --- a/apps/nato/appsManifestEntry.txt +++ /dev/null @@ -1,13 +0,0 @@ - { "id": "nato", - "name": "NATO Alphabet", - "shortName" : "NATOAlphabet", - "icon": "nato.png", - "version":"0.01", - "type": "app", - "description": "Learn the NATO Phonetic alphabet plus some numbers.", - "tags": "app,learn,visual", - "storage": [ - {"name":"nato.app.js","url":"nato.js"}, - {"name":"nato.img","url":"nato-icon.js","evaluate":true} - ], - }, \ No newline at end of file From 987be3201b580cf852aa8f9b86631689ef89d614 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Fri, 10 Apr 2020 07:40:29 -0500 Subject: [PATCH 10/39] Cleanup and comments --- apps/nato/nato.js | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/apps/nato/nato.js b/apps/nato/nato.js index 7e1e06db7..f4301b83f 100644 --- a/apps/nato/nato.js +++ b/apps/nato/nato.js @@ -1,10 +1,6 @@ -/** - * Teach a user the NATO Phonetic Alphabet + numbers -*/ +// Teach a user the NATO Phonetic Alphabet + numbers +// Based on the Morse Code app -/** - * Constants -*/ const FONT_NAME = 'Vector12'; const FONT_SIZE = 80; const SCREEN_PIXELS = 240; @@ -48,21 +44,16 @@ const NATO_MAP = { '9': 'NIN-ER', }; -/** - * Set the local state -*/ let INDEX = 0; let showLetter = true; -/** - * Utility functions for writing text, changing state -*/ const writeText = (txt) => { g.clear(); g.setFont(FONT_NAME, FONT_SIZE); var width = g.stringWidth(txt); + // Fit text to screen var fontFix = FONT_SIZE; while(width > SCREEN_PIXELS-10){ fontFix--; @@ -86,9 +77,8 @@ const toggle = () => { } }; -/** - * Bootstrapping -*/ +// Bootstrapping + g.clear(); g.setFont(FONT_NAME, FONT_SIZE); g.setColor(0, 1, 0); @@ -103,7 +93,7 @@ const step = (positive) => () => { INDEX = INDEX - 1; if (INDEX < 0) INDEX = Object.keys(NATO_MAP).length - 1; } - showLetter = true; + showLetter = true; // for toggle() writeLetter(); }; From ada96912f78107e00272e6897f75c78d6b160e9c Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Fri, 10 Apr 2020 07:46:44 -0500 Subject: [PATCH 11/39] Added newline to the end of apps/nato/nato-icon.js --- apps/nato/nato-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/nato/nato-icon.js b/apps/nato/nato-icon.js index b1a6e0947..ae38c0274 100644 --- a/apps/nato/nato-icon.js +++ b/apps/nato/nato-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwgFCiIABiAGFiINJAAUS///CAgGEgMT//zBoYXFmIiCC40fEooXF+QXJn4lCC5ARDC4oFC//xMAoXDJAQXFBgY9DC4wKCC4p2CPA4XDCQQXEOwXxPA4XBEQJICC4p2BmICCC44KBJAIXEiIJBkMvPAwXCWgYXFAgQMBPAoXCBwUxC4jtDeI4XDJAQXDFYXxHAoXGJAYXDLYPykUieIwXDJAYXDG4IAEPAgXCRgJICPYoAEPAgXDZ4TcDmYXGMAgXDUAZiEPwIABCALEBC5BZC+YQCRwRsEC45ID+S5BCAkBEYJ4DC4hID+IbCIAYjCCIYXGEgMxXoJwEgI3CA4JQDAAwaBmQGDFIQ3CC5UzkSLBdwIIDmYXCWY4jBCAJBCPYQ0EC5bXGkLuDC5QtEAAXzPoZMCmZwB+YFCbYkykQFCVoZMDWALnDQwRjDeoZIDZAgJCWwYeBFATWFC5LuHawgXKdwyJDD4YXIOAMzH4gICmIXKEwQXXkQXFKAKQFC85HNO64XDU44XMX48Sa5zvCmJICA4YXLE4fziIACJ4PyM4gXHCAQwBCwI2GC5JADAApGFC5ERmYWFFwwXHDARJCMgYWFB4MTmYiFLgMjCwMyiIuGE4QABNIyPDBQgA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwgFCiIABiAGFiINJAAUS///CAgGEgMT//zBoYXFmIiCC40fEooXF+QXJn4lCC5ARDC4oFC//xMAoXDJAQXFBgY9DC4wKCC4p2CPA4XDCQQXEOwXxPA4XBEQJICC4p2BmICCC44KBJAIXEiIJBkMvPAwXCWgYXFAgQMBPAoXCBwUxC4jtDeI4XDJAQXDFYXxHAoXGJAYXDLYPykUieIwXDJAYXDG4IAEPAgXCRgJICPYoAEPAgXDZ4TcDmYXGMAgXDUAZiEPwIABCALEBC5BZC+YQCRwRsEC45ID+S5BCAkBEYJ4DC4hID+IbCIAYjCCIYXGEgMxXoJwEgI3CA4JQDAAwaBmQGDFIQ3CC5UzkSLBdwIIDmYXCWY4jBCAJBCPYQ0EC5bXGkLuDC5QtEAAXzPoZMCmZwB+YFCbYkykQFCVoZMDWALnDQwRjDeoZIDZAgJCWwYeBFATWFC5LuHawgXKdwyJDD4YXIOAMzH4gICmIXKEwQXXkQXFKAKQFC85HNO64XDU44XMX48Sa5zvCmJICA4YXLE4fziIACJ4PyM4gXHCAQwBCwI2GC5JADAApGFC5ERmYWFFwwXHDARJCMgYWFB4MTmYiFLgMjCwMyiIuGE4QABNIyPDBQgA==")) From d9a9bae5eea9450acccae6f9a65b502311d478e9 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 10 Apr 2020 17:42:14 +0200 Subject: [PATCH 12/39] Move LCD Brightness menu into more general LCD menu & unify writings --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 40 ++++++++++++++++++++-------------------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/apps.json b/apps.json index d85739aad..a8390b927 100644 --- a/apps.json +++ b/apps.json @@ -119,7 +119,7 @@ { "id": "setting", "name": "Settings", "icon": "settings.png", - "version":"0.12", + "version":"0.13", "description": "A menu for setting up Bangle.js", "tags": "tool,system", "storage": [ diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 22277968c..c3109dda6 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -12,3 +12,4 @@ 0.12: Fix memory leak (#206) Bring App settings nearer the top Move LCD Timeout to wakeup menu +0.13: Move LCD Brightness menu into more general LCD menu diff --git a/apps/setting/settings.js b/apps/setting/settings.js index ac7692610..c6be52191 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -89,17 +89,6 @@ function showMainMenu() { updateSettings(); } }, - 'LCD Brightness': { - value: settings.brightness, - min: 0.1, - max: 1, - step: 0.1, - onchange: v => { - settings.brightness = v || 1; - updateSettings(); - Bangle.setLCDBrightness(settings.brightness); - } - }, 'Beep': { value: 0 | beepV.indexOf(settings.beep), min: 0, max: 2, @@ -134,7 +123,7 @@ function showMainMenu() { } }, 'Set Time': ()=>showSetTimeMenu(), - 'LCD Wake-Up': ()=>showWakeUpMenu(), + 'LCD': ()=>showLCDMenu(), 'Reset Settings': ()=>showResetMenu(), 'Turn Off': ()=>Bangle.off(), '< Back': ()=>load() @@ -142,10 +131,21 @@ function showMainMenu() { return E.showMenu(mainmenu); } -function showWakeUpMenu() { - const wakeUpMenu = { - '': { 'title': 'LCD Wake-Up' }, +function showLCDMenu() { + const lcdMenu = { + '': { 'title': 'LCD' }, '< Back': ()=>showMainMenu(), + 'LCD Brightness': { + value: settings.brightness, + min: 0.1, + max: 1, + step: 0.1, + onchange: v => { + settings.brightness = v || 1; + updateSettings(); + Bangle.setLCDBrightness(settings.brightness); + } + }, 'LCD Timeout': { value: settings.timeout, min: 0, @@ -157,7 +157,7 @@ function showWakeUpMenu() { Bangle.setLCDTimeout(settings.timeout); } }, - 'Wake On BTN1': { + 'Wake on BTN1': { value: settings.options.wakeOnBTN1, format: boolFormat, onchange: () => { @@ -165,7 +165,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On BTN2': { + 'Wake on BTN2': { value: settings.options.wakeOnBTN2, format: boolFormat, onchange: () => { @@ -173,7 +173,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On BTN3': { + 'Wake on BTN3': { value: settings.options.wakeOnBTN3, format: boolFormat, onchange: () => { @@ -197,7 +197,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On Twist': { + 'Wake on Twist': { value: settings.options.wakeOnTwist, format: boolFormat, onchange: () => { @@ -236,7 +236,7 @@ function showWakeUpMenu() { } } } - return E.showMenu(wakeUpMenu) + return E.showMenu(lcdMenu) } function showLocaleMenu() { From 5e5fb570db0ff446275d45bfa658f6c59ad9c918 Mon Sep 17 00:00:00 2001 From: Fabio Date: Fri, 10 Apr 2020 19:20:49 +0200 Subject: [PATCH 13/39] New bledetect app --- apps.json | 12 ++++++ apps/bledetect/ChangeLog | 1 + apps/bledetect/bledetect-icon.js | 1 + apps/bledetect/bledetect.js | 67 +++++++++++++++++++++++++++++++ apps/bledetect/bledetect.png | Bin 0 -> 4163 bytes 5 files changed, 81 insertions(+) create mode 100644 apps/bledetect/ChangeLog create mode 100644 apps/bledetect/bledetect-icon.js create mode 100644 apps/bledetect/bledetect.js create mode 100644 apps/bledetect/bledetect.png diff --git a/apps.json b/apps.json index d85739aad..8e4e2555a 100644 --- a/apps.json +++ b/apps.json @@ -1158,5 +1158,17 @@ {"name":"batchart.app.js","url":"app.js"}, {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "bledetect", + "name": "BLE Detector", + "shortName":"BLEDetector", + "icon": "bledetect.png", + "version":"0.01", + "description": "Detect BLE devices and show some informations.", + "tags": "app,bluetooth,tool", + "storage": [ + {"name":"bledetect.app.js","url":"bledetect.js"}, + {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} + ] } ] diff --git a/apps/bledetect/ChangeLog b/apps/bledetect/ChangeLog new file mode 100644 index 000000000..9352c7b96 --- /dev/null +++ b/apps/bledetect/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release \ No newline at end of file diff --git a/apps/bledetect/bledetect-icon.js b/apps/bledetect/bledetect-icon.js new file mode 100644 index 000000000..a15e13307 --- /dev/null +++ b/apps/bledetect/bledetect-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("AAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAiIgIiIiAAAAAAAAAAAAAAAAAAAAAAAAAiIgAiIiIAAAAAAAAAAAAAAAAAIAAAAAAiIgACIiIgAAAAAAAAAAAAAAAiIiAAAAAiIgAAAiIiIAAAAAAAAAAAAAAiIiIAAAAiIgAAACIiIgAAAAAAAAAAAAACIiIgAAAiIgAAAAIiIgAAAAAAAAAAAAAAIiIiAAAiIgAAAAIiIiAAAAAAAAAAAAAAAiIiIAAiIgAAACIiIgAAAAAAAAAAAAAAACIiIgAiIgAAAiIiIAAAAAAAAAAAAAAAAAIiIiIiIgACIiIiAAAAAAAAAAAAAAAAAAACIiIiIgAiIiIAAAAAAAAAAAAAAAAAAAAAIiIiIgIiIiAAAAAAAAAAAAAAAAAAAAAAAiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAACIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiAAAAAAAAAIgAAAAAAAAAAAAAACIiIiIiIAAAAACIiIiIiAAAAAAAAAAAIiIiIiIiIgAAAAiIiIiIiIAAAAAAAAACIiIiIgIiIiAACIiIiIiIiIgAAAAAAAAiIiIiIgAiIiAACIiIiACIiIiAAAAAAAIiIiAiIgAAIgAAiIiAAAAAiIiIAAAAACIiIgAiIgAAAAAIiIgAAAAAAIiIAAAAAiIiIAAiIgAAAAAIiIAAAAAAAEiIgAAAIiIiAAAiIgAAAAAIiIAAAAAAAAiIgAAiIiIgAAAiIgAAAAAIiIAAAAAAAAiIgAAiIiAAAAAiIgAAAACIiAAAAAAAAAiIgAAiIgAAAAAiIgAAAACIiAAAAAAAAAiIgAAAAAAAAAAiIgAAAAAIiIAAAAAAAAiIgAAAAAAAAAAiIgAiIAAIiIAAAAAAAAiIgAAAAAAAAAAiIgIiIgAIiIgAAAAAAIiIgAAAAAAAAAAiIiIiIgAIiIgAAAAACIiIAAAAAAAAAAAiIiIiIAAAiIiIAAAAiIiIAAAAAAAAAAAiIiIgAAAACIiIiIiIiIiIAAAAAAAAAAAiIiIAAAAAAIiIiIiIiIiIgAAAAAAAAAAiIiAAAAAAAAiIiIiIiIiIiAAAAAAAAAAiIgAAAAAAAAAIiIiIgACIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIi")) \ No newline at end of file diff --git a/apps/bledetect/bledetect.js b/apps/bledetect/bledetect.js new file mode 100644 index 000000000..dde3ee9eb --- /dev/null +++ b/apps/bledetect/bledetect.js @@ -0,0 +1,67 @@ +let menu = { + "": { "title": "BLE Detector" }, + "RE-SCAN": () => scan() +}; + +function showMainMenu() { + menu["< Back"] = () => load(); + return E.showMenu(menu); +} + +function showDeviceInfo(device){ + console.log(device); + const deviceMenu = { + "": { "title": "Device Info" }, + "name": { + value: device.name + }, + "rssi": { + value: device.rssi + }, + "manufacturer": { + value: device.manufacturer + } + }; + + deviceMenu[device.id] = () => {}; + deviceMenu["< Back"] = () => scan(); + + /*for(let key in device){ + deviceMenu[key.substring(0,17)] = { + value: device[key.substring(0,17)] + }; + }*/ + + return E.showMenu(deviceMenu); +} + +function scan() { + menu = { + "": { "title": "BLE Detector" }, + "RE-SCAN": () => scan() + }; + + waitMessage(); + + NRF.findDevices(devices => { + for (let device of devices) { + let deviceName = device.id.substring(0,17); + + if (device.name) { + deviceName = device.name; + } + + menu[deviceName] = () => showDeviceInfo(device); + } + showMainMenu(menu); + }, { active: true }); +} + +function waitMessage() { + E.showMenu(); + E.showMessage("scanning"); +} + +scan(); +waitMessage(); + diff --git a/apps/bledetect/bledetect.png b/apps/bledetect/bledetect.png new file mode 100644 index 0000000000000000000000000000000000000000..59d6a26cee07bc61899bc7ec129c426784e5f716 GIT binary patch literal 4163 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 literal 0 HcmV?d00001 From 558952c5408833fe0efaa6adf3a2a909b672de94 Mon Sep 17 00:00:00 2001 From: Fabio Date: Fri, 10 Apr 2020 19:24:34 +0200 Subject: [PATCH 14/39] Fix bledetect icon --- apps/bledetect/bledetect-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bledetect/bledetect-icon.js b/apps/bledetect/bledetect-icon.js index a15e13307..70b90cd42 100644 --- a/apps/bledetect/bledetect-icon.js +++ b/apps/bledetect/bledetect-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("AAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAiIgIiIiAAAAAAAAAAAAAAAAAAAAAAAAAiIgAiIiIAAAAAAAAAAAAAAAAAIAAAAAAiIgACIiIgAAAAAAAAAAAAAAAiIiAAAAAiIgAAAiIiIAAAAAAAAAAAAAAiIiIAAAAiIgAAACIiIgAAAAAAAAAAAAACIiIgAAAiIgAAAAIiIgAAAAAAAAAAAAAAIiIiAAAiIgAAAAIiIiAAAAAAAAAAAAAAAiIiIAAiIgAAACIiIgAAAAAAAAAAAAAAACIiIgAiIgAAAiIiIAAAAAAAAAAAAAAAAAIiIiIiIgACIiIiAAAAAAAAAAAAAAAAAAACIiIiIgAiIiIAAAAAAAAAAAAAAAAAAAAAIiIiIgIiIiAAAAAAAAAAAAAAAAAAAAAAAiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAACIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiAAAAAAAAAIgAAAAAAAAAAAAAACIiIiIiIAAAAACIiIiIiAAAAAAAAAAAIiIiIiIiIgAAAAiIiIiIiIAAAAAAAAACIiIiIgIiIiAACIiIiIiIiIgAAAAAAAAiIiIiIgAiIiAACIiIiACIiIiAAAAAAAIiIiAiIgAAIgAAiIiAAAAAiIiIAAAAACIiIgAiIgAAAAAIiIgAAAAAAIiIAAAAAiIiIAAiIgAAAAAIiIAAAAAAAEiIgAAAIiIiAAAiIgAAAAAIiIAAAAAAAAiIgAAiIiIgAAAiIgAAAAAIiIAAAAAAAAiIgAAiIiAAAAAiIgAAAACIiAAAAAAAAAiIgAAiIgAAAAAiIgAAAACIiAAAAAAAAAiIgAAAAAAAAAAiIgAAAAAIiIAAAAAAAAiIgAAAAAAAAAAiIgAiIAAIiIAAAAAAAAiIgAAAAAAAAAAiIgIiIgAIiIgAAAAAAIiIgAAAAAAAAAAiIiIiIgAIiIgAAAAACIiIAAAAAAAAAAAiIiIiIAAAiIiIAAAAiIiIAAAAAAAAAAAiIiIgAAAACIiIiIiIiIiIAAAAAAAAAAAiIiIAAAAAAIiIiIiIiIiIgAAAAAAAAAAiIiAAAAAAAAiIiIiIiIiIiAAAAAAAAAAiIgAAAAAAAAAIiIiIgACIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIi")) \ No newline at end of file +require("heatshrink").decompress(atob("MDCEAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAIiICIiIgAAAAAAAAAAAAAAAAAAAAAAAAIiIAIiIiAAAAAAAAAAAAAAAAACAAAAAAIiIAAiIiIAAAAAAAAAAAAAAAIiIgAAAAIiIAAAIiIiAAAAAAAAAAAAAAIiIiAAAAIiIAAAAiIiIAAAAAAAAAAAAAAiIiIAAAIiIAAAACIiIAAAAAAAAAAAAAACIiIgAAIiIAAAACIiIgAAAAAAAAAAAAAAIiIiAAIiIAAAAiIiIAAAAAAAAAAAAAAAAiIiIAIiIAAAIiIiAAAAAAAAAAAAAAAAACIiIiIiIAAiIiIgAAAAAAAAAAAAAAAAAAAiIiIiIAIiIiAAAAAAAAAAAAAAAAAAAAACIiIiICIiIgAAAAAAAAAAAAAAAAAAAAAAIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIiAAAAAAAAAAAAAAAAAAAAAAAAACIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAACIiIiIgAAAAAAAACIAAAAAAAAAAAAAAAiIiIiIiAAAAAAiIiIiIgAAAAAAAAAACIiIiIiIiIAAAAIiIiIiIiAAAAAAAAAAiIiIiICIiIgAAiIiIiIiIiIAAAAAAAAIiIiIiIAIiIgAAiIiIgAiIiIgAAAAAACIiIgIiIAACIAAIiIgAAAAIiIiAAAAAAiIiIAIiIAAAAACIiIAAAAAACIiAAAAAIiIiAAIiIAAAAACIiAAAAAAABIiIAAACIiIgAAIiIAAAAACIiAAAAAAAAIiIAAIiIiIAAAIiIAAAAACIiAAAAAAAAIiIAAIiIgAAAAIiIAAAAAiIgAAAAAAAAIiIAAIiIAAAAAIiIAAAAAiIgAAAAAAAAIiIAAAAAAAAAAIiIAAAAACIiAAAAAAAAIiIAAAAAAAAAAIiIAIiAACIiAAAAAAAAIiIAAAAAAAAAAIiICIiIACIiIAAAAAACIiIAAAAAAAAAAIiIiIiIACIiIAAAAAAiIiAAAAAAAAAAAIiIiIiAAAIiIiAAAAIiIiAAAAAAAAAAAIiIiIAAAAAiIiIiIiIiIiAAAAAAAAAAAIiIiAAAAAACIiIiIiIiIiIAAAAAAAAAAIiIgAAAAAAAIiIiIiIiIiIgAAAAAAAAAIiIAAAAAAAAACIiIiIAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIg==")) From 8d8befd5ec33d95f5333232c098ddd96bca74999 Mon Sep 17 00:00:00 2001 From: Fabio Date: Fri, 10 Apr 2020 19:35:34 +0200 Subject: [PATCH 15/39] Finally fixed icon for bledetect --- apps.json | 2 +- apps/bledetect/bledetect-icon.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8e4e2555a..9071c269f 100644 --- a/apps.json +++ b/apps.json @@ -1161,7 +1161,7 @@ }, { "id": "bledetect", "name": "BLE Detector", - "shortName":"BLEDetector", + "shortName":"BLE Detector", "icon": "bledetect.png", "version":"0.01", "description": "Detect BLE devices and show some informations.", diff --git a/apps/bledetect/bledetect-icon.js b/apps/bledetect/bledetect-icon.js index 70b90cd42..8c605889a 100644 --- a/apps/bledetect/bledetect-icon.js +++ b/apps/bledetect/bledetect-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("MDCEAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAIiICIiIgAAAAAAAAAAAAAAAAAAAAAAAAIiIAIiIiAAAAAAAAAAAAAAAAACAAAAAAIiIAAiIiIAAAAAAAAAAAAAAAIiIgAAAAIiIAAAIiIiAAAAAAAAAAAAAAIiIiAAAAIiIAAAAiIiIAAAAAAAAAAAAAAiIiIAAAIiIAAAACIiIAAAAAAAAAAAAAACIiIgAAIiIAAAACIiIgAAAAAAAAAAAAAAIiIiAAIiIAAAAiIiIAAAAAAAAAAAAAAAAiIiIAIiIAAAIiIiAAAAAAAAAAAAAAAAACIiIiIiIAAiIiIgAAAAAAAAAAAAAAAAAAAiIiIiIAIiIiAAAAAAAAAAAAAAAAAAAAACIiIiICIiIgAAAAAAAAAAAAAAAAAAAAAAIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIiAAAAAAAAAAAAAAAAAAAAAAAAACIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAACIiIiIgAAAAAAAACIAAAAAAAAAAAAAAAiIiIiIiAAAAAAiIiIiIgAAAAAAAAAACIiIiIiIiIAAAAIiIiIiIiAAAAAAAAAAiIiIiICIiIgAAiIiIiIiIiIAAAAAAAAIiIiIiIAIiIgAAiIiIgAiIiIgAAAAAACIiIgIiIAACIAAIiIgAAAAIiIiAAAAAAiIiIAIiIAAAAACIiIAAAAAACIiAAAAAIiIiAAIiIAAAAACIiAAAAAAABIiIAAACIiIgAAIiIAAAAACIiAAAAAAAAIiIAAIiIiIAAAIiIAAAAACIiAAAAAAAAIiIAAIiIgAAAAIiIAAAAAiIgAAAAAAAAIiIAAIiIAAAAAIiIAAAAAiIgAAAAAAAAIiIAAAAAAAAAAIiIAAAAACIiAAAAAAAAIiIAAAAAAAAAAIiIAIiAACIiAAAAAAAAIiIAAAAAAAAAAIiICIiIACIiIAAAAAACIiIAAAAAAAAAAIiIiIiIACIiIAAAAAAiIiAAAAAAAAAAAIiIiIiAAAIiIiAAAAIiIiAAAAAAAAAAAIiIiIAAAAAiIiIiIiIiIiAAAAAAAAAAAIiIiAAAAAACIiIiIiIiIiIAAAAAAAAAAIiIgAAAAAAAIiIiIiIiIiIgAAAAAAAAAIiIAAAAAAAAACIiIiIAAiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIg==")) +require("heatshrink").decompress(atob("oFAwgLIhGIFbuIxGAD7xAdD4RAcD4QgcD4ZhbD4hAaD4hAaD4pAZDYRAcD4UIEDZbDMKY0BD5IgES6IfJMIZAOCI4GFICIRHD4pARCI5GIICwfYIAxfXGQr7DT6ozFCgLfXKg4YDFIoARCwZjFHyZhGDIJdVIBJdWIBA+YIBIeWIA4eXEAxdXD44eZQAw+dMBEiAAUgX7IeDAAT/XDwxBLDYpAFgQfHIBI+FwAGDHxJAJThAICHwpFGLpQECPYQDCDAYUDA4ZAFHwYXBbg4WIEAQIFSwofKKwwJGHwofHGpAfIHwofSBQQ+JD5T1HBQoeGD6pKCLoofbW4ofXDAINFP64AHD4ZqCX6AfKZQT/SD5LKECpIfPAAYVKJJQfLCxAoCD6DCCD4QXEAwReLD4jhEDAYAGH553HABAfNHwhAXHw5AJA4b/MBQ4gFYJ0IDxAhEE47CLACDCOACBAjD7hACD7hABkAA=")) \ No newline at end of file From a95a396ac1cd20630848ef92baaa9db5a520a29a Mon Sep 17 00:00:00 2001 From: Fabio Date: Fri, 10 Apr 2020 19:43:10 +0200 Subject: [PATCH 16/39] Resized icon bledetect --- apps/bledetect/bledetect-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bledetect/bledetect-icon.js b/apps/bledetect/bledetect-icon.js index 8c605889a..2e49b3d0a 100644 --- a/apps/bledetect/bledetect-icon.js +++ b/apps/bledetect/bledetect-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("oFAwgLIhGIFbuIxGAD7xAdD4RAcD4QgcD4ZhbD4hAaD4hAaD4pAZDYRAcD4UIEDZbDMKY0BD5IgES6IfJMIZAOCI4GFICIRHD4pARCI5GIICwfYIAxfXGQr7DT6ozFCgLfXKg4YDFIoARCwZjFHyZhGDIJdVIBJdWIBA+YIBIeWIA4eXEAxdXD44eZQAw+dMBEiAAUgX7IeDAAT/XDwxBLDYpAFgQfHIBI+FwAGDHxJAJThAICHwpFGLpQECPYQDCDAYUDA4ZAFHwYXBbg4WIEAQIFSwofKKwwJGHwofHGpAfIHwofSBQQ+JD5T1HBQoeGD6pKCLoofbW4ofXDAINFP64AHD4ZqCX6AfKZQT/SD5LKECpIfPAAYVKJJQfLCxAoCD6DCCD4QXEAwReLD4jhEDAYAGH553HABAfNHwhAXHw5AJA4b/MBQ4gFYJ0IDxAhEE47CLACDCOACBAjD7hACD7hABkAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwgJGhGAEKuIxAXXGCoXBGCoXCDCgXDJKYXDGCYUBhAwUFgQwPEogTCGBwNFFYYYNHwoEGJJQlFCIgKCdR4XHJBQNEI6IOFO6IPEDQYGDahoYEa6BJFxBFPJJIuQGAouRGAoWSGAgXTSIoAEgUgL6cCkQACDJCOFGAYWDAAJFLX4gWFGA4sFC40gJQYuHwBEDAQISCMYowEFgoJDCAwYBAwZYEC45AEgIHERAgXMA4i4FC6bPDC4hXFC5B7FC57CHI54XIawgXRVwS/JC5SuDC4wGGC45HBFAQRCAooXIVwYRBAAoXLLIwAFC5IuDGCIuFDAyQLABphKABgwaC6owB")) \ No newline at end of file From d843210ed09194875e64cc2c3b138f9b9ee5f1e2 Mon Sep 17 00:00:00 2001 From: ps-igel <60899838+ps-igel@users.noreply.github.com> Date: Fri, 10 Apr 2020 22:32:09 +0200 Subject: [PATCH 17/39] add numerals clock --- apps.json | 15 +++++ apps/numerals/README.md | 17 ++++++ apps/numerals/numerals-icon.js | 1 + apps/numerals/numerals.app.js | 93 +++++++++++++++++++++++++++++ apps/numerals/numerals.png | Bin 0 -> 1173 bytes apps/numerals/numerals.settings.js | 33 ++++++++++ 6 files changed, 159 insertions(+) create mode 100644 apps/numerals/README.md create mode 100644 apps/numerals/numerals-icon.js create mode 100644 apps/numerals/numerals.app.js create mode 100644 apps/numerals/numerals.png create mode 100644 apps/numerals/numerals.settings.js diff --git a/apps.json b/apps.json index d85739aad..1f05142f5 100644 --- a/apps.json +++ b/apps.json @@ -1158,5 +1158,20 @@ {"name":"batchart.app.js","url":"app.js"}, {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "numerals", + "name": "Numerals Clock", + "shortName": "Numerals Clock", + "icon": "numerals.png", + "version":"0.01", + "description": "A simple big numerals clock", + "tags": "numerals,clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"numerals.app.js","url":"numerals.app.js"}, + {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, + {"name":"numerals.settings.js","url":"numerals.settings.js"} + ] } ] diff --git a/apps/numerals/README.md b/apps/numerals/README.md new file mode 100644 index 000000000..01d784ef8 --- /dev/null +++ b/apps/numerals/README.md @@ -0,0 +1,17 @@ +# Numerals Clock + +This is a simple big numerals clock. +Settings can be accessed through the app/widget settings menu of the Bangle.js + +## Settings available + +### color: +* rnd - shows numerals in different color combinations every time the watches wakes +* r/g - red/green +* y/w - yellow/white +* o/c - orange/cyan +* b/y - blue/yellow'ish + +### draw mode +* fill - fill numerals +* frame - only shows outline of numerals diff --git a/apps/numerals/numerals-icon.js b/apps/numerals/numerals-icon.js new file mode 100644 index 000000000..7e471fb0d --- /dev/null +++ b/apps/numerals/numerals-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/ABMBzIADyAJIAAkQBoMZBIoXCBIwADyIkIGAIuKGAQkIBJIwEEKQANC/4XWR58RiIHFWpAXFe4QRFcpAXFewQRFcxAXEFwQwGA4QXKiAXDGAgX/C/4X/C/4X/C7uQCwcBBwYXNBwYuEC54wCFwgXPzMRiIHFC54AHC/4XiCAoXRhIHDyK3GAAwOBJA0QG45VGC4YwCD4YwKFwgABcgIfEAwIAHBwgA/AAgA==")) \ No newline at end of file diff --git a/apps/numerals/numerals.app.js b/apps/numerals/numerals.app.js new file mode 100644 index 000000000..648a1005a --- /dev/null +++ b/apps/numerals/numerals.app.js @@ -0,0 +1,93 @@ +/** + * Bangle.js Numerals Clock + * + * + Original Author: Raik M. https://github.com/ps-igel + * + Created: April 2020 + * + see README.md for details + */ + +var numerals = { + 0:[[9,1,82,1,90,9,90,82,82,90,9,90,1,82,1,9,9,1],[30,21,61,21,69,29,69,61,61,69,30,69,22,61,22,29,30,21]], + 1:[[59,1,82,1,90,9,90,82,82,90,73,90,65,82,65,27,59,27,51,19,51,9,59,1]], + 2:[[9,1,82,1,90,9,90,47,82,55,21,55,21,64,82,64,90,72,90,82,82,90,9,90,1,82,1,43,9,35,70,35,70,25,9,25,1,17,1,9,9,1]], + 3:[[9,1,82,1,90,9,90,82,82,90,9,90,1,82,1,74,9,66,70,66,70,57,9,57,1,49,1,41,9,33,70,33,70,25,9,25,1,17,1,9,9,1]], + 4:[[9,1,14,1,22,9,22,34,69,34,69,9,77,1,82,1,90,9,90,82,82,90,78,90,70,82,70,55,9,55,1,47,1,9,9,1]], + 5:[[9,1,82,1,90,9,90,17,82,25,21,25,21,35,82,35,90,43,90,82,82,90,9,90,1,82,1,72,9,64,71,64,71,55,9,55,1,47,1,9,9,1]], + 6:[[9,1,82,1,90,9,90,14,82,22,22,22,22,36,82,36,90,44,90,82,82,90,9,90,1,82,1,9,9,1],[22,55,69,55,69,69,22,69,22,55]], + 7:[[9,1,82,1,90,9,90,15,15,90,9,90,1,82,1,76,54,23,9,23,1,15,1,9,9,1]], + 8:[[9,1,82,1,90,9,90,82,82,90,9,90,1,82,1,9,9,1],[22,22,69,22,69,36,22,36,22,22],[22,55,69,55,69,69,22,69,22,55]], + 9:[[9,1,82,1,90,9,90,82,82,90,9,90,1,82,1,77,9,69,69,69,69,55,9,55,1,47,1,9,9,1],[22,22,69,22,69,36,22,36,22,22]], +}; +var _hCol = ["#ff5555","#ffff00","#FF9901","#2F00FF"]; +var _mCol = ["#55ff55","#ffffff","#00EFEF","#FFBF00"]; +var _rCol = 0; +var interval = 0; +const REFRESH_RATE = 10E3; + +function translate(tx, ty, p) { + return p.map((x, i)=> x+((i%2)?ty:tx)); +} + +function fill(poly){ + return g.fillPoly(poly); +} + +function frame(poly){ + return g.drawPoly(poly); +} + +let settings = require('Storage').readJSON('numerals.json',1); +if (!settings) { + settings = { + color: 0, + drawMode: "fill" + }; +} + +function drawNum(num,col,x,y,func){ + g.setColor(col); + let tx = x*100+35; + let ty = y*100+35; + for (let i=0;i0) g.setColor((func==fill)?"#000000":col); + func(translate(tx, ty,numerals[num][i])); + } +} + +function draw(drawMode){ + let d = new Date(); + let h1 = Math.floor(d.getHours()/10); + let h2 = d.getHours()%10; + let m1 = Math.floor(d.getMinutes()/10); + let m2 = d.getMinutes()%10; + g.clearRect(0,24,240,240); + drawNum(h1,_hCol[_rCol],0,0,eval(drawMode)); + drawNum(h2,_hCol[_rCol],1,0,eval(drawMode)); + drawNum(m1,_mCol[_rCol],0,1,eval(drawMode)); + drawNum(m2,_mCol[_rCol],1,1,eval(drawMode)); +} + +Bangle.setLCDMode(); + +clearWatch(); +setWatch(Bangle.showLauncher, BTN1, {repeat:false,edge:"falling"}); + +g.clear(); +clearInterval(); +if (settings.color>0) _rCol=settings.color-1; +interval=setInterval(draw, REFRESH_RATE, settings.drawMode); +draw(settings.drawMode); + +Bangle.on('lcdPower', function(on) { + if (on) { + if (settings.color==0) _rCol = Math.floor(Math.random()*_hCol.length); + draw(settings.drawMode); + interval=setInterval(draw, REFRESH_RATE, settings.drawMode); + }else + { + clearInterval(interval); + } +}); + +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/numerals/numerals.png b/apps/numerals/numerals.png new file mode 100644 index 0000000000000000000000000000000000000000..c181e2e0dfc32596174d6c94480a6f92a101e20d GIT binary patch literal 1173 zcmV;G1Zw+EX>4Tx04R}tkv&MmKpe$i(@Iq;4t5Z6$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;lcSTOi5bWxZD8-pLEHP9LY~pC=`JAGy0|+FmMa>uDQLn_Hp_EWT>m<8{ps& z7%fuvy2rb_JA3>0Osl^iO2u-QrwyT@00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB600N~+L_t(&-tF1TYZO@+#^I;Rj;%XUaA*DnM_qYCM8{!7W-&}7 zZq!9gyrOFb2bDONC<@aHr-KW3O0PtM7jU5nf=X0GH|oL&qM&XyLptT6PfQy-rlQ@Q zIMfSGS5chryuYfi&iU#bGEJ?b+LNSEn0$b8dE9GX6K}G8Mq@hLhfWNqi1QE|#{&rQ zW}^@D8{|Dk2`66^%cB6Hv)%Y-k^%d$VJt+5m&Z*kYQjUO9GNd<$j&CpzKjS=pMJ1%o%_f_NQk0X#=xso-U$8bD?`VPf5%tCm z3|0yML#-S}W8b;{7Xa_SXMh}*hEZeI6!d=@SL(b=CCp6=a1YCIBMgD9Qc0p~@N9Jw ztW@~(D2E>v;5Pa(Z^9G`vuHn7v@o4Y+I3m!6Z1z7eXMf^uo$mXy~H&TD{%~e<9^f9 zCefvx!Chs;!*n01njcfF4PXi0Oq4>kjqc!1C=X+pX(k~VPp5`T2puQ-!JVE|ik zVcHI(QACn_v22dAi7W%i05X6KAOpw%GJp(VngUcR5urp4MXHe|EkoujRdzj}yc ziZ4H!zdMonsRV$7Vl(oa3YVxZWfwg^SWb{!hC2lv^XH^-a*PL)MzS_Ct{jd^FDpg+Y<{TeBj n$x|xAHL;ift}V-ysR8-`u%*0+fO-J!00000NkvXXu0mjfBikB4 literal 0 HcmV?d00001 diff --git a/apps/numerals/numerals.settings.js b/apps/numerals/numerals.settings.js new file mode 100644 index 000000000..f9c417da6 --- /dev/null +++ b/apps/numerals/numerals.settings.js @@ -0,0 +1,33 @@ +(function(back) { + function updateSettings() { + storage.write('numerals.json', numeralsSettings); + }; + function resetSettings() { + numeralsSettings = { + color: 0, + drawMode: "fill" + }; + updateSettings(); + } + let numeralsSettings = storage.readJSON('numerals.json',1); + if (!numeralsSettings) resetSettings(); + let dm = ["fill","frame"]; + let col = ["rnd","r/g","y/w","o/c","b/y"] + var menu={ + "" : { "title":"Numerals"}, + "Colors": { + value: 0|numeralsSettings.color, + min:0,max:4, + format: v=>col[v], + onchange: v=> { numeralsSettings.color=v; updateSettings();} + }, + "Draw mode": { + value: 0|dm.indexOf(numeralsSettings.drawMode), + min:0,max:1, + format: v=>dm[v], + onchange: v=> { numeralsSettings.drawMode=dm[v]; updateSettings();} + }, + "< back": back + }; + E.showMenu(menu); +}) \ No newline at end of file From 20ad2efbd4cf5b66b368e792826d0f7b631bf128 Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Sat, 11 Apr 2020 01:52:27 +0100 Subject: [PATCH 18/39] In night mode, further left swipes reduce the screen brightness (3 levels) until returning to day-mode --- apps.json | 2 +- apps/marioclock/ChangeLog | 3 ++- apps/marioclock/README.md | 2 +- apps/marioclock/marioclock-app.js | 16 ++++++++++++++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 0271c244d..293a709c7 100644 --- a/apps.json +++ b/apps.json @@ -914,7 +914,7 @@ { "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version":"0.09", + "version":"0.10", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", diff --git a/apps/marioclock/ChangeLog b/apps/marioclock/ChangeLog index acce6a7ed..b4a4c7af9 100644 --- a/apps/marioclock/ChangeLog +++ b/apps/marioclock/ChangeLog @@ -6,4 +6,5 @@ 0.06: Performance refactor, and enhanced graphics! 0.07: Swipe right to change between Mario and Toad characters, swipe left to toggle night mode 0.08: Update date panel to be info panel toggling between Date, Battery and Temperature. Add Princes Daisy -0.09: Add GadgetBridge functionality. Mario shows message type in speach bubble, while message scrolls in info panel \ No newline at end of file +0.09: Add GadgetBridge functionality. Mario shows message type in speach bubble, while message scrolls in info panel +0.10: Swiping left to enable night-mode now also reduces LCD brightness through 3 levels before returning to day-mode. \ No newline at end of file diff --git a/apps/marioclock/README.md b/apps/marioclock/README.md index e6aeaa1bb..25276a351 100644 --- a/apps/marioclock/README.md +++ b/apps/marioclock/README.md @@ -8,7 +8,7 @@ Enjoy watching Mario, or one of the other game characters run through a level wh ## Features * Multiple characters - swipe the screen right to change the character between `Mario`, `Toad`, and `Daisy` -* Night and Day modes - swipe left to toggle mode +* Night and Day modes - swipe left to enter night mode, with 3 levels of darkness before returning to day mode. * Smooth animation * Awesome 8-bit style grey-scale graphics * Mario jumps to change the time, every minute diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index 529f1c95b..e213c2498 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -16,6 +16,8 @@ const is12Hour = settings["12hour"] || false; // Screen dimensions let W, H; +// Screen brightness +let brightness = 1; let intervalRef, displayTimeoutRef = null; @@ -164,7 +166,17 @@ function switchCharacter() { } function toggleNightMode() { - nightMode = !nightMode; + if (!nightMode) { + nightMode = true; + return; + } + + brightness -= 0.30; + if (brightness <= 0) { + brightness = 1; + nightMode = false; + } + Bangle.setLCDBrightness(brightness); } function incrementTimer() { @@ -625,4 +637,4 @@ function init() { } // Initialise! -init() \ No newline at end of file +init(); \ No newline at end of file From cab228f47e79ec1872653dc6a29ac6ed5c4bbe8b Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Sat, 11 Apr 2020 10:47:01 +0100 Subject: [PATCH 19/39] Persist user settings --- apps.json | 2 +- apps/marioclock/ChangeLog | 3 ++- apps/marioclock/marioclock-app.js | 35 +++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 293a709c7..73a093a2c 100644 --- a/apps.json +++ b/apps.json @@ -914,7 +914,7 @@ { "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version":"0.10", + "version":"0.11", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", diff --git a/apps/marioclock/ChangeLog b/apps/marioclock/ChangeLog index b4a4c7af9..6f3c79504 100644 --- a/apps/marioclock/ChangeLog +++ b/apps/marioclock/ChangeLog @@ -7,4 +7,5 @@ 0.07: Swipe right to change between Mario and Toad characters, swipe left to toggle night mode 0.08: Update date panel to be info panel toggling between Date, Battery and Temperature. Add Princes Daisy 0.09: Add GadgetBridge functionality. Mario shows message type in speach bubble, while message scrolls in info panel -0.10: Swiping left to enable night-mode now also reduces LCD brightness through 3 levels before returning to day-mode. \ No newline at end of file +0.10: Swiping left to enable night-mode now also reduces LCD brightness through 3 levels before returning to day-mode. +0.11: User settings persisted and read to file. \ No newline at end of file diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index e213c2498..eb9632c59 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -81,6 +81,16 @@ const phone = { messageType: null, }; +const SETTINGS_FILE = "marioclock.json"; + +function readSettings() { + return require('Storage').readJSON(SETTINGS_FILE, 1) || {}; +} + +function writeSettings(newSettings) { + require("Storage").writeJSON(SETTINGS_FILE, newSettings); +} + function phoneOutbound(msg) { Bluetooth.println(JSON.stringify(msg)); } @@ -567,8 +577,31 @@ function startTimers(){ redraw(); } +function loadSettings() { + const settings = readSettings(); + if (!settings) return; + + if (settings.character) characterSprite.character = settings.character; + if (settings.nightMode) nightMode = settings.nightMode; + if (settings.brightness) { + brightness = settings.brightness; + Bangle.setLCDBrightness(brightness); + } +} + +function updateSettings() { + const newSettings = { + character: characterSprite.character, + nightMode: nightMode, + brightness: brightness, + }; + writeSettings(newSettings); +} + // Main function init() { + loadSettings(); + clearInterval(); // Initialise display @@ -618,6 +651,8 @@ function init() { default: toggleNightMode(); } + + updateSettings(); }); // Phone connectivity From cf58c0eb5f93c27966a98e4c7cd97040e4ddf751 Mon Sep 17 00:00:00 2001 From: Fabio Date: Sat, 11 Apr 2020 13:03:45 +0200 Subject: [PATCH 20/39] bledetect fixed issue with wrong device informations --- apps/bledetect/ChangeLog | 3 ++- apps/bledetect/bledetect.js | 16 ++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/apps/bledetect/ChangeLog b/apps/bledetect/ChangeLog index 9352c7b96..cd5ce5845 100644 --- a/apps/bledetect/ChangeLog +++ b/apps/bledetect/ChangeLog @@ -1 +1,2 @@ -0.01: Initial Release \ No newline at end of file +0.01: Initial Release +0.02: Fixed issue with wrong device informations \ No newline at end of file diff --git a/apps/bledetect/bledetect.js b/apps/bledetect/bledetect.js index dde3ee9eb..6f5f5fa30 100644 --- a/apps/bledetect/bledetect.js +++ b/apps/bledetect/bledetect.js @@ -9,7 +9,6 @@ function showMainMenu() { } function showDeviceInfo(device){ - console.log(device); const deviceMenu = { "": { "title": "Device Info" }, "name": { @@ -24,13 +23,7 @@ function showDeviceInfo(device){ }; deviceMenu[device.id] = () => {}; - deviceMenu["< Back"] = () => scan(); - - /*for(let key in device){ - deviceMenu[key.substring(0,17)] = { - value: device[key.substring(0,17)] - }; - }*/ + deviceMenu["< Back"] = () => showMainMenu(); return E.showMenu(deviceMenu); } @@ -44,7 +37,7 @@ function scan() { waitMessage(); NRF.findDevices(devices => { - for (let device of devices) { + devices.forEach(device =>{ let deviceName = device.id.substring(0,17); if (device.name) { @@ -52,7 +45,7 @@ function scan() { } menu[deviceName] = () => showDeviceInfo(device); - } + }); showMainMenu(menu); }, { active: true }); } @@ -63,5 +56,4 @@ function waitMessage() { } scan(); -waitMessage(); - +waitMessage(); \ No newline at end of file From c368bcdb89f63925a85bb236c1c5f82152586e5f Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Sat, 11 Apr 2020 13:26:02 +0200 Subject: [PATCH 21/39] Update app.json with bledetect new version. --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 9071c269f..fc60cb276 100644 --- a/apps.json +++ b/apps.json @@ -1163,7 +1163,7 @@ "name": "BLE Detector", "shortName":"BLE Detector", "icon": "bledetect.png", - "version":"0.01", + "version":"0.02", "description": "Detect BLE devices and show some informations.", "tags": "app,bluetooth,tool", "storage": [ From cffe04a54e41fce6be2fbcc11573769f2e03a2e9 Mon Sep 17 00:00:00 2001 From: ps-igel <60899838+ps-igel@users.noreply.github.com> Date: Sat, 11 Apr 2020 15:37:40 +0200 Subject: [PATCH 22/39] add ChangeLog --- apps/numerals/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/numerals/ChangeLog diff --git a/apps/numerals/ChangeLog b/apps/numerals/ChangeLog new file mode 100644 index 000000000..1dfcf61a6 --- /dev/null +++ b/apps/numerals/ChangeLog @@ -0,0 +1 @@ +0.01: new awesome clock \ No newline at end of file From fc801b29de7f1a0eb0d86cdc9d350f1b8841d38e Mon Sep 17 00:00:00 2001 From: ps-igel <60899838+ps-igel@users.noreply.github.com> Date: Sat, 11 Apr 2020 18:22:48 +0200 Subject: [PATCH 23/39] update --- apps/numerals/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/numerals/ChangeLog b/apps/numerals/ChangeLog index 1dfcf61a6..5560f00bc 100644 --- a/apps/numerals/ChangeLog +++ b/apps/numerals/ChangeLog @@ -1 +1 @@ -0.01: new awesome clock \ No newline at end of file +0.01: New App! From 3f08eee070e36cdfcd8552f75ac55293d1700324 Mon Sep 17 00:00:00 2001 From: Fabio Date: Sat, 11 Apr 2020 21:04:16 +0200 Subject: [PATCH 24/39] Changelog update and README.md --- apps.json | 1 + apps/bledetect/ChangeLog | 2 +- apps/bledetect/README.md | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 apps/bledetect/README.md diff --git a/apps.json b/apps.json index fc60cb276..56a6b69d3 100644 --- a/apps.json +++ b/apps.json @@ -1166,6 +1166,7 @@ "version":"0.02", "description": "Detect BLE devices and show some informations.", "tags": "app,bluetooth,tool", + "readme": "README.md", "storage": [ {"name":"bledetect.app.js","url":"bledetect.js"}, {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} diff --git a/apps/bledetect/ChangeLog b/apps/bledetect/ChangeLog index cd5ce5845..520ccfa2f 100644 --- a/apps/bledetect/ChangeLog +++ b/apps/bledetect/ChangeLog @@ -1,2 +1,2 @@ -0.01: Initial Release +0.01: New App! 0.02: Fixed issue with wrong device informations \ No newline at end of file diff --git a/apps/bledetect/README.md b/apps/bledetect/README.md new file mode 100644 index 000000000..1f0c0a7a4 --- /dev/null +++ b/apps/bledetect/README.md @@ -0,0 +1,14 @@ +# BLE Detector + +BLE Detector it's an app born for testing purpose that aim to show as informations as possible about near BLE devices. + +## Features + +BLE Detector shows: + +- Device name (if available) +- Received Signal Strength Indication (RSSI) +- Manufacturer +- MAC Address + +More informations will coming with future versions. From 437b94d166c52a14e1cf748c4e3c0dbb0b888573 Mon Sep 17 00:00:00 2001 From: unmotivagedgene Date: Sat, 11 Apr 2020 14:53:52 -0500 Subject: [PATCH 25/39] Create changelog.txt --- apps/nato/changelog.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/nato/changelog.txt diff --git a/apps/nato/changelog.txt b/apps/nato/changelog.txt new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/nato/changelog.txt @@ -0,0 +1 @@ +0.01: New App! From da2c2dba593be534d3ef0c8c691746c02c99ae86 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 12 Apr 2020 01:11:47 +0200 Subject: [PATCH 26/39] Sanity check: fix warning about app without id, check for unknown keys --- bin/sanitycheck.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index a2c9dee9a..62b111ae0 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -37,7 +37,13 @@ try{ ERROR("apps.json not valid JSON"); } -apps.forEach((app,addIdx) => { +const APP_KEYS = [ + 'id', 'name', 'shortName', 'version', 'icon', 'description', 'tags', 'type', + 'sortorder', 'readme', 'custom', 'interface', 'storage', 'allow_emulator', +]; +const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate']; + +apps.forEach((app,appIdx) => { if (!app.id) ERROR(`App ${appIdx} has no id`); //console.log(`Checking ${app.id}...`); var appDir = APPSDIR+app.id+"/"; @@ -105,9 +111,15 @@ apps.forEach((app,addIdx) => { ERROR(`App ${app.id}'s ${file.name} is a JS file but isn't valid JS`); } } + for (const key in file) { + if (!STORAGE_KEYS.includes(key)) ERROR(`App ${app.id}'s ${file.name} has unknown key ${key}`); + } }); //console.log(fileNames); if (isApp && !fileNames.includes(app.id+".app.js")) ERROR(`App ${app.id} has no entrypoint`); if (isApp && !fileNames.includes(app.id+".img")) ERROR(`App ${app.id} has no JS icon`); if (app.type=="widget" && !fileNames.includes(app.id+".wid.js")) ERROR(`Widget ${app.id} has no entrypoint`); + for (const key in app) { + if (!APP_KEYS.includes(key)) ERROR(`App ${app.id} has unknown key ${key}`); + } }); From f5246a4212dff6a7c18c640539ff261846ac2ca7 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 12 Apr 2020 01:29:57 +0200 Subject: [PATCH 27/39] Some minor settings fixes --- apps.json | 2 +- apps/setting/ChangeLog | 2 ++ apps/setting/settings.js | 14 +++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index d85739aad..a8390b927 100644 --- a/apps.json +++ b/apps.json @@ -119,7 +119,7 @@ { "id": "setting", "name": "Settings", "icon": "settings.png", - "version":"0.12", + "version":"0.13", "description": "A menu for setting up Bangle.js", "tags": "tool,system", "storage": [ diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 22277968c..3ca9dc3ec 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -12,3 +12,5 @@ 0.12: Fix memory leak (#206) Bring App settings nearer the top Move LCD Timeout to wakeup menu +0.13: Fix memory leak for App settings + Make capitalization more consistent diff --git a/apps/setting/settings.js b/apps/setting/settings.js index ac7692610..f1dc81ca9 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -64,7 +64,7 @@ function showMainMenu() { const mainmenu = { '': { 'title': 'Settings' }, 'Make Connectable': ()=>makeConnectable(), - 'App/widget settings': ()=>showAppSettingsMenu(), + 'App/Widget Settings': ()=>showAppSettingsMenu(), 'BLE': { value: settings.ble, format: boolFormat, @@ -81,7 +81,7 @@ function showMainMenu() { updateSettings(); } }, - 'Debug info': { + 'Debug Info': { value: settings.log, format: v => v ? "Show" : "Hide", onchange: () => { @@ -157,7 +157,7 @@ function showWakeUpMenu() { Bangle.setLCDTimeout(settings.timeout); } }, - 'Wake On BTN1': { + 'Wake on BTN1': { value: settings.options.wakeOnBTN1, format: boolFormat, onchange: () => { @@ -165,7 +165,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On BTN2': { + 'Wake on BTN2': { value: settings.options.wakeOnBTN2, format: boolFormat, onchange: () => { @@ -173,7 +173,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On BTN3': { + 'Wake on BTN3': { value: settings.options.wakeOnBTN3, format: boolFormat, onchange: () => { @@ -197,7 +197,7 @@ function showWakeUpMenu() { updateOptions(); } }, - 'Wake On Twist': { + 'Wake on Twist': { value: settings.options.wakeOnTwist, format: boolFormat, onchange: () => { @@ -450,7 +450,7 @@ function showAppSettings(app) { } try { // pass showAppSettingsMenu as "back" argument - appSettings(showAppSettingsMenu); + appSettings(()=>showAppSettingsMenu()); } catch (e) { console.log(`${app.name} settings error:`, e) return showError('Error in settings'); From 1c68ea0d1bbd6e16e12662e53876e7e723935190 Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Sun, 12 Apr 2020 14:43:52 +0100 Subject: [PATCH 28/39] Display info message when phone (dis)connectes and battery level <= 10% --- apps.json | 2 +- apps/marioclock/ChangeLog | 3 ++- apps/marioclock/marioclock-app.js | 30 +++++++++++++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 73a093a2c..6c7364a03 100644 --- a/apps.json +++ b/apps.json @@ -914,7 +914,7 @@ { "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version":"0.11", + "version":"0.12", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", diff --git a/apps/marioclock/ChangeLog b/apps/marioclock/ChangeLog index 6f3c79504..69a3ccc7b 100644 --- a/apps/marioclock/ChangeLog +++ b/apps/marioclock/ChangeLog @@ -8,4 +8,5 @@ 0.08: Update date panel to be info panel toggling between Date, Battery and Temperature. Add Princes Daisy 0.09: Add GadgetBridge functionality. Mario shows message type in speach bubble, while message scrolls in info panel 0.10: Swiping left to enable night-mode now also reduces LCD brightness through 3 levels before returning to day-mode. -0.11: User settings persisted and read to file. \ No newline at end of file +0.11: User settings persisted and read to file. +0.12: Add info banner message when phone (dis)connects. Display low-battery warning (<=10%) \ No newline at end of file diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index eb9632c59..4acbf384b 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -346,16 +346,20 @@ function drawToadFrame(idx, x, y) { function drawNotice(x, y) { if (phone.message === null) return; + let img; switch (phone.messageType) { case "call": - const callImg = require("heatshrink").decompress(atob("h8PxH+AAMHABIND6wAJB4INEw9cAAIPFBxAPEBw/WBxYACDrQ7QLI53OSpApDBoQAHB4INLByANNAwo=")); - g.drawImage(callImg, characterSprite.x, characterSprite.y - 16); + img = require("heatshrink").decompress(atob("h8PxH+AAMHABIND6wAJB4INEw9cAAIPFBxAPEBw/WBxYACDrQ7QLI53OSpApDBoQAHB4INLByANNAwo=")); break; case "notify": - const msgImg = require("heatshrink").decompress(atob("h8PxH+AAMHABIND6wAJB4INCrgAHB4QOEDQgOIAIQFGBwovDA4gOGFooOVLJR3OSpApDBoQAHB4INLByANNAwoA=")); - g.drawImage(msgImg, characterSprite.x, characterSprite.y - 16); + img = require("heatshrink").decompress(atob("h8PxH+AAMHABIND6wAJB4INCrgAHB4QOEDQgOIAIQFGBwovDA4gOGFooOVLJR3OSpApDBoQAHB4INLByANNAwoA=")); + break; + case "lowBatt": + img = require("heatshrink").decompress(atob("h8PxH+AAMHABIND6wAJB4INFrgABB4oOEBoQPFBwwDGB0uHAAIOLJRB3OSpApDBoQAHB4INLByANNAwo")); break; } + + g.drawImage(img, characterSprite.x, characterSprite.y - 16); } function drawCharacter(date, character) { @@ -598,6 +602,14 @@ function updateSettings() { writeSettings(newSettings); } +function checkBatteryLevel() { + if (Bangle.isCharging()) return; + if (E.getBattery() > 10) return; + if (phone.message !== null) return; + + phoneNewMessage("lowBatt", "Warning, battery is low"); +} + // Main function init() { loadSettings(); @@ -658,17 +670,25 @@ function init() { // Phone connectivity try { NRF.wake(); } catch (e) {} - NRF.on('disconnect', () => Bangle.buzz()); + NRF.on('disconnect', () => { + Bangle.buzz(); + phoneNewMessage(null, "Phone disconnected"); + }); + NRF.on('connect', () => { setTimeout(() => { phoneOutbound({ t: "status", bat: E.getBattery() }); }, ONE_SECOND * 2); Bangle.buzz(); + phoneNewMessage(null, "Phone connected"); }); GB = (evt) => phoneInbound(evt); startTimers(); + + setInterval(checkBatteryLevel, ONE_SECOND * 60 * 10); + checkBatteryLevel(); } // Initialise! From 65f5a46dd95d5c63b27a0a8ee958d432f082ea84 Mon Sep 17 00:00:00 2001 From: Purple-Tentacle <59914607+Purple-Tentacle@users.noreply.github.com> Date: Mon, 13 Apr 2020 12:53:38 +0200 Subject: [PATCH 29/39] Create ChangeLog --- apps/activepedom/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/activepedom/ChangeLog diff --git a/apps/activepedom/ChangeLog b/apps/activepedom/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/activepedom/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! From 0cee31908614af8b8e02f7c9fd1f12073c95a2ab Mon Sep 17 00:00:00 2001 From: Purple-Tentacle <59914607+Purple-Tentacle@users.noreply.github.com> Date: Mon, 13 Apr 2020 13:04:18 +0200 Subject: [PATCH 30/39] Initial transfer --- apps/activepedom/10600.png | Bin 0 -> 370 bytes apps/activepedom/1600.png | Bin 0 -> 374 bytes apps/activepedom/600.png | Bin 0 -> 338 bytes apps/activepedom/README.md | 38 ++++++++ apps/activepedom/app-icon.js | 1 + apps/activepedom/app.png | Bin 0 -> 836 bytes apps/activepedom/settings.js | 81 ++++++++++++++++ apps/activepedom/widget.js | 180 +++++++++++++++++++++++++++++++++++ 8 files changed, 300 insertions(+) create mode 100644 apps/activepedom/10600.png create mode 100644 apps/activepedom/1600.png create mode 100644 apps/activepedom/600.png create mode 100644 apps/activepedom/README.md create mode 100644 apps/activepedom/app-icon.js create mode 100644 apps/activepedom/app.png create mode 100644 apps/activepedom/settings.js create mode 100644 apps/activepedom/widget.js diff --git a/apps/activepedom/10600.png b/apps/activepedom/10600.png new file mode 100644 index 0000000000000000000000000000000000000000..36de436df0021f74082396aab83d959120af1fc5 GIT binary patch literal 370 zcmV-&0ge8NP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0S8G$K~z{r?Um6E zgCGn=+2Vu$|Fu4tY}8Rx8ZJsPW;C9pK??|$J0qJFSh zwJEg-q^^!TJ6|J?E1{J|${}S@{81&0m2!AHkrHI2M57uT*7(kK9ah4qL^G^>X9XCC zm9WyPD34>~cq1+Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0Sie)K~z{r?UmaO z!ypJi-O`7Cwx8XHCYvmhDGKUlt<|1{*uvx@mOYeGFC#~PSMJ9Pc#?w$3f$8@rAr5`=*eiI>q^;c6_G@ z`AqshRSKLece?)oopD8oGuiY@!QE-x&)E?!4&9gX7qL$|{VoVw)V6PGT~_<{1@wSx zLmiN#ZvhnLiAm-oF}Xc U&O83Y0{{R307*qoM6N<$f?Z6Z`Tzg` literal 0 HcmV?d00001 diff --git a/apps/activepedom/600.png b/apps/activepedom/600.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c625c709002faa5e3e5207e0caa12782fe1d9 GIT binary patch literal 338 zcmV-Y0j>UtP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0Ov_WK~z{r-IdV} z!ypJn-O`7Cc0aohO*(13hEj2oY^`zBSl+OwdPlF{`^8AX;833oOi^Eb=Ix< z4Y=t@{U4EN>is*v0p}eVkm5nsZ9V)v&4(utBU<85KnKYd3p?#)jMms|@h9wbM`9t_ zW6hyhNp&rLCzs1k1;I*(>6PYJtLJVIm&?w(zzej-@5asZn@5Y3MF(QJU*xBe^AR;z`8dFFL zUsbR>Fo;!9EEKUY+GwFz*~Jh=379B|Xkj6W8t)RLCYKaGh{f!Zz1f-B$?ap3KYZk| z|M|Y(cQZRXdyu~JzyMJ8;xUlRpl%|%2+V4t$03)M^626HSkN;uKy(BB&gd*OMRWs` zaf{T(O%PMFaTBE3zzYk{aEkR~D@XJaI^c}XQa$M5FF53ymvV^RX3C3x7QrXK=v4Oj831Y|-y`(Ee+f6AiE4qTQt>jdQS#LQW9S>WA^klD>`fmZ&M06`DSVq0 zzF=$sN{asv0f$KO-9#=rs3~^b0RPGJ^cpD^$2Dk^Frv>r7kZGn$ zKu3}dv?I$NL4Kg zfMBeS7{3Pb3@IXJr8g~5lU|~4;Iw6qdSH1fbQU^{zJXuBdRJgJs`q{t&^K}437Mt( zfK}e_1@uj{xqypO9pY#)g1DJM-^546%g}<-4(0$~F*g(4sGGR!fYGQER07(}L}%ud z23;czxIJ*aptwE(G-OI?&@h#7PZS>2ayph3ph>$BFX=(BBO31=$@e@9K$BJ?j=({v zabT&&znkzZw5E@#*F6Q$(TFi4lK*O&fF^YjhQDbs?xZy4Ck}4rR>H^MHZ@bSDW;E(H;iWU*PcZo8_9K(;h&mO8`>M<}B<0EEX8tM_eM|K( zA01MzViJH+8VwYjA>JO|0DKSR8;wn8p*-*zF%wCg>)U{D2>5)pN&W+*T-arpW9jGs O0000 { + var stepTimeDiff = 9999; //Time difference between two steps + var startTimeStep = new Date(); //set start time + var stopTimeStep = 0; //Time after one step + var timerResetActive = 0; //timer to reset active + var steps = 0; //steps taken + var stepsCounted = 0; //active steps counted + var active = 0; //x steps in y seconds achieved + var stepGoalPercent = 0; //percentage of step goal + var stepGoalBarLength = 0; //length og progress bar + var lastUpdate = new Date(); + var width = 45; + + var stepsTooShort = 0; + var stepsTooLong = 0; + var stepsOutsideTime = 0; + + //define default settings + const DEFAULTS = { + 'cMaxTime' : 1100, + 'cMinTime' : 240, + 'stepThreshold' : 30, + 'intervalResetActive' : 30000, + 'stepSensitivity' : 80, + 'stepGoal' : 10000, + }; + const SETTINGS_FILE = 'activepedom.settings.json'; + const PEDOMFILE = "activepedom.steps.json"; + + let settings; + //load settings + function loadSettings() { + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; + } + //return setting + function setting(key) { + if (!settings) { loadSettings(); } + return (key in settings) ? settings[key] : DEFAULTS[key]; + } + + function setStepSensitivity(s) { + function sqr(x) { return x*x; } + var X=sqr(8192-s); + var Y=sqr(8192+s); + Bangle.setOptions({stepCounterThresholdLow:X,stepCounterThresholdHigh:Y}); + } + + //format number to make them shorter + function kFormatter(num) { + if (num <= 999) return num; //smaller 1.000, return 600 as 600 + if (num >= 1000 && num < 10000) { //between 1.000 and 10.000 + num = Math.floor(num/100)*100; + return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; //return 1600 as 1.6k + } + if (num >= 10000) { //greater 10.000 + num = Math.floor(num/1000)*1000; + return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; //return 10.600 as 10k + } + } + + //Set Active to 0 + function resetActive() { + active = 0; + steps = 0; + if (Bangle.isLCDOn()) WIDGETS["activepedom"].draw(); + } + + function calcSteps() { + stopTimeStep = new Date(); //stop time after each step + stepTimeDiff = stopTimeStep - startTimeStep; //time between steps in milliseconds + startTimeStep = new Date(); //start time again + + //Remove step if time between first and second step is too long + if (stepTimeDiff >= setting('cMaxTime')) { //milliseconds + stepsTooLong++; //count steps which are note counted, because time too long + steps--; + } + + //Remove step if time between first and second step is too short + if (stepTimeDiff <= setting('cMinTime')) { //milliseconds + stepsTooShort++; //count steps which are note counted, because time too short + steps--; + } + + if (steps >= setting('stepThreshold')) { + if (active == 0) { + stepsCounted = stepsCounted + (stepThreshold -1) ; //count steps needed to reach active status, last step is counted anyway, so treshold -1 + stepsOutsideTime = stepsOutsideTime - 10; //substract steps needed to reac active status + } + active = 1; + clearInterval(timerResetActive); //stop timer which resets active + timerResetActive = setInterval(resetActive, setting('intervalResetActive')); //reset active after timer runs out + steps = 0; + } + + if (active == 1) { + stepsCounted++; //count steps + } + else { + stepsOutsideTime++; + } + } + + function draw() { + var height = 23; //width is deined globally + var stepsDisplayLarge = kFormatter(stepsCounted); + + //Check if same day + let date = new Date(); + if (lastUpdate.getDate() == date.getDate()){ //if same day + } + else { + stepsCounted = 1; //set stepcount to 1 + } + lastUpdate = date; + + g.reset(); + g.clearRect(this.x, this.y, this.x+width, this.y+height); + + //draw numbers + if (active == 1) g.setColor(0x07E0); //green + else g.setColor(0xFFFF); //white + g.setFont("6x8", 2); + g.drawString(stepsDisplayLarge,this.x+1,this.y); //first line, big number + g.setFont("6x8", 1); + g.setColor(0xFFFF); //white + g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number + + //draw step goal bar + stepGoalPercent = (stepsCounted / setting('stepGoal')) * 100; + stepGoalBarLength = width / 100 * stepGoalPercent; + if (stepGoalBarLength > width) stepGoalBarLength = width; //do not draw across width of widget + g.setColor(0x7BEF); //grey + g.fillRect(this.x, this.y+height, this.x+width, this.y+height); // draw background bar + g.setColor(0xFFFF); //white + g.fillRect(this.x, this.y+height, this.x+1, this.y+height-1); //draw start of bar + g.fillRect(this.x+width, this.y+height, this.x+width-1, this.y+height-1); //draw end of bar + g.fillRect(this.x, this.y+height, this.x+stepGoalBarLength, this.y+height); // draw progress bar + } + + //This event is called just before the device shuts down for commands such as reset(), load(), save(), E.reboot() or Bangle.off() + E.on('kill', () => { + let d = { //define array to write to file + lastUpdate : lastUpdate.toISOString(), + stepsToday : stepsCounted, + stepsTooShort : stepsTooShort, + stepsTooLong : stepsTooLong, + stepsOutsideTime : stepsOutsideTime + }; + require("Storage").write(PEDOMFILE,d); //write array to file + }); + + //When Step is registered by firmware + Bangle.on('step', (up) => { + steps++; //increase step count + calcSteps(); + if (Bangle.isLCDOn()) WIDGETS["activepedom"].draw(); + }); + + // redraw when the LCD turns on + Bangle.on('lcdPower', function(on) { + if (on) WIDGETS["activepedom"].draw(); + }); + + //Read data from file and set variables + let pedomData = require("Storage").readJSON(PEDOMFILE,1); + if (pedomData) { + if (pedomData.lastUpdate) lastUpdate = new Date(pedomData.lastUpdate); + stepsCounted = pedomData.stepsToday|0; + stepsTooShort = pedomData.stepsTooShort; + stepsTooLong = pedomData.stepsTooLong; + stepsOutsideTime = pedomData.stepsOutsideTime; + } + + setStepSensitivity(setting('stepSensitivity')); //set step sensitivity (80 is standard, 400 is muss less sensitive) + + //Add widget + WIDGETS["activepedom"]={area:"tl",width:width,draw:draw}; + +})(); \ No newline at end of file From 43d0f455a7d730632f6b8b00cc464cd959fd7025 Mon Sep 17 00:00:00 2001 From: Purple-Tentacle <59914607+Purple-Tentacle@users.noreply.github.com> Date: Mon, 13 Apr 2020 13:09:30 +0200 Subject: [PATCH 31/39] Active Pedometer --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index e9ba66804..49e2bad6a 100644 --- a/apps.json +++ b/apps.json @@ -1107,6 +1107,19 @@ {"name":"openstmap.app.js","url":"app.js"}, {"name":"openstmap.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "activepedom", + "name": "Active Pedometer", + "shortName":"activepedom", + "icon": "app.png", + "version":"0.01", + "description": "Pedometer that filters out arm movement and displays a step goal progress.", + "tags": "outdoors,widget", + "storage": [ + {"name":"activepedom.wid.js","url":"widget.js"}, + {"name":"activepedom.settings.js","url":"settings.js"}, + {"name":"activepedom.img","url":"app-icon.js","evaluate":true} + ] }, { "id": "tabata", "name": "Tabata", From 1bb6af5ad50833b8cd6a2ae29c34b3061e5911c8 Mon Sep 17 00:00:00 2001 From: Purple-Tentacle <59914607+Purple-Tentacle@users.noreply.github.com> Date: Mon, 13 Apr 2020 13:19:45 +0200 Subject: [PATCH 32/39] added type widget --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 49e2bad6a..a0b1a56aa 100644 --- a/apps.json +++ b/apps.json @@ -1115,6 +1115,7 @@ "version":"0.01", "description": "Pedometer that filters out arm movement and displays a step goal progress.", "tags": "outdoors,widget", + "type":"widget", "storage": [ {"name":"activepedom.wid.js","url":"widget.js"}, {"name":"activepedom.settings.js","url":"settings.js"}, From 477e6f07609a6a80a69cc9265732699d544a3c53 Mon Sep 17 00:00:00 2001 From: fredericrous Date: Mon, 13 Apr 2020 03:10:18 +0100 Subject: [PATCH 33/39] Add App Calculator --- apps.json | 12 + apps/calculator/ChangeLog | 1 + apps/calculator/app.js | 352 +++++++++++++++++++++++++++++ apps/calculator/calculator-icon.js | 1 + apps/calculator/calculator.info | 1 + apps/calculator/calculator.png | Bin 0 -> 10312 bytes 6 files changed, 367 insertions(+) create mode 100644 apps/calculator/ChangeLog create mode 100644 apps/calculator/app.js create mode 100644 apps/calculator/calculator-icon.js create mode 100644 apps/calculator/calculator.info create mode 100644 apps/calculator/calculator.png diff --git a/apps.json b/apps.json index d85739aad..77239e39e 100644 --- a/apps.json +++ b/apps.json @@ -1158,5 +1158,17 @@ {"name":"batchart.app.js","url":"app.js"}, {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "calculator", + "name": "Calculator", + "shortName":"Calculator", + "icon": "calculator.png", + "version":"0.01", + "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus. Push button1 and 3 to navigate up/down, tap right or left to navigate the sides, push button 2 to select.", + "tags": "app,tool", + "storage": [ + {"name":"calculator.app.js","url":"app.js"}, + {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} + ] } ] diff --git a/apps/calculator/ChangeLog b/apps/calculator/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/calculator/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/calculator/app.js b/apps/calculator/app.js new file mode 100644 index 000000000..91dd7c49d --- /dev/null +++ b/apps/calculator/app.js @@ -0,0 +1,352 @@ +/** + * BangleJS Calculator + * + * Original Author: Frederic Rousseau https://github.com/fredericrous + * Created: April 2020 + */ + +g.clear(); +Graphics.prototype.setFont7x11Numeric7Seg = function() { + this.setFontCustom(atob("ACAB70AYAwBgC94AAAAAAAAAAB7wAAPQhhDCGELwAAAAhDCGEMIXvAAeACAEAIAQPeAA8CEMIYQwhA8AB70IYQwhhCB4AAAIAQAgBAB7wAHvQhhDCGEL3gAPAhDCGEMIXvAAe9CCEEIIQPeAA94EIIQQghA8AB70AYAwBgCAAAAHgQghBCCF7wAHvQhhDCGEIAAAPehBCCEEIAAAAA=="), 46, atob("AgAHBwcHBwcHBwcHAAAAAAAAAAcHBwcHBw=="), 11); +}; + +var DEFAULT_SELECTION = '5'; +var BOTTOM_MARGIN = 10; +var RIGHT_MARGIN = 20; +var COLORS = { + // [normal, selected] + DEFAULT: ['#7F8183', '#A6A6A7'], + OPERATOR: ['#F99D1C', '#CA7F2A'], + SPECIAL: ['#65686C', '#7F8183'] +}; + +var keys = { + '0': { + xy: [0, 200, 120, 240], + trbl: '2.00' + }, + '.': { + xy: [120, 200, 180, 240], + trbl: '3=.0' + }, + '=': { + xy: [181, 200, 240, 240], + trbl: '+==.', + color: COLORS.OPERATOR + }, + '1': { + xy: [0, 160, 60, 200], + trbl: '4201' + }, + '2': { + xy: [60, 160, 120, 200], + trbl: '5301' + }, + '3': { + xy: [120, 160, 180, 200], + trbl: '6+.2' + }, + '+': { + xy: [181, 160, 240, 200], + trbl: '-+=3', + color: COLORS.OPERATOR + }, + '4': { + xy: [0, 120, 60, 160], + trbl: '7514' + }, + '5': { + xy: [60, 120, 120, 160], + trbl: '8624' + }, + '6': { + xy: [120, 120, 180, 160], + trbl: '9-35' + }, + '-': { + xy: [181, 120, 240, 160], + trbl: '*-+6', + color: COLORS.OPERATOR + }, + '7': { + xy: [0, 80, 60, 120], + trbl: 'R847' + }, + '8': { + xy: [60, 80, 120, 120], + trbl: 'N957' + }, + '9': { + xy: [120, 80, 180, 120], + trbl: '%*68' + }, + '*': { + xy: [181, 80, 240, 120], + trbl: '/*-9', + color: COLORS.OPERATOR + }, + 'R': { + xy: [0, 40, 60, 79], + trbl: 'RN7R', + color: COLORS.SPECIAL, + val: 'AC' + }, + 'N': { + xy: [60, 40, 120, 79], + trbl: 'N%8R', + color: COLORS.SPECIAL, + val: '+/-' + }, + '%': { + xy: [120, 40, 180, 79], + trbl: '%/9N', + color: COLORS.SPECIAL + }, + '/': { + xy: [181, 40, 240, 79], + trbl: '//*%', + color: COLORS.OPERATOR + } +}; + +var selected = DEFAULT_SELECTION; +var prevSelected = DEFAULT_SELECTION; +var prevNumber = null; +var currNumber = null; +var operator = null; +var results = null; +var isDecimal = false; +var hasPressedEquals = false; + +function drawKey(name, k, selected) { + var rMargin = 0; + var bMargin = 0; + var color = k.color || COLORS.DEFAULT; + g.setColor(color[selected ? 1 : 0]); + g.setFont('Vector', 20); + g.fillRect(k.xy[0], k.xy[1], k.xy[2], k.xy[3]); + g.setColor(-1); + // correct margins to center the texts + if (name == '0') { + rMargin = (RIGHT_MARGIN * 2) - 7; + } else if (name === '/') { + rMargin = 5; + } else if (name === '*') { + bMargin = 5; + rMargin = 3; + } else if (name === '-') { + rMargin = 3; + } else if (name === 'R' || name === 'N') { + rMargin = k.val === 'C' ? 0 : -9; + } else if (name === '%') { + rMargin = -3; + } + g.drawString(k.val || name, k.xy[0] + RIGHT_MARGIN + rMargin, k.xy[1] + BOTTOM_MARGIN + bMargin); +} + +function doMath(x, y, operator) { + // might not be a number due to display of dot "." algo + x = Number(x); + y = Number(y); + switch (operator) { + case '/': + return x / y; + case '*': + return x * y; + case '+': + return x + y; + case '-': + return x - y; + } +} + +function displayOutput(num) { + var len; + var minusMarge = 0; + g.setColor(0); + g.fillRect(0, 0, 240, 39); + g.setColor(-1); + if (num === Infinity || num === -Infinity || isNaN(num)) { + // handle division by 0 + if (num === Infinity) { + num = 'INFINITY'; + } else if (num === -Infinity) { + num = '-INFINITY'; + } else { + num = 'NOT A NUMBER'; + minusMarge = -25; + } + len = (num + '').length; + currNumber = null; + results = null; + isDecimal = false; + hasPressedEquals = false; + prevNumber = null; + operator = null; + keys.R.val = 'AC'; + drawKey('R', keys.R); + g.setFont('Vector', 22); + } else { + // might not be a number due to display of dot "." + var numNumeric = Number(num); + + if (typeof num === 'string') { + if (num.indexOf('.') !== -1) { + // display a 0 before a lonely dot + if (numNumeric == 0) { + num = '0.'; + } + } else { + // remove preceding 0 + while (num.length > 1 && num[0] === '0') + num = num.substr(1); + } + } + + len = (num + '').length; + if (numNumeric < 0) { + // minus is not available in font 7x11Numeric7Seg, we use Vector + g.setFont('Vector', 20); + g.drawString('-', 220 - (len * 15), 10); + minusMarge = 15; + } + g.setFont('7x11Numeric7Seg', 2); + } + g.drawString(num, 220 - (len * 15) + minusMarge, 10); +} + +function calculatorLogic(x) { + if (hasPressedEquals) { + currNumber = results; + prevNumber = null; + operator = null; + results = null; + isDecimal = null; + displayOutput(currNumber); + hasPressedEquals = false; + } + if (prevNumber != null && currNumber != null && operator != null) { + // we execute the calculus only when there was a previous number entered before and an operator + results = doMath(prevNumber, currNumber, operator); + operator = x; + prevNumber = results; + currNumber = null; + displayOutput(results); + } else if (prevNumber == null && currNumber != null && operator == null) { + // no operator yet, save the current number for later use when an operator is pressed + operator = x; + prevNumber = currNumber; + currNumber = null; + displayOutput(prevNumber); + } else if (prevNumber == null && currNumber == null && operator == null) { + displayOutput(0); + } +} + +function buttonPress(val) { + switch (val) { + case 'R': + currNumber = null; + results = null; + isDecimal = false; + hasPressedEquals = false; + if (keys.R.val == 'AC') { + prevNumber = null; + operator = null; + } else { + keys.R.val = 'AC'; + drawKey('R', keys.R); + } + displayOutput(0); + break; + case '%': + if (results != null) { + displayOutput(results /= 100); + } else if (currNumber != null) { + displayOutput(currNumber /= 100); + } + break; + case 'N': + if (results != null) { + displayOutput(results *= -1); + } else if (currNumber != null) { + displayOutput(currNumber *= -1); + } + break; + case '/': + case '*': + case '-': + case '+': + calculatorLogic(val); + break; + case '.': + keys.R.val = 'C'; + drawKey('R', keys.R); + isDecimal = true; + displayOutput(currNumber == null ? 0 + '.' : currNumber + '.'); + break; + case '=': + if (prevNumber != null && currNumber != null && operator != null) { + results = doMath(prevNumber, currNumber, operator); + prevNumber = results; + displayOutput(results); + hasPressedEquals = true; + } + break; + default: + keys.R.val = 'C'; + drawKey('R', keys.R); + if (isDecimal) { + currNumber = currNumber == null ? 0 + '.' + val : currNumber + '.' + val; + isDecimal = false; + } else { + currNumber = currNumber == null ? val : currNumber + val; + } + displayOutput(currNumber); + break; + } +} + +for (var k in keys) { + if (keys.hasOwnProperty(k)) { + drawKey(k, keys[k], k == '5'); + } +} +g.setFont('7x11Numeric7Seg', 2.8); +g.drawString('0', 205, 10); + + +setWatch(function() { + drawKey(selected, keys[selected]); + // key 0 is 2 keys wide, go up to 1 if it was previously selected + if (selected == '0' && prevSelected === '1') { + prevSelected = selected; + selected = '1'; + } else { + prevSelected = selected; + selected = keys[selected].trbl[0]; + } + drawKey(selected, keys[selected], true); +}, BTN1, {repeat: true, debounce: 100}); + +setWatch(function() { + drawKey(selected, keys[selected]); + prevSelected = selected; + selected = keys[selected].trbl[2]; + drawKey(selected, keys[selected], true); +}, BTN3, {repeat: true, debounce: 100}); + +Bangle.on('touch', function(direction) { + drawKey(selected, keys[selected]); + prevSelected = selected; + if (direction == 1) { + selected = keys[selected].trbl[3]; + } else if (direction == 2) { + selected = keys[selected].trbl[1]; + } + drawKey(selected, keys[selected], true); +}); + +setWatch(function() { + buttonPress(selected); +}, BTN2, {repeat: true, debounce: 100}); diff --git a/apps/calculator/calculator-icon.js b/apps/calculator/calculator-icon.js new file mode 100644 index 000000000..94158e7d2 --- /dev/null +++ b/apps/calculator/calculator-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwhBC/AC8r6/XlYvr64CEF9UrMIIv/R/7vTMwIAmlUklQGDroAFqwHGBRgJBqwMDq+k5nNABAWDC4QZFERAvGBQOBF5I0FCYNW1mImWs6+sDoQsDAYIJEAAeB2eB1mBA4QvF43P6/GF4mB6+BAQYlEro3BAAI3FDAezBYgvE43O64DBF4hbCAAMrGAIiFBYRUEHogaBxA6CF4vXLwPHF4giEDIIkDDgI2BFoI6FBgYWCF5PPF4rSBKwVWI4bAFFgdcYAykBX5HX53NFwfNfwIkDAQYAGBBAKCIIYABd4y9DAAJ9CAD9dF4gAGCIi8BABLXBBRQLEF4vHRwgvEERQ6DHpgvH66PB65fUBpZfJ4/G6wxBMIaPbL5QvB6/WF6hqNF5KPDF6jkGd6JeBF5AAdF4oAGDBeH1mHAAwIBF8esABQvdWQonDX4YvIYAq/GXobvNF4hfKCwwvF43GF5AXGL44vJLwgvE453DMIYuFR5JiHI4yPHRoaREIwpIFF7TvbR5BJCX5IvMADgvcroABF6vG4wvIX46DKBZYvEFwPHGAgZHERALRF4YuBHYIwEFxxfPF5CDDF6ZfLDAyPFFwovFKRYvV47vDAgIvRR5aOFL4orCFwbvHADYvEAA4YLdRYvQ45eBR5C6UF5vHX4LvJF8PGZYXXGAYvnLYYvfZ4xfXd6AvKGAK/RDAKNTF4wAG44=")) diff --git a/apps/calculator/calculator.info b/apps/calculator/calculator.info new file mode 100644 index 000000000..e8a760024 --- /dev/null +++ b/apps/calculator/calculator.info @@ -0,0 +1 @@ +{"name":"Calculator","src":"calculator.app.js","icon":"calculator.img"} diff --git a/apps/calculator/calculator.png b/apps/calculator/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..8362c9200facdad594bf07376e12eaf6d0c3550c GIT binary patch literal 10312 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 Date: Mon, 13 Apr 2020 14:26:53 +0200 Subject: [PATCH 34/39] Active Pedometer rename --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a0b1a56aa..3dbccb9b1 100644 --- a/apps.json +++ b/apps.json @@ -1110,7 +1110,7 @@ }, { "id": "activepedom", "name": "Active Pedometer", - "shortName":"activepedom", + "shortName":"Active Pedometer", "icon": "app.png", "version":"0.01", "description": "Pedometer that filters out arm movement and displays a step goal progress.", From 5bbb6bfc894c88922719801426c93c6ec0509f2a Mon Sep 17 00:00:00 2001 From: Purple-Tentacle <59914607+Purple-Tentacle@users.noreply.github.com> Date: Mon, 13 Apr 2020 14:57:47 +0200 Subject: [PATCH 35/39] Bugfix --- apps/activepedom/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js index ac07856fd..0c8b2438d 100644 --- a/apps/activepedom/widget.js +++ b/apps/activepedom/widget.js @@ -84,7 +84,7 @@ if (steps >= setting('stepThreshold')) { if (active == 0) { - stepsCounted = stepsCounted + (stepThreshold -1) ; //count steps needed to reach active status, last step is counted anyway, so treshold -1 + stepsCounted = stepsCounted + (setting('stepThreshold') -1) ; //count steps needed to reach active status, last step is counted anyway, so treshold -1 stepsOutsideTime = stepsOutsideTime - 10; //substract steps needed to reac active status } active = 1; From be10466ed14082f58923f80dfe1c55f2d6f3d6b2 Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Mon, 13 Apr 2020 14:33:22 +0100 Subject: [PATCH 36/39] Don't double-buzz, it throws an error!, Also only call drawImage if we have an image to draw --- apps/marioclock/marioclock-app.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/marioclock/marioclock-app.js b/apps/marioclock/marioclock-app.js index 4acbf384b..7601b89ba 100644 --- a/apps/marioclock/marioclock-app.js +++ b/apps/marioclock/marioclock-app.js @@ -359,7 +359,7 @@ function drawNotice(x, y) { break; } - g.drawImage(img, characterSprite.x, characterSprite.y - 16); + if (img) g.drawImage(img, characterSprite.x, characterSprite.y - 16); } function drawCharacter(date, character) { @@ -671,7 +671,6 @@ function init() { try { NRF.wake(); } catch (e) {} NRF.on('disconnect', () => { - Bangle.buzz(); phoneNewMessage(null, "Phone disconnected"); }); @@ -679,7 +678,6 @@ function init() { setTimeout(() => { phoneOutbound({ t: "status", bat: E.getBattery() }); }, ONE_SECOND * 2); - Bangle.buzz(); phoneNewMessage(null, "Phone connected"); }); From 0fa4b44990a9b8f63827b4185f318ced1ee2eb92 Mon Sep 17 00:00:00 2001 From: MaBecker Date: Tue, 14 Apr 2020 08:52:04 +0200 Subject: [PATCH 37/39] add favourite functionality * library select/unselect apps/widgets * as library section * as upload * deny unselect for boot and setting --- CHANGELOG.md | 1 + index.html | 4 +- js/index.js | 117 +++++++++++++++++++++++++++++++++++++++++---------- js/ui.js | 1 + js/utils.js | 13 ++++++ 5 files changed, 113 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1cd3d803..6368c2c46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,3 +7,4 @@ Changed for individual apps are listed in `apps/appname/ChangeLog` * Added optional `README.md` file for apps * Remove 2v04 version warning, add links in About to official/developer versions * Fix issue removing an app that was just installed (Fix #253) +* Add `Favourite` functionality diff --git a/index.html b/index.html index 0d5c17251..f016ffb49 100644 --- a/index.html +++ b/index.html @@ -96,6 +96,7 @@ +
@@ -134,7 +135,8 @@

Utilities

-

+ +

diff --git a/js/index.js b/js/index.js index d2c6d698b..ef9bcb4f1 100644 --- a/js/index.js +++ b/js/index.js @@ -1,6 +1,8 @@ var appJSON = []; // List of apps and info from apps.json var appsInstalled = []; // list of app JSON var files = []; // list of files on Bangle +var favourites = []; // list of user favourite app +const FAVOURITE = "favouriteapps.json"; httpGet("apps.json").then(apps=>{ try { @@ -18,7 +20,7 @@ httpGet("apps.json").then(apps=>{ function showChangeLog(appid) { var app = appNameToApp(appid); function show(contents) { - showPrompt(app.name+" Change Log",contents,{ok:true}).catch(()=>{});; + showPrompt(app.name+" Change Log",contents,{ok:true}).catch(()=>{}); } httpGet(`apps/${appid}/ChangeLog`). then(show).catch(()=>show("No Change Log available")); @@ -142,6 +144,20 @@ function handleAppInterface(app) { }); } +function handleAppFavourite(favourite, app){ + if (favourite) { + favourites = favourites.concat([app.id]); + } else { + if ([ "boot","setting"].includes(app.id)) { + showToast(app.name + ' is required, can\'t remove it' , 'warning'); + }else { + favourites = favourites.filter(e => e != app.id); + } + } + localStorage.setItem("favouriteapps.json", JSON.stringify(favourites)); + refreshLibrary(); +} + // =========================================== Top Navigation function showTab(tabname) { htmlToArray(document.querySelectorAll("#tab-navigate .tab-item")).forEach(tab => { @@ -156,7 +172,7 @@ function showTab(tabname) { // =========================================== Library -var chips = Array.from(document.querySelectorAll('.chip')).map(chip => chip.attributes.filterid.value) +var chips = Array.from(document.querySelectorAll('.chip')).map(chip => chip.attributes.filterid.value); var hash = window.location.hash ? window.location.hash.slice(1) : ''; var activeFilter = !!~chips.indexOf(hash) ? hash : ''; @@ -165,27 +181,34 @@ var currentSearch = ''; function refreshFilter(){ var filtersContainer = document.querySelector("#librarycontainer .filter-nav"); filtersContainer.querySelector('.active').classList.remove('active'); - if(activeFilter) filtersContainer.querySelector('.chip[filterid="'+activeFilter+'"]').classList.add('active') - else filtersContainer.querySelector('.chip[filterid]').classList.add('active') + if(activeFilter) filtersContainer.querySelector('.chip[filterid="'+activeFilter+'"]').classList.add('active'); + else filtersContainer.querySelector('.chip[filterid]').classList.add('active'); } function refreshLibrary() { var panelbody = document.querySelector("#librarycontainer .panel-body"); var visibleApps = appJSON; if (activeFilter) { - visibleApps = visibleApps.filter(app => app.tags && app.tags.split(',').includes(activeFilter)); + if ( activeFilter == "favourites" ) { + visibleApps = visibleApps.filter(app => app.id && (favourites.filter( e => e == app.id).length)); + }else{ + visibleApps = visibleApps.filter(app => app.tags && app.tags.split(',').includes(activeFilter)); + } } if (currentSearch) { visibleApps = visibleApps.filter(app => app.name.toLowerCase().includes(currentSearch) || app.tags.includes(currentSearch)); } + favourites = (localStorage.getItem(FAVOURITE)) === null ? JSON.parse('["boot","launch","setting"]') : JSON.parse(localStorage.getItem("favouriteapps.json")); + panelbody.innerHTML = visibleApps.map((app,idx) => { var appInstalled = appsInstalled.find(a=>a.id==app.id); var version = getVersionInfo(app, appInstalled); var versionInfo = version.text; if (versionInfo) versionInfo = " ("+versionInfo+")"; var readme = `
Read more...`; + var favourite = favourites.find(e => e == app.id); return `
${escapeHtml(app.name)}

@@ -195,7 +218,8 @@ function refreshLibrary() {

${escapeHtml(app.description)}${app.readme?`
${readme}`:""}

See the code on GitHub
-
+
+ @@ -232,7 +256,7 @@ function refreshLibrary() { // upload icon.classList.remove("icon-upload"); icon.classList.add("loading"); - uploadApp(app) + uploadApp(app); } else if (icon.classList.contains("icon-menu")) { // custom HTML update icon.classList.remove("icon-menu"); @@ -250,6 +274,10 @@ function refreshLibrary() { updateApp(app); } else if (icon.classList.contains("icon-download")) { handleAppInterface(app); + } else if ( button.innerText == String.fromCharCode(0x2661)) { + handleAppFavourite(true, app); + } else if ( button.innerText == String.fromCharCode(0x2665) ) { + handleAppFavourite(false, app); } }); }); @@ -262,17 +290,17 @@ refreshLibrary(); function uploadApp(app) { return getInstalledApps().then(()=>{ if (appsInstalled.some(i => i.id === app.id)) { - return updateApp(app) + return updateApp(app); } Comms.uploadApp(app).then((appJSON) => { - Progress.hide({ sticky: true }) + Progress.hide({ sticky: true }); if (appJSON) { - appsInstalled.push(appJSON) + appsInstalled.push(appJSON); } - showToast(app.name + ' Uploaded!', 'success') + showToast(app.name + ' Uploaded!', 'success'); }).catch(err => { - Progress.hide({ sticky: true }) - showToast('Upload failed, ' + err, 'error') + Progress.hide({ sticky: true }); + showToast('Upload failed, ' + err, 'error'); }).finally(()=>{ refreshMyApps(); refreshLibrary(); @@ -286,8 +314,8 @@ function removeApp(app) { return showPrompt("Delete","Really remove '"+app.name+"'?").then(() => { return getInstalledApps().then(()=>{ // a = from appid.info, app = from apps.json - return Comms.removeApp(appsInstalled.find(a => a.id === app.id)) - }) + return Comms.removeApp(appsInstalled.find(a => a.id === app.id)); + }); }).then(()=>{ appsInstalled = appsInstalled.filter(a=>a.id!=app.id); showToast(app.name+" removed successfully","success"); @@ -315,13 +343,13 @@ function updateApp(app) { if (app.custom) return customApp(app); return getInstalledApps().then(() => { // a = from appid.info, app = from apps.json - let remove = appsInstalled.find(a => a.id === app.id) + let remove = appsInstalled.find(a => a.id === app.id); // no need to remove files which will be overwritten anyway remove.files = remove.files.split(',') .filter(f => f !== app.id + '.info') .filter(f => !app.storage.some(s => s.name === f)) - .join(',') - return Comms.removeApp(remove) + .join(','); + return Comms.removeApp(remove); }).then(()=>{ showToast(`Updating ${app.name}...`); appsInstalled = appsInstalled.filter(a=>a.id!=app.id); @@ -397,7 +425,7 @@ return `
// check icon to figure out what we should do if (icon.classList.contains("icon-delete")) removeApp(app); if (icon.classList.contains("icon-refresh")) updateApp(app); - if (icon.classList.contains("icon-download")) handleAppInterface(app) + if (icon.classList.contains("icon-download")) handleAppInterface(app); }); }); } @@ -405,7 +433,7 @@ return `
let haveInstalledApps = false; function getInstalledApps(refresh) { if (haveInstalledApps && !refresh) { - return Promise.resolve(appsInstalled) + return Promise.resolve(appsInstalled); } showLoadingIndicator("myappscontainer"); // Get apps and files @@ -453,7 +481,7 @@ filtersContainer.addEventListener('click', ({ target }) => { activeFilter = target.getAttribute('filterid') || ''; refreshFilter(); refreshLibrary(); - window.location.hash = activeFilter + window.location.hash = activeFilter; }); var librarySearchInput = document.querySelector("#searchform input"); @@ -526,7 +554,7 @@ document.getElementById("installdefault").addEventListener("click",event=>{ upload(); }).catch(function() { Progress.hide({sticky:true}); - reject() + reject(); }); } upload(); @@ -541,3 +569,48 @@ document.getElementById("installdefault").addEventListener("click",event=>{ showToast("App Install failed, "+err,"error"); }); }); + +// Install all favoutrie apps in one go +document.getElementById("installfavourite").addEventListener("click",event=>{ + var defaultApps, appCount; + asyncLocalStorage.getItem(FAVOURITE).then(json=>{ + defaultApps = JSON.parse(json); + defaultApps = defaultApps.map( appid => appJSON.find(app=>app.id==appid) ); + if (defaultApps.some(x=>x===undefined)) + throw "Not all apps found"; + appCount = defaultApps.length; + return showPrompt("Install Defaults","Remove everything and install favourite apps?"); + }).then(() => { + return Comms.removeAllApps(); + }).then(()=>{ + Progress.hide({sticky:true}); + appsInstalled = []; + showToast(`Existing apps removed. Installing ${appCount} apps...`); + return new Promise((resolve,reject) => { + function upload() { + var app = defaultApps.shift(); + if (app===undefined) return resolve(); + Progress.show({title:`${app.name} (${appCount-defaultApps.length}/${appCount})`,sticky:true}); + Comms.uploadApp(app,"skip_reset").then((appJSON) => { + Progress.hide({sticky:true}); + if (appJSON) appsInstalled.push(appJSON); + showToast(`(${appCount-defaultApps.length}/${appCount}) ${app.name} Uploaded`); + upload(); + }).catch(function() { + Progress.hide({sticky:true}); + reject(); + }); + } + upload(); + }); + }).then(()=>{ + return Comms.setTime(); + }).then(()=>{ + showToast("Favourites apps successfully installed!","success"); + return getInstalledApps(true); + }).catch(err=>{ + Progress.hide({sticky:true}); + showToast("App Install failed, "+err,"error"); + }); +}); + diff --git a/js/ui.js b/js/ui.js index 616a92555..ea6885eac 100644 --- a/js/ui.js +++ b/js/ui.js @@ -86,6 +86,7 @@ function showToast(message, type) { var style = "toast-primary"; if (type=="success") style = "toast-success"; else if (type=="error") style = "toast-error"; + else if (type=="warning") style = "toast-warning"; else if (type!==undefined) console.log("showToast: unknown toast "+type); var toastcontainer = document.getElementById("toastcontainer"); var msgDiv = htmlElement(`
`); diff --git a/js/utils.js b/js/utils.js index 85b6eb0a1..4913c7129 100644 --- a/js/utils.js +++ b/js/utils.js @@ -67,3 +67,16 @@ function getVersionInfo(appListing, appInstalled) { canUpdate : canUpdate } } + +const asyncLocalStorage = { + setItem: function (key, value) { + return Promise.resolve().then(function () { + localStorage.setItem(key, value); + }); + }, + getItem: function (key) { + return Promise.resolve().then(function () { + return localStorage.getItem(key); + }); + } +}; From b84d0446a87f86ffc2c1f7eee5a695a3b863f19d Mon Sep 17 00:00:00 2001 From: Fabio Date: Tue, 14 Apr 2020 09:08:26 +0200 Subject: [PATCH 38/39] New game Snake! --- apps.json | 13 ++++ apps/snake/ChangeLog | 1 + apps/snake/README.md | 13 ++++ apps/snake/snake-icon.js | 1 + apps/snake/snake.js | 144 +++++++++++++++++++++++++++++++++++++++ apps/snake/snake.png | Bin 0 -> 2337 bytes 6 files changed, 172 insertions(+) create mode 100644 apps/snake/ChangeLog create mode 100644 apps/snake/README.md create mode 100644 apps/snake/snake-icon.js create mode 100644 apps/snake/snake.js create mode 100644 apps/snake/snake.png diff --git a/apps.json b/apps.json index 56a6b69d3..dc9d47c2c 100644 --- a/apps.json +++ b/apps.json @@ -1171,5 +1171,18 @@ {"name":"bledetect.app.js","url":"bledetect.js"}, {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} ] + }, + { "id": "snake", + "name": "Snake", + "shortName":"Snake", + "icon": "snake.png", + "version":"0.01", + "description": "The classic snake game. Eat apples and don't bite your tail:", + "tags": "game,fun", + "readme": "README.md", + "storage": [ + {"name":"snake.app.js","url":"snake.js"}, + {"name":"snake.img","url":"snake-icon.js","evaluate":true} + ] } ] diff --git a/apps/snake/ChangeLog b/apps/snake/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/snake/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/snake/README.md b/apps/snake/README.md new file mode 100644 index 000000000..7860dbd88 --- /dev/null +++ b/apps/snake/README.md @@ -0,0 +1,13 @@ +# Snake + +![Screenshot](https://i.ibb.co/XzWrvPL/screenshot.png) + +The legentary classic game is now available on Bangle.js! +Eat apples and don't bite your tail. + +## Controls + +- UP: BTN1 +- DOWN: BTN3 +- LEFT: BTN4 +- RIGHT: BTN5 diff --git a/apps/snake/snake-icon.js b/apps/snake/snake-icon.js new file mode 100644 index 000000000..305061003 --- /dev/null +++ b/apps/snake/snake-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/ADE3m9hsIusrdhGIM3LtU3g0GAgQxlEwIqBmEAgEGF4QwkF4c3F4MxF4dbF8qLDrYHDre74IABF8QwBLoaPDF8wPKF96/jF/4v/F/4vrrc3AIQsnsIAKF94wiFxgv/R//+m4ABrYALBwIpYFwwAQLC4v/F7gXGF91hACovWFqwwUF4VbF7IwUFzSRVF1gwCF9wwZFyoA/AH4A/AH4A/AGg=")) \ No newline at end of file diff --git a/apps/snake/snake.js b/apps/snake/snake.js new file mode 100644 index 000000000..37b461596 --- /dev/null +++ b/apps/snake/snake.js @@ -0,0 +1,144 @@ +const H = g.getWidth(); +const W = g.getHeight(); +let running = true; +let score = 0; +let d; + +// game world +const gridSize = 40; +const tileSize = 6; +let nextX = 0; +let nextY = 0; + +// snake +const defaultTailSize = 3; +let tailSize = defaultTailSize; +const snakeTrail = []; +let snakeX = 10; +let snakeY = 10; + +// apple +let appleX = Math.floor(Math.random() * gridSize); +let appleY = Math.floor(Math.random() * gridSize); + +function gameStart() { + running = true; + score = 0; +} + +function gameStop() { + g.clear(); + g.setColor("#FFFFFF"); + g.setFont("6x8", 2); + g.drawString("GAME OVER!", W / 2, H / 2 - 20); + g.drawString("Tap to Restart", W / 2, H / 2 + 20); + running = false; + tailSize = defaultTailSize; +} + +function draw() { + if (!running) { + return; + } + + // move snake in next pos + snakeX += nextX; + snakeY += nextY; + + // snake over game world? + if (snakeX < 0) { + snakeX = gridSize - 1; + } + + if (snakeX > gridSize - 1) { + snakeX = 0; + } + + if (snakeY < 0) { + snakeY = gridSize - 1; + } + if (snakeY > gridSize - 1) { + snakeY = 0; + } + + //snake bite apple? + if (snakeX === appleX && snakeY === appleY) { + tailSize++; + score++; + + appleX = Math.floor(Math.random() * gridSize); + appleY = Math.floor(Math.random() * gridSize); + } + + //paint background + g.setColor("#000000"); + g.fillRect(0, 0, H, W); + + // paint snake + g.setColor("#008000"); + + for (let i = 0; i < snakeTrail.length; i++) { + g.fillRect(snakeTrail[i].x * tileSize, snakeTrail[i].y * tileSize, snakeTrail[i].x * tileSize + tileSize, snakeTrail[i].y * tileSize + tileSize); + + //snake bites it's tail? + if (snakeTrail[i].x === snakeX && snakeTrail[i].y === snakeY && tailSize > defaultTailSize) { + gameStop(); + } + } + + // paint apple + g.setColor("#FF0000"); + g.fillRect(appleX * tileSize, appleY * tileSize, appleX * tileSize + tileSize, appleY * tileSize + tileSize); + + // paint score + g.setColor("#FFFFFF"); + g.setFont("6x8"); + g.setFontAlign(0, 0); + g.drawString("Score:" + score, W / 2, 10); + + //set snake trail + snakeTrail.push({ x: snakeX, y: snakeY }); + while (snakeTrail.length > tailSize) { + snakeTrail.shift(); + } +} + +// input +setWatch(() => {// Up + if (d !== 'd') { + nextX = 0; + nextY = -1; + d = 'u'; + } +}, BTN1, { repeat: true }); +setWatch(() => {// Down + if (d !== 'u') { + nextX = 0; + nextY = 1; + d = 'd'; + } +}, BTN3, { repeat: true }); +setWatch(() => {// Left + if (d !== 'r') { + nextX = -1; + nextY = 0; + d = 'l'; + } +}, BTN4, { repeat: true }); +setWatch(() => {// Right + if (d !== 'l') { + nextX = 1; + nextY = 0; + d = 'r'; + } +}, BTN5, { repeat: true }); + +Bangle.on('touch', button => { + if (!running) { + gameStart(); + } +}); + +// render X times per second +var x = 5; +setInterval(draw, 1000 / x); \ No newline at end of file diff --git a/apps/snake/snake.png b/apps/snake/snake.png new file mode 100644 index 0000000000000000000000000000000000000000..04564a8f77dad377b2dd2dd0a50561ca582bc6fb GIT binary patch literal 2337 zcmaJ@dpuNWAD`rwUb~B2QaBxEcE)AKV1}6n;ml;b#$_m8DaOpfe3*-wgFzRhTq@Sa zOB-^J-dI`6t?W{5Yg1ApOBX4ds3;*~N2PuLcze%t&Ur4M@Avz={_&)Hd2Cl#(^o^G zQ0h!qh%KKjS3Xr``QJ}rK2<(#MCksAk0=z0;LFx_5a9FdK|d19k|lP5 z!}+f964)o+!gS*q7}hX{*o<-HdGRsYGn(2dO*1~2``k& zh8Ul0$#?c(ID&|&1VU_VEI!s6FOq~2h!hHCMZ?O z`#*)HzHwrhz=oxwXbD$dxKQI2Q(~%%1m++jiLXc$xtc|cVg#Su?C4Tgb_lNTfSaY)A~q$=TV)#@d-q zX4tNBArUuP01J^-F7IzH{fpd{RuG8gmLXWekAZm%iAVr^2${n<(toq4-4hpE|Ir2*+9Jsg;L68LQcN2!HIwE3J;{~ zEj=BInVkszDbI#qUW3_@u6xF}tpN}isj6-ci?>p%-uv#0~Qd2!is z*7siT5k{9y$1>8*DX6C9fx?};K6e(ikYzTKLdfA#R$Wa;(T`7M>f4G!T| zh1{1+b;43Hw_Fe}3YeOoda7!J+qF)m`DVflS-oho^W`wuC<%KZglNE%`hwU*l^=)5b&HH6?|!yCmjl4NoGp3Jrz zK3&=R|L*fBXnLjlBC2Pp4ysT*rLyLVl$N2S zcLqYoz03Q{AKebT@(8@K>v&?t&thaic^6IL(qrTM+1ncI-2@_x?T+j&Z7JP!Bdu$G z++4Hv3FzDvmQW9pG`!vBBCN1J)2AIvr#4r&Wj(@IXy}$`esi~!NoU!u2yX|Sp%0a`%MFS(NLxL2BkB#T__BFwmVICPxsE5 zZ=beodpv-J&SxswVk&lVH*kc=guZjDjZ|swM%CPS ztF#fSh)=E5bKIIa9saDNo*O_;F<3jQqaC31jCyvQt#Gd>vtZFK=sPC{=JoM>Kmlw` zvUtG=P3!X8?|;gH>b*cx8?v8oXT;~1ny0PV$W0x47l!yadQ65@o3;BZ#%S)z=Q=$= zPvoJKqABR4f#%#scQ~RNXL@sMdA5vnIQeXvPS3RSd~3==+9Cn-?e9lMA`ci}YQ&6p zjF%2OtBJ~O63WSr$wLJyTk2R?&pA5Qh^be8HlsH@{nmD9^h8NvVqj2Tss3Qg_w^gr zv1^pKh&?AM0LC3T|I78u*_*Cu|MO7wgS5+q9IU6*^Ok}UtLBEQad+eGAbe6^qo$o8 z)Lkz<4LkUii62JPZ#>wt{&``gs@Sk1_kBQLu9nBWxYQO2N24mWSLfX|o%%ak4R;n& zvM@iobzgMaegE9?y~?|O^BS?5@a~9@;^-%$TZnz7Y!Yb&TvS8FRdLpEsvaP*JALrMJqvYUZGj;WIy+%C0f9NL#dDXo@ z%*STaf8tK_FlOCXw4%b^#SBzj&Vxd#XgdczPTuVfCEtKZEvn0v2ADRqM{!a}`^ Date: Tue, 14 Apr 2020 10:47:39 +0100 Subject: [PATCH 39/39] remove un-needed file --- apps/calculator/calculator.info | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/calculator/calculator.info diff --git a/apps/calculator/calculator.info b/apps/calculator/calculator.info deleted file mode 100644 index e8a760024..000000000 --- a/apps/calculator/calculator.info +++ /dev/null @@ -1 +0,0 @@ -{"name":"Calculator","src":"calculator.app.js","icon":"calculator.img"}