From 4301342292d4ae2a278bfff56d9d3cfac2aca2b6 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 8 Apr 2020 12:58:39 +0200 Subject: [PATCH 01/33] 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/33] 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/33] 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/33] 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/33] ...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/33] 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/33] , --- 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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/33] 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 eebc49470412d9cf93792df73156ee9ef12c4c3e Mon Sep 17 00:00:00 2001 From: msdeibel Date: Sun, 12 Apr 2020 13:32:25 +0200 Subject: [PATCH 28/33] Enables chart in the app --- apps/batchart/app.js | 107 ++++++++++++++++++++++++++++++++----- apps/batchart/batchart.dat | 0 apps/batchart/widget.js | 1 - 3 files changed, 95 insertions(+), 13 deletions(-) delete mode 100644 apps/batchart/batchart.dat diff --git a/apps/batchart/app.js b/apps/batchart/app.js index 684f9a88d..e8b30ba69 100644 --- a/apps/batchart/app.js +++ b/apps/batchart/app.js @@ -1,20 +1,100 @@ -// place your const, vars, functions or classes here +const GraphXZero = 40; +const GraphYZero = 180; +const GraphY100 = 80; +const GraphMarkerOffset = 5; +const MaxValueCount = 144; +const GraphXMax = GraphXZero + MaxValueCount; +var Storage = require("Storage"); -function renderBatteryChart(){ - g.drawString("t", 215, 175); - g.drawLine(40,190,40,80); +function renderCoordinateSystem() { + g.setFont("6x8", 1); + g.drawString("t", GraphXMax + GraphMarkerOffset, GraphYZero - GraphMarkerOffset); + g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100); g.drawString("%", 39, 70); - g.drawString("100", 15, 75); - g.drawLine(35,80,40,80); - g.drawString("50", 20,125); - g.drawLine(35,130,40,130); + g.setFontAlign(1, -1, 0); + g.drawString("100", 30, GraphY100 - GraphMarkerOffset); + g.drawLine(GraphXZero - GraphMarkerOffset, GraphY100, GraphXZero, GraphY100); - g.drawString("0", 25, 175); - g.drawLine(35,180,210,180); + g.drawString("50", 30, GraphYZero - 50 - GraphMarkerOffset); + g.drawLine(GraphXZero - GraphMarkerOffset, 130, GraphXZero, 130); - g.drawString("Chart not yet functional", 60, 125); + g.drawString("0", 30, GraphYZero - GraphMarkerOffset); + g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax, GraphYZero); +} + +function decrementDay(dayToDecrement) { + return dayToDecrement === 0 ? 6 : dayToDecrement-1; +} +function loadData() { + const MaxValueCount = 144; + const startingDay = new Date().getDay(); + + // Load data for the current day + var logFileName = "bclog" + startingDay; + + var dataLines = loadLinesFromFile(MaxValueCount, logFileName); + + // Top up to MaxValueCount from previous days as required + var previousDay = decrementDay(startingDay); + while (dataLines.length < MaxValueCount + && previousDay !== startingDay) { + + var topUpLogFileName = "bclog" + previousDay; + var remainingLines = MaxValueCount - dataLines.length; + var topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName); + dataLines = topUpLines.concat(dataLines); + + previousDay = decrementDay(previousDay); + } + + return dataLines; +} + +function loadLinesFromFile(requestedLineCount, fileName) { + var allLines = []; + var returnLines = []; + + var readFile = Storage.open(fileName, "r"); + + while ((nextLine = readFile.readLine())) { + if(nextLine) { + allLines.push(nextLine); + } + } + + if (allLines.length <= 0) return; + + linesToReadCount = Math.min(requestedLineCount, allLines.length); + startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1); + + for (let i = startingLineIndex; i < linesToReadCount + startingLineIndex; i++) { + if(allLines[i]) { + returnLines.push(allLines[i]); + } + } + + allLines = null; + + return returnLines; +} + +function renderData(dataArray) { + g.setColor(1, 1, 0); + for (let i = 0; i < dataArray.length; i++) { + const element = dataArray[i]; + var dataInfo = element.split(","); + var batteryPercentage = parseInt(dataInfo[1]); + + g.setPixel(GraphXZero + i, GraphYZero - batteryPercentage); + } +} + +function renderBatteryChart() { + renderCoordinateSystem(); + var data = loadData(); + renderData(data); } // special function to handle display switch on @@ -22,7 +102,10 @@ Bangle.on('lcdPower', (on) => { if (on) { // call your app function here // If you clear the screen, do Bangle.drawWidgets(); - renderBatteryChart(); + //g.clear() + Bangle.loadWidgets(); + Bangle.drawWidgets(); + //renderBatteryChart(); } }); diff --git a/apps/batchart/batchart.dat b/apps/batchart/batchart.dat deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/batchart/widget.js b/apps/batchart/widget.js index 2e2f43cdf..de7ce230d 100644 --- a/apps/batchart/widget.js +++ b/apps/batchart/widget.js @@ -60,7 +60,6 @@ } } - // Called by the heart app to reload settings and decide what's function reload() { WIDGETS["batchart"].width = 24; From 1a8a0d0a63b304fa0722447f73495d1ff6625731 Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 12 Apr 2020 14:06:12 +0200 Subject: [PATCH 29/33] Version for BatChart app updated --- apps.json | 2 +- apps/batchart/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index d85739aad..027abcb7c 100644 --- a/apps.json +++ b/apps.json @@ -1150,7 +1150,7 @@ "name": "Battery Chart", "shortName":"BatChart", "icon": "app.png", - "version":"0.03", + "version":"0.04", "description": "A widget and an app for recording and visualizing battery percentage over time.", "tags": "app,widget,battery,time,record,chart,tool", "storage": [ diff --git a/apps/batchart/ChangeLog b/apps/batchart/ChangeLog index 1b77ff82f..dcbd1687b 100644 --- a/apps/batchart/ChangeLog +++ b/apps/batchart/ChangeLog @@ -1,3 +1,4 @@ 0.01: New app and widget 0.02: Widget stores data to file (1 dataset/10min) 0.03: Rotate log files once a week. +0.04: chart in the app is now active. From 1c68ea0d1bbd6e16e12662e53876e7e723935190 Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Sun, 12 Apr 2020 14:43:52 +0100 Subject: [PATCH 30/33] 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 900b820474625dbd6437abed026203146e808a04 Mon Sep 17 00:00:00 2001 From: msdeibel Date: Mon, 13 Apr 2020 11:14:50 +0200 Subject: [PATCH 31/33] Display temperature and LCD state in chart --- apps.json | 4 +- apps/batchart/ChangeLog | 1 + apps/batchart/app.js | 137 ++++++++++++++++++++++++++++++++++------ 3 files changed, 119 insertions(+), 23 deletions(-) diff --git a/apps.json b/apps.json index d85739aad..2fa94fa18 100644 --- a/apps.json +++ b/apps.json @@ -1148,9 +1148,9 @@ }, { "id": "batchart", "name": "Battery Chart", - "shortName":"BatChart", + "shortName":"Battery Chart", "icon": "app.png", - "version":"0.03", + "version":"0.04", "description": "A widget and an app for recording and visualizing battery percentage over time.", "tags": "app,widget,battery,time,record,chart,tool", "storage": [ diff --git a/apps/batchart/ChangeLog b/apps/batchart/ChangeLog index 1b77ff82f..8c1e8f995 100644 --- a/apps/batchart/ChangeLog +++ b/apps/batchart/ChangeLog @@ -1,3 +1,4 @@ 0.01: New app and widget 0.02: Widget stores data to file (1 dataset/10min) 0.03: Rotate log files once a week. +0.04: Display temperature and LCD state in chart diff --git a/apps/batchart/app.js b/apps/batchart/app.js index e8b30ba69..4fb919354 100644 --- a/apps/batchart/app.js +++ b/apps/batchart/app.js @@ -1,17 +1,26 @@ const GraphXZero = 40; const GraphYZero = 180; const GraphY100 = 80; + const GraphMarkerOffset = 5; const MaxValueCount = 144; const GraphXMax = GraphXZero + MaxValueCount; + +const GraphLcdY = GraphYZero + 10; +// const GraphCompassY = GraphYZero + 16; +// const GraphBluetoothY = GraphYZero + 22; +// const GraphGpsY = GraphYZero + 28; +// const GraphHrmY = GraphYZero + 34; + var Storage = require("Storage"); function renderCoordinateSystem() { g.setFont("6x8", 1); - g.drawString("t", GraphXMax + GraphMarkerOffset, GraphYZero - GraphMarkerOffset); - g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100); - g.drawString("%", 39, 70); + // Left Y axis (Battery) + g.setColor(1, 1, 0); + g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100); + g.drawString("%", 39, GraphY100 - 10); g.setFontAlign(1, -1, 0); g.drawString("100", 30, GraphY100 - GraphMarkerOffset); @@ -21,29 +30,47 @@ function renderCoordinateSystem() { g.drawLine(GraphXZero - GraphMarkerOffset, 130, GraphXZero, 130); g.drawString("0", 30, GraphYZero - GraphMarkerOffset); - g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax, GraphYZero); + + g.setColor(1,1,1); + g.setFontAlign(1, -1, 0); + g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax + GraphMarkerOffset, GraphYZero); + + // Right Y axis (Temperature) + g.setColor(0.4, 0.4, 1); + g.drawLine(GraphXMax, GraphYZero + GraphMarkerOffset, GraphXMax, GraphY100); + g.drawString("°C", GraphXMax + GraphMarkerOffset, GraphY100 - 10); + g.setFontAlign(-1, -1, 0); + g.drawString("20", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - GraphMarkerOffset); + + g.drawLine(GraphXMax + GraphMarkerOffset, 130, GraphXMax, 130); + g.drawString("30", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - 50 - GraphMarkerOffset); + + g.drawLine(GraphXMax + GraphMarkerOffset, 80, GraphXMax, 80); + g.drawString("40", GraphXMax + 2 * GraphMarkerOffset, GraphY100 - GraphMarkerOffset); + + g.setColor(1,1,1); } function decrementDay(dayToDecrement) { return dayToDecrement === 0 ? 6 : dayToDecrement-1; } + function loadData() { - const MaxValueCount = 144; const startingDay = new Date().getDay(); // Load data for the current day - var logFileName = "bclog" + startingDay; + let logFileName = "bclog" + startingDay; - var dataLines = loadLinesFromFile(MaxValueCount, logFileName); + let dataLines = loadLinesFromFile(MaxValueCount, logFileName); // Top up to MaxValueCount from previous days as required - var previousDay = decrementDay(startingDay); + let previousDay = decrementDay(startingDay); while (dataLines.length < MaxValueCount && previousDay !== startingDay) { - var topUpLogFileName = "bclog" + previousDay; - var remainingLines = MaxValueCount - dataLines.length; - var topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName); + let topUpLogFileName = "bclog" + previousDay; + let remainingLines = MaxValueCount - dataLines.length; + let topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName); dataLines = topUpLines.concat(dataLines); previousDay = decrementDay(previousDay); @@ -53,8 +80,8 @@ function loadData() { } function loadLinesFromFile(requestedLineCount, fileName) { - var allLines = []; - var returnLines = []; + let allLines = []; + let returnLines = []; var readFile = Storage.open(fileName, "r"); @@ -63,11 +90,13 @@ function loadLinesFromFile(requestedLineCount, fileName) { allLines.push(nextLine); } } + + readFile = null; if (allLines.length <= 0) return; - linesToReadCount = Math.min(requestedLineCount, allLines.length); - startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1); + let linesToReadCount = Math.min(requestedLineCount, allLines.length); + let startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1); for (let i = startingLineIndex; i < linesToReadCount + startingLineIndex; i++) { if(allLines[i]) { @@ -81,20 +110,86 @@ function loadLinesFromFile(requestedLineCount, fileName) { } function renderData(dataArray) { - g.setColor(1, 1, 0); + const switchableConsumers = { + none: 0, + lcd: 1, + compass: 2, + bluetooth: 4, + gps: 8, + hrm: 16 + }; + + //const timestampIndex = 0; + const batteryIndex = 1; + const temperatureIndex = 2; + const switchabelsIndex = 3; + + var allConsumers = switchableConsumers.none | switchableConsumers.lcd | switchableConsumers.compass | switchableConsumers.bluetooth | switchableConsumers.gps | switchableConsumers.hrm; + for (let i = 0; i < dataArray.length; i++) { const element = dataArray[i]; + var dataInfo = element.split(","); - var batteryPercentage = parseInt(dataInfo[1]); - g.setPixel(GraphXZero + i, GraphYZero - batteryPercentage); + // Battery percentage + g.setColor(1, 1, 0); + g.setPixel(GraphXZero + i, GraphYZero - parseInt(dataInfo[batteryIndex])); + + // Temperature + g.setColor(0.4, 0.4, 1); + let scaledTemp = Math.floor(((parseFloat(dataInfo[temperatureIndex]) * 100) - 2000)/20) + ((((parseFloat(dataInfo[temperatureIndex]) * 100) - 2000) % 100)/25); + + g.setPixel(GraphXZero + i, GraphYZero - scaledTemp); + + // LCD state + if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.lcd == switchableConsumers.lcd) { + g.setColor(1, 1, 1); + g.setFontAlign(1, -1, 0); + g.drawString("LCD", GraphXZero - GraphMarkerOffset, GraphLcdY - 2, true); + g.drawLine(GraphXZero + i, GraphLcdY, GraphXZero + i, GraphLcdY + 1); + } + + // // Compass state + // if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) { + // g.setColor(0, 1, 0); + // g.setFontAlign(-1, -1, 0); + // g.drawString("Compass", GraphXMax + GraphMarkerOffset, GraphCompassY - 2, true); + // g.drawLine(GraphXZero + i, GraphCompassY, GraphXZero + i, GraphCompassY + 1); + // } + + // // Bluetooth state + // if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) { + // g.setColor(0, 0, 1); + // g.setFontAlign(1, -1, 0); + // g.drawString("BLE", GraphXZero - GraphMarkerOffset, GraphBluetoothY - 2, true); + // g.drawLine(GraphXZero + i, GraphBluetoothY, GraphXZero + i, GraphBluetoothY + 1); + // } + + // // Gps state + // if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) { + // g.setColor(0.8, 0.5, 0.24); + // g.setFontAlign(-1, -1, 0); + // g.drawString("GPS", GraphXMax + GraphMarkerOffset, GraphGpsY - 2, true); + // g.drawLine(GraphXZero + i, GraphGpsY, GraphXZero + i, GraphGpsY + 1); + // } + + // // Hrm state + // if (switchables & switchableConsumers.lcd == switchableConsumers.lcd) { + // g.setColor(1, 0, 0); + // g.setFontAlign(1, -1, 0); + // g.drawString("HRM", GraphXZero - GraphMarkerOffset, GraphHrmY - 2, true); + // g.drawLine(GraphXZero + i, GraphHrmY, GraphXZero + i, GraphHrmY + 1); + // } } + + dataArray = null; } function renderBatteryChart() { renderCoordinateSystem(); - var data = loadData(); + let data = loadData(); renderData(data); + data = null; } // special function to handle display switch on @@ -102,10 +197,10 @@ Bangle.on('lcdPower', (on) => { if (on) { // call your app function here // If you clear the screen, do Bangle.drawWidgets(); - //g.clear() + g.clear() Bangle.loadWidgets(); Bangle.drawWidgets(); - //renderBatteryChart(); + renderBatteryChart(); } }); From be10466ed14082f58923f80dfe1c55f2d6f3d6b2 Mon Sep 17 00:00:00 2001 From: Paul Cockrell Date: Mon, 13 Apr 2020 14:33:22 +0100 Subject: [PATCH 32/33] 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 33/33] 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); + }); + } +};