From ee7b7e4839ffe98c24fe6cdc95644e85f7ae6806 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 26 Nov 2021 19:01:12 +0100 Subject: [PATCH 001/503] Minor changes --- apps/lcars/bg_large.png | Bin 12390 -> 12564 bytes apps/lcars/bg_small.png | Bin 9939 -> 10161 bytes apps/lcars/lcars.app.js | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png index dd5bda4f3207c4764d8e0dea681f05608a031cc2..7b0f1ad5f06f14889a8e0477b6f8cf7a238be586 100644 GIT binary patch delta 11741 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 delta 11502 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 diff --git a/apps/lcars/bg_small.png b/apps/lcars/bg_small.png index 8030c0ddbcee2266a654b613ecdbc108605b014b..20fe40a4e1ef66f14ac76b577a1cd6a6c8302828 100644 GIT binary patch delta 10086 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 delta 9862 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 Hm Date: Fri, 26 Nov 2021 20:42:18 +0100 Subject: [PATCH 002/503] Minor changes --- apps/lcars/bg_large.png | Bin 12564 -> 11049 bytes apps/lcars/bg_small.png | Bin 10161 -> 8846 bytes apps/lcars/lcars.app.js | 17 +++++++++-------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png index 7b0f1ad5f06f14889a8e0477b6f8cf7a238be586..5526c241fce23c9ffe492c60047549337d0566ee 100644 GIT binary patch literal 11049 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 delta 11812 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 CDbe!) diff --git a/apps/lcars/bg_small.png b/apps/lcars/bg_small.png index 20fe40a4e1ef66f14ac76b577a1cd6a6c8302828..b9f984b33cd07203e130a5cac09814588d63713b 100644 GIT binary patch literal 8846 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 Date: Fri, 26 Nov 2021 21:00:30 +0100 Subject: [PATCH 003/503] Minor changes --- apps/lcars/bg_large.png | Bin 11049 -> 11003 bytes apps/lcars/bg_small.png | Bin 8846 -> 8753 bytes apps/lcars/lcars.app.js | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png index 5526c241fce23c9ffe492c60047549337d0566ee..56590e87891ec7908e31984aebc50db7ce8b3e4a 100644 GIT binary patch delta 9831 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 F{{WC60s{a5 delta 8408 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 Ws*t)6^$bDpc!j9G|NjE|93}h! diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 5a7ad5f93..8ac01d90c 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -12,7 +12,7 @@ const locale = require('locale'); var backgroundImage = { width : 176, height : 151, bpp : 3, transparent : 2, - buffer : require("heatshrink").decompress(atob("AAdz588+YCcgEHDrRAC8+evICd8mAgIdaIANHQDyDggSAeQcNzJQ0cuPHATCDBDrUAJQ1AZwIA2jjOF+BA4T4KDFyBB5Qf4ABQAaD9QAaD/QesH8CD/g/8Qf8//+AQfsB///GQ6D2IJSD/QfEPIIP+Qfkcv5BB//HjiD5g4/CAAeAQe8B//8QYkf+PAQew+BAQQAB/EDAQKD1j//PQJBDAoKMBQesf/0APoKDDBQM/8CD1FgJBEQAUH/iDzGoZBHgH/wCDyIIcfII6PCkGChACDJQIAofYZBFBAb+rQZB6DIPk/fwZBHgZB3QYv8BIVwQfhBCQYUcuPHAQZKqg5BLj5BB8+evICDwCDqfwQ+DgIDBGoJBCnnz54CDBAKDpPQMHIIUAIIKD3II6MBQYQCCQeI1B+BBC/BKCBASGCQeK5B/xBC4BKEn/gAoKDyj//4///wIE+LLCQecAv6CBIIrLDQecAgKDBF4cHQYLLDQecAn6EBAAiJEQeZBB/jICAAMcvwMDQevggE48YyCIIiDzgP/BA1/4CD3nAHGhyD3ABqD0ABiD/Qf4ADjiD/gEHQYuQQf6D7gaDFzxB5gFzQYnz4BB5hyDFATfkEoIdagEBQYoCcgEHDrReBgKDiEbbHCjiD/AH4A/AH4AGiFx48cATsAg4daIIWSpMkATuQEbkAgJfbQckJQDyDhJQ3EZwQA1gRKFpBA4gEQQYtwIPMSQYtAIPKADQfqADAQRA5Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AFkQoMEAQZB6yVJkgCDIPUcuPHAQdAQf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/AEcQoMEAQZB6AH4A/AH4A/AH4AJjlx44CDqBB5yVJkgCDQf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6DhuBB5iSDFoCD/QfcCQYtIIPMAQYoC6gEJQYgC6gEBg6D/AAKD/AAMQQfoA=")) + buffer : require("heatshrink").decompress(atob("AAdx48cATsAg4daIAX3799ATv2wEFDrUAgNHQDyDghaAeQcJKG86D4gRKGgAA4jxKFuBB5iaDF6BB5ZwyD6QAYCC4CD/Qf6Dzg/gQf8H/iD/n//wCD9gP///wQfpBKQf6D4h5BB/yD8jl/IIIABjiD5n4/DAAWAQe8B//8QYfHj//PAaDzHwICCAAP4gYCBQep6DIIYFBRgKD1j/+gB9BQYYKBn/gQen/+BBFQAUH/iDzGoZBHJoOAQeRBDj5BHj6PB0WKlACDJQIAofYZBFBAZBBAGMHPQZB8QYZAEIIcDIOiDI/hB3QZBBFjlx44CDuBBpg4DCIJEfIIPnz15AQeAQeH8gIDBGoJBCnnz54CDZ1UHPQMHIIUAIIKD3II6MBQYQCCQeI1B+BBC/BKCBASGCQeK5B/xBC4BKEn/gAoKDyj//45BFj/xZYSDzgF/IAP+JQrLCQecAgKDBF4cHQYKJDQecAn6EBAAiJEQeZBB/jICAAMcvwMDQevgQwR0CIIiDzgP/BA1/4CD3nAHGhyD3ABqD0ABiD/Qf4ADjiD/gEnQYuQQf6D7gaDFzxB5gFzQYnz4BB5hyDFATfkEoIdagEBQYoCcgEHDrReBhKDhwEBQbYABjiD/AH4A/AH4AGiFx48cATsAg4daIIWSpMkATuQEbkAgJfbQckJQDyDhZxQA1gRKFpBA4gEQQYtwIPMSQYtAIPKADQfqADAQRA5Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AFkcuPHAQdAIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AGUcuPHAQdwIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4AciSDFoCD/QfcCQYtIIPMAQYoC6gEJQYgC6gEBQf7HCQf4ABiiD9")) } var iconEarth = { From d80dc2ae12ef26c8c9e8e0eb2fcc97bea586883d Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:30:50 -0500 Subject: [PATCH 004/503] Add files via upload --- apps/thermomF2.app.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/thermomF2.app.js diff --git a/apps/thermomF2.app.js b/apps/thermomF2.app.js new file mode 100644 index 000000000..d3ba14dcd --- /dev/null +++ b/apps/thermomF2.app.js @@ -0,0 +1,26 @@ +function onTemperature(p) { + g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); + g.setFont("6x8",2).setFontAlign(0,0); + var x = g.getWidth()/2; + var y = g.getHeight()/2 + 10; + g.drawString("Temp", x, y - 45); + g.setFontVector(70).setFontAlign(0,0); + var t = require('locale').temp(p.temperature); + g.drawString(t, x, y); +} + +function drawTemperature() { + onTemperature({ + temperature : E.getTemperature() + }); + +} + + +setInterval(function() { + drawTemperature(); +}, 2000); +drawTemperature(); +E.showMessage("Loading..."); +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file From 69dc98c6819d4c8fa5e4a542de39f8ad046dcd28 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:33:07 -0500 Subject: [PATCH 005/503] Rename apps/thermomF2.app.js to apps/ltherm/app.js --- apps/{thermomF2.app.js => ltherm/app.js} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename apps/{thermomF2.app.js => ltherm/app.js} (96%) diff --git a/apps/thermomF2.app.js b/apps/ltherm/app.js similarity index 96% rename from apps/thermomF2.app.js rename to apps/ltherm/app.js index d3ba14dcd..06ff92e18 100644 --- a/apps/thermomF2.app.js +++ b/apps/ltherm/app.js @@ -23,4 +23,4 @@ setInterval(function() { drawTemperature(); E.showMessage("Loading..."); Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file +Bangle.drawWidgets(); From 36ed08f0eadb93b4b161298e4681084cab7730e2 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:33:35 -0500 Subject: [PATCH 006/503] Create icon.js --- apps/ltherm/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/ltherm/icon.js diff --git a/apps/ltherm/icon.js b/apps/ltherm/icon.js new file mode 100644 index 000000000..4f3cc4b0a --- /dev/null +++ b/apps/ltherm/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4AChGIxGAC6eIAQgARFgUIC9ReCAYJgSC7BHDF6gUBC6ovWI/5Hga/6P/ABsCkABDC/4XxkQXDkQuSAQwXPDQkAC6BBCkQDDC6MCmczFoIXQCQQXBDgQXP2EA2YXBncAhYXR3YXB3YXRCQWznYcCC6ICBAYYXPhYrBApAwPFyQqCIoYuRLwZgDAH4A/")) From 2fed2e2c45a70dbda1c82e3415486a01c716097b Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:34:43 -0500 Subject: [PATCH 007/503] Add files via upload --- apps/ltherm/thermf.png | Bin 0 -> 1189 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/ltherm/thermf.png diff --git a/apps/ltherm/thermf.png b/apps/ltherm/thermf.png new file mode 100644 index 0000000000000000000000000000000000000000..bb33cb939d63a9682e318025e2f94c7c1f0ea31b GIT binary patch literal 1189 zcmV;W1X}xvP)nbkt*}t8k&unGMZv-!*9L9P7LD0b z$gE+K)ifw5s5ZsGe@q54Q4?BH5!OTshs9=5bi*=m{V<9_)2Li(Qenkb?8kkd(;xS~ z+nBrl(fi!m#T|J5c+NST@AKt3&pGG47p7%eE^SfS3LJYvmN-HjK!i_E?@`CHfn%M( z{3oTz8Kzy}t_h}2m89YOm(-s&@f@4M0Q^DPwV~QKH2DrO-y!A;&7R>7?eMy7JgaiU zBeJBlQKW3WG)=UXt(T_KMv<}&vdAW;)f@2PR&Br^Vc!L|5%y^VI-tTPrd0y2p->x8 zaHf2nNclRE(02S4bygd211__Psci=H0TB>I%Vc&>Kv^yuRtad6B5?FI)tt$0n}F36 z(k8WTTO(5Wplr!xw~A>sSo#K(qJ@A@CbLiZ6hh$L{gbDVXRzKnvywt}_leZ4&e0SC zP|#vzk`xj^CTb&M+6?BK)cM|gD{~6j9=_~9V&MLjV-0No!LetnbA^D)(8zLzz^iXx zq>u}~2$_WCYJawle0Cv2msz&Wo znSh_3g~sp4iB=*1?*_!TRLTrnxK;>k ztB@;(JrbU>gd8*T}bwAsLpOkn3ysn>>k-GFDGKB^9f`qsEC(1tnMFlX0Nxh~W{^Reo54b9rH zsENgSpfq|@qFVk^&G&93#D2qK1i0sP;JW3?*i{jaG?6pZuKER+alQtH2E_rc<3WF z_;1e;=>`gg`C4$CfSyq2L4(dGnZE*xW~SE66`=D8TxbaWT&!wG2#_4}?Joe+&)jhDCOPjYP!OpaMY@3*hI870FT_Rz26U@)I0Zk# zl_RND@B_GKaWr&?exBi)bffz@${8XNSp5~JJi{5^P!sA3|7N={^!>gUGuQ!x9dLdx z#)Cd@i0z@D4>g|Q^qMdD>3<`jP@)Y7T*EybH>OHueXr_w0~Wc%v=4mFz+a!y?c#~YM15N_p=pm|Wzf(gO^Y2<9dC5Ey3QAp{ z>uZmzU!&kh?gJ~oR=;S&S}nx!>3pYHW@qy4S|C^9)1`&Qj<7cB;lbkP#rq}l0Pr%x zpulcX9P(Xy0Y;LPD2I9skE6&Fc(~?UwciG=)!{Z#EG57;U^(DUFb4__8O5gCdsVM3 z%&h#)nkbgp+E67hFAZ`!>5!;8p?=E--n2~1r7ZsdH4U76`VJt+00000NkvXXu0mjf DV^KD_ literal 0 HcmV?d00001 From 8a4d79ef2fd0345e062538bc120b84201df8c8a9 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:37:07 -0500 Subject: [PATCH 008/503] Create readme.md --- apps/ltherm/readme.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apps/ltherm/readme.md diff --git a/apps/ltherm/readme.md b/apps/ltherm/readme.md new file mode 100644 index 000000000..477c51bd6 --- /dev/null +++ b/apps/ltherm/readme.md @@ -0,0 +1,3 @@ +# Thermometer + +Localized Bangle.js 2 thermometer app. From a83b444b051e7ccda5241c681e3ed52db4b9ef64 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:47:23 -0500 Subject: [PATCH 009/503] Delete apps.json --- apps.json | 4976 ----------------------------------------------------- 1 file changed, 4976 deletions(-) delete mode 100644 apps.json diff --git a/apps.json b/apps.json deleted file mode 100644 index ca73a0d10..000000000 --- a/apps.json +++ /dev/null @@ -1,4976 +0,0 @@ -[ - { - "id": "fwupdate", - "name": "Firmware Update", - "version": "0.02", - "description": "[BETA] Uploads new Espruino firmwares to Bangle.js 2. For now, please use the instructions under https://www.espruino.com/Bangle.js2#firmware-updates", - "icon": "app.png", - "type": "RAM", - "tags": "tools,system", - "supports": ["BANGLEJS2"], - "custom": "custom.html", - "customConnect": true, - "storage": [], - "sortorder": 20 - }, - { - "id": "boot", - "name": "Bootloader", - "version": "0.38", - "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", - "icon": "bootloader.png", - "type": "bootloader", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":".boot0","url":"boot0.js"}, - {"name":".bootcde","url":"bootloader.js"}, - {"name":"bootupdate.js","url":"bootupdate.js"} - ], - "sortorder": -10 - }, - { - "id": "hebrew_calendar", - "name": "Hebrew Calendar", - "shortName": "HebCal", - "version": "0.04", - "description": "lists the date according to the hebrew calendar", - "icon": "app.png", - "allow_emulator": false, - "tags": "tool,locale", - "supports": [ - "BANGLEJS", - "BANGLEJS2" - ], - "readme": "README.md", - "storage": [ - { - "name": "hebrew_calendar.app.js", - "url": "app.js" - }, - { - "name": "hebrewDate", - "url": "hebrewDate.js" - }, - { - "name": "hebrew_calendar.img", - "url": "app-icon.js", - "evaluate": true - } - ] - }, - { "id": "golfscore", - "name": "Golf Score", - "shortName":"golfscore", - "version":"0.02", - "description": "keeps track of strokes during a golf game", - "icon": "app.png", - "tags": "outdoors", - "allow_emulator": true, - "supports" : ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"golfscore.app.js","url":"app.js"}, - {"name":"golfscore.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "messages", - "name": "Messages", - "version": "0.13", - "description": "App to display notifications from iOS and Gadgetbridge", - "icon": "app.png", - "type": "app", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"messages.app.js","url":"app.js"}, - {"name":"messages.settings.js","url":"settings.js"}, - {"name":"messages.img","url":"app-icon.js","evaluate":true}, - {"name":"messages.wid.js","url":"widget.js"}, - {"name":"messages","url":"lib.js"} - ], - "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}], - "sortorder": -9 - }, - { - "id": "android", - "name": "Android Integration", - "shortName": "Android", - "version": "0.05", - "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", - "icon": "app.png", - "tags": "tool,system,messages,notifications", - "dependencies": {"messages":"app"}, - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"android.app.js","url":"app.js"}, - {"name":"android.settings.js","url":"settings.js"}, - {"name":"android.img","url":"app-icon.js","evaluate":true}, - {"name":"android.boot.js","url":"boot.js"} - ], - "sortorder": -8 - }, - { - "id": "ios", - "name": "iOS Integration", - "version": "0.07", - "description": "Display notifications/music/etc from iOS devices", - "icon": "app.png", - "tags": "tool,system,ios,apple,messages,notifications", - "dependencies": {"messages":"app"}, - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"ios.app.js","url":"app.js"}, - {"name":"ios.img","url":"app-icon.js","evaluate":true}, - {"name":"ios.boot.js","url":"boot.js"} - ], - "sortorder": -8 - }, - { - "id": "health", - "name": "Health Tracking", - "version": "0.08", - "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", - "icon": "app.png", - "tags": "tool,system,health", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"health.app.js","url":"app.js"}, - {"name":"health.img","url":"app-icon.js","evaluate":true}, - {"name":"health.boot.js","url":"boot.js"}, - {"name":"health","url":"lib.js"} - ] - }, - { - "id": "launch", - "name": "Launcher", - "shortName": "Launcher", - "version": "0.10", - "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"launch.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]}, - {"name":"launch.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]}, - {"name":"launch.settings.js","url":"settings.js","supports":["BANGLEJS2"]} - ], - "data": [{"name":"launch.json"}], - "sortorder": -10 - }, - { - "id": "setting", - "name": "Settings", - "version": "0.36", - "description": "A menu for setting up Bangle.js", - "icon": "settings.png", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"setting.app.js","url":"settings.js"}, - {"name":"setting.img","url":"settings-icon.js","evaluate":true} - ], - "data": [{"name":"setting.json","url":"settings.min.json","evaluate":true}], - "sortorder": -5 - }, - { - "id": "about", - "name": "About", - "version": "0.12", - "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", - "icon": "app.png", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-about-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"about.img","url":"app-icon.js","evaluate":true} - ], - "sortorder": -4 - }, - { - "id": "alarm", - "name": "Default Alarm & Timer", - "shortName": "Alarms", - "version": "0.14", - "description": "Set and respond to alarms and timers", - "icon": "app.png", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"alarm.app.js","url":"app.js"}, - {"name":"alarm.boot.js","url":"boot.js"}, - {"name":"alarm.js","url":"alarm.js"}, - {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} - ], - "data": [{"name":"alarm.json"}] - }, - { - "id": "locale", - "name": "Languages", - "version": "0.14", - "description": "Translations for different countries", - "icon": "locale.png", - "type": "locale", - "tags": "tool,system,locale,translate", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "locale.html", - "storage": [ - {"name":"locale"} - ], - "sortorder": -10 - }, - { - "id": "notify", - "name": "Notifications (default)", - "shortName": "Notifications", - "version": "0.11", - "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen", - "icon": "notify.png", - "type": "notify", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { - "id": "notifyfs", - "name": "Fullscreen Notifications", - "shortName": "Notifications", - "version": "0.12", - "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.", - "icon": "notify.png", - "type": "notify", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { - "id": "welcome", - "name": "Welcome", - "shortName": "Welcome", - "version": "0.14", - "description": "Appears at first boot and explains how to use Bangle.js", - "icon": "app.png", - "screenshots": [{"url":"screenshot_welcome.png"}], - "tags": "start,welcome", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"welcome.boot.js","url":"boot.js"}, - {"name":"welcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"welcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"welcome.settings.js","url":"settings.js"}, - {"name":"welcome.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"welcome.json"}] - }, - { - "id": "mywelcome", - "name": "Customised Welcome", - "shortName": "My Welcome", - "version": "0.13", - "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", - "icon": "app.png", - "tags": "start,welcome", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}], - "storage": [ - {"name":"mywelcome.boot.js","url":"boot.js"}, - {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"mywelcome.settings.js","url":"settings.js"}, - {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"mywelcome.json"}] - }, - { - "id": "gbridge", - "name": "Gadgetbridge", - "version": "0.25", - "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", - "icon": "app.png", - "type": "widget", - "tags": "tool,system,android,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "dependencies": {"notify":"type"}, - "readme": "README.md", - "storage": [ - {"name":"gbridge.settings.js","url":"settings.js"}, - {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, - {"name":"gbridge.wid.js","url":"widget.js"} - ], - "data": [{"name":"gbridge.json"}] - }, - { "id": "gbdebug", - "name": "Gadgetbridge Debug", - "shortName":"GB Debug", - "version":"0.01", - "description": "Debug info for Gadgetbridge. Run this app and when Gadgetbridge messages arrive they are displayed on-screen.", - "icon": "app.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"gbdebug.app.js","url":"app.js"}, - {"name":"gbdebug.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mclock", - "name": "Morphing Clock", - "version": "0.07", - "description": "7 segment clock that morphs between minutes and hours", - "icon": "clock-morphing.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-morphing-clock-screenshot.png"}], - "storage": [ - {"name":"mclock.app.js","url":"clock-morphing.js"}, - {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} - ], - "sortorder": -9 - }, - { - "id": "moonphase", - "name": "Moonphase", - "version": "0.02", - "description": "Shows current moon phase. Now with GPS function.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-moon-phase-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"moonphase.app.js","url":"app.js"}, - {"name":"moonphase.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "daysl", - "name": "Days left", - "version": "0.03", - "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "allow_emulator": false, - "storage": [ - {"name":"daysl.app.js","url":"app.js"}, - {"name":"daysl.img","url":"app-icon.js","evaluate":true}, - {"name":"daysl.wid.js","url":"widget.js"} - ] - }, - { - "id": "wclock", - "name": "Word Clock", - "version": "0.03", - "description": "Display Time as Text", - "icon": "clock-word.png", - "screenshots": [{"url":"screenshot_word.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"wclock.app.js","url":"clock-word.js"}, - {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} - ] - }, - { - "id": "fontclock", - "name": "Font Clock", - "version": "0.01", - "description": "Choose the font and design of clock face from a library of available designs", - "icon": "fontclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"fontclock.app.js","url":"fontclock.js"}, - {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, - {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, - {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, - {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, - {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, - {"name":"fontclock.font.js","url":"fontclock.font.js"}, - {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, - {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, - {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, - {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, - {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, - {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} - ] - }, - { - "id": "slidingtext", - "name": "Sliding Clock", - "version": "0.07", - "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported", - "icon": "slidingtext.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"slidingtext.app.js","url":"slidingtext.js"}, - {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true}, - {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"}, - {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"}, - {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"}, - {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"}, - {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"}, - {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"}, - {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"}, - {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"} - ] - }, - { - "id": "solarclock", - "name": "Solar Clock", - "version": "0.02", - "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position", - "icon": "solar_clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"solarclock.app.js","url":"solar_clock.js"}, - {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true}, - {"name":"solar_colors.js","url":"solar_colors.js"}, - {"name":"solar_controller.js","url":"solar_controller.js"}, - {"name":"solar_date_utils.js","url":"solar_date_utils.js"}, - {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"}, - {"name":"solar_location.js","url":"solar_location.js"}, - {"name":"solar_math_utils.js","url":"solar_math_utils.js"}, - {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"}, - {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"}, - {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"}, - {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"}, - {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"}, - {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"} - ] - }, - { - "id": "sweepclock", - "name": "Sweep Clock", - "version": "0.04", - "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", - "icon": "sweepclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-sweep-clock-screenshot.png"}], - "storage": [ - {"name":"sweepclock.app.js","url":"sweepclock.js"}, - {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} - ] - }, - { - "id": "matrixclock", - "name": "Matrix Clock", - "version": "0.02", - "description": "inspired by The Matrix, a clock of the same style", - "icon": "matrixclock.png", - "screenshots": [{"url":"screenshot_matrix.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"matrixclock.app.js","url":"matrixclock.js"}, - {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true} - ] - }, - { - "id": "mandelbrotclock", - "name": "Mandelbrot Clock", - "version": "0.01", - "description": "A mandelbrot set themed clock cool", - "icon": "mandelbrotclock.png", - "screenshots": [{ "url": "screenshot_mandelbrotclock.png" }], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - { "name": "mandelbrotclock.app.js", "url": "mandelbrotclock.js" }, - { - "name": "mandelbrotclock.img", - "url": "mandelbrotclock-icon.js", - "evaluate": true - } - ] - }, - { - "id": "imgclock", - "name": "Image background clock", - "shortName": "Image Clock", - "version": "0.08", - "description": "A clock with an image as a background", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"imgclock.app.js","url":"app.js"}, - {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, - {"name":"imgclock.face.img"}, - {"name":"imgclock.face.json"}, - {"name":"imgclock.face.bg","content":""} - ] - }, - { - "id": "impwclock", - "name": "Imprecise Word Clock", - "version": "0.03", - "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", - "icon": "clock-impword.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"impwclock.app.js","url":"clock-impword.js"}, - {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} - ] - }, - { - "id": "aclock", - "name": "Analog Clock", - "version": "0.15", - "description": "An Analog Clock", - "icon": "clock-analog.png", - "screenshots": [{"url":"screenshot_analog.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"aclock.app.js","url":"clock-analog.js"}, - {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} - ] - }, - { - "id": "clock2x3", - "name": "2x3 Pixel Clock", - "version": "0.05", - "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", - "icon": "clock2x3.png", - "screenshots": [{"url":"screenshot_pixel.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, - {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} - ] - }, - { - "id": "geissclk", - "name": "Geiss Clock", - "version": "0.03", - "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", - "icon": "clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"geissclk.app.js","url":"clock.js"}, - {"name":"geissclk.precompute.js","url":"precompute.js"}, - {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} - ], - "data": [{"name":"geissclk.0.map"},{"name":"geissclk.1.map"},{"name":"geissclk.2.map"},{"name":"geissclk.3.map"},{"name":"geissclk.4.map"},{"name":"geissclk.5.map"},{"name":"geissclk.0.pal"},{"name":"geissclk.1.pal"},{"name":"geissclk.2.pal"}] - }, - { - "id": "trex", - "name": "T-Rex", - "version": "0.04", - "description": "T-Rex game in the style of Chrome's offline game", - "icon": "trex.png", - "screenshots": [{"url":"screenshot_trex.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"trex.app.js","url":"trex.js"}, - {"name":"trex.img","url":"trex-icon.js","evaluate":true}, - {"name":"trex.settings.js","url":"settings.js"} - ], - "data": [{"name":"trex.score","storageFile":true}] - }, - { - "id": "cubescramble", - "name": "Cube Scramble", - "version":"0.04", - "description": "A random scramble generator for the 3x3 Rubik's cube with a basic timer", - "icon": "cube-scramble.png", - "tags": "", - "supports" : ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle2-cube-scramble-screenshot.png"},{"url":"bangle1-cube-scramble-screenshot.png"}], - "storage": [ - {"name":"cubescramble.app.js","url":"cube-scramble.js"}, - {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} - ] - }, - { - "id": "astroid", - "name": "Asteroids!", - "version": "0.03", - "description": "Retro asteroids game", - "icon": "asteroids.png", - "screenshots": [{"url":"screenshot_asteroids.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"astroid.app.js","url":"asteroids.js"}, - {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} - ] - }, - { - "id": "clickms", - "name": "Click Master", - "version": "0.01", - "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", - "icon": "click-master.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"clickms.app.js","url":"click-master.js"}, - {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} - ] - }, - { - "id": "horsey", - "name": "Horse Race!", - "version": "0.01", - "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", - "icon": "horse-race.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"horsey.app.js","url":"horse-race.js"}, - {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} - ] - }, - { - "id": "compass", - "name": "Compass", - "version": "0.05", - "description": "Simple compass that points North", - "icon": "compass.png", - "screenshots": [{"url":"screenshot_compass.png"}], - "tags": "tool,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"compass.app.js","url":"compass.js"}, - {"name":"compass.img","url":"compass-icon.js","evaluate":true} - ] - }, - { - "id": "gpstime", - "name": "GPS Time", - "version": "0.05", - "description": "Update the Bangle.js's clock based on the time from the GPS receiver", - "icon": "gpstime.png", - "tags": "tool,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"gpstime.app.js","url":"gpstime.js"}, - {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} - ] - }, - { - "id": "openloc", - "name": "Open Location / Plus Codes", - "shortName": "Open Location", - "version": "0.01", - "description": "Convert your current GPS location to a series of characters", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"openloc.app.js","url":"app.js"}, - {"name":"openloc.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "speedo", - "name": "Speedo", - "version": "0.05", - "description": "Show the current speed according to the GPS", - "icon": "speedo.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"speedo.app.js","url":"speedo.js"}, - {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} - ] - }, - { - "id": "gpsrec", - "name": "GPS Recorder", - "version": "0.27", - "description": "Application that allows you to record a GPS track. Can run in background", - "icon": "app.png", - "tags": "tool,outdoors,gps,widget", - "screenshots": [{"url":"screenshot.png"}], - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"gpsrec.app.js","url":"app.js"}, - {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, - {"name":"gpsrec.wid.js","url":"widget.js"}, - {"name":"gpsrec.settings.js","url":"settings.js"} - ], - "data": [{"name":"gpsrec.json"},{"wildcard":".gpsrc?","storageFile":true}] - }, - { - "id": "recorder", - "name": "Recorder (BETA)", - "shortName": "Recorder", - "version": "0.04", - "description": "Record GPS position, heart rate and more in the background, then download to your PC.", - "icon": "app.png", - "tags": "tool,outdoors,gps,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"recorder.app.js","url":"app.js"}, - {"name":"recorder.img","url":"app-icon.js","evaluate":true}, - {"name":"recorder.wid.js","url":"widget.js"}, - {"name":"recorder.settings.js","url":"settings.js"} - ], - "data": [{"name":"recorder.json"},{"wildcard":"recorder.log?.csv","storageFile":true}] - }, - { - "id": "gpsnav", - "name": "GPS Navigation", - "version": "0.05", - "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", - "icon": "icon.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"gpsnav.app.js","url":"app.min.js"}, - {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "heart", - "name": "Heart Rate Recorder", - "shortName": "HRM Record", - "version": "0.07", - "description": "Application that allows you to record your heart rate. Can run in background", - "icon": "app.png", - "tags": "tool,health,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "interface": "interface.html", - "storage": [ - {"name":"heart.app.js","url":"app.js"}, - {"name":"heart.img","url":"app-icon.js","evaluate":true}, - {"name":"heart.wid.js","url":"widget.js"} - ], - "data": [{"name":"heart.json"},{"wildcard":".heart?","storageFile":true}] - }, - { - "id": "slevel", - "name": "Spirit Level", - "version": "0.02", - "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", - "icon": "spiritlevel.png", - "tags": "tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"slevel.app.js","url":"spiritlevel.js"}, - {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} - ] - }, - { - "id": "files", - "name": "App Manager", - "version": "0.07", - "description": "Show currently installed apps, free space, and allow their deletion from the watch", - "icon": "files.png", - "tags": "tool,system,files", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"files.app.js","url":"files.js"}, - {"name":"files.img","url":"files-icon.js","evaluate":true} - ] - }, - { - "id": "weather", - "name": "Weather", - "version": "0.13", - "description": "Show Gadgetbridge weather report", - "icon": "icon.png", - "screenshots": [{"url":"screenshot.png"}], - "tags": "widget,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "readme.md", - "storage": [ - {"name":"weather.app.js","url":"app.js"}, - {"name":"weather.wid.js","url":"widget.js"}, - {"name":"weather","url":"lib.js"}, - {"name":"weather.img","url":"icon.js","evaluate":true}, - {"name":"weather.settings.js","url":"settings.js"} - ], - "data": [{"name":"weather.json"}] - }, - { - "id": "chargeanim", - "name": "Charge Animation", - "version": "0.02", - "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.", - "icon": "icon.png", - "tags": "battery", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-charge-animation-screenshot.png"},{"url":"bangle-charge-animation-screenshot.png"}], - "storage": [ - {"name":"chargeanim.app.js","url":"app.js"}, - {"name":"chargeanim.boot.js","url":"boot.js"}, - {"name":"chargeanim.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "bluetoothdock", - "name": "Bluetooth Dock", - "shortName": "Dock", - "version": "0.01", - "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", - "icon": "app.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"bluetoothdock.app.js","url":"app.js"}, - {"name":"bluetoothdock.boot.js","url":"boot.js"}, - {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widbat", - "name": "Battery Level Widget", - "version": "0.09", - "description": "Show the current battery level and charging status in the top right of the clock", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbat.wid.js","url":"widget.js"} - ] - }, - { - "id": "widbatv", - "name": "Battery Level Widget (Vertical)", - "version": "0.01", - "description": "Slim, vertical battery widget that only takes up 14px", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbatv.wid.js","url":"widget.js"} - ] - }, - { - "id": "widlock", - "name": "Lock Widget", - "version": "0.03", - "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", - "icon": "widget.png", - "type": "widget", - "tags": "widget,lock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widlock.wid.js","url":"widget.js"} - ] - }, - { - "id": "widbatpc", - "name": "Battery Level Widget (with percentage)", - "shortName": "Battery Widget", - "version": "0.14", - "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widbatpc.wid.js","url":"widget.js"}, - {"name":"widbatpc.settings.js","url":"settings.js"} - ], - "data": [{"name":"widbatpc.json"}] - }, - { - "id": "widbatwarn", - "name": "Battery Warning", - "shortName": "Battery Warning", - "version": "0.02", - "description": "Show a warning when the battery runs low.", - "icon": "widget.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "widget", - "tags": "tool,battery", - "supports": ["BANGLEJS"], - "dependencies": {"notify":"type"}, - "readme": "README.md", - "storage": [ - {"name":"widbatwarn.wid.js","url":"widget.js"}, - {"name":"widbatwarn.settings.js","url":"settings.js"} - ], - "data": [{"name":"widbatwarn.json"}] - }, - { - "id": "widbt", - "name": "Bluetooth Widget", - "version": "0.07", - "description": "Show the current Bluetooth connection status in the top right of the clock", - "icon": "widget.png", - "type": "widget", - "tags": "widget,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbt.wid.js","url":"widget.js"} - ] - }, - { - "id": "widchime", - "name": "Hour Chime", - "version": "0.02", - "description": "Buzz or beep on every whole hour.", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widchime.wid.js","url":"widget.js"}, - {"name":"widchime.settings.js","url":"settings.js"} - ], - "data": [{"name":"widchime.json"}] - }, - { - "id": "widram", - "name": "RAM Widget", - "shortName": "RAM Widget", - "version": "0.01", - "description": "Display your Bangle's available RAM percentage in a widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widram.wid.js","url":"widget.js"} - ] - }, - { - "id": "hrm", - "name": "Heart Rate Monitor", - "version": "0.06", - "description": "Measure your heart rate and see live sensor data", - "icon": "heartrate.png", - "tags": "health", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"hrm.app.js","url":"heartrate.js"}, - {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} - ] - }, - { - "id": "widhrm", - "name": "Simple Heart Rate widget", - "version": "0.05", - "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", - "icon": "widget.png", - "type": "widget", - "tags": "health,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widhrm.wid.js","url":"widget.js"} - ] - }, - { - "id": "bthrm", - "name": "Bluetooth Heart Rate Monitor", - "shortName": "BT HRM", - "version": "0.01", - "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", - "icon": "app.png", - "type": "boot", - "tags": "health,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"bthrm.boot.js","url":"boot.js"}, - {"name":"bthrm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "stetho", - "name": "Stethoscope", - "version": "0.01", - "description": "Hear your heart rate", - "icon": "stetho.png", - "tags": "health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"stetho.app.js","url":"stetho.js"}, - {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} - ] - }, - { - "id": "swatch", - "name": "Stopwatch", - "version": "0.07", - "description": "Simple stopwatch with Lap Time logging to a JSON file", - "icon": "stopwatch.png", - "tags": "health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-stopwatch-screenshot.png"}], - "storage": [ - {"name":"swatch.app.js","url":"stopwatch.js"}, - {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} - ] - }, - { - "id": "hidmsic", - "name": "Bluetooth Music Controls", - "shortName": "Music Control", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", - "icon": "hid-music.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidmsic.app.js","url":"hid-music.js"}, - {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} - ] - }, - { - "id": "hidkbd", - "name": "Bluetooth Keyboard", - "shortName": "Bluetooth Kbd", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", - "icon": "hid-keyboard.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, - {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} - ] - }, - { - "id": "hidbkbd", - "name": "Binary Bluetooth Keyboard", - "shortName": "Binary BT Kbd", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", - "icon": "hid-binary-keyboard.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, - {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} - ] - }, - { - "id": "animals", - "name": "Animals Game", - "version": "0.01", - "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", - "icon": "animals.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"animals.app.js","url":"animals.js"}, - {"name":"animals.img","url":"animals-icon.js","evaluate":true}, - {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, - {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, - {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, - {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, - {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, - {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, - {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, - {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} - ] - }, - { - "id": "qrcode", - "name": "Custom QR Code", - "version": "0.04", - "description": "Use this to upload a customised QR code to Bangle.js", - "icon": "app.png", - "tags": "qrcode", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "customConnect": true, - "storage": [ - {"name":"qrcode.app.js"}, - {"name":"qrcode.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "beer", - "name": "Beer Compass", - "version": "0.01", - "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"beer.app.js"}, - {"name":"beer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "route", - "name": "Route Viewer", - "version": "0.02", - "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"route.app.js"}, - {"name":"route.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ncstart", - "name": "NCEU Startup", - "version": "0.06", - "description": "NodeConfEU 2019 'First Start' Sequence", - "icon": "start.png", - "tags": "start,welcome", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncstart.app.js","url":"start.js"}, - {"name":"ncstart.boot.js","url":"boot.js"}, - {"name":"ncstart.settings.js","url":"settings.js"}, - {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, - {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, - {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, - {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, - {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, - {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} - ], - "data": [{"name":"ncstart.json"}] - }, - { - "id": "ncfrun", - "name": "NCEU 5K Fun Run", - "version": "0.01", - "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", - "icon": "nceu-funrun.png", - "tags": "health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, - {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} - ] - }, - { - "id": "widnceu", - "name": "NCEU Logo Widget", - "version": "0.02", - "description": "Show the NodeConf EU logo in the top left", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widnceu.wid.js","url":"widget.js"} - ] - }, - { - "id": "sclock", - "name": "Simple Clock", - "version": "0.07", - "description": "A Simple Digital Clock", - "icon": "clock-simple.png", - "screenshots": [{"url":"screenshot_simplec.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"sclock.app.js","url":"clock-simple.js"}, - {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} - ] - }, - { - "id": "s7clk", - "name": "Simple 7 segment Clock", - "version": "0.03", - "description": "A simple 7 segment Clock with date", - "icon": "icon.png", - "screenshots": [{"url":"screenshot_s7segment.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"s7clk.app.js","url":"app.js"}, - {"name":"s7clk.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "vibrclock", - "name": "Vibrate Clock", - "version": "0.03", - "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-vibrate-clock-screenshot.png"}], - "storage": [ - {"name":"vibrclock.app.js","url":"app.js"}, - {"name":"vibrclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "svclock", - "name": "Simple V-Clock", - "version": "0.04", - "description": "Modification of Simple Clock 0.04 to use Vectorfont", - "icon": "vclock-simple.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-simple-v-clock-screenshot.png"}], - "storage": [ - {"name":"svclock.app.js","url":"vclock-simple.js"}, - {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true} - ] - }, - { - "id": "dclock", - "name": "Dev Clock", - "version": "0.10", - "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", - "icon": "clock-dev.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-dev-clock-screenshot.png"},{"url":"bangle1-dev-clock-screenshot.png"}], - "storage": [ - {"name":"dclock.app.js","url":"clock-dev.js"}, - {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} - ] - }, - { - "id": "gesture", - "name": "Gesture Test", - "version": "0.01", - "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", - "icon": "gesture.png", - "type": "app", - "tags": "gesture,ai", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gesture.app.js","url":"gesture.js"}, - {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, - {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, - {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} - ] - }, - { - "id": "pparrot", - "name": "Party Parrot", - "version": "0.01", - "description": "Party with a parrot on your wrist", - "icon": "party-parrot.png", - "type": "app", - "tags": "party,parrot,lol", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-party-parrot-screenshot.png"}], - "storage": [ - {"name":"pparrot.app.js","url":"party-parrot.js"}, - {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} - ] - }, - { - "id": "hrings", - "name": "Hypno Rings", - "version": "0.01", - "description": "Experiment with trippy rings, press buttons for change", - "icon": "hypno-rings.png", - "type": "app", - "tags": "rings,hypnosis,psychadelic", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-hypno-rings-screenshot.png"}], - "storage": [ - {"name":"hrings.app.js","url":"hypno-rings.js"}, - {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} - ] - }, - { - "id": "morse", - "name": "Morse Code", - "version": "0.01", - "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", - "icon": "morse-code.png", - "type": "app", - "tags": "morse,sound,visual,input", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"morse.app.js","url":"morse-code.js"}, - {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} - ] - }, - { - "id": "blescan", - "name": "BLE Scanner", - "version": "0.01", - "description": "Scan for advertising BLE devices", - "icon": "blescan.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"blescan.app.js","url":"blescan.js"}, - {"name":"blescan.img","url":"blescan-icon.js","evaluate":true} - ] - }, - { - "id": "mmonday", - "name": "Manic Monday Tone", - "version": "0.02", - "description": "The Bangles make a comeback", - "icon": "manic-monday-icon.png", - "tags": "sound", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"mmonday.app.js","url":"manic-monday.js"}, - {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} - ] - }, - { - "id": "jbells", - "name": "Jingle Bells", - "version": "0.01", - "description": "Play Jingle Bells", - "icon": "jbells.png", - "type": "app", - "tags": "sound", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"jbells.app.js","url":"jbells.js"}, - {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} - ] - }, - { - "id": "scolor", - "name": "Show Color", - "version": "0.01", - "description": "Display all available Colors and Names", - "icon": "show-color.png", - "type": "app", - "tags": "tool", - "screenshots": [{"url":"bangle1-view-color-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"scolor.app.js","url":"show-color.js"}, - {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} - ] - }, - { - "id": "miclock", - "name": "Mixed Clock", - "version": "0.05", - "description": "A mix of analog and digital Clock", - "icon": "clock-mixed.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-mixed-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"miclock.app.js","url":"clock-mixed.js"}, - {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { - "id": "bclock", - "name": "Binary Clock", - "version": "0.03", - "description": "A simple binary clock watch face", - "icon": "clock-binary.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-binary-clock-screenshot.png"}], - "storage": [ - {"name":"bclock.app.js","url":"clock-binary.js"}, - {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} - ] - }, - { - "id": "clotris", - "name": "Clock-Tris", - "version": "0.01", - "description": "A fully functional clone of a classic game of falling blocks", - "icon": "clock-tris.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-clock-tris-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"clotris.app.js","url":"clock-tris.js"}, - {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, - {"name":".trishig","url":"clock-tris-high"} - ] - }, - { - "id": "flappy", - "name": "Flappy Bird", - "version": "0.05", - "description": "A Flappy Bird game clone", - "icon": "app.png", - "screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"flappy.app.js","url":"app.js"}, - {"name":"flappy.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gpsinfo", - "name": "GPS Info", - "version": "0.05", - "description": "An application that displays information about altitude, lat/lon, satellites and time", - "icon": "gps-info.png", - "type": "app", - "tags": "gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"gpsinfo.app.js","url":"gps-info.js"}, - {"name":"gpsinfo.img","url":"gps-info-icon.js","evaluate":true} - ] - }, - { - "id": "assistedgps", - "name": "Assisted GPS Update (AGPS)", - "version": "0.01", - "description": "Downloads assisted GPS (AGPS) data to Bangle.js 1 for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.", - "icon": "app.png", - "type": "RAM", - "tags": "tool,outdoors,agps", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [] - }, - { - "id": "pomodo", - "name": "Pomodoro", - "version": "0.02", - "description": "A simple pomodoro timer.", - "icon": "pomodoro.png", - "type": "app", - "tags": "pomodoro,cooking,tools", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-pomodoro-screenshot.png"}], - "storage": [ - {"name":"pomodo.app.js","url":"pomodoro.js"}, - {"name":"pomodo.img","url":"pomodoro-icon.js","evaluate":true} - ] - }, - { - "id": "blobclk", - "name": "Large Digit Blob Clock", - "shortName": "Blob Clock", - "version": "0.06", - "description": "A clock with big digits", - "icon": "clock-blob.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-large-digit-blob-clock-screenshot.png"},{"url":"bangle1-large-digit-blob-clock-screenshot.png"}], - "storage": [ - {"name":"blobclk.app.js","url":"clock-blob.js"}, - {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} - ] - }, - { - "id": "boldclk", - "name": "Bold Clock", - "version": "0.05", - "description": "Simple, readable and practical clock", - "icon": "bold_clock.png", - "screenshots": [{"url":"screenshot_bold.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"boldclk.app.js","url":"bold_clock.js"}, - {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} - ] - }, - { - "id": "widclk", - "name": "Digital clock widget", - "version": "0.06", - "description": "A simple digital clock widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget,clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widclk.wid.js","url":"widget.js"} - ] - }, - { - "id": "widpedom", - "name": "Pedometer widget", - "version": "0.19", - "description": "Daily pedometer widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widpedom.wid.js","url":"widget.js"}, - {"name":"widpedom.settings.js","url":"settings.js"} - ] - }, - { - "id": "berlinc", - "name": "Berlin Clock", - "version": "0.05", - "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", - "icon": "berlin-clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"berlin-clock-screenshot.png"}], - "storage": [ - {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} - ] - }, - { - "id": "ctrclk", - "name": "Centerclock", - "version": "0.03", - "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-center-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"ctrclk.app.js","url":"app.js"}, - {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "demoapp", - "name": "Demo Loop", - "version": "0.02", - "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", - "icon": "app.png", - "type": "app", - "tags": "", - "screenshots": [{"url":"bangle1-demo-loop-screenshot1.png"},{"url":"bangle1-demo-loop-screenshot2.png"},{"url":"bangle1-demo-loop-screenshot3.png"},{"url":"bangle1-demo-loop-screenshot4.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"demoapp.app.js","url":"app.js"}, - {"name":"demoapp.img","url":"app-icon.js","evaluate":true} - ], - "sortorder": -9 - }, - { - "id": "flagrse", - "name": "Espruino Flag Raiser", - "version": "0.01", - "description": "App to send a command to another Espruino to cause it to raise a flag", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"flagrse.app.js","url":"app.js"}, - {"name":"flagrse.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pipboy", - "name": "Pipboy", - "version": "0.04", - "description": "Pipboy themed clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}], - "storage": [ - {"name":"pipboy.app.js","url":"app.js"}, - {"name":"pipboy.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "torch", - "name": "Torch", - "shortName": "Torch", - "version": "0.02", - "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", - "icon": "app.png", - "tags": "tool,torch", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"torch.app.js","url":"app.js"}, - {"name":"torch.wid.js","url":"widget.js"}, - {"name":"torch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rtorch", - "name": "Red Torch", - "shortName": "RedTorch", - "version": "0.02", - "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", - "icon": "app.png", - "tags": "tool,torch", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"rtorch.app.js","url":"app.js"}, - {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]}, - {"name":"rtorch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "wohrm", - "name": "Workout HRM", - "version": "0.08", - "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", - "icon": "app.png", - "type": "app", - "tags": "hrm,workout", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], - "storage": [ - {"name":"wohrm.app.js","url":"app.js"}, - {"name":"wohrm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widid", - "name": "Bluetooth ID Widget", - "version": "0.03", - "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", - "icon": "widget.png", - "type": "widget", - "tags": "widget,address,mac", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widid.wid.js","url":"widget.js"} - ] - }, - { - "id": "grocery", - "name": "Grocery", - "version": "0.02", - "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", - "icon": "grocery.png", - "type": "app", - "tags": "tool,outdoors,shopping,list", - "supports": ["BANGLEJS"], - "custom": "grocery.html", - "storage": [ - {"name":"grocery.app.js","url":"app.js"}, - {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} - ] - }, - { - "id": "marioclock", - "name": "Mario Clock", - "version": "0.15", - "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", - "icon": "marioclock.png", - "type": "clock", - "tags": "clock,mario,retro", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "screenshots": [{"url":"bangle1-mario-clock-screenshot.png"}], - "storage": [ - {"name":"marioclock.app.js","url":"marioclock-app.js"}, - {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} - ] - }, - { - "id": "cliock", - "name": "Commandline-Clock", - "shortName": "CLI-Clock", - "version": "0.15", - "description": "Simple CLI-Styled Clock", - "icon": "app.png", - "screenshots": [{"url":"screenshot_cli.png"}], - "type": "clock", - "tags": "clock,cli,command,bash,shell", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"cliock.app.js","url":"app.js"}, - {"name":"cliock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widver", - "name": "Firmware Version Widget", - "version": "0.03", - "description": "Display the version of the installed firmware in the top widget section.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widver.wid.js","url":"widget.js"} - ] - }, - { - "id": "barclock", - "name": "Bar Clock", - "version": "0.09", - "description": "A simple digital clock showing seconds as a bar", - "icon": "clock-bar.png", - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"barclock.app.js","url":"clock-bar.js"}, - {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} - ] - }, - { - "id": "dotclock", - "name": "Dot Clock", - "version": "0.03", - "description": "A Minimal Dot Analog Clock", - "icon": "clock-dot.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-dot-clcok-screenshot.png"},{"url":"bangle1-dot-clock-screenshot.png"}], - "storage": [ - {"name":"dotclock.app.js","url":"clock-dot.js"}, - {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} - ] - }, - { - "id": "widtbat", - "name": "Tiny Battery Widget", - "version": "0.02", - "description": "Tiny blueish battery widget, vibs and changes level color when charging", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widtbat.wid.js","url":"widget.js"} - ] - }, - { - "id": "chrono", - "name": "Chrono", - "shortName": "Chrono", - "version": "0.01", - "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", - "icon": "chrono.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"chrono.app.js","url":"chrono.js"}, - {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} - ] - }, - { - "id": "astrocalc", - "name": "Astrocalc", - "version": "0.02", - "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", - "icon": "astrocalc.png", - "tags": "app,sun,moon,cycles,tool,outdoors", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, - {"name":"suncalc.js","url":"suncalc.js"}, - {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, - {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, - {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, - {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, - {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, - {"name":"full.img","url":"full-icon.js","evaluate":true}, - {"name":"new.img","url":"new-icon.js","evaluate":true}, - {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, - {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} - ] - }, - { - "id": "widhwt", - "name": "Hand Wash Timer", - "version": "0.01", - "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widhwt.wid.js","url":"widget.js"} - ] - }, - { - "id": "toucher", - "name": "Touch Launcher", - "shortName": "Toucher", - "version": "0.07", - "description": "Touch enable left to right launcher.", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"toucher.app.js","url":"app.js"}, - {"name":"toucher.settings.js","url":"settings.js"} - ], - "data": [{"name":"toucher.json"}] - }, - { - "id": "balltastic", - "name": "Balltastic", - "version": "0.02", - "description": "Simple but fun ball eats dots game.", - "icon": "app.png", - "type": "app", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"balltastic.app.js","url":"app.js"}, - {"name":"balltastic.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rpgdice", - "name": "RPG dice", - "version": "0.02", - "description": "Simple RPG dice rolling app.", - "icon": "rpgdice.png", - "type": "app", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-rpg-dice-screenshot.png"}], - "storage": [ - {"name":"rpgdice.app.js","url":"app.js"}, - {"name":"rpgdice.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widmp", - "name": "Moon Phase Widget", - "version": "0.02", - "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widmp.wid.js","url":"widget.js"} - ] - }, - { - "id": "widmpsh", - "name": "Moon Phase Widget Southern Hemisphere", - "version": "0.01", - "description": "Display the current moon phase in blueish for the southern hemisphere in eight phases", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widmpsh.wid.js","url":"widget.js"} - ] - }, - { - "id": "minionclk", - "name": "Minion clock", - "version": "0.05", - "description": "Minion themed clock.", - "icon": "minionclk.png", - "type": "clock", - "tags": "clock,minion", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-minion-clock-screenshot.png"}], - "storage": [ - {"name":"minionclk.app.js","url":"app.js"}, - {"name":"minionclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "openstmap", - "name": "OpenStreetMap", - "shortName": "OpenStMap", - "version": "0.11", - "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", - "icon": "app.png", - "tags": "outdoors,gps,osm", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "custom": "custom.html", - "customConnect": true, - "storage": [ - {"name":"openstmap","url":"openstmap.js"}, - {"name":"openstmap.app.js","url":"app.js"}, - {"name":"openstmap.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "activepedom", - "name": "Active Pedometer", - "shortName": "Active Pedometer", - "version": "0.09", - "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", - "icon": "app.png", - "tags": "outdoors,widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"activepedom.wid.js","url":"widget.js"}, - {"name":"activepedom.settings.js","url":"settings.js"}, - {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, - {"name":"activepedom.app.js","url":"app.js"} - ] - }, - { - "id": "chronowid", - "name": "Chrono Widget", - "shortName": "Chrono Widget", - "version": "0.04", - "description": "Chronometer (timer) which runs as widget.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "storage": [ - {"name":"chronowid.wid.js","url":"widget.js"}, - {"name":"chronowid.app.js","url":"app.js"}, - {"name":"chronowid.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "tabata", - "name": "Tabata", - "shortName": "Tabata - Control High-Intensity Interval Training", - "version": "0.01", - "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", - "icon": "tabata.png", - "tags": "workout,health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"tabata.app.js","url":"tabata.js"}, - {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} - ] - }, - { - "id": "custom", - "name": "Custom Boot Code ", - "version": "0.01", - "description": "Add code you want to run at boot time", - "icon": "custom.png", - "type": "bootloader", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "storage": [ - {"name":"custom"} - ] - }, - { - "id": "devstopwatch", - "name": "Dev Stopwatch", - "shortName": "Dev Stopwatch", - "version": "0.03", - "description": "Stopwatch with 5 laps supported (cyclically replaced)", - "icon": "app.png", - "tags": "stopwatch,chrono,timer,chronometer", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-dev-stopwatch-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"devstopwatch.app.js","url":"app.js"}, - {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "batchart", - "name": "Battery Chart", - "shortName": "Battery Chart", - "version": "0.10", - "description": "A widget and an app for recording and visualizing battery percentage over time.", - "icon": "app.png", - "tags": "app,widget,battery,time,record,chart,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"batchart.wid.js","url":"widget.js"}, - {"name":"batchart.app.js","url":"app.js"}, - {"name":"batchart.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "nato", - "name": "NATO Alphabet", - "shortName": "NATOAlphabet", - "version": "0.01", - "description": "Learn the NATO Phonetic alphabet plus some numbers.", - "icon": "nato.png", - "type": "app", - "tags": "app,learn,visual", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-NATO-alphabet-screenshot.png"},{"url":"bangle1-NATO-alphabet-screenshot2.png"}], - "storage": [ - {"name":"nato.app.js","url":"nato.js"}, - {"name":"nato.img","url":"nato-icon.js","evaluate":true} - ] - }, - { - "id": "numerals", - "name": "Numerals Clock", - "shortName": "Numerals Clock", - "version": "0.10", - "description": "A simple big numerals clock", - "icon": "numerals.png", - "type": "clock", - "tags": "numerals,clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-numerals-screenshot.png"}], - "storage": [ - {"name":"numerals.app.js","url":"numerals.app.js"}, - {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, - {"name":"numerals.settings.js","url":"numerals.settings.js"} - ], - "data": [{"name":"numerals.json"}] - }, - { - "id": "bledetect", - "name": "BLE Detector", - "shortName": "BLE Detector", - "version": "0.03", - "description": "Detect BLE devices and show some informations.", - "icon": "bledetect.png", - "tags": "app,bluetooth,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"bledetect.app.js","url":"bledetect.js"}, - {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} - ] - }, - { - "id": "snake", - "name": "Snake", - "shortName": "Snake", - "version": "0.02", - "description": "The classic snake game. Eat apples and don't bite your tail.", - "icon": "snake.png", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"snake.app.js","url":"snake.js"}, - {"name":"snake.img","url":"snake-icon.js","evaluate":true} - ] - }, - { "id": "snek", - "name": "The snek game", - "shortName":"Snek", - "version": "0.02", - "description": "A snek game where you control a snek to eat all the apples!", - "screenshots": [{"url":"screenshot_snek.png"}], - "icon": "snek.png", - "supports": ["BANGLEJS2"], - "tags": "game,fun", - "storage": [ - {"name":"snek.app.js","url":"snek.js"}, - {"name":"snek.img","url":"snek.icon.js","evaluate":true} - ] - }, - { - "id": "calculator", - "name": "Calculator", - "shortName": "Calculator", - "version": "0.04", - "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", - "icon": "calculator.png", - "screenshots": [{"url":"screenshot_calculator.png"}], - "tags": "app,tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"calculator.app.js","url":"app.js"}, - {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} - ] - }, - { - "id": "dane", - "name": "Digital Assistant, not EDITH", - "shortName": "DANE", - "version": "0.16", - "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"dane.app.js","url":"app.js"}, - {"name":"dane.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "dane_tcr", - "name": "DANE Touch Launcher", - "shortName": "DANE Toucher", - "version": "0.07", - "description": "Touch enable left to right launcher in the style of the DANE Watchface", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"dane_tcr.app.js","url":"app.js"}, - {"name":"dane_tcr.settings.js","url":"settings.js"} - ], - "data": [{"name":"dane_tcr.json"}] - }, - { - "id": "buffgym", - "name": "BuffGym", - "version": "0.02", - "description": "BuffGym is the famous 5x5 workout program for the BangleJS", - "icon": "buffgym.png", - "type": "app", - "tags": "tool,outdoors,gym,exercise", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "buffgym.html", - "allow_emulator": false, - "storage": [ - {"name":"buffgym.app.js","url":"buffgym.app.js"}, - {"name":"buffgym-set.js","url":"buffgym-set.js"}, - {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, - {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, - {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, - {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, - {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, - {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} - ] - }, - { - "id": "banglerun", - "name": "BangleRun", - "shortName": "BangleRun", - "version": "0.10", - "description": "An app for running sessions. Displays info and logs your run for later viewing.", - "icon": "banglerun.png", - "tags": "run,running,fitness,outdoors", - "supports": ["BANGLEJS"], - "interface": "interface.html", - "allow_emulator": false, - "storage": [ - {"name":"banglerun.app.js","url":"app.js"}, - {"name":"banglerun.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "metronome", - "name": "Metronome", - "version": "0.07", - "readme": "README.md", - "description": "Makes the watch blinking and vibrating with a given rate", - "icon": "metronome_icon.png", - "tags": "tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-metronome-screenshot.png"}], - "storage": [ - {"name":"metronome.app.js","url":"metronome.js"}, - {"name":"metronome.img","url":"metronome-icon.js","evaluate":true}, - {"name":"metronome.settings.js","url":"settings.js"} - ] - }, - { - "id": "blackjack", - "name": "Black Jack game", - "shortName": "Black Jack game", - "version": "0.02", - "description": "Simple implementation of card game Black Jack", - "icon": "blackjack.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"blackjack.app.js","url":"blackjack.app.js"}, - {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} - ] - }, - { - "id": "hidcam", - "name": "Camera shutter", - "shortName": "Cam shutter", - "version": "0.03", - "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", - "icon": "app.png", - "tags": "bluetooth,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hidcam.app.js","url":"app.js"}, - {"name":"hidcam.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "swlclk", - "name": "SWL Clock / Short Wave Listner Clock", - "shortName": "SWL Clock", - "version": "0.02", - "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies", - "icon": "swlclk.png", - "type": "clock", - "tags": "tool,clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-SWL-clock-screenshot.png"}], - "storage": [ - {"name":"swlclk.app.js","url":"app.js"}, - {"name":"swlclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rclock", - "name": "Round clock with seconds, minutes and date", - "shortName": "Round Clock", - "version": "0.06", - "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"rclock.app.js","url":"rclock.app.js"}, - {"name":"rclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "fclock", - "name": "fclock", - "shortName": "F Clock", - "version": "0.02", - "description": "Simple design of a digital clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"fclock.app.js","url":"fclock.app.js"}, - {"name":"fclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hamloc", - "name": "QTH Locator / Maidenhead Locator System", - "shortName": "QTH Locator", - "version": "0.01", - "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hamloc.app.js","url":"app.js"}, - {"name":"hamloc.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "osmpoi", - "name": "POI Compass", - "version": "0.03", - "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"osmpoi.app.js"}, - {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pong", - "name": "Pong", - "shortName": "Pong", - "version": "0.03", - "description": "A clone of the Atari game Pong", - "icon": "pong.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-pong-screenshot.png"}], - "storage": [ - {"name":"pong.app.js","url":"app.js"}, - {"name":"pong.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ballmaze", - "name": "Ball Maze", - "version": "0.02", - "description": "Navigate a ball through a maze by tilting your watch.", - "icon": "icon.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"ballmaze.app.js","url":"app.js"}, - {"name":"ballmaze.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"ballmaze.json"}] - }, - { - "id": "calendar", - "name": "Calendar", - "version": "0.03", - "description": "Simple calendar", - "icon": "calendar.png", - "screenshots": [{"url":"screenshot_calendar.png"}], - "tags": "calendar", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"calendar.app.js","url":"calendar.js"}, - {"name":"calendar.settings.js","url":"settings.js"}, - {"name":"calendar.img","url":"calendar-icon.js","evaluate":true} - ], - "data": [{"name":"calendar.json"}] - }, - { - "id": "hidjoystick", - "name": "Bluetooth Joystick", - "shortName": "Joystick", - "version": "0.01", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", - "icon": "app.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidjoystick.app.js","url":"app.js"}, - {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "largeclock", - "name": "Large Clock", - "version": "0.10", - "description": "A readable and informational digital watch, with date, seconds and moon phase", - "icon": "largeclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-large-clock-screenshot.png"}], - "storage": [ - {"name":"largeclock.app.js","url":"largeclock.js"}, - {"name":"largeclock.img","url":"largeclock-icon.js","evaluate":true}, - {"name":"largeclock.settings.js","url":"settings.js"} - ], - "data": [{"name":"largeclock.json"}] - }, - { - "id": "smtswch", - "name": "Smart Switch", - "shortName": "Smart Switch", - "version": "0.01", - "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", - "icon": "app.png", - "type": "app", - "tags": "bluetooth,btle,smart,switch", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"smtswch.app.js","url":"app.js"}, - {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, - {"name":"light-on.img","url":"light-on.js","evaluate":true}, - {"name":"light-off.img","url":"light-off.js","evaluate":true}, - {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, - {"name":"switch-off.img","url":"switch-off.js","evaluate":true} - ] - }, - { - "id": "miplant", - "name": "Xiaomi Plant Sensor", - "shortName": "Mi Plant", - "version": "0.02", - "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors", - "icon": "app.png", - "tags": "xiaomi,mi,plant,ble,bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"miplant.app.js","url":"app.js"}, - {"name":"miplant.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "simpletimer", - "name": "Timer", - "version": "0.07", - "description": "Simple timer, useful when playing board games or cooking", - "icon": "app.png", - "tags": "timer", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-timer-screenshot.png"}], - "storage": [ - {"name":"simpletimer.app.js","url":"app.js"}, - {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, - {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, - {"name":"simpletimer.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"simpletimer.json"}] - }, - { - "id": "beebclock", - "name": "Beeb Clock", - "version": "0.05", - "description": "Clock face that may be coincidentally familiar to BBC viewers", - "icon": "beebclock.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-beeb-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"beebclock.app.js","url":"beebclock.js"}, - {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} - ] - }, - { - "id": "findphone", - "name": "Find Phone", - "shortName": "Find Phone", - "version": "0.03", - "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.", - "icon": "app.png", - "tags": "tool,android", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"findphone.app.js","url":"app.js"}, - {"name":"findphone.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "getup", - "name": "Get Up", - "shortName": "Get Up", - "version": "0.01", - "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!", - "icon": "app.png", - "tags": "tools,health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "screenshots": [{"url":"bangle1-get-up-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"getup.app.js","url":"app.js"}, - {"name":"getup.settings.js","url":"settings.js"}, - {"name":"getup.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gallifr", - "name": "Time Traveller's Chronometer", - "shortName": "Time Travel Clock", - "version": "0.02", - "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", - "icon": "gallifr.png", - "screenshots": [{"url":"screenshot_time.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"gallifr.app.js","url":"app.js"}, - {"name":"gallifr.img","url":"app-icon.js","evaluate":true}, - {"name":"gallifr.settings.js","url":"settings.js"} - ], - "data": [{"name":"gallifr.json"}] - }, - { - "id": "rndmclk", - "name": "Random Clock Loader", - "version": "0.03", - "description": "Load a different clock whenever the LCD is switched on.", - "icon": "rndmclk.png", - "type": "widget", - "tags": "widget,clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"rndmclk.wid.js","url":"widget.js"} - ] - }, - { - "id": "dotmatrixclock", - "name": "Dotmatrix Clock", - "version": "0.01", - "description": "A clear white-on-blue dotmatrix simulated clock", - "icon": "dotmatrixclock.png", - "type": "clock", - "tags": "clock,dotmatrix,retro", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"dotmatrixclock.app.js","url":"app.js"}, - {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true} - ] - }, - { - "id": "jbm8b", - "name": "Magic 8 Ball", - "shortName": "Magic 8 Ball", - "version": "0.03", - "description": "A simple fortune telling app", - "icon": "app.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"jbm8b.app.js","url":"app.js"}, - {"name":"jbm8b.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "jbm8b_IT", - "name": "Magic 8 Ball Italiano", - "shortName": "Magic 8 Ball IT", - "version": "0.01", - "description": "La palla predice il futuro", - "icon": "app.png", - "screenshots": [{"url":"bangle1-magic-8-ball-italiano-screenshot.png"}], - "tags": "game", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"jbm8b_IT.app.js","url":"app.js"}, - {"name":"jbm8b_IT.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "BLEcontroller", - "name": "BLE Customisable Controller with Joystick", - "shortName": "BLE Controller", - "version": "0.01", - "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.", - "icon": "BLEcontroller.png", - "tags": "tool,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "storage": [ - {"name":"BLEcontroller.app.js","url":"app.js"}, - {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widviz", - "name": "Widget Visibility Widget", - "shortName": "Viz Widget", - "version": "0.03", - "description": "Swipe left to hide top bar widgets, swipe right to redisplay.", - "icon": "eye.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widviz.wid.js","url":"widget.js"} - ] - }, - { - "id": "binclock", - "name": "Binary Clock", - "shortName": "Binary Clock", - "version": "0.03", - "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.", - "icon": "app.png", - "type": "clock", - "tags": "clock,binary", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"binclock.app.js","url":"app.js"}, - {"name":"binclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pizzatimer", - "name": "Pizza Timer", - "shortName": "Pizza Timer", - "version": "0.01", - "description": "A timer app for when you cook Pizza. Some say it can also time other things", - "icon": "pizza.png", - "tags": "timer,tool,pizza", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"pizzatimer.app.js","url":"app.js"}, - {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "animclk", - "name": "Animated Clock", - "shortName": "Anim Clock", - "version": "0.03", - "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", - "icon": "app.png", - "type": "clock", - "tags": "clock,animated", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"animclk.app.js","url":"app.js"}, - {"name":"animclk.pixels1","url":"animclk.pixels1"}, - {"name":"animclk.pixels2","url":"animclk.pixels2"}, - {"name":"animclk.pal","url":"animclk.pal"}, - {"name":"animclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "analogimgclk", - "name": "Analog Clock (Image background)", - "shortName": "Analog Clock", - "version": "0.03", - "description": "An analog clock with an image background", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"analogimgclk.app.js","url":"app.js"}, - {"name":"analogimgclk.bg.img","url":"bg.img"}, - {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "verticalface", - "name": "Vertical watch face", - "shortName": "Vertical Face", - "version": "0.09", - "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-vertical-watch-face-screenshot.png"}], - "storage": [ - {"name":"verticalface.app.js","url":"app.js"}, - {"name":"verticalface.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "sleepphasealarm", - "name": "SleepPhaseAlarm", - "shortName": "SleepPhaseAlarm", - "version": "0.02", - "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", - "icon": "app.png", - "tags": "alarm", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"sleepphasealarm.app.js","url":"app.js"}, - {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "life", - "name": "Game of Life", - "version": "0.04", - "description": "Conway's Game of Life - 16x16 board", - "icon": "life.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-game-of-life-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"life.app.js","url":"life.min.js"}, - {"name":"life.img","url":"life-icon.js","evaluate":true} - ] - }, - { - "id": "magnav", - "name": "Navigation Compass", - "version": "0.05", - "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", - "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}], - "icon": "magnav.png", - "tags": "tool,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]}, - {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]}, - {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} - ], - "data": [{"name":"magnav.json"}] - }, - { - "id": "gpspoilog", - "name": "GPS POI Logger", - "shortName": "GPS POI Log", - "version": "0.01", - "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial", - "icon": "app.png", - "tags": "outdoors", - "supports": ["BANGLEJS"], - "interface": "interface.html", - "storage": [ - {"name":"gpspoilog.app.js","url":"app.js"}, - {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "miclock2", - "name": "Mixed Clock 2", - "version": "0.01", - "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", - "icon": "clock-mixed.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-mixed-clock-2-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"miclock2.app.js","url":"clock-mixed.js"}, - {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { - "id": "1button", - "name": "One-Button-Tracker", - "version": "0.01", - "description": "A widget that turns BTN1 into a tracker, records time of button press/release.", - "icon": "widget.png", - "type": "widget", - "tags": "tool,quantifiedself,widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"1button.wid.js","url":"widget.js"} - ], - "data": [{"name":"one_button_presses.csv","storageFile":true}] - }, - { - "id": "gpsautotime", - "name": "GPS auto time", - "shortName": "GPS auto time", - "version": "0.01", - "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gpsautotime.wid.js","url":"widget.js"} - ] - }, - { - "id": "espruinoctrl", - "name": "Espruino Control", - "shortName": "Espruino Ctrl", - "version": "0.01", - "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"espruinoctrl.app.js"}, - {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "multiclock", - "name": "Multi Clock", - "version": "0.09", - "description": "Clock with multiple faces. Switch between faces with BTN1 & BTN3 (Bangle 2 touch top-right, bottom right). For best display set theme Background 2 to cyan or some other bright colour in settings.", - "screenshots": [{"url":"screen-ana.png"},{"url":"screen-big.png"},{"url":"screen-td.png"},{"url":"screen-nifty.png"},{"url":"screen-word.png"},{"url":"screen-sec.png"}], - "icon": "multiclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"multiclock.app.js","url":"multiclock.app.js"}, - {"name":"big.face.js","url":"big.face.js"}, - {"name":"ana.face.js","url":"ana.face.js"}, - {"name":"digi.face.js","url":"digi.face.js"}, - {"name":"txt.face.js","url":"txt.face.js"}, - {"name":"dk.face.js","url":"dk.face.js"}, - {"name":"nifty.face.js","url":"nifty.face.js"}, - {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} - ] - }, - { - "id": "widancs", - "name": "Apple Notification Widget", - "shortName": "ANCS Widget", - "version": "0.07", - "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"widancs.wid.js","url":"ancs.min.js"}, - {"name":"widancs.settings.js","url":"settings.js"} - ] - }, - { - "id": "accelrec", - "name": "Acceleration Recorder", - "shortName": "Accel Rec", - "version": "0.02", - "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"accelrec.app.js","url":"app.js"}, - {"name":"accelrec.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"wildcard":"accelrec.?.csv"}] - }, - { - "id": "accellog", - "name": "Acceleration Logger", - "shortName": "Accel Log", - "version": "0.03", - "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", - "icon": "app.png", - "tags": "outdoor", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"accellog.app.js","url":"app.js"}, - {"name":"accellog.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"wildcard":"accellog.?.csv"}] - }, - { - "id": "cprassist", - "name": "CPR Assist", - "version": "0.01", - "description": "Provides assistance while performing a CPR", - "icon": "cprassist-icon.png", - "tags": "tool,firstaid", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], - "storage": [ - {"name":"cprassist.app.js","url":"cprassist.js"}, - {"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true}, - {"name":"cprassist.settings.js","url":"settings.js"} - ] - }, - { - "id": "osgridref", - "name": "Ordnance Survey Grid Reference", - "shortName": "OS Grid ref", - "version": "0.01", - "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", - "icon": "app.png", - "tags": "outdoors,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"osgridref.app.js","url":"app.js"}, - {"name":"osgridref.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "openseizure", - "name": "OpenSeizureDetector Widget", - "shortName": "Short Name", - "version": "0.01", - "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"openseizure.wid.js","url":"widget.js"} - ] - }, - { - "id": "counter", - "name": "Counter", - "version": "0.03", - "description": "Simple counter", - "icon": "counter_icon.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-counter-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"counter.app.js","url":"counter.js"}, - {"name":"counter.img","url":"counter-icon.js","evaluate":true} - ] - }, - { - "id": "bootgattbat", - "name": "BLE GATT Battery Service", - "shortName": "BLE Battery Service", - "version": "0.01", - "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n", - "icon": "bluetooth.png", - "type": "bootloader", - "tags": "battery,ble,bluetooth,gatt", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"gattbat.boot.js","url":"boot.js"} - ] - }, - { - "id": "viewstl", - "name": "STL file viewer", - "shortName": "ViewSTL", - "version": "0.02", - "description": "This app allows you to view STL 3D models on your watch", - "icon": "icons8-octahedron-48.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"viewstl.app.js","url":"viewstl.min.js"}, - {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, - {"name":"tetra.stl","url":"tetra.stl"}, - {"name":"cube.stl","url":"cube.stl"}, - {"name":"icosa.stl","url":"icosa.stl"} - ] - }, - { - "id": "cscsensor", - "name": "Cycling speed sensor", - "shortName": "CSCSensor", - "version": "0.06", - "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch", - "icon": "icons8-cycling-48.png", - "tags": "outdoors,exercise,ble,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"cscsensor.app.js","url":"cscsensor.app.js"}, - {"name":"cscsensor.settings.js","url":"settings.js"}, - {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true} - ] - }, - { - "id": "fileman", - "name": "File manager", - "shortName": "FileManager", - "version": "0.03", - "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", - "icon": "icons8-filing-cabinet-48.png", - "tags": "tools", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"fileman.app.js","url":"fileman.app.js"}, - {"name":"fileman.img","url":"fileman-icon.js","evaluate":true} - ] - }, - { - "id": "worldclock", - "name": "World Clock - 4 time zones", - "shortName": "World Clock", - "version": "0.05", - "description": "Current time zone plus up to four others", - "icon": "app.png", - "screenshots": [{"url":"screenshot_world.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"worldclock.app.js","url":"app.js"}, - {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true} - ], - "data": [{"name":"worldclock.settings.json"}] - }, - { - "id": "digiclock", - "name": "Digital Clock Face", - "shortName": "Digi Clock", - "version": "0.02", - "description": "A simple digital clock with the time, day, month, and year", - "icon": "digiclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"digiclock.app.js","url":"digiclock.js"}, - {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true} - ] - }, - { - "id": "dsdrelay", - "name": "DSD BLE Relay controller", - "shortName": "DSDRelay", - "version": "0.01", - "description": "Control BLE relay board from the watch", - "icon": "icons8-relay-48.png", - "tags": "ble,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"}, - {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true} - ] - }, - { - "id": "mandel", - "name": "Mandelbrot", - "shortName": "Mandel", - "version": "0.01", - "description": "Draw a zoomable Mandelbrot set", - "icon": "mandel.png", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mandel.app.js","url":"mandel.min.js"}, - {"name":"mandel.img","url":"mandel-icon.js","evaluate":true} - ] - }, - { - "id": "petrock", - "name": "Pet rock", - "version": "0.02", - "description": "A virtual pet rock with wobbly eyes", - "icon": "petrock.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"petrock.app.js","url":"app.js"}, - {"name":"petrock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "smartibot", - "name": "Smartibot controller", - "shortName": "Smartibot", - "version": "0.01", - "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"smartibot.app.js","url":"app.js"}, - {"name":"smartibot.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widncr", - "name": "NCR Logo Widget", - "version": "0.01", - "description": "Show the NodeConf Remote logo in the top left", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widncr.wid.js","url":"widget.js"} - ] - }, - { - "id": "ncrclk", - "name": "NCR Clock", - "shortName": "NCR Clock", - "version": "0.02", - "description": "NodeConf Remote clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncrclk.app.js","url":"app.js"}, - {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "isoclock", - "name": "ISO Compliant Clock Face", - "shortName": "ISO Clock", - "version": "0.02", - "description": "Tweaked fork of digiclock for ISO date and time", - "icon": "isoclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"isoclock.app.js","url":"isoclock.js"}, - {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true} - ] - }, - { - "id": "gpstimeserver", - "name": "GPS Time Server", - "version": "0.01", - "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"gpstimeserver.wid.js","url":"widget.js"} - ] - }, - { - "id": "tilthydro", - "name": "Tilt Hydrometer Display", - "shortName": "Tilt Hydro", - "version": "0.01", - "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", - "icon": "app.png", - "tags": "tools,bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"tilthydro.app.js","url":"app.js"}, - {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "supmariodark", - "name": "Super mario clock night mode", - "shortName": "supmariodark", - "version": "0.01", - "description": "Super mario clock in night mode", - "icon": "supmariodark.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"supmariodark.app.js","url":"supmariodark.js"}, - {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, - {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"}, - {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"}, - {"name":"banner-up.img","url":"banner-up.js","evaluate":true}, - {"name":"banner-down.img","url":"banner-down.js","evaluate":true}, - {"name":"brick2.img","url":"brick2.js","evaluate":true}, - {"name":"enemy.img","url":"enemy.js","evaluate":true}, - {"name":"flower.img","url":"flower.js","evaluate":true}, - {"name":"flower_b.img","url":"flower_b.js","evaluate":true}, - {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true}, - {"name":"pipe.img","url":"pipe.js","evaluate":true} - ] - }, - { - "id": "gmeter", - "name": "G-Meter", - "shortName": "G-Meter", - "version": "0.01", - "description": "Simple G-Meter", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gmeter.app.js","url":"app.js"}, - {"name":"gmeter.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "dtlaunch", - "name": "Desktop Launcher", - "version": "0.07", - "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", - "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], - "icon": "icon.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, - {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, - {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]}, - {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]}, - {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"dtlaunch.json"}] - }, - { - "id": "HRV", - "name": "Heart Rate Variability monitor", - "shortName": "HRV monitor", - "version": "0.04", - "description": "Heart Rate Variability monitor, see Readme for more info", - "icon": "hrv.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"HRV.app.js","url":"app.js"}, - {"name":"HRV.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hardalarm", - "name": "Hard Alarm", - "shortName": "HardAlarm", - "version": "0.02", - "description": "Make sure you wake up! Count to the right number to turn off the alarm", - "icon": "app.png", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hardalarm.app.js","url":"app.js"}, - {"name":"hardalarm.boot.js","url":"boot.js"}, - {"name":"hardalarm.js","url":"hardalarm.js"}, - {"name":"hardalarm.img","url":"app-icon.js","evaluate":true}, - {"name":"hardalarm.wid.js","url":"widget.js"} - ], - "data": [{"name":"hardalarm.json"}] - }, - { - "id": "edisonsball", - "name": "Edison's Ball", - "shortName": "Edison's Ball", - "version": "0.01", - "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", - "icon": "app-icon.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"edisonsball.app.js","url":"app.js"}, - {"name":"edisonsball.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hrrawexp", - "name": "HRM Data Exporter", - "shortName": "HRM Data Exporter", - "version": "0.01", - "description": "export raw hrm signal data to a csv file", - "icon": "app-icon.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"hrrawexp.app.js","url":"app.js"}, - {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "breath", - "name": "Breathing App", - "shortName": "Breathing App", - "version": "0.01", - "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR", - "icon": "app-icon.png", - "tags": "tools,health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"breath.app.js","url":"app.js"}, - {"name":"breath.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"breath.settings.json","url":"settings.json"}] - }, - { - "id": "lazyclock", - "name": "Lazy Clock", - "version": "0.03", - "description": "Tells the time, roughly", - "icon": "lazyclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "screenshots": [{"url":"bangle1-lazy-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"lazyclock.app.js","url":"lazyclock-app.js"}, - {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true} - ] - }, - { - "id": "astral", - "name": "Astral Clock", - "version": "0.03", - "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", - "icon": "app-icon.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"astral.app.js","url":"app.js"}, - {"name":"astral.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "alpinenav", - "name": "Alpine Nav", - "version": "0.01", - "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime", - "icon": "app-icon.png", - "tags": "outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"alpinenav.app.js","url":"app.js"}, - {"name":"alpinenav.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "lifeclk", - "name": "Game of Life Clock", - "shortName": "Conway's Clock", - "version": "0.06", - "description": "Modification and clockification of Conway's Game of Life", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"lifeclk.app.js","url":"app.min.js"}, - {"name":"lifeclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "speedalt", - "name": "GPS Adventure Sports", - "shortName": "GPS Adv Sport", - "version": "1.02", - "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", - "icon": "app.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"speedalt.app.js","url":"app.js"}, - {"name":"speedalt.img","url":"app-icon.js","evaluate":true}, - {"name":"speedalt.settings.js","url":"settings.js"} - ], - "data": [{"name":"speedalt.json"}] - }, - { - "id": "speedalt2", - "name": "GPS Adventure Sports II", - "shortName": "GPS Adv Sport II", - "version": "0.07", - "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", - "icon": "app.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"speedalt2.app.js","url":"app.js"}, - {"name":"speedalt2.img","url":"app-icon.js","evaluate":true}, - {"name":"speedalt2.settings.js","url":"settings.js"} - ], - "data": [{"name":"speedalt2.json"}] - }, - { - "id": "slomoclock", - "name": "SloMo Clock", - "shortName": "SloMo Clock", - "version": "0.10", - "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", - "icon": "watch.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-slow-mo-clock-screenshot.png"}], - "storage": [ - {"name":"slomoclock.app.js","url":"app.js"}, - {"name":"slomoclock.img","url":"app-icon.js","evaluate":true}, - {"name":"slomoclock.settings.js","url":"settings.js"} - ], - "data": [{"name":"slomoclock.json"}] - }, - { - "id": "de-stress", - "name": "De-Stress", - "shortName": "De-Stress", - "version": "0.02", - "description": "Simple haptic heartbeat", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"de-stress.app.js","url":"app.js"}, - {"name":"de-stress.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mclockplus", - "name": "Morph Clock+", - "shortName": "Morph Clock+", - "version": "0.02", - "description": "Morphing Clock with more readable seconds and date and additional stopwatch", - "icon": "mclockplus.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, - {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} - ] - }, - { - "id": "intervals", - "name": "Intervals App", - "shortName": "Intervals", - "version": "0.01", - "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", - "icon": "intervals.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"intervals.app.js","url":"intervals.app.js"}, - {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} - ] - }, - { - "id": "planetarium", - "name": "Planetarium", - "shortName": "Planetarium", - "version": "0.03", - "description": "Planetarium showing up to 500 stars using the watch location and time", - "icon": "planetarium.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"planetarium.app.js","url":"planetarium.app.js"}, - {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, - {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, - {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, - {"name":"planetarium.settings.js","url":"settings.js"}, - {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} - ], - "data": [{"name":"planetarium.json"}] - }, - { - "id": "tapelauncher", - "name": "Tape Launcher", - "version": "0.02", - "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", - "icon": "icon.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"tapelauncher.app.js","url":"app.js"}, - {"name":"tapelauncher.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "oblique", - "name": "Oblique Strategies", - "version": "0.01", - "description": "Oblique Strategies for creativity. Copied from Brian Eno.", - "icon": "eno.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"oblique.app.js","url":"app.js"}, - {"name":"oblique.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "testuserinput", - "name": "Test User Input", - "shortName": "Test User Input", - "version": "0.06", - "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.", - "icon": "app.png", - "tags": "input,interface,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"testuserinput.app.js","url":"app.js"}, - {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gpssetup", - "name": "GPS Setup", - "shortName": "GPS Setup", - "version": "0.02", - "description": "Configure the GPS power options and store them in the GPS nvram", - "icon": "gpssetup.png", - "tags": "gps,tools,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"gpssetup","url":"gpssetup.js"}, - {"name":"gpssetup.settings.js","url":"settings.js"}, - {"name":"gpssetup.app.js","url":"app.js"}, - {"name":"gpssetup.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"gpssetup.settings.json","url":"settings.json"}] - }, - { - "id": "walkersclock", - "name": "Walkers Clock", - "shortName": "Walkers Clock", - "version": "0.04", - "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference", - "icon": "walkersclock48.png", - "type": "clock", - "tags": "clock,gps,tools,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"walkersclock.app.js","url":"app.js"}, - {"name":"walkersclock.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "widgps", - "name": "GPS Widget", - "version": "0.03", - "description": "Tiny widget to show the power on/off status of the GPS", - "icon": "widget.png", - "type": "widget", - "tags": "widget,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widgps.wid.js","url":"widget.js"} - ] - }, - { - "id": "widhrt", - "name": "HRM Widget", - "version": "0.03", - "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor", - "icon": "widget.png", - "type": "widget", - "tags": "widget,hrm", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widhrt.wid.js","url":"widget.js"} - ] - }, - { - "id": "countdowntimer", - "name": "Countdown Timer", - "version": "0.01", - "description": "A simple countdown timer with a focus on usability", - "icon": "countdowntimer.png", - "tags": "timer,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"countdowntimer.app.js","url":"countdowntimer.js"}, - {"name":"countdowntimer.img","url":"countdowntimer-icon.js","evaluate":true} - ] - }, - { - "id": "helloworld", - "name": "hello, world!", - "shortName": "hello world", - "version": "0.02", - "description": "A cross cultural hello world!/hola mundo! app with colors and languages", - "icon": "app.png", - "tags": "input,interface,buttons,touch", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"helloworld.app.js","url":"app.js"}, - {"name":"helloworld.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widcom", - "name": "Compass Widget", - "version": "0.02", - "description": "Tiny widget to show the power on/off status of the Compass", - "icon": "widget.png", - "type": "widget", - "tags": "widget,compass", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widcom.wid.js","url":"widget.js"} - ] - }, - { - "id": "arrow", - "name": "Arrow Compass", - "version": "0.05", - "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass", - "icon": "arrow.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"arrow.app.js","url":"app.js"}, - {"name":"arrow.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "waypointer", - "name": "Way Pointer", - "version": "0.01", - "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", - "icon": "waypointer.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"waypointer.app.js","url":"app.js"}, - {"name":"waypointer.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "color_catalog", - "name": "Colors Catalog", - "shortName": "Colors Catalog", - "version": "0.01", - "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", - "icon": "app.png", - "tags": "Color,input,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"color_catalog.app.js","url":"app.js"}, - {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "UI4swatch", - "name": "UI 4 swatch", - "shortName": "UI 4 swatch", - "version": "0.01", - "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.", - "icon": "app.png", - "tags": "Color,input,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"UI4swatch.app.js","url":"app.js"}, - {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "simplest", - "name": "Simplest Clock", - "version": "0.03", - "description": "The simplest working clock, acts as a tutorial piece", - "icon": "simplest.png", - "screenshots": [{"url":"screenshot_simplest.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"simplest.app.js","url":"app.js"}, - {"name":"simplest.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "stepo", - "name": "Stepometer Clock", - "version": "0.03", - "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed", - "icon": "stepo.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"stepo.app.js","url":"app.js"}, - {"name":"stepo.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "gbmusic", - "name": "Gadgetbridge Music Controls", - "shortName": "Music Controls", - "version": "0.08", - "description": "Control the music on your Gadgetbridge-connected phone", - "icon": "icon.png", - "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], - "type": "app", - "tags": "tools,bluetooth,gadgetbridge,music", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"gbmusic.app.js","url":"app.js"}, - {"name":"gbmusic.settings.js","url":"settings.js"}, - {"name":"gbmusic.wid.js","url":"widget.js"}, - {"name":"gbmusic.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}] - }, - { - "id": "battleship", - "name": "Battleship", - "version": "0.01", - "description": "The classic game of battleship", - "icon": "battleship-icon.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-battle-ship-screenshot.png"}], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"battleship.app.js","url":"battleship.js"}, - {"name":"battleship.img","url":"battleship-icon.js","evaluate":true} - ] - }, - { - "id": "kitchen", - "name": "Kitchen Combo", - "version": "0.13", - "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'", - "icon": "kitchen.png", - "type": "clock", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"kitchen.app.js","url":"kitchen.app.js"}, - {"name":"stepo2.kit.js","url":"stepo2.kit.js"}, - {"name":"swatch.kit.js","url":"swatch.kit.js"}, - {"name":"gps.kit.js","url":"gps.kit.js"}, - {"name":"compass.kit.js","url":"compass.kit.js"}, - {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "banglebridge", - "name": "BangleBridge", - "shortName": "BangleBridge", - "version": "0.01", - "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"banglebridge.wid.js","url":"widget.js"}, - {"name":"banglebridge.watch.img","url":"watch.img"}, - {"name":"banglebridge.heart.img","url":"heart.img"} - ] - }, - { - "id": "qmsched", - "name": "Quiet Mode Schedule and Widget", - "shortName": "Quiet Mode", - "version": "0.05", - "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", - "icon": "app.png", - "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, - {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}], - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"qmsched","url":"lib.js"}, - {"name":"qmsched.app.js","url":"app.js"}, - {"name":"qmsched.boot.js","url":"boot.js"}, - {"name":"qmsched.img","url":"icon.js","evaluate":true}, - {"name":"qmsched.wid.js","url":"widget.js"} - ], - "data": [{"name":"qmsched.json"}] - }, - { - "id": "hourstrike", - "name": "Hour Strike", - "shortName": "Hour Strike", - "version": "0.08", - "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!", - "icon": "app-icon.png", - "tags": "tool,alarm", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hourstrike.app.js","url":"app.js"}, - {"name":"hourstrike.boot.js","url":"boot.js"}, - {"name":"hourstrike.img","url":"app-icon.js","evaluate":true}, - {"name":"hourstrike.json","url":"hourstrike.json"} - ] - }, - { - "id": "whereworld", - "name": "Where in the World?", - "shortName": "Where World", - "version": "0.01", - "description": "Shows your current location on the world map", - "icon": "app.png", - "tags": "gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"whereworld.app.js","url":"app.js"}, - {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, - {"name":"whereworld.worldmap","url":"worldmap"} - ] - }, - { - "id": "omnitrix", - "name": "Omnitrix", - "version": "0.01", - "description": "An Omnitrix Showpiece", - "icon": "omnitrix.png", - "screenshots": [{"url":"screenshot.png"}], - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"omnitrix.app.js","url":"omnitrix.app.js"}, - {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true} - ] - }, - { - "id": "batclock", - "name": "Bat Clock", - "shortName": "Bat Clock", - "version": "0.02", - "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", - "icon": "bat-clock.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"batclock.app.js","url":"bat-clock.app.js"}, - {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true} - ] - }, - { - "id": "doztime", - "name": "Dozenal Time", - "shortName": "Dozenal Time", - "version": "0.04", - "description": "A dozenal Holocene calendar and dozenal diurnal clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"doztime.app.js","url":"app.js"}, - {"name":"doztime.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gbtwist", - "name": "Gadgetbridge Twist Control", - "shortName": "Twist Control", - "version": "0.01", - "description": "Shake your wrist to control your music app via Gadgetbridge", - "icon": "app.png", - "type": "app", - "tags": "tools,bluetooth,gadgetbridge,music", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "storage": [ - {"name":"gbtwist.app.js","url":"app.js"}, - {"name":"gbtwist.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "thermom", - "name": "Thermometer", - "version": "0.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"thermom.app.js","url":"app.js"}, - {"name":"thermom.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mysticdock", - "name": "Mystic Dock", - "version": "1.00", - "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.", - "icon": "mystic-dock.png", - "type": "dock", - "tags": "dock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mysticdock.app.js","url":"mystic-dock-app.js"}, - {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"}, - {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"}, - {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true} - ] - }, - { - "id": "mysticclock", - "name": "Mystic Clock", - "version": "1.01", - "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.", - "icon": "mystic-clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-mystic-clock-screenshot.png"}], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"mysticclock.app.js","url":"mystic-clock-app.js"}, - {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"}, - {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true} - ] - }, - { - "id": "hcclock", - "name": "Hi-Contrast Clock", - "version": "0.02", - "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", - "icon": "hcclock-icon.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"hcclock.app.js","url":"hcclock.app.js"}, - {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} - ] - }, - { - "id": "thermomF", - "name": "Fahrenheit Temp", - "version": "0.01", - "description": "A modification of the Thermometer App to display temprature in Fahrenheit", - "icon": "thermf.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"thermomF.app.js","url":"app.js"}, - {"name":"thermomF.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "nixie", - "name": "Nixie Clock", - "shortName": "Nixie", - "version": "0.01", - "description": "A nixie tube clock for both Bangle 1 and 2.", - "icon": "nixie.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"nixie.app.js","url":"app.js"}, - {"name":"nixie.img","url":"app-icon.js","evaluate":true}, - {"name":"m_vatch.js","url":"m_vatch.js"} - ] - }, - { - "id": "carcrazy", - "name": "Car Crazy", - "shortName": "Car Crazy", - "version": "0.03", - "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.", - "icon": "carcrash.png", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"carcrazy.app.js","url":"app.js"}, - {"name":"carcrazy.img","url":"app-icon.js","evaluate":true}, - {"name":"carcrazy.settings.js","url":"settings.js"} - ], - "data": [{"name":"CarCrazy.csv"}] - }, - { - "id": "shortcuts", - "name": "Shortcuts", - "shortName": "Shortcuts", - "version": "0.01", - "description": "Quickly load your favourite apps from (almost) any watch face.", - "icon": "app.png", - "type": "bootloader", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"shortcuts.boot.js","url":"boot.js"}, - {"name":"shortcuts.settings.js","url":"settings.js"} - ], - "data": [{"name":"shortcuts.json"}] - }, - { - "id": "vectorclock", - "name": "Vector Clock", - "version": "0.03", - "description": "A digital clock that uses the built-in vector font.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [ - {"url":"bangle2-vector-clock-screenshot.png"}, - {"url":"bangle1-vector-clock-screenshot.png"} - ], - "storage": [ - {"name":"vectorclock.app.js","url":"app.js"}, - {"name":"vectorclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "fd6fdetect", - "name": "fd6fdetect", - "shortName": "fd6fdetect", - "version": "0.2", - "description": "Allows you to see 0xFD6F beacons near you.", - "icon": "app.png", - "tags": "tool", - "readme": "README.md", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"fd6fdetect.app.js","url":"app.js"}, - {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "choozi", - "name": "Choozi", - "version": "0.01", - "description": "Choose people or things at random using Bangle.js.", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-choozi-screenshot1.png"},{"url":"bangle1-choozi-screenshot2.png"}], - "storage": [ - {"name":"choozi.app.js","url":"app.js"}, - {"name":"choozi.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widclkbttm", - "name": "Digital clock (Bottom) widget", - "shortName": "Digital clock Bottom Widget", - "version": "0.03", - "description": "Displays time in the bottom area.", - "icon": "widclkbttm.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"} - ] - }, - { - "id": "pastel", - "name": "Pastel Clock", - "shortName": "Pastel", - "version": "0.08", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", - "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"f_architect","url":"f_architect.js"}, - {"name":"f_gochihand","url":"f_gochihand.js"}, - {"name":"f_cabin","url":"f_cabin.js"}, - {"name":"f_orbitron","url":"f_orbitron.js"}, - {"name":"f_monoton","url":"f_monoton.js"}, - {"name":"f_elite","url":"f_elite.js"}, - {"name":"f_lato","url":"f_lato.js"}, - {"name":"f_latosmall","url":"f_latosmall.js"}, - {"name":"pastel.app.js","url":"pastel.app.js"}, - {"name":"pastel.img","url":"pastel.icon.js","evaluate":true}, - {"name":"pastel.settings.js","url":"pastel.settings.js"} - ], - "data": [{"name":"pastel.json"}] - }, - { - "id": "antonclk", - "name": "Anton Clock", - "version": "0.03", - "description": "A simple clock using the bold Anton font.", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"antonclk.app.js","url":"app.js"}, - {"name":"antonclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "waveclk", - "name": "Wave Clock", - "version": "0.02", - "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"waveclk.app.js","url":"app.js"}, - {"name":"waveclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "floralclk", - "name": "Floral Clock", - "version": "0.01", - "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**", - "icon": "app.png", - "screenshots": [{"url":"screenshot_floral.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"floralclk.app.js","url":"app.js"}, - {"name":"floralclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "score", - "name": "Score Tracker", - "version": "0.01", - "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.", - "icon": "score.app.png", - "screenshots": [{"url":"screenshot_score.png"}], - "type": "app", - "tags": "", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"score.app.js","url":"score.app.js"}, - {"name":"score.settings.js","url":"score.settings.js"}, - {"name":"score.presets.json","url":"score.presets.json"}, - {"name":"score.img","url":"score.app-icon.js","evaluate":true} - ], - "data": [{"name":"score.json"}] - }, - { - "id": "menusmall", - "name": "Small Menus", - "version": "0.02", - "description": "Replace Bangle.js 2's menus with a version that contains smaller text", - "icon": "app.png", - "type": "boot", - "tags": "system", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"menusmall.boot.js","url":"boot.js"} - ] - }, - { - "id": "ffcniftya", - "name": "Nifty-A Clock", - "version": "0.01", - "description": "A nifty clock with time and date", - "icon": "app.png", - "screenshots": [{"url":"screenshot_nifty.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"ffcniftya.app.js","url":"app.js"}, - {"name":"ffcniftya.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ffcniftyb", - "name": "Nifty-B Clock", - "version": "0.02", - "description": "A nifty clock (series B) with time, date and color configuration", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"ffcniftyb.app.js","url":"app.js"}, - {"name":"ffcniftyb.img","url":"app-icon.js","evaluate":true}, - {"name":"ffcniftyb.settings.js","url":"settings.js"} - ], - "data": [{"name":"ffcniftyb.json"}] - }, - { - "id": "stopwatch", - "name": "Stopwatch Touch", - "version": "0.01", - "description": "A touch based stop watch for Bangle JS 2", - "icon": "stopwatch.png", - "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], - "tags": "tools,app", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"stopwatch.app.js","url":"stopwatch.app.js"}, - {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true} - ] - }, - { - "id": "vernierrespirate", - "name": "Vernier Go Direct Respiration Belt", - "shortName": "Respiration Belt", - "version": "0.01", - "description": "Connects to a Go Direct Respiration Belt and shows respiration rate", - "icon": "app.png", - "tags": "health,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"vernierrespirate.app.js","url":"app.js"}, - {"name":"vernierrespirate.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"vernierrespirate.json"}] - }, - { - "id": "gpstouch", - "name": "GPS Touch", - "version": "0.01", - "description": "A touch based GPS watch, shows OS map reference", - "icon": "gpstouch.png", - "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], - "tags": "tools,app", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"geotools","url":"geotools.js"}, - {"name":"gpstouch.app.js","url":"gpstouch.app.js"}, - {"name":"gpstouch.img","url":"gpstouch.icon.js","evaluate":true} - ] - }, - { - "id": "swiperclocklaunch", - "name": "Swiper Clock Launch", - "version": "0.02", - "description": "Navigate between clock and launcher with Swipe action", - "icon": "swiperclocklaunch.png", - "type": "bootloader", - "tags": "tools, system", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - {"name":"swiperclocklaunch.boot.js","url":"boot.js"}, - {"name":"swiperclocklaunch.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "qalarm", - "name": "Q Alarm and Timer", - "shortName": "Q Alarm", - "icon": "app.png", - "version": "0.03", - "description": "Alarm and timer app with days of week and 'hard' option.", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - { "name": "qalarm.app.js", "url": "app.js" }, - { "name": "qalarm.boot.js", "url": "boot.js" }, - { "name": "qalarm.js", "url": "qalarm.js" }, - { "name": "qalarmcheck.js", "url": "qalarmcheck.js" }, - { "name": "qalarm.img", "url": "app-icon.js", "evaluate": true }, - { "name": "qalarm.wid.js", "url": "widget.js" } - ], - "data": [{ "name": "qalarm.json" }] - }, - { - "id": "emojuino", - "name": "Emojuino", - "shortName": "Emojuino", - "version": "0.03", - "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", - "icon": "emojuino.png", - "screenshots": [ - { "url": "screenshot-tx.png" }, - { "url": "screenshot-swipe.png" }, - { "url": "screenshot-welcome.png" } - ], - "type": "app", - "tags": "emoji", - "supports" : [ "BANGLEJS2" ], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - { "name": "emojuino.app.js", "url": "emojuino.js" }, - { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } - ] - }, - { - "id": "cliclockJS2Enhanced", - "name": "Commandline-Clock JS2 Enhanced", - "shortName": "CLI-Clock JS2", - "version": "0.03", - "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design. Also added HID media controlls, just swipe on the clock face to controll the media! Gadgetbride support coming soon(hopefully) Thanks to t0m1o1 for media controls!", - "icon": "app.png", - "screenshots": [{"url":"screengrab.png"}], - "type": "clock", - "tags": "clock,cli,command,bash,shell", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, - {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} - ] - }, - { - "id": "wid_a_battery_widget", - "name": "A Battery Widget (with percentage)", - "shortName":"A Battery Widget", - "icon": "widget.png", - "version":"1.02", - "type": "widget", - "supports": ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "description": "Simple and slim battery widget with charge status and percentage", - "tags": "widget,battery", - "storage": [ - {"name":"wid_a_battery_widget.wid.js","url":"widget.js"} - ] - }, - { - "id": "lcars", - "name": "LCARS Clock", - "shortName":"LCARS", - "icon": "lcars.png", - "version":"0.06", - "readme": "README.md", - "supports": ["BANGLEJS2"], - "description": "Library Computer Access Retrieval System (LCARS) clock.", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"screenshot.png"}], - "storage": [ - {"name":"lcars.app.js","url":"lcars.app.js"}, - {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} - ] - }, - { "id": "binwatch", - "name": "Binary Watch", - "shortName":"BinWatch", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.04", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "allow_emulator":true, - "description": "Famous binary watch", - "tags": "clock", - "type": "clock", - "storage": [ - {"name":"binwatch.app.js","url":"app.js"}, - {"name":"binwatch.bg176.img","url":"Background176_center.img"}, - {"name":"binwatch.bg240.img","url":"Background240_center.img"}, - {"name":"binwatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hidmsicswipe", - "name": "Bluetooth Music Swipe Controls", - "shortName": "Swipe Control", - "version": "0.01", - "description": "Based on the original Bluetooth Music Controls. Swipe up/down for volume, left/right for previous and next, tap for play/pause and btn1 to lock and unlock the controls. Enable HID in settings, pair with your phone, then use this app to control music from your watch!", - "icon": "hidmsicswipe.png", - "tags": "bluetooth", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"hidmsicswipe.app.js","url":"hidmsicswipe.js"}, - {"name":"hidmsicswipe.img","url":"hidmsicswipe-icon.js","evaluate":true} - ] - }, - { - "id": "authentiwatch", - "name": "2FA Authenticator", - "shortName": "AuthWatch", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "version": "0.04", - "description": "Google Authenticator compatible tool.", - "tags": "tool", - "interface": "interface.html", - "supports": ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"authentiwatch.app.js","url":"app.js"}, - {"name":"authentiwatch.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"authentiwatch.json"}] - }, - { "id": "schoolCalendar", - "name": "School Calendar", - "shortName":"SCalendar", - "icon": "CalenderLogo.png", - "version": "0.01", - "description": "A simple calendar that you can see your upcoming events that you create in the customizer. Keep in note that your events reapeat weekly.(Beta)", - "tags": "tool", - "readme":"README.md", - "custom":"custom.html", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"screenshot_basic.png"},{"url":"screenshot_info.png"}], - "storage": [ - {"name":"schoolCalendar.app.js"}, - {"name":"schoolCalendar.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"calendarItems.csv"} - ] - }, - { "id": "timecal", - "name": "TimeCal", - "shortName":"TimeCal", - "icon": "icon.png", - "version":"0.01", - "description": "TimeCal shows the Time along with a 3 week calendar", - "tags": "clock", - "type": "clock", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"timecal.app.js","url":"timecal.app.js"} - ] - }, - { - "id": "a_clock_timer", - "name": "A Clock with Timer", - "version": "0.01", - "description": "A Clock with Timer, Map and Time Zones", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - {"name":"a_clock_timer.app.js","url":"app.js"}, - {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id":"intervalTimer", - "name":"Interval Timer", - "shortName":"Interval Timer", - "icon": "app.png", - "version":"0.01", - "description": "Interval Timer for workouts, HIIT, or whatever else.", - "tags": "timer, interval, hiit, workout", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"intervalTimer.app.js","url":"app.js"}, - {"name":"intervalTimer.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "93dub", - "name": "93 Dub", - "shortName":"93 Dub", - "icon": "93dub.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.05", - "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", - "tags": "clock", - "type": "clock", - "supports":["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"93dub.app.js","url":"app.js"}, - {"name":"93dub.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "poweroff", - "name": "Poweroff", - "shortName":"Poweroff", - "version":"0.01", - "description": "Simple app to power off your Bangle.js", - "icon": "app.png", - "tags": "tool, poweroff, shutdown", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"poweroff.app.js","url":"app.js"}, - {"name":"poweroff.img","url":"app-icon.js","evaluate":true} - ] -}, -{ - "id": "sensible", - "name": "SensiBLE", - "shortName": "SensiBLE", - "version": "0.04", - "description": "Collect, display and advertise real-time sensor data.", - "icon": "sensible.png", - "screenshots": [ - { "url": "screenshot-top.png" }, - { "url": "screenshot-acc.png" }, - { "url": "screenshot-bar.png" }, - { "url": "screenshot-gps.png" }, - { "url": "screenshot-hrm.png" }, - { "url": "screenshot-mag.png" } - ], - "type": "app", - "tags": "tool,sensors", - "supports" : [ "BANGLEJS2" ], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - { "name": "sensible.app.js", "url": "sensible.js" }, - { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } - ] -}, - { - "id": "widbars", - "name": "Bars Widget", - "version": "0.01", - "description": "Display several measurements as vertical bars.", - "icon": "icon.png", - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbars.wid.js","url":"widget.js"} - ] -}, -{ - "id":"a_speech_timer", - "name":"Speech Timer", - "icon": "app.png", - "version":"1.01", - "description": "A timer designed to help keeping your speeches and presentations to time.", - "tags": "tool,timer", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"a_speech_timer.app.js","url":"app.js"}, - {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} - ] -}, - { "id": "mylocation", - "name": "My Location", - "shortName":"My Location", - "icon": "mylocation.png", - "type": "app", - "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.01", - "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", - "readme": "README.md", - "tags": "tool,utility", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - {"name":"mylocation.app.js","url":"mylocation.app.js"}, - {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } - ], - "data": [ - {"name":"mylocation.json"} - ] - }, - { - "id": "pebble", - "name": "Pebble Clock", - "shortName": "Pebble", - "version": "0.04", - "description": "A pebble style clock to keep the rebellion going", - "readme": "README.md", - "icon": "pebble.png", - "screenshots": [{"url":"pebble_screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"pebble.app.js","url":"pebble.app.js"}, - {"name":"pebble.settings.js","url":"pebble.settings.js"}, - {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} - ] - }, - { "id": "pooqroman", - "name": "pooq Roman watch face", - "shortName":"pooq Roman", - "version":"0.03", - "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"pooqroman.app.js","url":"app.js"}, - {"name":"pooqroman.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"pooqroman.json"} - ] - }, - { - "id": "widbata", - "name": "Battery Level Widget (Themed)", - "shortName":"Battery Theme", - "icon": "widbata.png", - "screenshots": [{"url":"screenshot_widbata_1.png"}], - "version":"0.01", - "type": "widget", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "description": "Shows the current battery level status in the top right using the clocks colour theme", - "tags": "widget,battery", - "storage": [ - {"name":"widbata.wid.js","url":"widbata.wid.js"} - ] - }, - { - "id": "weatherClock", - "name": "Weather Clock", - "version": "0.04", - "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", - "icon": "app.png", - "screenshots": [{"url":"screens/screen1.png"}], - "type": "clock", - "tags": "clock, weather", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - {"name":"weatherClock.app.js","url":"app.js"}, - {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "menuwheel", - "name": "Wheel Menus", - "version": "0.01", - "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button", - "readme": "README.md", - "icon": "icon.png", - "screenshots": [ - {"url":"screenshot_b1_dark.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_light.png"}, - {"url":"screenshot_b2_dark.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_light.png"} - ], - "type": "boot", - "tags": "system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"menuwheel.boot.js","url":"boot.js"} - ] - }, - { "id": "widChargingStatus", - "name": "Charging Status", - "shortName":"ChargingStatus", - "icon": "widget.png", - "version":"0.1", - "type": "widget", - "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widChargingStatus.wid.js","url":"widget.js"} - ] - }, - { - "id": "flow", - "name": "FLOW", - "shortName": "FLOW", - "version": "0.01", - "description": "A game where you have to help a flow avoid white obstacles thing by tapping! This is a demake of an app which I forgot the name of. Press BTN(1) to restart. See if you can get to 2500 score!", - "icon": "app.png", - "tags": "game", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name": "flow.app.js", "url": "app.js" }, - {"name": "flow.img", "url": "app-icon.js","evaluate": true } - ] - }, - { "id": "scribble", - "name": "Scribble", - "shortName":"Scribble", - "version":"0.01", - "type": "app", - "description": "A keyboard on your wrist! Swipe right for space, left for delete.", - "icon": "app.png", - "allow_emulator": true, - "tags": "tools, keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"scribble.app.js","url":"app.js"}, - {"name":"scribble.img","url":"app-icon.js","evaluate":true} - ], - "screenshots":[ - { "url":"screenshot.png" } - ] - }, - { - "id": "ptlaunch", - "name": "Pattern Launcher", - "shortName": "Pattern Launcher", - "version": "0.10", - "description": "Directly launch apps from the clock screen with custom patterns.", - "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], - "tags": "tools", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - { "name": "ptlaunch.app.js", "url": "app.js" }, - { "name": "ptlaunch.boot.js", "url": "boot.js" }, - { "name": "ptlaunch.img", "url": "app-icon.js", "evaluate": true } - ], - "data": [{"name":"ptlaunch.patterns.json"}] - }, - { - "id": "rebble", - "name": "Rebble Clock", - "shortName": "Rebble", - "version": "0.02", - "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", - "readme": "README.md", - "icon": "rebble.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_rebble.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"rebble.app.js","url":"rebble.app.js"}, - {"name":"rebble.settings.js","url":"rebble.settings.js"}, - {"name":"rebble.img","url":"rebble.icon.js","evaluate":true} - ] - }, - { "id": "snaky", - "name": "Snaky", - "shortName":"Snaky", - "version":"0.01", - "description": "The classic snake game. Eat apples and don't bite your tail. Control the snake with the touch screen.", - "tags": "game,fun", - "icon": "snaky.png", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"snaky.app.js","url":"snaky.js"}, - {"name":"snaky.img","url":"snaky-icon.js","evaluate":true} - ] - }, - { - "id": "clicompleteclk", - "name": "CLI complete clock", - "shortName":"CLI cmplt clock", - "version":"0.03", - "description": "Command line styled clock with lots of information", - "icon": "app.png", - "allow_emulator": true, - "type": "clock", - "tags": "clock,cli,command,bash,shell,weather,hrt", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, - {"name":"clicompleteclk.settings.js","url":"settings.js"} - ], - "data": [{"name":"clicompleteclk.json"}] - }, - { - "id":"awairmonitor", - "name":"Awair Monitor", - "icon": "app.png", - "allow_emulator": true, - "version":"0.01", - "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "tool,health", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"awairmonitor.app.js","url":"app.js"}, - {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "pooqround", - "name": "pooq Round watch face", - "shortName":"pooq Round", - "version":"0.00", - "description": "A 24 hour analogue watchface with high legibility and a novel style.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"pooqround.app.js","url":"app.js"}, - {"name":"pooqround.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"pooqround.json"} - ] - }, - { - "id": "coretemp", - "name": "Core Temp Display", - "version": "0.01", - "description": "Display CoreTemp device sensor data", - "icon": "coretemp.png", - "type": "app", - "tags": "health", - "readme": "README.md", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, - {"name":"coretemp.app.js","url":"coretemp.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] - } -] From dbfc114dd6d30e1cc5c288d3b369c4c20d3eff60 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 05:48:11 -0500 Subject: [PATCH 010/503] Add files via upload --- apps.json | 4990 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4990 insertions(+) create mode 100644 apps.json diff --git a/apps.json b/apps.json new file mode 100644 index 000000000..2a83c2b69 --- /dev/null +++ b/apps.json @@ -0,0 +1,4990 @@ +[ + { + "id": "fwupdate", + "name": "Firmware Update", + "version": "0.02", + "description": "[BETA] Uploads new Espruino firmwares to Bangle.js 2. For now, please use the instructions under https://www.espruino.com/Bangle.js2#firmware-updates", + "icon": "app.png", + "type": "RAM", + "tags": "tools,system", + "supports": ["BANGLEJS2"], + "custom": "custom.html", + "customConnect": true, + "storage": [], + "sortorder": 20 + }, + { + "id": "boot", + "name": "Bootloader", + "version": "0.38", + "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", + "icon": "bootloader.png", + "type": "bootloader", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":".boot0","url":"boot0.js"}, + {"name":".bootcde","url":"bootloader.js"}, + {"name":"bootupdate.js","url":"bootupdate.js"} + ], + "sortorder": -10 + }, + { + "id": "hebrew_calendar", + "name": "Hebrew Calendar", + "shortName": "HebCal", + "version": "0.04", + "description": "lists the date according to the hebrew calendar", + "icon": "app.png", + "allow_emulator": false, + "tags": "tool,locale", + "supports": [ + "BANGLEJS", + "BANGLEJS2" + ], + "readme": "README.md", + "storage": [ + { + "name": "hebrew_calendar.app.js", + "url": "app.js" + }, + { + "name": "hebrewDate", + "url": "hebrewDate.js" + }, + { + "name": "hebrew_calendar.img", + "url": "app-icon.js", + "evaluate": true + } + ] + }, + { "id": "golfscore", + "name": "Golf Score", + "shortName":"golfscore", + "version":"0.02", + "description": "keeps track of strokes during a golf game", + "icon": "app.png", + "tags": "outdoors", + "allow_emulator": true, + "supports" : ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"golfscore.app.js","url":"app.js"}, + {"name":"golfscore.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "messages", + "name": "Messages", + "version": "0.13", + "description": "App to display notifications from iOS and Gadgetbridge", + "icon": "app.png", + "type": "app", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"messages.app.js","url":"app.js"}, + {"name":"messages.settings.js","url":"settings.js"}, + {"name":"messages.img","url":"app-icon.js","evaluate":true}, + {"name":"messages.wid.js","url":"widget.js"}, + {"name":"messages","url":"lib.js"} + ], + "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}], + "sortorder": -9 + }, + { + "id": "android", + "name": "Android Integration", + "shortName": "Android", + "version": "0.05", + "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", + "icon": "app.png", + "tags": "tool,system,messages,notifications", + "dependencies": {"messages":"app"}, + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"android.app.js","url":"app.js"}, + {"name":"android.settings.js","url":"settings.js"}, + {"name":"android.img","url":"app-icon.js","evaluate":true}, + {"name":"android.boot.js","url":"boot.js"} + ], + "sortorder": -8 + }, + { + "id": "ios", + "name": "iOS Integration", + "version": "0.07", + "description": "Display notifications/music/etc from iOS devices", + "icon": "app.png", + "tags": "tool,system,ios,apple,messages,notifications", + "dependencies": {"messages":"app"}, + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"ios.app.js","url":"app.js"}, + {"name":"ios.img","url":"app-icon.js","evaluate":true}, + {"name":"ios.boot.js","url":"boot.js"} + ], + "sortorder": -8 + }, + { + "id": "health", + "name": "Health Tracking", + "version": "0.08", + "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", + "icon": "app.png", + "tags": "tool,system,health", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"health.app.js","url":"app.js"}, + {"name":"health.img","url":"app-icon.js","evaluate":true}, + {"name":"health.boot.js","url":"boot.js"}, + {"name":"health","url":"lib.js"} + ] + }, + { + "id": "launch", + "name": "Launcher", + "shortName": "Launcher", + "version": "0.10", + "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"launch.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]}, + {"name":"launch.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]}, + {"name":"launch.settings.js","url":"settings.js","supports":["BANGLEJS2"]} + ], + "data": [{"name":"launch.json"}], + "sortorder": -10 + }, + { + "id": "setting", + "name": "Settings", + "version": "0.36", + "description": "A menu for setting up Bangle.js", + "icon": "settings.png", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"setting.app.js","url":"settings.js"}, + {"name":"setting.img","url":"settings-icon.js","evaluate":true} + ], + "data": [{"name":"setting.json","url":"settings.min.json","evaluate":true}], + "sortorder": -5 + }, + { + "id": "about", + "name": "About", + "version": "0.12", + "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", + "icon": "app.png", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-about-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"about.img","url":"app-icon.js","evaluate":true} + ], + "sortorder": -4 + }, + { + "id": "alarm", + "name": "Default Alarm & Timer", + "shortName": "Alarms", + "version": "0.14", + "description": "Set and respond to alarms and timers", + "icon": "app.png", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"alarm.app.js","url":"app.js"}, + {"name":"alarm.boot.js","url":"boot.js"}, + {"name":"alarm.js","url":"alarm.js"}, + {"name":"alarm.img","url":"app-icon.js","evaluate":true}, + {"name":"alarm.wid.js","url":"widget.js"} + ], + "data": [{"name":"alarm.json"}] + }, + { + "id": "locale", + "name": "Languages", + "version": "0.14", + "description": "Translations for different countries", + "icon": "locale.png", + "type": "locale", + "tags": "tool,system,locale,translate", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "locale.html", + "storage": [ + {"name":"locale"} + ], + "sortorder": -10 + }, + { + "id": "notify", + "name": "Notifications (default)", + "shortName": "Notifications", + "version": "0.11", + "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen", + "icon": "notify.png", + "type": "notify", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"notify","url":"notify.js"} + ] + }, + { + "id": "notifyfs", + "name": "Fullscreen Notifications", + "shortName": "Notifications", + "version": "0.12", + "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.", + "icon": "notify.png", + "type": "notify", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"notify","url":"notify.js"} + ] + }, + { + "id": "welcome", + "name": "Welcome", + "shortName": "Welcome", + "version": "0.14", + "description": "Appears at first boot and explains how to use Bangle.js", + "icon": "app.png", + "screenshots": [{"url":"screenshot_welcome.png"}], + "tags": "start,welcome", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"welcome.boot.js","url":"boot.js"}, + {"name":"welcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"welcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"welcome.settings.js","url":"settings.js"}, + {"name":"welcome.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"welcome.json"}] + }, + { + "id": "mywelcome", + "name": "Customised Welcome", + "shortName": "My Welcome", + "version": "0.13", + "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", + "icon": "app.png", + "tags": "start,welcome", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}], + "storage": [ + {"name":"mywelcome.boot.js","url":"boot.js"}, + {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"mywelcome.settings.js","url":"settings.js"}, + {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"mywelcome.json"}] + }, + { + "id": "gbridge", + "name": "Gadgetbridge", + "version": "0.25", + "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "icon": "app.png", + "type": "widget", + "tags": "tool,system,android,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "dependencies": {"notify":"type"}, + "readme": "README.md", + "storage": [ + {"name":"gbridge.settings.js","url":"settings.js"}, + {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, + {"name":"gbridge.wid.js","url":"widget.js"} + ], + "data": [{"name":"gbridge.json"}] + }, + { "id": "gbdebug", + "name": "Gadgetbridge Debug", + "shortName":"GB Debug", + "version":"0.01", + "description": "Debug info for Gadgetbridge. Run this app and when Gadgetbridge messages arrive they are displayed on-screen.", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"gbdebug.app.js","url":"app.js"}, + {"name":"gbdebug.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mclock", + "name": "Morphing Clock", + "version": "0.07", + "description": "7 segment clock that morphs between minutes and hours", + "icon": "clock-morphing.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-morphing-clock-screenshot.png"}], + "storage": [ + {"name":"mclock.app.js","url":"clock-morphing.js"}, + {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} + ], + "sortorder": -9 + }, + { + "id": "moonphase", + "name": "Moonphase", + "version": "0.02", + "description": "Shows current moon phase. Now with GPS function.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-moon-phase-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"moonphase.app.js","url":"app.js"}, + {"name":"moonphase.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "daysl", + "name": "Days left", + "version": "0.03", + "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "allow_emulator": false, + "storage": [ + {"name":"daysl.app.js","url":"app.js"}, + {"name":"daysl.img","url":"app-icon.js","evaluate":true}, + {"name":"daysl.wid.js","url":"widget.js"} + ] + }, + { + "id": "wclock", + "name": "Word Clock", + "version": "0.03", + "description": "Display Time as Text", + "icon": "clock-word.png", + "screenshots": [{"url":"screenshot_word.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"wclock.app.js","url":"clock-word.js"}, + {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} + ] + }, + { + "id": "fontclock", + "name": "Font Clock", + "version": "0.01", + "description": "Choose the font and design of clock face from a library of available designs", + "icon": "fontclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"fontclock.app.js","url":"fontclock.js"}, + {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, + {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, + {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, + {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, + {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, + {"name":"fontclock.font.js","url":"fontclock.font.js"}, + {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, + {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, + {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, + {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, + {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, + {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} + ] + }, + { + "id": "slidingtext", + "name": "Sliding Clock", + "version": "0.07", + "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported", + "icon": "slidingtext.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"slidingtext.app.js","url":"slidingtext.js"}, + {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true}, + {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"}, + {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"}, + {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"}, + {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"}, + {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"}, + {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"}, + {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"}, + {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"} + ] + }, + { + "id": "solarclock", + "name": "Solar Clock", + "version": "0.02", + "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position", + "icon": "solar_clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"solarclock.app.js","url":"solar_clock.js"}, + {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true}, + {"name":"solar_colors.js","url":"solar_colors.js"}, + {"name":"solar_controller.js","url":"solar_controller.js"}, + {"name":"solar_date_utils.js","url":"solar_date_utils.js"}, + {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"}, + {"name":"solar_location.js","url":"solar_location.js"}, + {"name":"solar_math_utils.js","url":"solar_math_utils.js"}, + {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"}, + {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"}, + {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"}, + {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"}, + {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"}, + {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"} + ] + }, + { + "id": "sweepclock", + "name": "Sweep Clock", + "version": "0.04", + "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", + "icon": "sweepclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-sweep-clock-screenshot.png"}], + "storage": [ + {"name":"sweepclock.app.js","url":"sweepclock.js"}, + {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} + ] + }, + { + "id": "matrixclock", + "name": "Matrix Clock", + "version": "0.02", + "description": "inspired by The Matrix, a clock of the same style", + "icon": "matrixclock.png", + "screenshots": [{"url":"screenshot_matrix.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"matrixclock.app.js","url":"matrixclock.js"}, + {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true} + ] + }, + { + "id": "mandelbrotclock", + "name": "Mandelbrot Clock", + "version": "0.01", + "description": "A mandelbrot set themed clock cool", + "icon": "mandelbrotclock.png", + "screenshots": [{ "url": "screenshot_mandelbrotclock.png" }], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + { "name": "mandelbrotclock.app.js", "url": "mandelbrotclock.js" }, + { + "name": "mandelbrotclock.img", + "url": "mandelbrotclock-icon.js", + "evaluate": true + } + ] + }, + { + "id": "imgclock", + "name": "Image background clock", + "shortName": "Image Clock", + "version": "0.08", + "description": "A clock with an image as a background", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"imgclock.app.js","url":"app.js"}, + {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, + {"name":"imgclock.face.img"}, + {"name":"imgclock.face.json"}, + {"name":"imgclock.face.bg","content":""} + ] + }, + { + "id": "impwclock", + "name": "Imprecise Word Clock", + "version": "0.03", + "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", + "icon": "clock-impword.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"impwclock.app.js","url":"clock-impword.js"}, + {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} + ] + }, + { + "id": "aclock", + "name": "Analog Clock", + "version": "0.15", + "description": "An Analog Clock", + "icon": "clock-analog.png", + "screenshots": [{"url":"screenshot_analog.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"aclock.app.js","url":"clock-analog.js"}, + {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} + ] + }, + { + "id": "clock2x3", + "name": "2x3 Pixel Clock", + "version": "0.05", + "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", + "icon": "clock2x3.png", + "screenshots": [{"url":"screenshot_pixel.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, + {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} + ] + }, + { + "id": "geissclk", + "name": "Geiss Clock", + "version": "0.03", + "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", + "icon": "clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"geissclk.app.js","url":"clock.js"}, + {"name":"geissclk.precompute.js","url":"precompute.js"}, + {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} + ], + "data": [{"name":"geissclk.0.map"},{"name":"geissclk.1.map"},{"name":"geissclk.2.map"},{"name":"geissclk.3.map"},{"name":"geissclk.4.map"},{"name":"geissclk.5.map"},{"name":"geissclk.0.pal"},{"name":"geissclk.1.pal"},{"name":"geissclk.2.pal"}] + }, + { + "id": "trex", + "name": "T-Rex", + "version": "0.04", + "description": "T-Rex game in the style of Chrome's offline game", + "icon": "trex.png", + "screenshots": [{"url":"screenshot_trex.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"trex.app.js","url":"trex.js"}, + {"name":"trex.img","url":"trex-icon.js","evaluate":true}, + {"name":"trex.settings.js","url":"settings.js"} + ], + "data": [{"name":"trex.score","storageFile":true}] + }, + { + "id": "cubescramble", + "name": "Cube Scramble", + "version":"0.04", + "description": "A random scramble generator for the 3x3 Rubik's cube with a basic timer", + "icon": "cube-scramble.png", + "tags": "", + "supports" : ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle2-cube-scramble-screenshot.png"},{"url":"bangle1-cube-scramble-screenshot.png"}], + "storage": [ + {"name":"cubescramble.app.js","url":"cube-scramble.js"}, + {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} + ] + }, + { + "id": "astroid", + "name": "Asteroids!", + "version": "0.03", + "description": "Retro asteroids game", + "icon": "asteroids.png", + "screenshots": [{"url":"screenshot_asteroids.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"astroid.app.js","url":"asteroids.js"}, + {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} + ] + }, + { + "id": "clickms", + "name": "Click Master", + "version": "0.01", + "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", + "icon": "click-master.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"clickms.app.js","url":"click-master.js"}, + {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} + ] + }, + { + "id": "horsey", + "name": "Horse Race!", + "version": "0.01", + "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", + "icon": "horse-race.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"horsey.app.js","url":"horse-race.js"}, + {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} + ] + }, + { + "id": "compass", + "name": "Compass", + "version": "0.05", + "description": "Simple compass that points North", + "icon": "compass.png", + "screenshots": [{"url":"screenshot_compass.png"}], + "tags": "tool,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"compass.app.js","url":"compass.js"}, + {"name":"compass.img","url":"compass-icon.js","evaluate":true} + ] + }, + { + "id": "gpstime", + "name": "GPS Time", + "version": "0.05", + "description": "Update the Bangle.js's clock based on the time from the GPS receiver", + "icon": "gpstime.png", + "tags": "tool,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"gpstime.app.js","url":"gpstime.js"}, + {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} + ] + }, + { + "id": "openloc", + "name": "Open Location / Plus Codes", + "shortName": "Open Location", + "version": "0.01", + "description": "Convert your current GPS location to a series of characters", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"openloc.app.js","url":"app.js"}, + {"name":"openloc.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "speedo", + "name": "Speedo", + "version": "0.05", + "description": "Show the current speed according to the GPS", + "icon": "speedo.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"speedo.app.js","url":"speedo.js"}, + {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} + ] + }, + { + "id": "gpsrec", + "name": "GPS Recorder", + "version": "0.27", + "description": "Application that allows you to record a GPS track. Can run in background", + "icon": "app.png", + "tags": "tool,outdoors,gps,widget", + "screenshots": [{"url":"screenshot.png"}], + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"gpsrec.app.js","url":"app.js"}, + {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, + {"name":"gpsrec.wid.js","url":"widget.js"}, + {"name":"gpsrec.settings.js","url":"settings.js"} + ], + "data": [{"name":"gpsrec.json"},{"wildcard":".gpsrc?","storageFile":true}] + }, + { + "id": "recorder", + "name": "Recorder (BETA)", + "shortName": "Recorder", + "version": "0.04", + "description": "Record GPS position, heart rate and more in the background, then download to your PC.", + "icon": "app.png", + "tags": "tool,outdoors,gps,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"recorder.app.js","url":"app.js"}, + {"name":"recorder.img","url":"app-icon.js","evaluate":true}, + {"name":"recorder.wid.js","url":"widget.js"}, + {"name":"recorder.settings.js","url":"settings.js"} + ], + "data": [{"name":"recorder.json"},{"wildcard":"recorder.log?.csv","storageFile":true}] + }, + { + "id": "gpsnav", + "name": "GPS Navigation", + "version": "0.05", + "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", + "icon": "icon.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"gpsnav.app.js","url":"app.min.js"}, + {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "heart", + "name": "Heart Rate Recorder", + "shortName": "HRM Record", + "version": "0.07", + "description": "Application that allows you to record your heart rate. Can run in background", + "icon": "app.png", + "tags": "tool,health,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "interface": "interface.html", + "storage": [ + {"name":"heart.app.js","url":"app.js"}, + {"name":"heart.img","url":"app-icon.js","evaluate":true}, + {"name":"heart.wid.js","url":"widget.js"} + ], + "data": [{"name":"heart.json"},{"wildcard":".heart?","storageFile":true}] + }, + { + "id": "slevel", + "name": "Spirit Level", + "version": "0.02", + "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", + "icon": "spiritlevel.png", + "tags": "tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"slevel.app.js","url":"spiritlevel.js"}, + {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} + ] + }, + { + "id": "files", + "name": "App Manager", + "version": "0.07", + "description": "Show currently installed apps, free space, and allow their deletion from the watch", + "icon": "files.png", + "tags": "tool,system,files", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"files.app.js","url":"files.js"}, + {"name":"files.img","url":"files-icon.js","evaluate":true} + ] + }, + { + "id": "weather", + "name": "Weather", + "version": "0.13", + "description": "Show Gadgetbridge weather report", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "tags": "widget,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "readme.md", + "storage": [ + {"name":"weather.app.js","url":"app.js"}, + {"name":"weather.wid.js","url":"widget.js"}, + {"name":"weather","url":"lib.js"}, + {"name":"weather.img","url":"icon.js","evaluate":true}, + {"name":"weather.settings.js","url":"settings.js"} + ], + "data": [{"name":"weather.json"}] + }, + { + "id": "chargeanim", + "name": "Charge Animation", + "version": "0.02", + "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.", + "icon": "icon.png", + "tags": "battery", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-charge-animation-screenshot.png"},{"url":"bangle-charge-animation-screenshot.png"}], + "storage": [ + {"name":"chargeanim.app.js","url":"app.js"}, + {"name":"chargeanim.boot.js","url":"boot.js"}, + {"name":"chargeanim.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "bluetoothdock", + "name": "Bluetooth Dock", + "shortName": "Dock", + "version": "0.01", + "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", + "icon": "app.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"bluetoothdock.app.js","url":"app.js"}, + {"name":"bluetoothdock.boot.js","url":"boot.js"}, + {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widbat", + "name": "Battery Level Widget", + "version": "0.09", + "description": "Show the current battery level and charging status in the top right of the clock", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbat.wid.js","url":"widget.js"} + ] + }, + { + "id": "widbatv", + "name": "Battery Level Widget (Vertical)", + "version": "0.01", + "description": "Slim, vertical battery widget that only takes up 14px", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbatv.wid.js","url":"widget.js"} + ] + }, + { + "id": "widlock", + "name": "Lock Widget", + "version": "0.03", + "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", + "icon": "widget.png", + "type": "widget", + "tags": "widget,lock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widlock.wid.js","url":"widget.js"} + ] + }, + { + "id": "widbatpc", + "name": "Battery Level Widget (with percentage)", + "shortName": "Battery Widget", + "version": "0.14", + "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widbatpc.wid.js","url":"widget.js"}, + {"name":"widbatpc.settings.js","url":"settings.js"} + ], + "data": [{"name":"widbatpc.json"}] + }, + { + "id": "widbatwarn", + "name": "Battery Warning", + "shortName": "Battery Warning", + "version": "0.02", + "description": "Show a warning when the battery runs low.", + "icon": "widget.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "widget", + "tags": "tool,battery", + "supports": ["BANGLEJS"], + "dependencies": {"notify":"type"}, + "readme": "README.md", + "storage": [ + {"name":"widbatwarn.wid.js","url":"widget.js"}, + {"name":"widbatwarn.settings.js","url":"settings.js"} + ], + "data": [{"name":"widbatwarn.json"}] + }, + { + "id": "widbt", + "name": "Bluetooth Widget", + "version": "0.07", + "description": "Show the current Bluetooth connection status in the top right of the clock", + "icon": "widget.png", + "type": "widget", + "tags": "widget,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbt.wid.js","url":"widget.js"} + ] + }, + { + "id": "widchime", + "name": "Hour Chime", + "version": "0.02", + "description": "Buzz or beep on every whole hour.", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widchime.wid.js","url":"widget.js"}, + {"name":"widchime.settings.js","url":"settings.js"} + ], + "data": [{"name":"widchime.json"}] + }, + { + "id": "widram", + "name": "RAM Widget", + "shortName": "RAM Widget", + "version": "0.01", + "description": "Display your Bangle's available RAM percentage in a widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widram.wid.js","url":"widget.js"} + ] + }, + { + "id": "hrm", + "name": "Heart Rate Monitor", + "version": "0.06", + "description": "Measure your heart rate and see live sensor data", + "icon": "heartrate.png", + "tags": "health", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"hrm.app.js","url":"heartrate.js"}, + {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} + ] + }, + { + "id": "widhrm", + "name": "Simple Heart Rate widget", + "version": "0.05", + "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", + "icon": "widget.png", + "type": "widget", + "tags": "health,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widhrm.wid.js","url":"widget.js"} + ] + }, + { + "id": "bthrm", + "name": "Bluetooth Heart Rate Monitor", + "shortName": "BT HRM", + "version": "0.01", + "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", + "icon": "app.png", + "type": "boot", + "tags": "health,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"bthrm.boot.js","url":"boot.js"}, + {"name":"bthrm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "stetho", + "name": "Stethoscope", + "version": "0.01", + "description": "Hear your heart rate", + "icon": "stetho.png", + "tags": "health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"stetho.app.js","url":"stetho.js"}, + {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} + ] + }, + { + "id": "swatch", + "name": "Stopwatch", + "version": "0.07", + "description": "Simple stopwatch with Lap Time logging to a JSON file", + "icon": "stopwatch.png", + "tags": "health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-stopwatch-screenshot.png"}], + "storage": [ + {"name":"swatch.app.js","url":"stopwatch.js"}, + {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} + ] + }, + { + "id": "hidmsic", + "name": "Bluetooth Music Controls", + "shortName": "Music Control", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", + "icon": "hid-music.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidmsic.app.js","url":"hid-music.js"}, + {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} + ] + }, + { + "id": "hidkbd", + "name": "Bluetooth Keyboard", + "shortName": "Bluetooth Kbd", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", + "icon": "hid-keyboard.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, + {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} + ] + }, + { + "id": "hidbkbd", + "name": "Binary Bluetooth Keyboard", + "shortName": "Binary BT Kbd", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", + "icon": "hid-binary-keyboard.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, + {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} + ] + }, + { + "id": "animals", + "name": "Animals Game", + "version": "0.01", + "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", + "icon": "animals.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"animals.app.js","url":"animals.js"}, + {"name":"animals.img","url":"animals-icon.js","evaluate":true}, + {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, + {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, + {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, + {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, + {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, + {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, + {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, + {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} + ] + }, + { + "id": "qrcode", + "name": "Custom QR Code", + "version": "0.04", + "description": "Use this to upload a customised QR code to Bangle.js", + "icon": "app.png", + "tags": "qrcode", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "customConnect": true, + "storage": [ + {"name":"qrcode.app.js"}, + {"name":"qrcode.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "beer", + "name": "Beer Compass", + "version": "0.01", + "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"beer.app.js"}, + {"name":"beer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "route", + "name": "Route Viewer", + "version": "0.02", + "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"route.app.js"}, + {"name":"route.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ncstart", + "name": "NCEU Startup", + "version": "0.06", + "description": "NodeConfEU 2019 'First Start' Sequence", + "icon": "start.png", + "tags": "start,welcome", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncstart.app.js","url":"start.js"}, + {"name":"ncstart.boot.js","url":"boot.js"}, + {"name":"ncstart.settings.js","url":"settings.js"}, + {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, + {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, + {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, + {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, + {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, + {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} + ], + "data": [{"name":"ncstart.json"}] + }, + { + "id": "ncfrun", + "name": "NCEU 5K Fun Run", + "version": "0.01", + "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", + "icon": "nceu-funrun.png", + "tags": "health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, + {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} + ] + }, + { + "id": "widnceu", + "name": "NCEU Logo Widget", + "version": "0.02", + "description": "Show the NodeConf EU logo in the top left", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widnceu.wid.js","url":"widget.js"} + ] + }, + { + "id": "sclock", + "name": "Simple Clock", + "version": "0.07", + "description": "A Simple Digital Clock", + "icon": "clock-simple.png", + "screenshots": [{"url":"screenshot_simplec.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"sclock.app.js","url":"clock-simple.js"}, + {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} + ] + }, + { + "id": "s7clk", + "name": "Simple 7 segment Clock", + "version": "0.03", + "description": "A simple 7 segment Clock with date", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_s7segment.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"s7clk.app.js","url":"app.js"}, + {"name":"s7clk.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "vibrclock", + "name": "Vibrate Clock", + "version": "0.03", + "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-vibrate-clock-screenshot.png"}], + "storage": [ + {"name":"vibrclock.app.js","url":"app.js"}, + {"name":"vibrclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "svclock", + "name": "Simple V-Clock", + "version": "0.04", + "description": "Modification of Simple Clock 0.04 to use Vectorfont", + "icon": "vclock-simple.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-simple-v-clock-screenshot.png"}], + "storage": [ + {"name":"svclock.app.js","url":"vclock-simple.js"}, + {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true} + ] + }, + { + "id": "dclock", + "name": "Dev Clock", + "version": "0.10", + "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", + "icon": "clock-dev.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-dev-clock-screenshot.png"},{"url":"bangle1-dev-clock-screenshot.png"}], + "storage": [ + {"name":"dclock.app.js","url":"clock-dev.js"}, + {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} + ] + }, + { + "id": "gesture", + "name": "Gesture Test", + "version": "0.01", + "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", + "icon": "gesture.png", + "type": "app", + "tags": "gesture,ai", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gesture.app.js","url":"gesture.js"}, + {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, + {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, + {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} + ] + }, + { + "id": "pparrot", + "name": "Party Parrot", + "version": "0.01", + "description": "Party with a parrot on your wrist", + "icon": "party-parrot.png", + "type": "app", + "tags": "party,parrot,lol", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-party-parrot-screenshot.png"}], + "storage": [ + {"name":"pparrot.app.js","url":"party-parrot.js"}, + {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} + ] + }, + { + "id": "hrings", + "name": "Hypno Rings", + "version": "0.01", + "description": "Experiment with trippy rings, press buttons for change", + "icon": "hypno-rings.png", + "type": "app", + "tags": "rings,hypnosis,psychadelic", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-hypno-rings-screenshot.png"}], + "storage": [ + {"name":"hrings.app.js","url":"hypno-rings.js"}, + {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} + ] + }, + { + "id": "morse", + "name": "Morse Code", + "version": "0.01", + "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", + "icon": "morse-code.png", + "type": "app", + "tags": "morse,sound,visual,input", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"morse.app.js","url":"morse-code.js"}, + {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} + ] + }, + { + "id": "blescan", + "name": "BLE Scanner", + "version": "0.01", + "description": "Scan for advertising BLE devices", + "icon": "blescan.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"blescan.app.js","url":"blescan.js"}, + {"name":"blescan.img","url":"blescan-icon.js","evaluate":true} + ] + }, + { + "id": "mmonday", + "name": "Manic Monday Tone", + "version": "0.02", + "description": "The Bangles make a comeback", + "icon": "manic-monday-icon.png", + "tags": "sound", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"mmonday.app.js","url":"manic-monday.js"}, + {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} + ] + }, + { + "id": "jbells", + "name": "Jingle Bells", + "version": "0.01", + "description": "Play Jingle Bells", + "icon": "jbells.png", + "type": "app", + "tags": "sound", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"jbells.app.js","url":"jbells.js"}, + {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} + ] + }, + { + "id": "scolor", + "name": "Show Color", + "version": "0.01", + "description": "Display all available Colors and Names", + "icon": "show-color.png", + "type": "app", + "tags": "tool", + "screenshots": [{"url":"bangle1-view-color-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"scolor.app.js","url":"show-color.js"}, + {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} + ] + }, + { + "id": "miclock", + "name": "Mixed Clock", + "version": "0.05", + "description": "A mix of analog and digital Clock", + "icon": "clock-mixed.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-mixed-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"miclock.app.js","url":"clock-mixed.js"}, + {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} + ] + }, + { + "id": "bclock", + "name": "Binary Clock", + "version": "0.03", + "description": "A simple binary clock watch face", + "icon": "clock-binary.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-binary-clock-screenshot.png"}], + "storage": [ + {"name":"bclock.app.js","url":"clock-binary.js"}, + {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} + ] + }, + { + "id": "clotris", + "name": "Clock-Tris", + "version": "0.01", + "description": "A fully functional clone of a classic game of falling blocks", + "icon": "clock-tris.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-clock-tris-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"clotris.app.js","url":"clock-tris.js"}, + {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, + {"name":".trishig","url":"clock-tris-high"} + ] + }, + { + "id": "flappy", + "name": "Flappy Bird", + "version": "0.05", + "description": "A Flappy Bird game clone", + "icon": "app.png", + "screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"flappy.app.js","url":"app.js"}, + {"name":"flappy.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gpsinfo", + "name": "GPS Info", + "version": "0.05", + "description": "An application that displays information about altitude, lat/lon, satellites and time", + "icon": "gps-info.png", + "type": "app", + "tags": "gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"gpsinfo.app.js","url":"gps-info.js"}, + {"name":"gpsinfo.img","url":"gps-info-icon.js","evaluate":true} + ] + }, + { + "id": "assistedgps", + "name": "Assisted GPS Update (AGPS)", + "version": "0.01", + "description": "Downloads assisted GPS (AGPS) data to Bangle.js 1 for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.", + "icon": "app.png", + "type": "RAM", + "tags": "tool,outdoors,agps", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [] + }, + { + "id": "pomodo", + "name": "Pomodoro", + "version": "0.02", + "description": "A simple pomodoro timer.", + "icon": "pomodoro.png", + "type": "app", + "tags": "pomodoro,cooking,tools", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-pomodoro-screenshot.png"}], + "storage": [ + {"name":"pomodo.app.js","url":"pomodoro.js"}, + {"name":"pomodo.img","url":"pomodoro-icon.js","evaluate":true} + ] + }, + { + "id": "blobclk", + "name": "Large Digit Blob Clock", + "shortName": "Blob Clock", + "version": "0.06", + "description": "A clock with big digits", + "icon": "clock-blob.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-large-digit-blob-clock-screenshot.png"},{"url":"bangle1-large-digit-blob-clock-screenshot.png"}], + "storage": [ + {"name":"blobclk.app.js","url":"clock-blob.js"}, + {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} + ] + }, + { + "id": "boldclk", + "name": "Bold Clock", + "version": "0.05", + "description": "Simple, readable and practical clock", + "icon": "bold_clock.png", + "screenshots": [{"url":"screenshot_bold.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"boldclk.app.js","url":"bold_clock.js"}, + {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} + ] + }, + { + "id": "widclk", + "name": "Digital clock widget", + "version": "0.06", + "description": "A simple digital clock widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget,clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widclk.wid.js","url":"widget.js"} + ] + }, + { + "id": "widpedom", + "name": "Pedometer widget", + "version": "0.19", + "description": "Daily pedometer widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widpedom.wid.js","url":"widget.js"}, + {"name":"widpedom.settings.js","url":"settings.js"} + ] + }, + { + "id": "berlinc", + "name": "Berlin Clock", + "version": "0.05", + "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", + "icon": "berlin-clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"berlin-clock-screenshot.png"}], + "storage": [ + {"name":"berlinc.app.js","url":"berlin-clock.js"}, + {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} + ] + }, + { + "id": "ctrclk", + "name": "Centerclock", + "version": "0.03", + "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-center-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"ctrclk.app.js","url":"app.js"}, + {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "demoapp", + "name": "Demo Loop", + "version": "0.02", + "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", + "icon": "app.png", + "type": "app", + "tags": "", + "screenshots": [{"url":"bangle1-demo-loop-screenshot1.png"},{"url":"bangle1-demo-loop-screenshot2.png"},{"url":"bangle1-demo-loop-screenshot3.png"},{"url":"bangle1-demo-loop-screenshot4.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"demoapp.app.js","url":"app.js"}, + {"name":"demoapp.img","url":"app-icon.js","evaluate":true} + ], + "sortorder": -9 + }, + { + "id": "flagrse", + "name": "Espruino Flag Raiser", + "version": "0.01", + "description": "App to send a command to another Espruino to cause it to raise a flag", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"flagrse.app.js","url":"app.js"}, + {"name":"flagrse.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pipboy", + "name": "Pipboy", + "version": "0.04", + "description": "Pipboy themed clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}], + "storage": [ + {"name":"pipboy.app.js","url":"app.js"}, + {"name":"pipboy.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "torch", + "name": "Torch", + "shortName": "Torch", + "version": "0.02", + "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", + "icon": "app.png", + "tags": "tool,torch", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"torch.app.js","url":"app.js"}, + {"name":"torch.wid.js","url":"widget.js"}, + {"name":"torch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rtorch", + "name": "Red Torch", + "shortName": "RedTorch", + "version": "0.02", + "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", + "icon": "app.png", + "tags": "tool,torch", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"rtorch.app.js","url":"app.js"}, + {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]}, + {"name":"rtorch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "wohrm", + "name": "Workout HRM", + "version": "0.08", + "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", + "icon": "app.png", + "type": "app", + "tags": "hrm,workout", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], + "storage": [ + {"name":"wohrm.app.js","url":"app.js"}, + {"name":"wohrm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widid", + "name": "Bluetooth ID Widget", + "version": "0.03", + "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", + "icon": "widget.png", + "type": "widget", + "tags": "widget,address,mac", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widid.wid.js","url":"widget.js"} + ] + }, + { + "id": "grocery", + "name": "Grocery", + "version": "0.02", + "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", + "icon": "grocery.png", + "type": "app", + "tags": "tool,outdoors,shopping,list", + "supports": ["BANGLEJS"], + "custom": "grocery.html", + "storage": [ + {"name":"grocery.app.js","url":"app.js"}, + {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} + ] + }, + { + "id": "marioclock", + "name": "Mario Clock", + "version": "0.15", + "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", + "icon": "marioclock.png", + "type": "clock", + "tags": "clock,mario,retro", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "screenshots": [{"url":"bangle1-mario-clock-screenshot.png"}], + "storage": [ + {"name":"marioclock.app.js","url":"marioclock-app.js"}, + {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} + ] + }, + { + "id": "cliock", + "name": "Commandline-Clock", + "shortName": "CLI-Clock", + "version": "0.15", + "description": "Simple CLI-Styled Clock", + "icon": "app.png", + "screenshots": [{"url":"screenshot_cli.png"}], + "type": "clock", + "tags": "clock,cli,command,bash,shell", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"cliock.app.js","url":"app.js"}, + {"name":"cliock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widver", + "name": "Firmware Version Widget", + "version": "0.03", + "description": "Display the version of the installed firmware in the top widget section.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widver.wid.js","url":"widget.js"} + ] + }, + { + "id": "barclock", + "name": "Bar Clock", + "version": "0.09", + "description": "A simple digital clock showing seconds as a bar", + "icon": "clock-bar.png", + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"barclock.app.js","url":"clock-bar.js"}, + {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} + ] + }, + { + "id": "dotclock", + "name": "Dot Clock", + "version": "0.03", + "description": "A Minimal Dot Analog Clock", + "icon": "clock-dot.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-dot-clcok-screenshot.png"},{"url":"bangle1-dot-clock-screenshot.png"}], + "storage": [ + {"name":"dotclock.app.js","url":"clock-dot.js"}, + {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} + ] + }, + { + "id": "widtbat", + "name": "Tiny Battery Widget", + "version": "0.02", + "description": "Tiny blueish battery widget, vibs and changes level color when charging", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widtbat.wid.js","url":"widget.js"} + ] + }, + { + "id": "chrono", + "name": "Chrono", + "shortName": "Chrono", + "version": "0.01", + "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", + "icon": "chrono.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"chrono.app.js","url":"chrono.js"}, + {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} + ] + }, + { + "id": "astrocalc", + "name": "Astrocalc", + "version": "0.02", + "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", + "icon": "astrocalc.png", + "tags": "app,sun,moon,cycles,tool,outdoors", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, + {"name":"suncalc.js","url":"suncalc.js"}, + {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, + {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, + {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, + {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, + {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, + {"name":"full.img","url":"full-icon.js","evaluate":true}, + {"name":"new.img","url":"new-icon.js","evaluate":true}, + {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, + {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} + ] + }, + { + "id": "widhwt", + "name": "Hand Wash Timer", + "version": "0.01", + "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widhwt.wid.js","url":"widget.js"} + ] + }, + { + "id": "toucher", + "name": "Touch Launcher", + "shortName": "Toucher", + "version": "0.07", + "description": "Touch enable left to right launcher.", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"toucher.app.js","url":"app.js"}, + {"name":"toucher.settings.js","url":"settings.js"} + ], + "data": [{"name":"toucher.json"}] + }, + { + "id": "balltastic", + "name": "Balltastic", + "version": "0.02", + "description": "Simple but fun ball eats dots game.", + "icon": "app.png", + "type": "app", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"balltastic.app.js","url":"app.js"}, + {"name":"balltastic.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rpgdice", + "name": "RPG dice", + "version": "0.02", + "description": "Simple RPG dice rolling app.", + "icon": "rpgdice.png", + "type": "app", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-rpg-dice-screenshot.png"}], + "storage": [ + {"name":"rpgdice.app.js","url":"app.js"}, + {"name":"rpgdice.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widmp", + "name": "Moon Phase Widget", + "version": "0.02", + "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widmp.wid.js","url":"widget.js"} + ] + }, + { + "id": "widmpsh", + "name": "Moon Phase Widget Southern Hemisphere", + "version": "0.01", + "description": "Display the current moon phase in blueish for the southern hemisphere in eight phases", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widmpsh.wid.js","url":"widget.js"} + ] + }, + { + "id": "minionclk", + "name": "Minion clock", + "version": "0.05", + "description": "Minion themed clock.", + "icon": "minionclk.png", + "type": "clock", + "tags": "clock,minion", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-minion-clock-screenshot.png"}], + "storage": [ + {"name":"minionclk.app.js","url":"app.js"}, + {"name":"minionclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "openstmap", + "name": "OpenStreetMap", + "shortName": "OpenStMap", + "version": "0.11", + "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", + "icon": "app.png", + "tags": "outdoors,gps,osm", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "custom": "custom.html", + "customConnect": true, + "storage": [ + {"name":"openstmap","url":"openstmap.js"}, + {"name":"openstmap.app.js","url":"app.js"}, + {"name":"openstmap.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "activepedom", + "name": "Active Pedometer", + "shortName": "Active Pedometer", + "version": "0.09", + "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", + "icon": "app.png", + "tags": "outdoors,widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"activepedom.wid.js","url":"widget.js"}, + {"name":"activepedom.settings.js","url":"settings.js"}, + {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, + {"name":"activepedom.app.js","url":"app.js"} + ] + }, + { + "id": "chronowid", + "name": "Chrono Widget", + "shortName": "Chrono Widget", + "version": "0.04", + "description": "Chronometer (timer) which runs as widget.", + "icon": "app.png", + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"chronowid.wid.js","url":"widget.js"}, + {"name":"chronowid.app.js","url":"app.js"}, + {"name":"chronowid.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "tabata", + "name": "Tabata", + "shortName": "Tabata - Control High-Intensity Interval Training", + "version": "0.01", + "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", + "icon": "tabata.png", + "tags": "workout,health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"tabata.app.js","url":"tabata.js"}, + {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} + ] + }, + { + "id": "custom", + "name": "Custom Boot Code ", + "version": "0.01", + "description": "Add code you want to run at boot time", + "icon": "custom.png", + "type": "bootloader", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "storage": [ + {"name":"custom"} + ] + }, + { + "id": "devstopwatch", + "name": "Dev Stopwatch", + "shortName": "Dev Stopwatch", + "version": "0.03", + "description": "Stopwatch with 5 laps supported (cyclically replaced)", + "icon": "app.png", + "tags": "stopwatch,chrono,timer,chronometer", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-dev-stopwatch-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"devstopwatch.app.js","url":"app.js"}, + {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "batchart", + "name": "Battery Chart", + "shortName": "Battery Chart", + "version": "0.10", + "description": "A widget and an app for recording and visualizing battery percentage over time.", + "icon": "app.png", + "tags": "app,widget,battery,time,record,chart,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"batchart.wid.js","url":"widget.js"}, + {"name":"batchart.app.js","url":"app.js"}, + {"name":"batchart.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "nato", + "name": "NATO Alphabet", + "shortName": "NATOAlphabet", + "version": "0.01", + "description": "Learn the NATO Phonetic alphabet plus some numbers.", + "icon": "nato.png", + "type": "app", + "tags": "app,learn,visual", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-NATO-alphabet-screenshot.png"},{"url":"bangle1-NATO-alphabet-screenshot2.png"}], + "storage": [ + {"name":"nato.app.js","url":"nato.js"}, + {"name":"nato.img","url":"nato-icon.js","evaluate":true} + ] + }, + { + "id": "numerals", + "name": "Numerals Clock", + "shortName": "Numerals Clock", + "version": "0.10", + "description": "A simple big numerals clock", + "icon": "numerals.png", + "type": "clock", + "tags": "numerals,clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-numerals-screenshot.png"}], + "storage": [ + {"name":"numerals.app.js","url":"numerals.app.js"}, + {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, + {"name":"numerals.settings.js","url":"numerals.settings.js"} + ], + "data": [{"name":"numerals.json"}] + }, + { + "id": "bledetect", + "name": "BLE Detector", + "shortName": "BLE Detector", + "version": "0.03", + "description": "Detect BLE devices and show some informations.", + "icon": "bledetect.png", + "tags": "app,bluetooth,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"bledetect.app.js","url":"bledetect.js"}, + {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} + ] + }, + { + "id": "snake", + "name": "Snake", + "shortName": "Snake", + "version": "0.02", + "description": "The classic snake game. Eat apples and don't bite your tail.", + "icon": "snake.png", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"snake.app.js","url":"snake.js"}, + {"name":"snake.img","url":"snake-icon.js","evaluate":true} + ] + }, + { "id": "snek", + "name": "The snek game", + "shortName":"Snek", + "version": "0.02", + "description": "A snek game where you control a snek to eat all the apples!", + "screenshots": [{"url":"screenshot_snek.png"}], + "icon": "snek.png", + "supports": ["BANGLEJS2"], + "tags": "game,fun", + "storage": [ + {"name":"snek.app.js","url":"snek.js"}, + {"name":"snek.img","url":"snek.icon.js","evaluate":true} + ] + }, + { + "id": "calculator", + "name": "Calculator", + "shortName": "Calculator", + "version": "0.04", + "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", + "icon": "calculator.png", + "screenshots": [{"url":"screenshot_calculator.png"}], + "tags": "app,tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"calculator.app.js","url":"app.js"}, + {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} + ] + }, + { + "id": "dane", + "name": "Digital Assistant, not EDITH", + "shortName": "DANE", + "version": "0.16", + "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"dane.app.js","url":"app.js"}, + {"name":"dane.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "dane_tcr", + "name": "DANE Touch Launcher", + "shortName": "DANE Toucher", + "version": "0.07", + "description": "Touch enable left to right launcher in the style of the DANE Watchface", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"dane_tcr.app.js","url":"app.js"}, + {"name":"dane_tcr.settings.js","url":"settings.js"} + ], + "data": [{"name":"dane_tcr.json"}] + }, + { + "id": "buffgym", + "name": "BuffGym", + "version": "0.02", + "description": "BuffGym is the famous 5x5 workout program for the BangleJS", + "icon": "buffgym.png", + "type": "app", + "tags": "tool,outdoors,gym,exercise", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "buffgym.html", + "allow_emulator": false, + "storage": [ + {"name":"buffgym.app.js","url":"buffgym.app.js"}, + {"name":"buffgym-set.js","url":"buffgym-set.js"}, + {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, + {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, + {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, + {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, + {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, + {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} + ] + }, + { + "id": "banglerun", + "name": "BangleRun", + "shortName": "BangleRun", + "version": "0.10", + "description": "An app for running sessions. Displays info and logs your run for later viewing.", + "icon": "banglerun.png", + "tags": "run,running,fitness,outdoors", + "supports": ["BANGLEJS"], + "interface": "interface.html", + "allow_emulator": false, + "storage": [ + {"name":"banglerun.app.js","url":"app.js"}, + {"name":"banglerun.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "metronome", + "name": "Metronome", + "version": "0.07", + "readme": "README.md", + "description": "Makes the watch blinking and vibrating with a given rate", + "icon": "metronome_icon.png", + "tags": "tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-metronome-screenshot.png"}], + "storage": [ + {"name":"metronome.app.js","url":"metronome.js"}, + {"name":"metronome.img","url":"metronome-icon.js","evaluate":true}, + {"name":"metronome.settings.js","url":"settings.js"} + ] + }, + { + "id": "blackjack", + "name": "Black Jack game", + "shortName": "Black Jack game", + "version": "0.02", + "description": "Simple implementation of card game Black Jack", + "icon": "blackjack.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"blackjack.app.js","url":"blackjack.app.js"}, + {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} + ] + }, + { + "id": "hidcam", + "name": "Camera shutter", + "shortName": "Cam shutter", + "version": "0.03", + "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", + "icon": "app.png", + "tags": "bluetooth,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hidcam.app.js","url":"app.js"}, + {"name":"hidcam.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "swlclk", + "name": "SWL Clock / Short Wave Listner Clock", + "shortName": "SWL Clock", + "version": "0.02", + "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies", + "icon": "swlclk.png", + "type": "clock", + "tags": "tool,clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-SWL-clock-screenshot.png"}], + "storage": [ + {"name":"swlclk.app.js","url":"app.js"}, + {"name":"swlclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rclock", + "name": "Round clock with seconds, minutes and date", + "shortName": "Round Clock", + "version": "0.06", + "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"rclock.app.js","url":"rclock.app.js"}, + {"name":"rclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "fclock", + "name": "fclock", + "shortName": "F Clock", + "version": "0.02", + "description": "Simple design of a digital clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"fclock.app.js","url":"fclock.app.js"}, + {"name":"fclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hamloc", + "name": "QTH Locator / Maidenhead Locator System", + "shortName": "QTH Locator", + "version": "0.01", + "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hamloc.app.js","url":"app.js"}, + {"name":"hamloc.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "osmpoi", + "name": "POI Compass", + "version": "0.03", + "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"osmpoi.app.js"}, + {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pong", + "name": "Pong", + "shortName": "Pong", + "version": "0.03", + "description": "A clone of the Atari game Pong", + "icon": "pong.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-pong-screenshot.png"}], + "storage": [ + {"name":"pong.app.js","url":"app.js"}, + {"name":"pong.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ballmaze", + "name": "Ball Maze", + "version": "0.02", + "description": "Navigate a ball through a maze by tilting your watch.", + "icon": "icon.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"ballmaze.app.js","url":"app.js"}, + {"name":"ballmaze.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"ballmaze.json"}] + }, + { + "id": "calendar", + "name": "Calendar", + "version": "0.03", + "description": "Simple calendar", + "icon": "calendar.png", + "screenshots": [{"url":"screenshot_calendar.png"}], + "tags": "calendar", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"calendar.app.js","url":"calendar.js"}, + {"name":"calendar.settings.js","url":"settings.js"}, + {"name":"calendar.img","url":"calendar-icon.js","evaluate":true} + ], + "data": [{"name":"calendar.json"}] + }, + { + "id": "hidjoystick", + "name": "Bluetooth Joystick", + "shortName": "Joystick", + "version": "0.01", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", + "icon": "app.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidjoystick.app.js","url":"app.js"}, + {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "largeclock", + "name": "Large Clock", + "version": "0.10", + "description": "A readable and informational digital watch, with date, seconds and moon phase", + "icon": "largeclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-large-clock-screenshot.png"}], + "storage": [ + {"name":"largeclock.app.js","url":"largeclock.js"}, + {"name":"largeclock.img","url":"largeclock-icon.js","evaluate":true}, + {"name":"largeclock.settings.js","url":"settings.js"} + ], + "data": [{"name":"largeclock.json"}] + }, + { + "id": "smtswch", + "name": "Smart Switch", + "shortName": "Smart Switch", + "version": "0.01", + "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", + "icon": "app.png", + "type": "app", + "tags": "bluetooth,btle,smart,switch", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"smtswch.app.js","url":"app.js"}, + {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, + {"name":"light-on.img","url":"light-on.js","evaluate":true}, + {"name":"light-off.img","url":"light-off.js","evaluate":true}, + {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, + {"name":"switch-off.img","url":"switch-off.js","evaluate":true} + ] + }, + { + "id": "miplant", + "name": "Xiaomi Plant Sensor", + "shortName": "Mi Plant", + "version": "0.02", + "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors", + "icon": "app.png", + "tags": "xiaomi,mi,plant,ble,bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"miplant.app.js","url":"app.js"}, + {"name":"miplant.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "simpletimer", + "name": "Timer", + "version": "0.07", + "description": "Simple timer, useful when playing board games or cooking", + "icon": "app.png", + "tags": "timer", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-timer-screenshot.png"}], + "storage": [ + {"name":"simpletimer.app.js","url":"app.js"}, + {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, + {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, + {"name":"simpletimer.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"simpletimer.json"}] + }, + { + "id": "beebclock", + "name": "Beeb Clock", + "version": "0.05", + "description": "Clock face that may be coincidentally familiar to BBC viewers", + "icon": "beebclock.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-beeb-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"beebclock.app.js","url":"beebclock.js"}, + {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} + ] + }, + { + "id": "findphone", + "name": "Find Phone", + "shortName": "Find Phone", + "version": "0.03", + "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.", + "icon": "app.png", + "tags": "tool,android", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"findphone.app.js","url":"app.js"}, + {"name":"findphone.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "getup", + "name": "Get Up", + "shortName": "Get Up", + "version": "0.01", + "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!", + "icon": "app.png", + "tags": "tools,health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "screenshots": [{"url":"bangle1-get-up-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"getup.app.js","url":"app.js"}, + {"name":"getup.settings.js","url":"settings.js"}, + {"name":"getup.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gallifr", + "name": "Time Traveller's Chronometer", + "shortName": "Time Travel Clock", + "version": "0.02", + "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", + "icon": "gallifr.png", + "screenshots": [{"url":"screenshot_time.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"gallifr.app.js","url":"app.js"}, + {"name":"gallifr.img","url":"app-icon.js","evaluate":true}, + {"name":"gallifr.settings.js","url":"settings.js"} + ], + "data": [{"name":"gallifr.json"}] + }, + { + "id": "rndmclk", + "name": "Random Clock Loader", + "version": "0.03", + "description": "Load a different clock whenever the LCD is switched on.", + "icon": "rndmclk.png", + "type": "widget", + "tags": "widget,clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"rndmclk.wid.js","url":"widget.js"} + ] + }, + { + "id": "dotmatrixclock", + "name": "Dotmatrix Clock", + "version": "0.01", + "description": "A clear white-on-blue dotmatrix simulated clock", + "icon": "dotmatrixclock.png", + "type": "clock", + "tags": "clock,dotmatrix,retro", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"dotmatrixclock.app.js","url":"app.js"}, + {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true} + ] + }, + { + "id": "jbm8b", + "name": "Magic 8 Ball", + "shortName": "Magic 8 Ball", + "version": "0.03", + "description": "A simple fortune telling app", + "icon": "app.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"jbm8b.app.js","url":"app.js"}, + {"name":"jbm8b.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "jbm8b_IT", + "name": "Magic 8 Ball Italiano", + "shortName": "Magic 8 Ball IT", + "version": "0.01", + "description": "La palla predice il futuro", + "icon": "app.png", + "screenshots": [{"url":"bangle1-magic-8-ball-italiano-screenshot.png"}], + "tags": "game", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"jbm8b_IT.app.js","url":"app.js"}, + {"name":"jbm8b_IT.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "BLEcontroller", + "name": "BLE Customisable Controller with Joystick", + "shortName": "BLE Controller", + "version": "0.01", + "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.", + "icon": "BLEcontroller.png", + "tags": "tool,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "storage": [ + {"name":"BLEcontroller.app.js","url":"app.js"}, + {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widviz", + "name": "Widget Visibility Widget", + "shortName": "Viz Widget", + "version": "0.03", + "description": "Swipe left to hide top bar widgets, swipe right to redisplay.", + "icon": "eye.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widviz.wid.js","url":"widget.js"} + ] + }, + { + "id": "binclock", + "name": "Binary Clock", + "shortName": "Binary Clock", + "version": "0.03", + "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.", + "icon": "app.png", + "type": "clock", + "tags": "clock,binary", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"binclock.app.js","url":"app.js"}, + {"name":"binclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pizzatimer", + "name": "Pizza Timer", + "shortName": "Pizza Timer", + "version": "0.01", + "description": "A timer app for when you cook Pizza. Some say it can also time other things", + "icon": "pizza.png", + "tags": "timer,tool,pizza", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"pizzatimer.app.js","url":"app.js"}, + {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "animclk", + "name": "Animated Clock", + "shortName": "Anim Clock", + "version": "0.03", + "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", + "icon": "app.png", + "type": "clock", + "tags": "clock,animated", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"animclk.app.js","url":"app.js"}, + {"name":"animclk.pixels1","url":"animclk.pixels1"}, + {"name":"animclk.pixels2","url":"animclk.pixels2"}, + {"name":"animclk.pal","url":"animclk.pal"}, + {"name":"animclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "analogimgclk", + "name": "Analog Clock (Image background)", + "shortName": "Analog Clock", + "version": "0.03", + "description": "An analog clock with an image background", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"analogimgclk.app.js","url":"app.js"}, + {"name":"analogimgclk.bg.img","url":"bg.img"}, + {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "verticalface", + "name": "Vertical watch face", + "shortName": "Vertical Face", + "version": "0.09", + "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-vertical-watch-face-screenshot.png"}], + "storage": [ + {"name":"verticalface.app.js","url":"app.js"}, + {"name":"verticalface.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "sleepphasealarm", + "name": "SleepPhaseAlarm", + "shortName": "SleepPhaseAlarm", + "version": "0.02", + "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", + "icon": "app.png", + "tags": "alarm", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"sleepphasealarm.app.js","url":"app.js"}, + {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "life", + "name": "Game of Life", + "version": "0.04", + "description": "Conway's Game of Life - 16x16 board", + "icon": "life.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-game-of-life-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"life.app.js","url":"life.min.js"}, + {"name":"life.img","url":"life-icon.js","evaluate":true} + ] + }, + { + "id": "magnav", + "name": "Navigation Compass", + "version": "0.05", + "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", + "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}], + "icon": "magnav.png", + "tags": "tool,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]}, + {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]}, + {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} + ], + "data": [{"name":"magnav.json"}] + }, + { + "id": "gpspoilog", + "name": "GPS POI Logger", + "shortName": "GPS POI Log", + "version": "0.01", + "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial", + "icon": "app.png", + "tags": "outdoors", + "supports": ["BANGLEJS"], + "interface": "interface.html", + "storage": [ + {"name":"gpspoilog.app.js","url":"app.js"}, + {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "miclock2", + "name": "Mixed Clock 2", + "version": "0.01", + "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", + "icon": "clock-mixed.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-mixed-clock-2-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"miclock2.app.js","url":"clock-mixed.js"}, + {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} + ] + }, + { + "id": "1button", + "name": "One-Button-Tracker", + "version": "0.01", + "description": "A widget that turns BTN1 into a tracker, records time of button press/release.", + "icon": "widget.png", + "type": "widget", + "tags": "tool,quantifiedself,widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"1button.wid.js","url":"widget.js"} + ], + "data": [{"name":"one_button_presses.csv","storageFile":true}] + }, + { + "id": "gpsautotime", + "name": "GPS auto time", + "shortName": "GPS auto time", + "version": "0.01", + "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gpsautotime.wid.js","url":"widget.js"} + ] + }, + { + "id": "espruinoctrl", + "name": "Espruino Control", + "shortName": "Espruino Ctrl", + "version": "0.01", + "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"espruinoctrl.app.js"}, + {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "multiclock", + "name": "Multi Clock", + "version": "0.09", + "description": "Clock with multiple faces. Switch between faces with BTN1 & BTN3 (Bangle 2 touch top-right, bottom right). For best display set theme Background 2 to cyan or some other bright colour in settings.", + "screenshots": [{"url":"screen-ana.png"},{"url":"screen-big.png"},{"url":"screen-td.png"},{"url":"screen-nifty.png"},{"url":"screen-word.png"},{"url":"screen-sec.png"}], + "icon": "multiclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"multiclock.app.js","url":"multiclock.app.js"}, + {"name":"big.face.js","url":"big.face.js"}, + {"name":"ana.face.js","url":"ana.face.js"}, + {"name":"digi.face.js","url":"digi.face.js"}, + {"name":"txt.face.js","url":"txt.face.js"}, + {"name":"dk.face.js","url":"dk.face.js"}, + {"name":"nifty.face.js","url":"nifty.face.js"}, + {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} + ] + }, + { + "id": "widancs", + "name": "Apple Notification Widget", + "shortName": "ANCS Widget", + "version": "0.07", + "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"widancs.wid.js","url":"ancs.min.js"}, + {"name":"widancs.settings.js","url":"settings.js"} + ] + }, + { + "id": "accelrec", + "name": "Acceleration Recorder", + "shortName": "Accel Rec", + "version": "0.02", + "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"accelrec.app.js","url":"app.js"}, + {"name":"accelrec.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"wildcard":"accelrec.?.csv"}] + }, + { + "id": "accellog", + "name": "Acceleration Logger", + "shortName": "Accel Log", + "version": "0.03", + "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", + "icon": "app.png", + "tags": "outdoor", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"accellog.app.js","url":"app.js"}, + {"name":"accellog.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"wildcard":"accellog.?.csv"}] + }, + { + "id": "cprassist", + "name": "CPR Assist", + "version": "0.01", + "description": "Provides assistance while performing a CPR", + "icon": "cprassist-icon.png", + "tags": "tool,firstaid", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], + "storage": [ + {"name":"cprassist.app.js","url":"cprassist.js"}, + {"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true}, + {"name":"cprassist.settings.js","url":"settings.js"} + ] + }, + { + "id": "osgridref", + "name": "Ordnance Survey Grid Reference", + "shortName": "OS Grid ref", + "version": "0.01", + "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", + "icon": "app.png", + "tags": "outdoors,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"osgridref.app.js","url":"app.js"}, + {"name":"osgridref.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "openseizure", + "name": "OpenSeizureDetector Widget", + "shortName": "Short Name", + "version": "0.01", + "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"openseizure.wid.js","url":"widget.js"} + ] + }, + { + "id": "counter", + "name": "Counter", + "version": "0.03", + "description": "Simple counter", + "icon": "counter_icon.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-counter-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"counter.app.js","url":"counter.js"}, + {"name":"counter.img","url":"counter-icon.js","evaluate":true} + ] + }, + { + "id": "bootgattbat", + "name": "BLE GATT Battery Service", + "shortName": "BLE Battery Service", + "version": "0.01", + "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n", + "icon": "bluetooth.png", + "type": "bootloader", + "tags": "battery,ble,bluetooth,gatt", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"gattbat.boot.js","url":"boot.js"} + ] + }, + { + "id": "viewstl", + "name": "STL file viewer", + "shortName": "ViewSTL", + "version": "0.02", + "description": "This app allows you to view STL 3D models on your watch", + "icon": "icons8-octahedron-48.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"viewstl.app.js","url":"viewstl.min.js"}, + {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, + {"name":"tetra.stl","url":"tetra.stl"}, + {"name":"cube.stl","url":"cube.stl"}, + {"name":"icosa.stl","url":"icosa.stl"} + ] + }, + { + "id": "cscsensor", + "name": "Cycling speed sensor", + "shortName": "CSCSensor", + "version": "0.06", + "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch", + "icon": "icons8-cycling-48.png", + "tags": "outdoors,exercise,ble,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"cscsensor.app.js","url":"cscsensor.app.js"}, + {"name":"cscsensor.settings.js","url":"settings.js"}, + {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true} + ] + }, + { + "id": "fileman", + "name": "File manager", + "shortName": "FileManager", + "version": "0.03", + "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", + "icon": "icons8-filing-cabinet-48.png", + "tags": "tools", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"fileman.app.js","url":"fileman.app.js"}, + {"name":"fileman.img","url":"fileman-icon.js","evaluate":true} + ] + }, + { + "id": "worldclock", + "name": "World Clock - 4 time zones", + "shortName": "World Clock", + "version": "0.05", + "description": "Current time zone plus up to four others", + "icon": "app.png", + "screenshots": [{"url":"screenshot_world.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"worldclock.app.js","url":"app.js"}, + {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true} + ], + "data": [{"name":"worldclock.settings.json"}] + }, + { + "id": "digiclock", + "name": "Digital Clock Face", + "shortName": "Digi Clock", + "version": "0.02", + "description": "A simple digital clock with the time, day, month, and year", + "icon": "digiclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"digiclock.app.js","url":"digiclock.js"}, + {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true} + ] + }, + { + "id": "dsdrelay", + "name": "DSD BLE Relay controller", + "shortName": "DSDRelay", + "version": "0.01", + "description": "Control BLE relay board from the watch", + "icon": "icons8-relay-48.png", + "tags": "ble,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"}, + {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true} + ] + }, + { + "id": "mandel", + "name": "Mandelbrot", + "shortName": "Mandel", + "version": "0.01", + "description": "Draw a zoomable Mandelbrot set", + "icon": "mandel.png", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mandel.app.js","url":"mandel.min.js"}, + {"name":"mandel.img","url":"mandel-icon.js","evaluate":true} + ] + }, + { + "id": "petrock", + "name": "Pet rock", + "version": "0.02", + "description": "A virtual pet rock with wobbly eyes", + "icon": "petrock.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"petrock.app.js","url":"app.js"}, + {"name":"petrock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "smartibot", + "name": "Smartibot controller", + "shortName": "Smartibot", + "version": "0.01", + "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"smartibot.app.js","url":"app.js"}, + {"name":"smartibot.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widncr", + "name": "NCR Logo Widget", + "version": "0.01", + "description": "Show the NodeConf Remote logo in the top left", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widncr.wid.js","url":"widget.js"} + ] + }, + { + "id": "ncrclk", + "name": "NCR Clock", + "shortName": "NCR Clock", + "version": "0.02", + "description": "NodeConf Remote clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncrclk.app.js","url":"app.js"}, + {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "isoclock", + "name": "ISO Compliant Clock Face", + "shortName": "ISO Clock", + "version": "0.02", + "description": "Tweaked fork of digiclock for ISO date and time", + "icon": "isoclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"isoclock.app.js","url":"isoclock.js"}, + {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true} + ] + }, + { + "id": "gpstimeserver", + "name": "GPS Time Server", + "version": "0.01", + "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"gpstimeserver.wid.js","url":"widget.js"} + ] + }, + { + "id": "tilthydro", + "name": "Tilt Hydrometer Display", + "shortName": "Tilt Hydro", + "version": "0.01", + "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", + "icon": "app.png", + "tags": "tools,bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"tilthydro.app.js","url":"app.js"}, + {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "supmariodark", + "name": "Super mario clock night mode", + "shortName": "supmariodark", + "version": "0.01", + "description": "Super mario clock in night mode", + "icon": "supmariodark.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"supmariodark.app.js","url":"supmariodark.js"}, + {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, + {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"}, + {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"}, + {"name":"banner-up.img","url":"banner-up.js","evaluate":true}, + {"name":"banner-down.img","url":"banner-down.js","evaluate":true}, + {"name":"brick2.img","url":"brick2.js","evaluate":true}, + {"name":"enemy.img","url":"enemy.js","evaluate":true}, + {"name":"flower.img","url":"flower.js","evaluate":true}, + {"name":"flower_b.img","url":"flower_b.js","evaluate":true}, + {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true}, + {"name":"pipe.img","url":"pipe.js","evaluate":true} + ] + }, + { + "id": "gmeter", + "name": "G-Meter", + "shortName": "G-Meter", + "version": "0.01", + "description": "Simple G-Meter", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gmeter.app.js","url":"app.js"}, + {"name":"gmeter.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "dtlaunch", + "name": "Desktop Launcher", + "version": "0.07", + "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", + "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], + "icon": "icon.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, + {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, + {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]}, + {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]}, + {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"dtlaunch.json"}] + }, + { + "id": "HRV", + "name": "Heart Rate Variability monitor", + "shortName": "HRV monitor", + "version": "0.04", + "description": "Heart Rate Variability monitor, see Readme for more info", + "icon": "hrv.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"HRV.app.js","url":"app.js"}, + {"name":"HRV.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hardalarm", + "name": "Hard Alarm", + "shortName": "HardAlarm", + "version": "0.02", + "description": "Make sure you wake up! Count to the right number to turn off the alarm", + "icon": "app.png", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hardalarm.app.js","url":"app.js"}, + {"name":"hardalarm.boot.js","url":"boot.js"}, + {"name":"hardalarm.js","url":"hardalarm.js"}, + {"name":"hardalarm.img","url":"app-icon.js","evaluate":true}, + {"name":"hardalarm.wid.js","url":"widget.js"} + ], + "data": [{"name":"hardalarm.json"}] + }, + { + "id": "edisonsball", + "name": "Edison's Ball", + "shortName": "Edison's Ball", + "version": "0.01", + "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", + "icon": "app-icon.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"edisonsball.app.js","url":"app.js"}, + {"name":"edisonsball.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hrrawexp", + "name": "HRM Data Exporter", + "shortName": "HRM Data Exporter", + "version": "0.01", + "description": "export raw hrm signal data to a csv file", + "icon": "app-icon.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"hrrawexp.app.js","url":"app.js"}, + {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "breath", + "name": "Breathing App", + "shortName": "Breathing App", + "version": "0.01", + "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR", + "icon": "app-icon.png", + "tags": "tools,health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"breath.app.js","url":"app.js"}, + {"name":"breath.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"breath.settings.json","url":"settings.json"}] + }, + { + "id": "lazyclock", + "name": "Lazy Clock", + "version": "0.03", + "description": "Tells the time, roughly", + "icon": "lazyclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "screenshots": [{"url":"bangle1-lazy-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"lazyclock.app.js","url":"lazyclock-app.js"}, + {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true} + ] + }, + { + "id": "astral", + "name": "Astral Clock", + "version": "0.03", + "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"astral.app.js","url":"app.js"}, + {"name":"astral.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "alpinenav", + "name": "Alpine Nav", + "version": "0.01", + "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime", + "icon": "app-icon.png", + "tags": "outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"alpinenav.app.js","url":"app.js"}, + {"name":"alpinenav.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "lifeclk", + "name": "Game of Life Clock", + "shortName": "Conway's Clock", + "version": "0.06", + "description": "Modification and clockification of Conway's Game of Life", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"lifeclk.app.js","url":"app.min.js"}, + {"name":"lifeclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "speedalt", + "name": "GPS Adventure Sports", + "shortName": "GPS Adv Sport", + "version": "1.02", + "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", + "icon": "app.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"speedalt.app.js","url":"app.js"}, + {"name":"speedalt.img","url":"app-icon.js","evaluate":true}, + {"name":"speedalt.settings.js","url":"settings.js"} + ], + "data": [{"name":"speedalt.json"}] + }, + { + "id": "speedalt2", + "name": "GPS Adventure Sports II", + "shortName": "GPS Adv Sport II", + "version": "0.07", + "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", + "icon": "app.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"speedalt2.app.js","url":"app.js"}, + {"name":"speedalt2.img","url":"app-icon.js","evaluate":true}, + {"name":"speedalt2.settings.js","url":"settings.js"} + ], + "data": [{"name":"speedalt2.json"}] + }, + { + "id": "slomoclock", + "name": "SloMo Clock", + "shortName": "SloMo Clock", + "version": "0.10", + "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", + "icon": "watch.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-slow-mo-clock-screenshot.png"}], + "storage": [ + {"name":"slomoclock.app.js","url":"app.js"}, + {"name":"slomoclock.img","url":"app-icon.js","evaluate":true}, + {"name":"slomoclock.settings.js","url":"settings.js"} + ], + "data": [{"name":"slomoclock.json"}] + }, + { + "id": "de-stress", + "name": "De-Stress", + "shortName": "De-Stress", + "version": "0.02", + "description": "Simple haptic heartbeat", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"de-stress.app.js","url":"app.js"}, + {"name":"de-stress.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mclockplus", + "name": "Morph Clock+", + "shortName": "Morph Clock+", + "version": "0.02", + "description": "Morphing Clock with more readable seconds and date and additional stopwatch", + "icon": "mclockplus.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, + {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} + ] + }, + { + "id": "intervals", + "name": "Intervals App", + "shortName": "Intervals", + "version": "0.01", + "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", + "icon": "intervals.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"intervals.app.js","url":"intervals.app.js"}, + {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} + ] + }, + { + "id": "planetarium", + "name": "Planetarium", + "shortName": "Planetarium", + "version": "0.03", + "description": "Planetarium showing up to 500 stars using the watch location and time", + "icon": "planetarium.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"planetarium.app.js","url":"planetarium.app.js"}, + {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, + {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, + {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, + {"name":"planetarium.settings.js","url":"settings.js"}, + {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} + ], + "data": [{"name":"planetarium.json"}] + }, + { + "id": "tapelauncher", + "name": "Tape Launcher", + "version": "0.02", + "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", + "icon": "icon.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"tapelauncher.app.js","url":"app.js"}, + {"name":"tapelauncher.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "oblique", + "name": "Oblique Strategies", + "version": "0.01", + "description": "Oblique Strategies for creativity. Copied from Brian Eno.", + "icon": "eno.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"oblique.app.js","url":"app.js"}, + {"name":"oblique.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "testuserinput", + "name": "Test User Input", + "shortName": "Test User Input", + "version": "0.06", + "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.", + "icon": "app.png", + "tags": "input,interface,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"testuserinput.app.js","url":"app.js"}, + {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gpssetup", + "name": "GPS Setup", + "shortName": "GPS Setup", + "version": "0.02", + "description": "Configure the GPS power options and store them in the GPS nvram", + "icon": "gpssetup.png", + "tags": "gps,tools,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"gpssetup","url":"gpssetup.js"}, + {"name":"gpssetup.settings.js","url":"settings.js"}, + {"name":"gpssetup.app.js","url":"app.js"}, + {"name":"gpssetup.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"gpssetup.settings.json","url":"settings.json"}] + }, + { + "id": "walkersclock", + "name": "Walkers Clock", + "shortName": "Walkers Clock", + "version": "0.04", + "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference", + "icon": "walkersclock48.png", + "type": "clock", + "tags": "clock,gps,tools,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"walkersclock.app.js","url":"app.js"}, + {"name":"walkersclock.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "widgps", + "name": "GPS Widget", + "version": "0.03", + "description": "Tiny widget to show the power on/off status of the GPS", + "icon": "widget.png", + "type": "widget", + "tags": "widget,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widgps.wid.js","url":"widget.js"} + ] + }, + { + "id": "widhrt", + "name": "HRM Widget", + "version": "0.03", + "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor", + "icon": "widget.png", + "type": "widget", + "tags": "widget,hrm", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widhrt.wid.js","url":"widget.js"} + ] + }, + { + "id": "countdowntimer", + "name": "Countdown Timer", + "version": "0.01", + "description": "A simple countdown timer with a focus on usability", + "icon": "countdowntimer.png", + "tags": "timer,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"countdowntimer.app.js","url":"countdowntimer.js"}, + {"name":"countdowntimer.img","url":"countdowntimer-icon.js","evaluate":true} + ] + }, + { + "id": "helloworld", + "name": "hello, world!", + "shortName": "hello world", + "version": "0.02", + "description": "A cross cultural hello world!/hola mundo! app with colors and languages", + "icon": "app.png", + "tags": "input,interface,buttons,touch", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"helloworld.app.js","url":"app.js"}, + {"name":"helloworld.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widcom", + "name": "Compass Widget", + "version": "0.02", + "description": "Tiny widget to show the power on/off status of the Compass", + "icon": "widget.png", + "type": "widget", + "tags": "widget,compass", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widcom.wid.js","url":"widget.js"} + ] + }, + { + "id": "arrow", + "name": "Arrow Compass", + "version": "0.05", + "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass", + "icon": "arrow.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"arrow.app.js","url":"app.js"}, + {"name":"arrow.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "waypointer", + "name": "Way Pointer", + "version": "0.01", + "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", + "icon": "waypointer.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"waypointer.app.js","url":"app.js"}, + {"name":"waypointer.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "color_catalog", + "name": "Colors Catalog", + "shortName": "Colors Catalog", + "version": "0.01", + "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", + "icon": "app.png", + "tags": "Color,input,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"color_catalog.app.js","url":"app.js"}, + {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "UI4swatch", + "name": "UI 4 swatch", + "shortName": "UI 4 swatch", + "version": "0.01", + "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.", + "icon": "app.png", + "tags": "Color,input,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"UI4swatch.app.js","url":"app.js"}, + {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "simplest", + "name": "Simplest Clock", + "version": "0.03", + "description": "The simplest working clock, acts as a tutorial piece", + "icon": "simplest.png", + "screenshots": [{"url":"screenshot_simplest.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"simplest.app.js","url":"app.js"}, + {"name":"simplest.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "stepo", + "name": "Stepometer Clock", + "version": "0.03", + "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed", + "icon": "stepo.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"stepo.app.js","url":"app.js"}, + {"name":"stepo.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "gbmusic", + "name": "Gadgetbridge Music Controls", + "shortName": "Music Controls", + "version": "0.08", + "description": "Control the music on your Gadgetbridge-connected phone", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], + "type": "app", + "tags": "tools,bluetooth,gadgetbridge,music", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"gbmusic.app.js","url":"app.js"}, + {"name":"gbmusic.settings.js","url":"settings.js"}, + {"name":"gbmusic.wid.js","url":"widget.js"}, + {"name":"gbmusic.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}] + }, + { + "id": "battleship", + "name": "Battleship", + "version": "0.01", + "description": "The classic game of battleship", + "icon": "battleship-icon.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-battle-ship-screenshot.png"}], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"battleship.app.js","url":"battleship.js"}, + {"name":"battleship.img","url":"battleship-icon.js","evaluate":true} + ] + }, + { + "id": "kitchen", + "name": "Kitchen Combo", + "version": "0.13", + "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'", + "icon": "kitchen.png", + "type": "clock", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"kitchen.app.js","url":"kitchen.app.js"}, + {"name":"stepo2.kit.js","url":"stepo2.kit.js"}, + {"name":"swatch.kit.js","url":"swatch.kit.js"}, + {"name":"gps.kit.js","url":"gps.kit.js"}, + {"name":"compass.kit.js","url":"compass.kit.js"}, + {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "banglebridge", + "name": "BangleBridge", + "shortName": "BangleBridge", + "version": "0.01", + "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"banglebridge.wid.js","url":"widget.js"}, + {"name":"banglebridge.watch.img","url":"watch.img"}, + {"name":"banglebridge.heart.img","url":"heart.img"} + ] + }, + { + "id": "qmsched", + "name": "Quiet Mode Schedule and Widget", + "shortName": "Quiet Mode", + "version": "0.05", + "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", + "icon": "app.png", + "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, + {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}], + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"qmsched","url":"lib.js"}, + {"name":"qmsched.app.js","url":"app.js"}, + {"name":"qmsched.boot.js","url":"boot.js"}, + {"name":"qmsched.img","url":"icon.js","evaluate":true}, + {"name":"qmsched.wid.js","url":"widget.js"} + ], + "data": [{"name":"qmsched.json"}] + }, + { + "id": "hourstrike", + "name": "Hour Strike", + "shortName": "Hour Strike", + "version": "0.08", + "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!", + "icon": "app-icon.png", + "tags": "tool,alarm", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hourstrike.app.js","url":"app.js"}, + {"name":"hourstrike.boot.js","url":"boot.js"}, + {"name":"hourstrike.img","url":"app-icon.js","evaluate":true}, + {"name":"hourstrike.json","url":"hourstrike.json"} + ] + }, + { + "id": "whereworld", + "name": "Where in the World?", + "shortName": "Where World", + "version": "0.01", + "description": "Shows your current location on the world map", + "icon": "app.png", + "tags": "gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"whereworld.app.js","url":"app.js"}, + {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, + {"name":"whereworld.worldmap","url":"worldmap"} + ] + }, + { + "id": "omnitrix", + "name": "Omnitrix", + "version": "0.01", + "description": "An Omnitrix Showpiece", + "icon": "omnitrix.png", + "screenshots": [{"url":"screenshot.png"}], + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"omnitrix.app.js","url":"omnitrix.app.js"}, + {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true} + ] + }, + { + "id": "batclock", + "name": "Bat Clock", + "shortName": "Bat Clock", + "version": "0.02", + "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", + "icon": "bat-clock.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"batclock.app.js","url":"bat-clock.app.js"}, + {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true} + ] + }, + { + "id": "doztime", + "name": "Dozenal Time", + "shortName": "Dozenal Time", + "version": "0.04", + "description": "A dozenal Holocene calendar and dozenal diurnal clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"doztime.app.js","url":"app.js"}, + {"name":"doztime.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gbtwist", + "name": "Gadgetbridge Twist Control", + "shortName": "Twist Control", + "version": "0.01", + "description": "Shake your wrist to control your music app via Gadgetbridge", + "icon": "app.png", + "type": "app", + "tags": "tools,bluetooth,gadgetbridge,music", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "storage": [ + {"name":"gbtwist.app.js","url":"app.js"}, + {"name":"gbtwist.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "thermom", + "name": "Thermometer", + "version": "0.04", + "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"thermom.app.js","url":"app.js"}, + {"name":"thermom.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mysticdock", + "name": "Mystic Dock", + "version": "1.00", + "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.", + "icon": "mystic-dock.png", + "type": "dock", + "tags": "dock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mysticdock.app.js","url":"mystic-dock-app.js"}, + {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"}, + {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"}, + {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true} + ] + }, + { + "id": "mysticclock", + "name": "Mystic Clock", + "version": "1.01", + "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.", + "icon": "mystic-clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-mystic-clock-screenshot.png"}], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"mysticclock.app.js","url":"mystic-clock-app.js"}, + {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"}, + {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true} + ] + }, + { + "id": "hcclock", + "name": "Hi-Contrast Clock", + "version": "0.02", + "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", + "icon": "hcclock-icon.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"hcclock.app.js","url":"hcclock.app.js"}, + {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} + ] + }, + { + "id": "thermomF", + "name": "Fahrenheit Temp", + "version": "0.01", + "description": "A modification of the Thermometer App to display temprature in Fahrenheit", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"thermomF.app.js","url":"app.js"}, + {"name":"thermomF.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "nixie", + "name": "Nixie Clock", + "shortName": "Nixie", + "version": "0.01", + "description": "A nixie tube clock for both Bangle 1 and 2.", + "icon": "nixie.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"nixie.app.js","url":"app.js"}, + {"name":"nixie.img","url":"app-icon.js","evaluate":true}, + {"name":"m_vatch.js","url":"m_vatch.js"} + ] + }, + { + "id": "carcrazy", + "name": "Car Crazy", + "shortName": "Car Crazy", + "version": "0.03", + "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.", + "icon": "carcrash.png", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"carcrazy.app.js","url":"app.js"}, + {"name":"carcrazy.img","url":"app-icon.js","evaluate":true}, + {"name":"carcrazy.settings.js","url":"settings.js"} + ], + "data": [{"name":"CarCrazy.csv"}] + }, + { + "id": "shortcuts", + "name": "Shortcuts", + "shortName": "Shortcuts", + "version": "0.01", + "description": "Quickly load your favourite apps from (almost) any watch face.", + "icon": "app.png", + "type": "bootloader", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"shortcuts.boot.js","url":"boot.js"}, + {"name":"shortcuts.settings.js","url":"settings.js"} + ], + "data": [{"name":"shortcuts.json"}] + }, + { + "id": "vectorclock", + "name": "Vector Clock", + "version": "0.03", + "description": "A digital clock that uses the built-in vector font.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [ + {"url":"bangle2-vector-clock-screenshot.png"}, + {"url":"bangle1-vector-clock-screenshot.png"} + ], + "storage": [ + {"name":"vectorclock.app.js","url":"app.js"}, + {"name":"vectorclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "fd6fdetect", + "name": "fd6fdetect", + "shortName": "fd6fdetect", + "version": "0.2", + "description": "Allows you to see 0xFD6F beacons near you.", + "icon": "app.png", + "tags": "tool", + "readme": "README.md", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"fd6fdetect.app.js","url":"app.js"}, + {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "choozi", + "name": "Choozi", + "version": "0.01", + "description": "Choose people or things at random using Bangle.js.", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-choozi-screenshot1.png"},{"url":"bangle1-choozi-screenshot2.png"}], + "storage": [ + {"name":"choozi.app.js","url":"app.js"}, + {"name":"choozi.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widclkbttm", + "name": "Digital clock (Bottom) widget", + "shortName": "Digital clock Bottom Widget", + "version": "0.03", + "description": "Displays time in the bottom area.", + "icon": "widclkbttm.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"} + ] + }, + { + "id": "pastel", + "name": "Pastel Clock", + "shortName": "Pastel", + "version": "0.08", + "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "icon": "pastel.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_pastel.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"f_architect","url":"f_architect.js"}, + {"name":"f_gochihand","url":"f_gochihand.js"}, + {"name":"f_cabin","url":"f_cabin.js"}, + {"name":"f_orbitron","url":"f_orbitron.js"}, + {"name":"f_monoton","url":"f_monoton.js"}, + {"name":"f_elite","url":"f_elite.js"}, + {"name":"f_lato","url":"f_lato.js"}, + {"name":"f_latosmall","url":"f_latosmall.js"}, + {"name":"pastel.app.js","url":"pastel.app.js"}, + {"name":"pastel.img","url":"pastel.icon.js","evaluate":true}, + {"name":"pastel.settings.js","url":"pastel.settings.js"} + ], + "data": [{"name":"pastel.json"}] + }, + { + "id": "antonclk", + "name": "Anton Clock", + "version": "0.03", + "description": "A simple clock using the bold Anton font.", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"antonclk.app.js","url":"app.js"}, + {"name":"antonclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "waveclk", + "name": "Wave Clock", + "version": "0.02", + "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"waveclk.app.js","url":"app.js"}, + {"name":"waveclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "floralclk", + "name": "Floral Clock", + "version": "0.01", + "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**", + "icon": "app.png", + "screenshots": [{"url":"screenshot_floral.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"floralclk.app.js","url":"app.js"}, + {"name":"floralclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "score", + "name": "Score Tracker", + "version": "0.01", + "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.", + "icon": "score.app.png", + "screenshots": [{"url":"screenshot_score.png"}], + "type": "app", + "tags": "", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"score.app.js","url":"score.app.js"}, + {"name":"score.settings.js","url":"score.settings.js"}, + {"name":"score.presets.json","url":"score.presets.json"}, + {"name":"score.img","url":"score.app-icon.js","evaluate":true} + ], + "data": [{"name":"score.json"}] + }, + { + "id": "menusmall", + "name": "Small Menus", + "version": "0.02", + "description": "Replace Bangle.js 2's menus with a version that contains smaller text", + "icon": "app.png", + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"menusmall.boot.js","url":"boot.js"} + ] + }, + { + "id": "ffcniftya", + "name": "Nifty-A Clock", + "version": "0.01", + "description": "A nifty clock with time and date", + "icon": "app.png", + "screenshots": [{"url":"screenshot_nifty.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"ffcniftya.app.js","url":"app.js"}, + {"name":"ffcniftya.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ffcniftyb", + "name": "Nifty-B Clock", + "version": "0.02", + "description": "A nifty clock (series B) with time, date and color configuration", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ffcniftyb.app.js","url":"app.js"}, + {"name":"ffcniftyb.img","url":"app-icon.js","evaluate":true}, + {"name":"ffcniftyb.settings.js","url":"settings.js"} + ], + "data": [{"name":"ffcniftyb.json"}] + }, + { + "id": "stopwatch", + "name": "Stopwatch Touch", + "version": "0.01", + "description": "A touch based stop watch for Bangle JS 2", + "icon": "stopwatch.png", + "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "tags": "tools,app", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"stopwatch.app.js","url":"stopwatch.app.js"}, + {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true} + ] + }, + { + "id": "vernierrespirate", + "name": "Vernier Go Direct Respiration Belt", + "shortName": "Respiration Belt", + "version": "0.01", + "description": "Connects to a Go Direct Respiration Belt and shows respiration rate", + "icon": "app.png", + "tags": "health,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"vernierrespirate.app.js","url":"app.js"}, + {"name":"vernierrespirate.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"vernierrespirate.json"}] + }, + { + "id": "gpstouch", + "name": "GPS Touch", + "version": "0.01", + "description": "A touch based GPS watch, shows OS map reference", + "icon": "gpstouch.png", + "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], + "tags": "tools,app", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"geotools","url":"geotools.js"}, + {"name":"gpstouch.app.js","url":"gpstouch.app.js"}, + {"name":"gpstouch.img","url":"gpstouch.icon.js","evaluate":true} + ] + }, + { + "id": "swiperclocklaunch", + "name": "Swiper Clock Launch", + "version": "0.02", + "description": "Navigate between clock and launcher with Swipe action", + "icon": "swiperclocklaunch.png", + "type": "bootloader", + "tags": "tools, system", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"swiperclocklaunch.boot.js","url":"boot.js"}, + {"name":"swiperclocklaunch.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "qalarm", + "name": "Q Alarm and Timer", + "shortName": "Q Alarm", + "icon": "app.png", + "version": "0.03", + "description": "Alarm and timer app with days of week and 'hard' option.", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + { "name": "qalarm.app.js", "url": "app.js" }, + { "name": "qalarm.boot.js", "url": "boot.js" }, + { "name": "qalarm.js", "url": "qalarm.js" }, + { "name": "qalarmcheck.js", "url": "qalarmcheck.js" }, + { "name": "qalarm.img", "url": "app-icon.js", "evaluate": true }, + { "name": "qalarm.wid.js", "url": "widget.js" } + ], + "data": [{ "name": "qalarm.json" }] + }, + { + "id": "emojuino", + "name": "Emojuino", + "shortName": "Emojuino", + "version": "0.03", + "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", + "icon": "emojuino.png", + "screenshots": [ + { "url": "screenshot-tx.png" }, + { "url": "screenshot-swipe.png" }, + { "url": "screenshot-welcome.png" } + ], + "type": "app", + "tags": "emoji", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "emojuino.app.js", "url": "emojuino.js" }, + { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } + ] + }, + { + "id": "cliclockJS2Enhanced", + "name": "Commandline-Clock JS2 Enhanced", + "shortName": "CLI-Clock JS2", + "version": "0.03", + "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design. Also added HID media controlls, just swipe on the clock face to controll the media! Gadgetbride support coming soon(hopefully) Thanks to t0m1o1 for media controls!", + "icon": "app.png", + "screenshots": [{"url":"screengrab.png"}], + "type": "clock", + "tags": "clock,cli,command,bash,shell", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, + {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} + ] + }, + { + "id": "wid_a_battery_widget", + "name": "A Battery Widget (with percentage)", + "shortName":"A Battery Widget", + "icon": "widget.png", + "version":"1.02", + "type": "widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "description": "Simple and slim battery widget with charge status and percentage", + "tags": "widget,battery", + "storage": [ + {"name":"wid_a_battery_widget.wid.js","url":"widget.js"} + ] + }, + { + "id": "lcars", + "name": "LCARS Clock", + "shortName":"LCARS", + "icon": "lcars.png", + "version":"0.06", + "readme": "README.md", + "supports": ["BANGLEJS2"], + "description": "Library Computer Access Retrieval System (LCARS) clock.", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"screenshot.png"}], + "storage": [ + {"name":"lcars.app.js","url":"lcars.app.js"}, + {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} + ] + }, + { "id": "binwatch", + "name": "Binary Watch", + "shortName":"BinWatch", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.04", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "allow_emulator":true, + "description": "Famous binary watch", + "tags": "clock", + "type": "clock", + "storage": [ + {"name":"binwatch.app.js","url":"app.js"}, + {"name":"binwatch.bg176.img","url":"Background176_center.img"}, + {"name":"binwatch.bg240.img","url":"Background240_center.img"}, + {"name":"binwatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hidmsicswipe", + "name": "Bluetooth Music Swipe Controls", + "shortName": "Swipe Control", + "version": "0.01", + "description": "Based on the original Bluetooth Music Controls. Swipe up/down for volume, left/right for previous and next, tap for play/pause and btn1 to lock and unlock the controls. Enable HID in settings, pair with your phone, then use this app to control music from your watch!", + "icon": "hidmsicswipe.png", + "tags": "bluetooth", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"hidmsicswipe.app.js","url":"hidmsicswipe.js"}, + {"name":"hidmsicswipe.img","url":"hidmsicswipe-icon.js","evaluate":true} + ] + }, + { + "id": "authentiwatch", + "name": "2FA Authenticator", + "shortName": "AuthWatch", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "version": "0.04", + "description": "Google Authenticator compatible tool.", + "tags": "tool", + "interface": "interface.html", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"authentiwatch.app.js","url":"app.js"}, + {"name":"authentiwatch.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"authentiwatch.json"}] + }, + { "id": "schoolCalendar", + "name": "School Calendar", + "shortName":"SCalendar", + "icon": "CalenderLogo.png", + "version": "0.01", + "description": "A simple calendar that you can see your upcoming events that you create in the customizer. Keep in note that your events reapeat weekly.(Beta)", + "tags": "tool", + "readme":"README.md", + "custom":"custom.html", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"screenshot_basic.png"},{"url":"screenshot_info.png"}], + "storage": [ + {"name":"schoolCalendar.app.js"}, + {"name":"schoolCalendar.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"calendarItems.csv"} + ] + }, + { "id": "timecal", + "name": "TimeCal", + "shortName":"TimeCal", + "icon": "icon.png", + "version":"0.01", + "description": "TimeCal shows the Time along with a 3 week calendar", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"timecal.app.js","url":"timecal.app.js"} + ] + }, + { + "id": "a_clock_timer", + "name": "A Clock with Timer", + "version": "0.01", + "description": "A Clock with Timer, Map and Time Zones", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"a_clock_timer.app.js","url":"app.js"}, + {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id":"intervalTimer", + "name":"Interval Timer", + "shortName":"Interval Timer", + "icon": "app.png", + "version":"0.01", + "description": "Interval Timer for workouts, HIIT, or whatever else.", + "tags": "timer, interval, hiit, workout", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"intervalTimer.app.js","url":"app.js"}, + {"name":"intervalTimer.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "93dub", + "name": "93 Dub", + "shortName":"93 Dub", + "icon": "93dub.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.05", + "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"93dub.app.js","url":"app.js"}, + {"name":"93dub.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "poweroff", + "name": "Poweroff", + "shortName":"Poweroff", + "version":"0.01", + "description": "Simple app to power off your Bangle.js", + "icon": "app.png", + "tags": "tool, poweroff, shutdown", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"poweroff.app.js","url":"app.js"}, + {"name":"poweroff.img","url":"app-icon.js","evaluate":true} + ] +}, +{ + "id": "sensible", + "name": "SensiBLE", + "shortName": "SensiBLE", + "version": "0.04", + "description": "Collect, display and advertise real-time sensor data.", + "icon": "sensible.png", + "screenshots": [ + { "url": "screenshot-top.png" }, + { "url": "screenshot-acc.png" }, + { "url": "screenshot-bar.png" }, + { "url": "screenshot-gps.png" }, + { "url": "screenshot-hrm.png" }, + { "url": "screenshot-mag.png" } + ], + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "sensible.app.js", "url": "sensible.js" }, + { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } + ] +}, + { + "id": "widbars", + "name": "Bars Widget", + "version": "0.01", + "description": "Display several measurements as vertical bars.", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbars.wid.js","url":"widget.js"} + ] +}, +{ + "id":"a_speech_timer", + "name":"Speech Timer", + "icon": "app.png", + "version":"1.01", + "description": "A timer designed to help keeping your speeches and presentations to time.", + "tags": "tool,timer", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"a_speech_timer.app.js","url":"app.js"}, + {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} + ] +}, + { "id": "mylocation", + "name": "My Location", + "shortName":"My Location", + "icon": "mylocation.png", + "type": "app", + "screenshots": [{"url":"screenshot_1.png"}], + "version":"0.01", + "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", + "readme": "README.md", + "tags": "tool,utility", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"mylocation.app.js","url":"mylocation.app.js"}, + {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } + ], + "data": [ + {"name":"mylocation.json"} + ] + }, + { + "id": "pebble", + "name": "Pebble Clock", + "shortName": "Pebble", + "version": "0.04", + "description": "A pebble style clock to keep the rebellion going", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"pebble.app.js","url":"pebble.app.js"}, + {"name":"pebble.settings.js","url":"pebble.settings.js"}, + {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} + ] + }, + { "id": "pooqroman", + "name": "pooq Roman watch face", + "shortName":"pooq Roman", + "version":"0.03", + "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"pooqroman.app.js","url":"app.js"}, + {"name":"pooqroman.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"pooqroman.json"} + ] + }, + { + "id": "widbata", + "name": "Battery Level Widget (Themed)", + "shortName":"Battery Theme", + "icon": "widbata.png", + "screenshots": [{"url":"screenshot_widbata_1.png"}], + "version":"0.01", + "type": "widget", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "description": "Shows the current battery level status in the top right using the clocks colour theme", + "tags": "widget,battery", + "storage": [ + {"name":"widbata.wid.js","url":"widbata.wid.js"} + ] + }, + { + "id": "weatherClock", + "name": "Weather Clock", + "version": "0.04", + "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", + "icon": "app.png", + "screenshots": [{"url":"screens/screen1.png"}], + "type": "clock", + "tags": "clock, weather", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"weatherClock.app.js","url":"app.js"}, + {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "menuwheel", + "name": "Wheel Menus", + "version": "0.01", + "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button", + "readme": "README.md", + "icon": "icon.png", + "screenshots": [ + {"url":"screenshot_b1_dark.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_light.png"}, + {"url":"screenshot_b2_dark.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_light.png"} + ], + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"menuwheel.boot.js","url":"boot.js"} + ] + }, + { "id": "widChargingStatus", + "name": "Charging Status", + "shortName":"ChargingStatus", + "icon": "widget.png", + "version":"0.1", + "type": "widget", + "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widChargingStatus.wid.js","url":"widget.js"} + ] + }, + { + "id": "flow", + "name": "FLOW", + "shortName": "FLOW", + "version": "0.01", + "description": "A game where you have to help a flow avoid white obstacles thing by tapping! This is a demake of an app which I forgot the name of. Press BTN(1) to restart. See if you can get to 2500 score!", + "icon": "app.png", + "tags": "game", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name": "flow.app.js", "url": "app.js" }, + {"name": "flow.img", "url": "app-icon.js","evaluate": true } + ] + }, + { "id": "scribble", + "name": "Scribble", + "shortName":"Scribble", + "version":"0.01", + "type": "app", + "description": "A keyboard on your wrist! Swipe right for space, left for delete.", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"scribble.app.js","url":"app.js"}, + {"name":"scribble.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } + ] + }, + { + "id": "ptlaunch", + "name": "Pattern Launcher", + "shortName": "Pattern Launcher", + "version": "0.10", + "description": "Directly launch apps from the clock screen with custom patterns.", + "icon": "app.png", + "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "ptlaunch.app.js", "url": "app.js" }, + { "name": "ptlaunch.boot.js", "url": "boot.js" }, + { "name": "ptlaunch.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"ptlaunch.patterns.json"}] + }, + { + "id": "rebble", + "name": "Rebble Clock", + "shortName": "Rebble", + "version": "0.02", + "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", + "readme": "README.md", + "icon": "rebble.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_rebble.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"rebble.app.js","url":"rebble.app.js"}, + {"name":"rebble.settings.js","url":"rebble.settings.js"}, + {"name":"rebble.img","url":"rebble.icon.js","evaluate":true} + ] + }, + { "id": "snaky", + "name": "Snaky", + "shortName":"Snaky", + "version":"0.01", + "description": "The classic snake game. Eat apples and don't bite your tail. Control the snake with the touch screen.", + "tags": "game,fun", + "icon": "snaky.png", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"snaky.app.js","url":"snaky.js"}, + {"name":"snaky.img","url":"snaky-icon.js","evaluate":true} + ] + }, + { + "id": "clicompleteclk", + "name": "CLI complete clock", + "shortName":"CLI cmplt clock", + "version":"0.03", + "description": "Command line styled clock with lots of information", + "icon": "app.png", + "allow_emulator": true, + "type": "clock", + "tags": "clock,cli,command,bash,shell,weather,hrt", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, + {"name":"clicompleteclk.settings.js","url":"settings.js"} + ], + "data": [{"name":"clicompleteclk.json"}] + }, + { + "id":"awairmonitor", + "name":"Awair Monitor", + "icon": "app.png", + "allow_emulator": true, + "version":"0.01", + "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", + "tags": "tool,health", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"awairmonitor.app.js","url":"app.js"}, + {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "pooqround", + "name": "pooq Round watch face", + "shortName":"pooq Round", + "version":"0.00", + "description": "A 24 hour analogue watchface with high legibility and a novel style.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"pooqround.app.js","url":"app.js"}, + {"name":"pooqround.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"pooqround.json"} + ] + }, + { + "id": "coretemp", + "name": "Core Temp Display", + "version": "0.01", + "description": "Display CoreTemp device sensor data", + "icon": "coretemp.png", + "type": "app", + "tags": "health", + "readme": "README.md", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + ] + }, + { + "id": "ltherm", + "name": "Thermometer", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ltherm.app.js","url":"app.js"}, + {"name":"thermf.img","url":"icon.js","evaluate":true} + ] + } +] \ No newline at end of file From 73ef9ce7fba2ed30508eae45c228849d2e2533b8 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 06:02:51 -0500 Subject: [PATCH 011/503] Delete apps.json --- apps.json | 4990 ----------------------------------------------------- 1 file changed, 4990 deletions(-) delete mode 100644 apps.json diff --git a/apps.json b/apps.json deleted file mode 100644 index 2a83c2b69..000000000 --- a/apps.json +++ /dev/null @@ -1,4990 +0,0 @@ -[ - { - "id": "fwupdate", - "name": "Firmware Update", - "version": "0.02", - "description": "[BETA] Uploads new Espruino firmwares to Bangle.js 2. For now, please use the instructions under https://www.espruino.com/Bangle.js2#firmware-updates", - "icon": "app.png", - "type": "RAM", - "tags": "tools,system", - "supports": ["BANGLEJS2"], - "custom": "custom.html", - "customConnect": true, - "storage": [], - "sortorder": 20 - }, - { - "id": "boot", - "name": "Bootloader", - "version": "0.38", - "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", - "icon": "bootloader.png", - "type": "bootloader", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":".boot0","url":"boot0.js"}, - {"name":".bootcde","url":"bootloader.js"}, - {"name":"bootupdate.js","url":"bootupdate.js"} - ], - "sortorder": -10 - }, - { - "id": "hebrew_calendar", - "name": "Hebrew Calendar", - "shortName": "HebCal", - "version": "0.04", - "description": "lists the date according to the hebrew calendar", - "icon": "app.png", - "allow_emulator": false, - "tags": "tool,locale", - "supports": [ - "BANGLEJS", - "BANGLEJS2" - ], - "readme": "README.md", - "storage": [ - { - "name": "hebrew_calendar.app.js", - "url": "app.js" - }, - { - "name": "hebrewDate", - "url": "hebrewDate.js" - }, - { - "name": "hebrew_calendar.img", - "url": "app-icon.js", - "evaluate": true - } - ] - }, - { "id": "golfscore", - "name": "Golf Score", - "shortName":"golfscore", - "version":"0.02", - "description": "keeps track of strokes during a golf game", - "icon": "app.png", - "tags": "outdoors", - "allow_emulator": true, - "supports" : ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"golfscore.app.js","url":"app.js"}, - {"name":"golfscore.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "messages", - "name": "Messages", - "version": "0.13", - "description": "App to display notifications from iOS and Gadgetbridge", - "icon": "app.png", - "type": "app", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"messages.app.js","url":"app.js"}, - {"name":"messages.settings.js","url":"settings.js"}, - {"name":"messages.img","url":"app-icon.js","evaluate":true}, - {"name":"messages.wid.js","url":"widget.js"}, - {"name":"messages","url":"lib.js"} - ], - "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}], - "sortorder": -9 - }, - { - "id": "android", - "name": "Android Integration", - "shortName": "Android", - "version": "0.05", - "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", - "icon": "app.png", - "tags": "tool,system,messages,notifications", - "dependencies": {"messages":"app"}, - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"android.app.js","url":"app.js"}, - {"name":"android.settings.js","url":"settings.js"}, - {"name":"android.img","url":"app-icon.js","evaluate":true}, - {"name":"android.boot.js","url":"boot.js"} - ], - "sortorder": -8 - }, - { - "id": "ios", - "name": "iOS Integration", - "version": "0.07", - "description": "Display notifications/music/etc from iOS devices", - "icon": "app.png", - "tags": "tool,system,ios,apple,messages,notifications", - "dependencies": {"messages":"app"}, - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"ios.app.js","url":"app.js"}, - {"name":"ios.img","url":"app-icon.js","evaluate":true}, - {"name":"ios.boot.js","url":"boot.js"} - ], - "sortorder": -8 - }, - { - "id": "health", - "name": "Health Tracking", - "version": "0.08", - "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", - "icon": "app.png", - "tags": "tool,system,health", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"health.app.js","url":"app.js"}, - {"name":"health.img","url":"app-icon.js","evaluate":true}, - {"name":"health.boot.js","url":"boot.js"}, - {"name":"health","url":"lib.js"} - ] - }, - { - "id": "launch", - "name": "Launcher", - "shortName": "Launcher", - "version": "0.10", - "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"launch.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]}, - {"name":"launch.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]}, - {"name":"launch.settings.js","url":"settings.js","supports":["BANGLEJS2"]} - ], - "data": [{"name":"launch.json"}], - "sortorder": -10 - }, - { - "id": "setting", - "name": "Settings", - "version": "0.36", - "description": "A menu for setting up Bangle.js", - "icon": "settings.png", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"setting.app.js","url":"settings.js"}, - {"name":"setting.img","url":"settings-icon.js","evaluate":true} - ], - "data": [{"name":"setting.json","url":"settings.min.json","evaluate":true}], - "sortorder": -5 - }, - { - "id": "about", - "name": "About", - "version": "0.12", - "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", - "icon": "app.png", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-about-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"about.img","url":"app-icon.js","evaluate":true} - ], - "sortorder": -4 - }, - { - "id": "alarm", - "name": "Default Alarm & Timer", - "shortName": "Alarms", - "version": "0.14", - "description": "Set and respond to alarms and timers", - "icon": "app.png", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"alarm.app.js","url":"app.js"}, - {"name":"alarm.boot.js","url":"boot.js"}, - {"name":"alarm.js","url":"alarm.js"}, - {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} - ], - "data": [{"name":"alarm.json"}] - }, - { - "id": "locale", - "name": "Languages", - "version": "0.14", - "description": "Translations for different countries", - "icon": "locale.png", - "type": "locale", - "tags": "tool,system,locale,translate", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "locale.html", - "storage": [ - {"name":"locale"} - ], - "sortorder": -10 - }, - { - "id": "notify", - "name": "Notifications (default)", - "shortName": "Notifications", - "version": "0.11", - "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen", - "icon": "notify.png", - "type": "notify", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { - "id": "notifyfs", - "name": "Fullscreen Notifications", - "shortName": "Notifications", - "version": "0.12", - "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.", - "icon": "notify.png", - "type": "notify", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { - "id": "welcome", - "name": "Welcome", - "shortName": "Welcome", - "version": "0.14", - "description": "Appears at first boot and explains how to use Bangle.js", - "icon": "app.png", - "screenshots": [{"url":"screenshot_welcome.png"}], - "tags": "start,welcome", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"welcome.boot.js","url":"boot.js"}, - {"name":"welcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"welcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"welcome.settings.js","url":"settings.js"}, - {"name":"welcome.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"welcome.json"}] - }, - { - "id": "mywelcome", - "name": "Customised Welcome", - "shortName": "My Welcome", - "version": "0.13", - "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", - "icon": "app.png", - "tags": "start,welcome", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}], - "storage": [ - {"name":"mywelcome.boot.js","url":"boot.js"}, - {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, - {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, - {"name":"mywelcome.settings.js","url":"settings.js"}, - {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"mywelcome.json"}] - }, - { - "id": "gbridge", - "name": "Gadgetbridge", - "version": "0.25", - "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", - "icon": "app.png", - "type": "widget", - "tags": "tool,system,android,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "dependencies": {"notify":"type"}, - "readme": "README.md", - "storage": [ - {"name":"gbridge.settings.js","url":"settings.js"}, - {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, - {"name":"gbridge.wid.js","url":"widget.js"} - ], - "data": [{"name":"gbridge.json"}] - }, - { "id": "gbdebug", - "name": "Gadgetbridge Debug", - "shortName":"GB Debug", - "version":"0.01", - "description": "Debug info for Gadgetbridge. Run this app and when Gadgetbridge messages arrive they are displayed on-screen.", - "icon": "app.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"gbdebug.app.js","url":"app.js"}, - {"name":"gbdebug.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mclock", - "name": "Morphing Clock", - "version": "0.07", - "description": "7 segment clock that morphs between minutes and hours", - "icon": "clock-morphing.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-morphing-clock-screenshot.png"}], - "storage": [ - {"name":"mclock.app.js","url":"clock-morphing.js"}, - {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} - ], - "sortorder": -9 - }, - { - "id": "moonphase", - "name": "Moonphase", - "version": "0.02", - "description": "Shows current moon phase. Now with GPS function.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-moon-phase-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"moonphase.app.js","url":"app.js"}, - {"name":"moonphase.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "daysl", - "name": "Days left", - "version": "0.03", - "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "allow_emulator": false, - "storage": [ - {"name":"daysl.app.js","url":"app.js"}, - {"name":"daysl.img","url":"app-icon.js","evaluate":true}, - {"name":"daysl.wid.js","url":"widget.js"} - ] - }, - { - "id": "wclock", - "name": "Word Clock", - "version": "0.03", - "description": "Display Time as Text", - "icon": "clock-word.png", - "screenshots": [{"url":"screenshot_word.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"wclock.app.js","url":"clock-word.js"}, - {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} - ] - }, - { - "id": "fontclock", - "name": "Font Clock", - "version": "0.01", - "description": "Choose the font and design of clock face from a library of available designs", - "icon": "fontclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"fontclock.app.js","url":"fontclock.js"}, - {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, - {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, - {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, - {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, - {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, - {"name":"fontclock.font.js","url":"fontclock.font.js"}, - {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, - {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, - {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, - {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, - {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, - {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} - ] - }, - { - "id": "slidingtext", - "name": "Sliding Clock", - "version": "0.07", - "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported", - "icon": "slidingtext.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"slidingtext.app.js","url":"slidingtext.js"}, - {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true}, - {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"}, - {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"}, - {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"}, - {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"}, - {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"}, - {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"}, - {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"}, - {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"} - ] - }, - { - "id": "solarclock", - "name": "Solar Clock", - "version": "0.02", - "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position", - "icon": "solar_clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "allow_emulator": false, - "storage": [ - {"name":"solarclock.app.js","url":"solar_clock.js"}, - {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true}, - {"name":"solar_colors.js","url":"solar_colors.js"}, - {"name":"solar_controller.js","url":"solar_controller.js"}, - {"name":"solar_date_utils.js","url":"solar_date_utils.js"}, - {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"}, - {"name":"solar_location.js","url":"solar_location.js"}, - {"name":"solar_math_utils.js","url":"solar_math_utils.js"}, - {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"}, - {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"}, - {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"}, - {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"}, - {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"}, - {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"} - ] - }, - { - "id": "sweepclock", - "name": "Sweep Clock", - "version": "0.04", - "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", - "icon": "sweepclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-sweep-clock-screenshot.png"}], - "storage": [ - {"name":"sweepclock.app.js","url":"sweepclock.js"}, - {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} - ] - }, - { - "id": "matrixclock", - "name": "Matrix Clock", - "version": "0.02", - "description": "inspired by The Matrix, a clock of the same style", - "icon": "matrixclock.png", - "screenshots": [{"url":"screenshot_matrix.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"matrixclock.app.js","url":"matrixclock.js"}, - {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true} - ] - }, - { - "id": "mandelbrotclock", - "name": "Mandelbrot Clock", - "version": "0.01", - "description": "A mandelbrot set themed clock cool", - "icon": "mandelbrotclock.png", - "screenshots": [{ "url": "screenshot_mandelbrotclock.png" }], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - { "name": "mandelbrotclock.app.js", "url": "mandelbrotclock.js" }, - { - "name": "mandelbrotclock.img", - "url": "mandelbrotclock-icon.js", - "evaluate": true - } - ] - }, - { - "id": "imgclock", - "name": "Image background clock", - "shortName": "Image Clock", - "version": "0.08", - "description": "A clock with an image as a background", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"imgclock.app.js","url":"app.js"}, - {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, - {"name":"imgclock.face.img"}, - {"name":"imgclock.face.json"}, - {"name":"imgclock.face.bg","content":""} - ] - }, - { - "id": "impwclock", - "name": "Imprecise Word Clock", - "version": "0.03", - "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", - "icon": "clock-impword.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"impwclock.app.js","url":"clock-impword.js"}, - {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} - ] - }, - { - "id": "aclock", - "name": "Analog Clock", - "version": "0.15", - "description": "An Analog Clock", - "icon": "clock-analog.png", - "screenshots": [{"url":"screenshot_analog.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"aclock.app.js","url":"clock-analog.js"}, - {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} - ] - }, - { - "id": "clock2x3", - "name": "2x3 Pixel Clock", - "version": "0.05", - "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", - "icon": "clock2x3.png", - "screenshots": [{"url":"screenshot_pixel.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, - {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} - ] - }, - { - "id": "geissclk", - "name": "Geiss Clock", - "version": "0.03", - "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", - "icon": "clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"geissclk.app.js","url":"clock.js"}, - {"name":"geissclk.precompute.js","url":"precompute.js"}, - {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} - ], - "data": [{"name":"geissclk.0.map"},{"name":"geissclk.1.map"},{"name":"geissclk.2.map"},{"name":"geissclk.3.map"},{"name":"geissclk.4.map"},{"name":"geissclk.5.map"},{"name":"geissclk.0.pal"},{"name":"geissclk.1.pal"},{"name":"geissclk.2.pal"}] - }, - { - "id": "trex", - "name": "T-Rex", - "version": "0.04", - "description": "T-Rex game in the style of Chrome's offline game", - "icon": "trex.png", - "screenshots": [{"url":"screenshot_trex.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"trex.app.js","url":"trex.js"}, - {"name":"trex.img","url":"trex-icon.js","evaluate":true}, - {"name":"trex.settings.js","url":"settings.js"} - ], - "data": [{"name":"trex.score","storageFile":true}] - }, - { - "id": "cubescramble", - "name": "Cube Scramble", - "version":"0.04", - "description": "A random scramble generator for the 3x3 Rubik's cube with a basic timer", - "icon": "cube-scramble.png", - "tags": "", - "supports" : ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle2-cube-scramble-screenshot.png"},{"url":"bangle1-cube-scramble-screenshot.png"}], - "storage": [ - {"name":"cubescramble.app.js","url":"cube-scramble.js"}, - {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} - ] - }, - { - "id": "astroid", - "name": "Asteroids!", - "version": "0.03", - "description": "Retro asteroids game", - "icon": "asteroids.png", - "screenshots": [{"url":"screenshot_asteroids.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"astroid.app.js","url":"asteroids.js"}, - {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} - ] - }, - { - "id": "clickms", - "name": "Click Master", - "version": "0.01", - "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", - "icon": "click-master.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"clickms.app.js","url":"click-master.js"}, - {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} - ] - }, - { - "id": "horsey", - "name": "Horse Race!", - "version": "0.01", - "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", - "icon": "horse-race.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"horsey.app.js","url":"horse-race.js"}, - {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} - ] - }, - { - "id": "compass", - "name": "Compass", - "version": "0.05", - "description": "Simple compass that points North", - "icon": "compass.png", - "screenshots": [{"url":"screenshot_compass.png"}], - "tags": "tool,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"compass.app.js","url":"compass.js"}, - {"name":"compass.img","url":"compass-icon.js","evaluate":true} - ] - }, - { - "id": "gpstime", - "name": "GPS Time", - "version": "0.05", - "description": "Update the Bangle.js's clock based on the time from the GPS receiver", - "icon": "gpstime.png", - "tags": "tool,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"gpstime.app.js","url":"gpstime.js"}, - {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} - ] - }, - { - "id": "openloc", - "name": "Open Location / Plus Codes", - "shortName": "Open Location", - "version": "0.01", - "description": "Convert your current GPS location to a series of characters", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"openloc.app.js","url":"app.js"}, - {"name":"openloc.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "speedo", - "name": "Speedo", - "version": "0.05", - "description": "Show the current speed according to the GPS", - "icon": "speedo.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"speedo.app.js","url":"speedo.js"}, - {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} - ] - }, - { - "id": "gpsrec", - "name": "GPS Recorder", - "version": "0.27", - "description": "Application that allows you to record a GPS track. Can run in background", - "icon": "app.png", - "tags": "tool,outdoors,gps,widget", - "screenshots": [{"url":"screenshot.png"}], - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"gpsrec.app.js","url":"app.js"}, - {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, - {"name":"gpsrec.wid.js","url":"widget.js"}, - {"name":"gpsrec.settings.js","url":"settings.js"} - ], - "data": [{"name":"gpsrec.json"},{"wildcard":".gpsrc?","storageFile":true}] - }, - { - "id": "recorder", - "name": "Recorder (BETA)", - "shortName": "Recorder", - "version": "0.04", - "description": "Record GPS position, heart rate and more in the background, then download to your PC.", - "icon": "app.png", - "tags": "tool,outdoors,gps,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"recorder.app.js","url":"app.js"}, - {"name":"recorder.img","url":"app-icon.js","evaluate":true}, - {"name":"recorder.wid.js","url":"widget.js"}, - {"name":"recorder.settings.js","url":"settings.js"} - ], - "data": [{"name":"recorder.json"},{"wildcard":"recorder.log?.csv","storageFile":true}] - }, - { - "id": "gpsnav", - "name": "GPS Navigation", - "version": "0.05", - "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", - "icon": "icon.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"gpsnav.app.js","url":"app.min.js"}, - {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "heart", - "name": "Heart Rate Recorder", - "shortName": "HRM Record", - "version": "0.07", - "description": "Application that allows you to record your heart rate. Can run in background", - "icon": "app.png", - "tags": "tool,health,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "interface": "interface.html", - "storage": [ - {"name":"heart.app.js","url":"app.js"}, - {"name":"heart.img","url":"app-icon.js","evaluate":true}, - {"name":"heart.wid.js","url":"widget.js"} - ], - "data": [{"name":"heart.json"},{"wildcard":".heart?","storageFile":true}] - }, - { - "id": "slevel", - "name": "Spirit Level", - "version": "0.02", - "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", - "icon": "spiritlevel.png", - "tags": "tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"slevel.app.js","url":"spiritlevel.js"}, - {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} - ] - }, - { - "id": "files", - "name": "App Manager", - "version": "0.07", - "description": "Show currently installed apps, free space, and allow their deletion from the watch", - "icon": "files.png", - "tags": "tool,system,files", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"files.app.js","url":"files.js"}, - {"name":"files.img","url":"files-icon.js","evaluate":true} - ] - }, - { - "id": "weather", - "name": "Weather", - "version": "0.13", - "description": "Show Gadgetbridge weather report", - "icon": "icon.png", - "screenshots": [{"url":"screenshot.png"}], - "tags": "widget,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "readme.md", - "storage": [ - {"name":"weather.app.js","url":"app.js"}, - {"name":"weather.wid.js","url":"widget.js"}, - {"name":"weather","url":"lib.js"}, - {"name":"weather.img","url":"icon.js","evaluate":true}, - {"name":"weather.settings.js","url":"settings.js"} - ], - "data": [{"name":"weather.json"}] - }, - { - "id": "chargeanim", - "name": "Charge Animation", - "version": "0.02", - "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.", - "icon": "icon.png", - "tags": "battery", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-charge-animation-screenshot.png"},{"url":"bangle-charge-animation-screenshot.png"}], - "storage": [ - {"name":"chargeanim.app.js","url":"app.js"}, - {"name":"chargeanim.boot.js","url":"boot.js"}, - {"name":"chargeanim.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "bluetoothdock", - "name": "Bluetooth Dock", - "shortName": "Dock", - "version": "0.01", - "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", - "icon": "app.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"bluetoothdock.app.js","url":"app.js"}, - {"name":"bluetoothdock.boot.js","url":"boot.js"}, - {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widbat", - "name": "Battery Level Widget", - "version": "0.09", - "description": "Show the current battery level and charging status in the top right of the clock", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbat.wid.js","url":"widget.js"} - ] - }, - { - "id": "widbatv", - "name": "Battery Level Widget (Vertical)", - "version": "0.01", - "description": "Slim, vertical battery widget that only takes up 14px", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbatv.wid.js","url":"widget.js"} - ] - }, - { - "id": "widlock", - "name": "Lock Widget", - "version": "0.03", - "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", - "icon": "widget.png", - "type": "widget", - "tags": "widget,lock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widlock.wid.js","url":"widget.js"} - ] - }, - { - "id": "widbatpc", - "name": "Battery Level Widget (with percentage)", - "shortName": "Battery Widget", - "version": "0.14", - "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", - "icon": "widget.png", - "type": "widget", - "tags": "widget,battery", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widbatpc.wid.js","url":"widget.js"}, - {"name":"widbatpc.settings.js","url":"settings.js"} - ], - "data": [{"name":"widbatpc.json"}] - }, - { - "id": "widbatwarn", - "name": "Battery Warning", - "shortName": "Battery Warning", - "version": "0.02", - "description": "Show a warning when the battery runs low.", - "icon": "widget.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "widget", - "tags": "tool,battery", - "supports": ["BANGLEJS"], - "dependencies": {"notify":"type"}, - "readme": "README.md", - "storage": [ - {"name":"widbatwarn.wid.js","url":"widget.js"}, - {"name":"widbatwarn.settings.js","url":"settings.js"} - ], - "data": [{"name":"widbatwarn.json"}] - }, - { - "id": "widbt", - "name": "Bluetooth Widget", - "version": "0.07", - "description": "Show the current Bluetooth connection status in the top right of the clock", - "icon": "widget.png", - "type": "widget", - "tags": "widget,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbt.wid.js","url":"widget.js"} - ] - }, - { - "id": "widchime", - "name": "Hour Chime", - "version": "0.02", - "description": "Buzz or beep on every whole hour.", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widchime.wid.js","url":"widget.js"}, - {"name":"widchime.settings.js","url":"settings.js"} - ], - "data": [{"name":"widchime.json"}] - }, - { - "id": "widram", - "name": "RAM Widget", - "shortName": "RAM Widget", - "version": "0.01", - "description": "Display your Bangle's available RAM percentage in a widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widram.wid.js","url":"widget.js"} - ] - }, - { - "id": "hrm", - "name": "Heart Rate Monitor", - "version": "0.06", - "description": "Measure your heart rate and see live sensor data", - "icon": "heartrate.png", - "tags": "health", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"hrm.app.js","url":"heartrate.js"}, - {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} - ] - }, - { - "id": "widhrm", - "name": "Simple Heart Rate widget", - "version": "0.05", - "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", - "icon": "widget.png", - "type": "widget", - "tags": "health,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widhrm.wid.js","url":"widget.js"} - ] - }, - { - "id": "bthrm", - "name": "Bluetooth Heart Rate Monitor", - "shortName": "BT HRM", - "version": "0.01", - "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", - "icon": "app.png", - "type": "boot", - "tags": "health,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"bthrm.boot.js","url":"boot.js"}, - {"name":"bthrm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "stetho", - "name": "Stethoscope", - "version": "0.01", - "description": "Hear your heart rate", - "icon": "stetho.png", - "tags": "health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"stetho.app.js","url":"stetho.js"}, - {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} - ] - }, - { - "id": "swatch", - "name": "Stopwatch", - "version": "0.07", - "description": "Simple stopwatch with Lap Time logging to a JSON file", - "icon": "stopwatch.png", - "tags": "health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-stopwatch-screenshot.png"}], - "storage": [ - {"name":"swatch.app.js","url":"stopwatch.js"}, - {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} - ] - }, - { - "id": "hidmsic", - "name": "Bluetooth Music Controls", - "shortName": "Music Control", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", - "icon": "hid-music.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidmsic.app.js","url":"hid-music.js"}, - {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} - ] - }, - { - "id": "hidkbd", - "name": "Bluetooth Keyboard", - "shortName": "Bluetooth Kbd", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", - "icon": "hid-keyboard.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, - {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} - ] - }, - { - "id": "hidbkbd", - "name": "Binary Bluetooth Keyboard", - "shortName": "Binary BT Kbd", - "version": "0.02", - "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", - "icon": "hid-binary-keyboard.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, - {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} - ] - }, - { - "id": "animals", - "name": "Animals Game", - "version": "0.01", - "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", - "icon": "animals.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"animals.app.js","url":"animals.js"}, - {"name":"animals.img","url":"animals-icon.js","evaluate":true}, - {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, - {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, - {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, - {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, - {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, - {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, - {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, - {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} - ] - }, - { - "id": "qrcode", - "name": "Custom QR Code", - "version": "0.04", - "description": "Use this to upload a customised QR code to Bangle.js", - "icon": "app.png", - "tags": "qrcode", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "customConnect": true, - "storage": [ - {"name":"qrcode.app.js"}, - {"name":"qrcode.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "beer", - "name": "Beer Compass", - "version": "0.01", - "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"beer.app.js"}, - {"name":"beer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "route", - "name": "Route Viewer", - "version": "0.02", - "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [ - {"name":"route.app.js"}, - {"name":"route.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ncstart", - "name": "NCEU Startup", - "version": "0.06", - "description": "NodeConfEU 2019 'First Start' Sequence", - "icon": "start.png", - "tags": "start,welcome", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncstart.app.js","url":"start.js"}, - {"name":"ncstart.boot.js","url":"boot.js"}, - {"name":"ncstart.settings.js","url":"settings.js"}, - {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, - {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, - {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, - {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, - {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, - {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} - ], - "data": [{"name":"ncstart.json"}] - }, - { - "id": "ncfrun", - "name": "NCEU 5K Fun Run", - "version": "0.01", - "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", - "icon": "nceu-funrun.png", - "tags": "health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, - {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} - ] - }, - { - "id": "widnceu", - "name": "NCEU Logo Widget", - "version": "0.02", - "description": "Show the NodeConf EU logo in the top left", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widnceu.wid.js","url":"widget.js"} - ] - }, - { - "id": "sclock", - "name": "Simple Clock", - "version": "0.07", - "description": "A Simple Digital Clock", - "icon": "clock-simple.png", - "screenshots": [{"url":"screenshot_simplec.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"sclock.app.js","url":"clock-simple.js"}, - {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} - ] - }, - { - "id": "s7clk", - "name": "Simple 7 segment Clock", - "version": "0.03", - "description": "A simple 7 segment Clock with date", - "icon": "icon.png", - "screenshots": [{"url":"screenshot_s7segment.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"s7clk.app.js","url":"app.js"}, - {"name":"s7clk.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "vibrclock", - "name": "Vibrate Clock", - "version": "0.03", - "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-vibrate-clock-screenshot.png"}], - "storage": [ - {"name":"vibrclock.app.js","url":"app.js"}, - {"name":"vibrclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "svclock", - "name": "Simple V-Clock", - "version": "0.04", - "description": "Modification of Simple Clock 0.04 to use Vectorfont", - "icon": "vclock-simple.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-simple-v-clock-screenshot.png"}], - "storage": [ - {"name":"svclock.app.js","url":"vclock-simple.js"}, - {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true} - ] - }, - { - "id": "dclock", - "name": "Dev Clock", - "version": "0.10", - "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", - "icon": "clock-dev.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-dev-clock-screenshot.png"},{"url":"bangle1-dev-clock-screenshot.png"}], - "storage": [ - {"name":"dclock.app.js","url":"clock-dev.js"}, - {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} - ] - }, - { - "id": "gesture", - "name": "Gesture Test", - "version": "0.01", - "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", - "icon": "gesture.png", - "type": "app", - "tags": "gesture,ai", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gesture.app.js","url":"gesture.js"}, - {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, - {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, - {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} - ] - }, - { - "id": "pparrot", - "name": "Party Parrot", - "version": "0.01", - "description": "Party with a parrot on your wrist", - "icon": "party-parrot.png", - "type": "app", - "tags": "party,parrot,lol", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-party-parrot-screenshot.png"}], - "storage": [ - {"name":"pparrot.app.js","url":"party-parrot.js"}, - {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} - ] - }, - { - "id": "hrings", - "name": "Hypno Rings", - "version": "0.01", - "description": "Experiment with trippy rings, press buttons for change", - "icon": "hypno-rings.png", - "type": "app", - "tags": "rings,hypnosis,psychadelic", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-hypno-rings-screenshot.png"}], - "storage": [ - {"name":"hrings.app.js","url":"hypno-rings.js"}, - {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} - ] - }, - { - "id": "morse", - "name": "Morse Code", - "version": "0.01", - "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", - "icon": "morse-code.png", - "type": "app", - "tags": "morse,sound,visual,input", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"morse.app.js","url":"morse-code.js"}, - {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} - ] - }, - { - "id": "blescan", - "name": "BLE Scanner", - "version": "0.01", - "description": "Scan for advertising BLE devices", - "icon": "blescan.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"blescan.app.js","url":"blescan.js"}, - {"name":"blescan.img","url":"blescan-icon.js","evaluate":true} - ] - }, - { - "id": "mmonday", - "name": "Manic Monday Tone", - "version": "0.02", - "description": "The Bangles make a comeback", - "icon": "manic-monday-icon.png", - "tags": "sound", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"mmonday.app.js","url":"manic-monday.js"}, - {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} - ] - }, - { - "id": "jbells", - "name": "Jingle Bells", - "version": "0.01", - "description": "Play Jingle Bells", - "icon": "jbells.png", - "type": "app", - "tags": "sound", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"jbells.app.js","url":"jbells.js"}, - {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} - ] - }, - { - "id": "scolor", - "name": "Show Color", - "version": "0.01", - "description": "Display all available Colors and Names", - "icon": "show-color.png", - "type": "app", - "tags": "tool", - "screenshots": [{"url":"bangle1-view-color-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"scolor.app.js","url":"show-color.js"}, - {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} - ] - }, - { - "id": "miclock", - "name": "Mixed Clock", - "version": "0.05", - "description": "A mix of analog and digital Clock", - "icon": "clock-mixed.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-mixed-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"miclock.app.js","url":"clock-mixed.js"}, - {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { - "id": "bclock", - "name": "Binary Clock", - "version": "0.03", - "description": "A simple binary clock watch face", - "icon": "clock-binary.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-binary-clock-screenshot.png"}], - "storage": [ - {"name":"bclock.app.js","url":"clock-binary.js"}, - {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} - ] - }, - { - "id": "clotris", - "name": "Clock-Tris", - "version": "0.01", - "description": "A fully functional clone of a classic game of falling blocks", - "icon": "clock-tris.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-clock-tris-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"clotris.app.js","url":"clock-tris.js"}, - {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, - {"name":".trishig","url":"clock-tris-high"} - ] - }, - { - "id": "flappy", - "name": "Flappy Bird", - "version": "0.05", - "description": "A Flappy Bird game clone", - "icon": "app.png", - "screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}], - "tags": "game", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"flappy.app.js","url":"app.js"}, - {"name":"flappy.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gpsinfo", - "name": "GPS Info", - "version": "0.05", - "description": "An application that displays information about altitude, lat/lon, satellites and time", - "icon": "gps-info.png", - "type": "app", - "tags": "gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"gpsinfo.app.js","url":"gps-info.js"}, - {"name":"gpsinfo.img","url":"gps-info-icon.js","evaluate":true} - ] - }, - { - "id": "assistedgps", - "name": "Assisted GPS Update (AGPS)", - "version": "0.01", - "description": "Downloads assisted GPS (AGPS) data to Bangle.js 1 for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.", - "icon": "app.png", - "type": "RAM", - "tags": "tool,outdoors,agps", - "supports": ["BANGLEJS"], - "custom": "custom.html", - "storage": [] - }, - { - "id": "pomodo", - "name": "Pomodoro", - "version": "0.02", - "description": "A simple pomodoro timer.", - "icon": "pomodoro.png", - "type": "app", - "tags": "pomodoro,cooking,tools", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-pomodoro-screenshot.png"}], - "storage": [ - {"name":"pomodo.app.js","url":"pomodoro.js"}, - {"name":"pomodo.img","url":"pomodoro-icon.js","evaluate":true} - ] - }, - { - "id": "blobclk", - "name": "Large Digit Blob Clock", - "shortName": "Blob Clock", - "version": "0.06", - "description": "A clock with big digits", - "icon": "clock-blob.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-large-digit-blob-clock-screenshot.png"},{"url":"bangle1-large-digit-blob-clock-screenshot.png"}], - "storage": [ - {"name":"blobclk.app.js","url":"clock-blob.js"}, - {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} - ] - }, - { - "id": "boldclk", - "name": "Bold Clock", - "version": "0.05", - "description": "Simple, readable and practical clock", - "icon": "bold_clock.png", - "screenshots": [{"url":"screenshot_bold.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"boldclk.app.js","url":"bold_clock.js"}, - {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} - ] - }, - { - "id": "widclk", - "name": "Digital clock widget", - "version": "0.06", - "description": "A simple digital clock widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget,clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widclk.wid.js","url":"widget.js"} - ] - }, - { - "id": "widpedom", - "name": "Pedometer widget", - "version": "0.19", - "description": "Daily pedometer widget", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widpedom.wid.js","url":"widget.js"}, - {"name":"widpedom.settings.js","url":"settings.js"} - ] - }, - { - "id": "berlinc", - "name": "Berlin Clock", - "version": "0.05", - "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", - "icon": "berlin-clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"berlin-clock-screenshot.png"}], - "storage": [ - {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} - ] - }, - { - "id": "ctrclk", - "name": "Centerclock", - "version": "0.03", - "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-center-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"ctrclk.app.js","url":"app.js"}, - {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "demoapp", - "name": "Demo Loop", - "version": "0.02", - "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", - "icon": "app.png", - "type": "app", - "tags": "", - "screenshots": [{"url":"bangle1-demo-loop-screenshot1.png"},{"url":"bangle1-demo-loop-screenshot2.png"},{"url":"bangle1-demo-loop-screenshot3.png"},{"url":"bangle1-demo-loop-screenshot4.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"demoapp.app.js","url":"app.js"}, - {"name":"demoapp.img","url":"app-icon.js","evaluate":true} - ], - "sortorder": -9 - }, - { - "id": "flagrse", - "name": "Espruino Flag Raiser", - "version": "0.01", - "description": "App to send a command to another Espruino to cause it to raise a flag", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"flagrse.app.js","url":"app.js"}, - {"name":"flagrse.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pipboy", - "name": "Pipboy", - "version": "0.04", - "description": "Pipboy themed clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}], - "storage": [ - {"name":"pipboy.app.js","url":"app.js"}, - {"name":"pipboy.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "torch", - "name": "Torch", - "shortName": "Torch", - "version": "0.02", - "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", - "icon": "app.png", - "tags": "tool,torch", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"torch.app.js","url":"app.js"}, - {"name":"torch.wid.js","url":"widget.js"}, - {"name":"torch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rtorch", - "name": "Red Torch", - "shortName": "RedTorch", - "version": "0.02", - "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", - "icon": "app.png", - "tags": "tool,torch", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"rtorch.app.js","url":"app.js"}, - {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]}, - {"name":"rtorch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "wohrm", - "name": "Workout HRM", - "version": "0.08", - "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", - "icon": "app.png", - "type": "app", - "tags": "hrm,workout", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], - "storage": [ - {"name":"wohrm.app.js","url":"app.js"}, - {"name":"wohrm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widid", - "name": "Bluetooth ID Widget", - "version": "0.03", - "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", - "icon": "widget.png", - "type": "widget", - "tags": "widget,address,mac", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widid.wid.js","url":"widget.js"} - ] - }, - { - "id": "grocery", - "name": "Grocery", - "version": "0.02", - "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", - "icon": "grocery.png", - "type": "app", - "tags": "tool,outdoors,shopping,list", - "supports": ["BANGLEJS"], - "custom": "grocery.html", - "storage": [ - {"name":"grocery.app.js","url":"app.js"}, - {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} - ] - }, - { - "id": "marioclock", - "name": "Mario Clock", - "version": "0.15", - "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", - "icon": "marioclock.png", - "type": "clock", - "tags": "clock,mario,retro", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "screenshots": [{"url":"bangle1-mario-clock-screenshot.png"}], - "storage": [ - {"name":"marioclock.app.js","url":"marioclock-app.js"}, - {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} - ] - }, - { - "id": "cliock", - "name": "Commandline-Clock", - "shortName": "CLI-Clock", - "version": "0.15", - "description": "Simple CLI-Styled Clock", - "icon": "app.png", - "screenshots": [{"url":"screenshot_cli.png"}], - "type": "clock", - "tags": "clock,cli,command,bash,shell", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"cliock.app.js","url":"app.js"}, - {"name":"cliock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widver", - "name": "Firmware Version Widget", - "version": "0.03", - "description": "Display the version of the installed firmware in the top widget section.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widver.wid.js","url":"widget.js"} - ] - }, - { - "id": "barclock", - "name": "Bar Clock", - "version": "0.09", - "description": "A simple digital clock showing seconds as a bar", - "icon": "clock-bar.png", - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"barclock.app.js","url":"clock-bar.js"}, - {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} - ] - }, - { - "id": "dotclock", - "name": "Dot Clock", - "version": "0.03", - "description": "A Minimal Dot Analog Clock", - "icon": "clock-dot.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle2-dot-clcok-screenshot.png"},{"url":"bangle1-dot-clock-screenshot.png"}], - "storage": [ - {"name":"dotclock.app.js","url":"clock-dot.js"}, - {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} - ] - }, - { - "id": "widtbat", - "name": "Tiny Battery Widget", - "version": "0.02", - "description": "Tiny blueish battery widget, vibs and changes level color when charging", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widtbat.wid.js","url":"widget.js"} - ] - }, - { - "id": "chrono", - "name": "Chrono", - "shortName": "Chrono", - "version": "0.01", - "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", - "icon": "chrono.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"chrono.app.js","url":"chrono.js"}, - {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} - ] - }, - { - "id": "astrocalc", - "name": "Astrocalc", - "version": "0.02", - "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", - "icon": "astrocalc.png", - "tags": "app,sun,moon,cycles,tool,outdoors", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, - {"name":"suncalc.js","url":"suncalc.js"}, - {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, - {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, - {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, - {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, - {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, - {"name":"full.img","url":"full-icon.js","evaluate":true}, - {"name":"new.img","url":"new-icon.js","evaluate":true}, - {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, - {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} - ] - }, - { - "id": "widhwt", - "name": "Hand Wash Timer", - "version": "0.01", - "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widhwt.wid.js","url":"widget.js"} - ] - }, - { - "id": "toucher", - "name": "Touch Launcher", - "shortName": "Toucher", - "version": "0.07", - "description": "Touch enable left to right launcher.", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"toucher.app.js","url":"app.js"}, - {"name":"toucher.settings.js","url":"settings.js"} - ], - "data": [{"name":"toucher.json"}] - }, - { - "id": "balltastic", - "name": "Balltastic", - "version": "0.02", - "description": "Simple but fun ball eats dots game.", - "icon": "app.png", - "type": "app", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"balltastic.app.js","url":"app.js"}, - {"name":"balltastic.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rpgdice", - "name": "RPG dice", - "version": "0.02", - "description": "Simple RPG dice rolling app.", - "icon": "rpgdice.png", - "type": "app", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-rpg-dice-screenshot.png"}], - "storage": [ - {"name":"rpgdice.app.js","url":"app.js"}, - {"name":"rpgdice.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widmp", - "name": "Moon Phase Widget", - "version": "0.02", - "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widmp.wid.js","url":"widget.js"} - ] - }, - { - "id": "widmpsh", - "name": "Moon Phase Widget Southern Hemisphere", - "version": "0.01", - "description": "Display the current moon phase in blueish for the southern hemisphere in eight phases", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widmpsh.wid.js","url":"widget.js"} - ] - }, - { - "id": "minionclk", - "name": "Minion clock", - "version": "0.05", - "description": "Minion themed clock.", - "icon": "minionclk.png", - "type": "clock", - "tags": "clock,minion", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-minion-clock-screenshot.png"}], - "storage": [ - {"name":"minionclk.app.js","url":"app.js"}, - {"name":"minionclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "openstmap", - "name": "OpenStreetMap", - "shortName": "OpenStMap", - "version": "0.11", - "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", - "icon": "app.png", - "tags": "outdoors,gps,osm", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "custom": "custom.html", - "customConnect": true, - "storage": [ - {"name":"openstmap","url":"openstmap.js"}, - {"name":"openstmap.app.js","url":"app.js"}, - {"name":"openstmap.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "activepedom", - "name": "Active Pedometer", - "shortName": "Active Pedometer", - "version": "0.09", - "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", - "icon": "app.png", - "tags": "outdoors,widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"activepedom.wid.js","url":"widget.js"}, - {"name":"activepedom.settings.js","url":"settings.js"}, - {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, - {"name":"activepedom.app.js","url":"app.js"} - ] - }, - { - "id": "chronowid", - "name": "Chrono Widget", - "shortName": "Chrono Widget", - "version": "0.04", - "description": "Chronometer (timer) which runs as widget.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "storage": [ - {"name":"chronowid.wid.js","url":"widget.js"}, - {"name":"chronowid.app.js","url":"app.js"}, - {"name":"chronowid.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "tabata", - "name": "Tabata", - "shortName": "Tabata - Control High-Intensity Interval Training", - "version": "0.01", - "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", - "icon": "tabata.png", - "tags": "workout,health", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"tabata.app.js","url":"tabata.js"}, - {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} - ] - }, - { - "id": "custom", - "name": "Custom Boot Code ", - "version": "0.01", - "description": "Add code you want to run at boot time", - "icon": "custom.png", - "type": "bootloader", - "tags": "tool,system", - "supports": ["BANGLEJS","BANGLEJS2"], - "custom": "custom.html", - "storage": [ - {"name":"custom"} - ] - }, - { - "id": "devstopwatch", - "name": "Dev Stopwatch", - "shortName": "Dev Stopwatch", - "version": "0.03", - "description": "Stopwatch with 5 laps supported (cyclically replaced)", - "icon": "app.png", - "tags": "stopwatch,chrono,timer,chronometer", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"bangle1-dev-stopwatch-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"devstopwatch.app.js","url":"app.js"}, - {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "batchart", - "name": "Battery Chart", - "shortName": "Battery Chart", - "version": "0.10", - "description": "A widget and an app for recording and visualizing battery percentage over time.", - "icon": "app.png", - "tags": "app,widget,battery,time,record,chart,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"batchart.wid.js","url":"widget.js"}, - {"name":"batchart.app.js","url":"app.js"}, - {"name":"batchart.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "nato", - "name": "NATO Alphabet", - "shortName": "NATOAlphabet", - "version": "0.01", - "description": "Learn the NATO Phonetic alphabet plus some numbers.", - "icon": "nato.png", - "type": "app", - "tags": "app,learn,visual", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-NATO-alphabet-screenshot.png"},{"url":"bangle1-NATO-alphabet-screenshot2.png"}], - "storage": [ - {"name":"nato.app.js","url":"nato.js"}, - {"name":"nato.img","url":"nato-icon.js","evaluate":true} - ] - }, - { - "id": "numerals", - "name": "Numerals Clock", - "shortName": "Numerals Clock", - "version": "0.10", - "description": "A simple big numerals clock", - "icon": "numerals.png", - "type": "clock", - "tags": "numerals,clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-numerals-screenshot.png"}], - "storage": [ - {"name":"numerals.app.js","url":"numerals.app.js"}, - {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, - {"name":"numerals.settings.js","url":"numerals.settings.js"} - ], - "data": [{"name":"numerals.json"}] - }, - { - "id": "bledetect", - "name": "BLE Detector", - "shortName": "BLE Detector", - "version": "0.03", - "description": "Detect BLE devices and show some informations.", - "icon": "bledetect.png", - "tags": "app,bluetooth,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"bledetect.app.js","url":"bledetect.js"}, - {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} - ] - }, - { - "id": "snake", - "name": "Snake", - "shortName": "Snake", - "version": "0.02", - "description": "The classic snake game. Eat apples and don't bite your tail.", - "icon": "snake.png", - "tags": "game,fun", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"snake.app.js","url":"snake.js"}, - {"name":"snake.img","url":"snake-icon.js","evaluate":true} - ] - }, - { "id": "snek", - "name": "The snek game", - "shortName":"Snek", - "version": "0.02", - "description": "A snek game where you control a snek to eat all the apples!", - "screenshots": [{"url":"screenshot_snek.png"}], - "icon": "snek.png", - "supports": ["BANGLEJS2"], - "tags": "game,fun", - "storage": [ - {"name":"snek.app.js","url":"snek.js"}, - {"name":"snek.img","url":"snek.icon.js","evaluate":true} - ] - }, - { - "id": "calculator", - "name": "Calculator", - "shortName": "Calculator", - "version": "0.04", - "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", - "icon": "calculator.png", - "screenshots": [{"url":"screenshot_calculator.png"}], - "tags": "app,tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"calculator.app.js","url":"app.js"}, - {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} - ] - }, - { - "id": "dane", - "name": "Digital Assistant, not EDITH", - "shortName": "DANE", - "version": "0.16", - "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"dane.app.js","url":"app.js"}, - {"name":"dane.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "dane_tcr", - "name": "DANE Touch Launcher", - "shortName": "DANE Toucher", - "version": "0.07", - "description": "Touch enable left to right launcher in the style of the DANE Watchface", - "icon": "app.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"dane_tcr.app.js","url":"app.js"}, - {"name":"dane_tcr.settings.js","url":"settings.js"} - ], - "data": [{"name":"dane_tcr.json"}] - }, - { - "id": "buffgym", - "name": "BuffGym", - "version": "0.02", - "description": "BuffGym is the famous 5x5 workout program for the BangleJS", - "icon": "buffgym.png", - "type": "app", - "tags": "tool,outdoors,gym,exercise", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "buffgym.html", - "allow_emulator": false, - "storage": [ - {"name":"buffgym.app.js","url":"buffgym.app.js"}, - {"name":"buffgym-set.js","url":"buffgym-set.js"}, - {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, - {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, - {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, - {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, - {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, - {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} - ] - }, - { - "id": "banglerun", - "name": "BangleRun", - "shortName": "BangleRun", - "version": "0.10", - "description": "An app for running sessions. Displays info and logs your run for later viewing.", - "icon": "banglerun.png", - "tags": "run,running,fitness,outdoors", - "supports": ["BANGLEJS"], - "interface": "interface.html", - "allow_emulator": false, - "storage": [ - {"name":"banglerun.app.js","url":"app.js"}, - {"name":"banglerun.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "metronome", - "name": "Metronome", - "version": "0.07", - "readme": "README.md", - "description": "Makes the watch blinking and vibrating with a given rate", - "icon": "metronome_icon.png", - "tags": "tool", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-metronome-screenshot.png"}], - "storage": [ - {"name":"metronome.app.js","url":"metronome.js"}, - {"name":"metronome.img","url":"metronome-icon.js","evaluate":true}, - {"name":"metronome.settings.js","url":"settings.js"} - ] - }, - { - "id": "blackjack", - "name": "Black Jack game", - "shortName": "Black Jack game", - "version": "0.02", - "description": "Simple implementation of card game Black Jack", - "icon": "blackjack.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"blackjack.app.js","url":"blackjack.app.js"}, - {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} - ] - }, - { - "id": "hidcam", - "name": "Camera shutter", - "shortName": "Cam shutter", - "version": "0.03", - "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", - "icon": "app.png", - "tags": "bluetooth,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hidcam.app.js","url":"app.js"}, - {"name":"hidcam.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "swlclk", - "name": "SWL Clock / Short Wave Listner Clock", - "shortName": "SWL Clock", - "version": "0.02", - "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies", - "icon": "swlclk.png", - "type": "clock", - "tags": "tool,clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-SWL-clock-screenshot.png"}], - "storage": [ - {"name":"swlclk.app.js","url":"app.js"}, - {"name":"swlclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rclock", - "name": "Round clock with seconds, minutes and date", - "shortName": "Round Clock", - "version": "0.06", - "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"rclock.app.js","url":"rclock.app.js"}, - {"name":"rclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "fclock", - "name": "fclock", - "shortName": "F Clock", - "version": "0.02", - "description": "Simple design of a digital clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"fclock.app.js","url":"fclock.app.js"}, - {"name":"fclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hamloc", - "name": "QTH Locator / Maidenhead Locator System", - "shortName": "QTH Locator", - "version": "0.01", - "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hamloc.app.js","url":"app.js"}, - {"name":"hamloc.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "osmpoi", - "name": "POI Compass", - "version": "0.03", - "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", - "icon": "app.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"osmpoi.app.js"}, - {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pong", - "name": "Pong", - "shortName": "Pong", - "version": "0.03", - "description": "A clone of the Atari game Pong", - "icon": "pong.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-pong-screenshot.png"}], - "storage": [ - {"name":"pong.app.js","url":"app.js"}, - {"name":"pong.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ballmaze", - "name": "Ball Maze", - "version": "0.02", - "description": "Navigate a ball through a maze by tilting your watch.", - "icon": "icon.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"ballmaze.app.js","url":"app.js"}, - {"name":"ballmaze.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"ballmaze.json"}] - }, - { - "id": "calendar", - "name": "Calendar", - "version": "0.03", - "description": "Simple calendar", - "icon": "calendar.png", - "screenshots": [{"url":"screenshot_calendar.png"}], - "tags": "calendar", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"calendar.app.js","url":"calendar.js"}, - {"name":"calendar.settings.js","url":"settings.js"}, - {"name":"calendar.img","url":"calendar-icon.js","evaluate":true} - ], - "data": [{"name":"calendar.json"}] - }, - { - "id": "hidjoystick", - "name": "Bluetooth Joystick", - "shortName": "Joystick", - "version": "0.01", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", - "icon": "app.png", - "tags": "bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hidjoystick.app.js","url":"app.js"}, - {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "largeclock", - "name": "Large Clock", - "version": "0.10", - "description": "A readable and informational digital watch, with date, seconds and moon phase", - "icon": "largeclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-large-clock-screenshot.png"}], - "storage": [ - {"name":"largeclock.app.js","url":"largeclock.js"}, - {"name":"largeclock.img","url":"largeclock-icon.js","evaluate":true}, - {"name":"largeclock.settings.js","url":"settings.js"} - ], - "data": [{"name":"largeclock.json"}] - }, - { - "id": "smtswch", - "name": "Smart Switch", - "shortName": "Smart Switch", - "version": "0.01", - "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", - "icon": "app.png", - "type": "app", - "tags": "bluetooth,btle,smart,switch", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"smtswch.app.js","url":"app.js"}, - {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, - {"name":"light-on.img","url":"light-on.js","evaluate":true}, - {"name":"light-off.img","url":"light-off.js","evaluate":true}, - {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, - {"name":"switch-off.img","url":"switch-off.js","evaluate":true} - ] - }, - { - "id": "miplant", - "name": "Xiaomi Plant Sensor", - "shortName": "Mi Plant", - "version": "0.02", - "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors", - "icon": "app.png", - "tags": "xiaomi,mi,plant,ble,bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"miplant.app.js","url":"app.js"}, - {"name":"miplant.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "simpletimer", - "name": "Timer", - "version": "0.07", - "description": "Simple timer, useful when playing board games or cooking", - "icon": "app.png", - "tags": "timer", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-timer-screenshot.png"}], - "storage": [ - {"name":"simpletimer.app.js","url":"app.js"}, - {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, - {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, - {"name":"simpletimer.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"simpletimer.json"}] - }, - { - "id": "beebclock", - "name": "Beeb Clock", - "version": "0.05", - "description": "Clock face that may be coincidentally familiar to BBC viewers", - "icon": "beebclock.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-beeb-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"beebclock.app.js","url":"beebclock.js"}, - {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} - ] - }, - { - "id": "findphone", - "name": "Find Phone", - "shortName": "Find Phone", - "version": "0.03", - "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.", - "icon": "app.png", - "tags": "tool,android", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"findphone.app.js","url":"app.js"}, - {"name":"findphone.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "getup", - "name": "Get Up", - "shortName": "Get Up", - "version": "0.01", - "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!", - "icon": "app.png", - "tags": "tools,health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "screenshots": [{"url":"bangle1-get-up-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"getup.app.js","url":"app.js"}, - {"name":"getup.settings.js","url":"settings.js"}, - {"name":"getup.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gallifr", - "name": "Time Traveller's Chronometer", - "shortName": "Time Travel Clock", - "version": "0.02", - "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", - "icon": "gallifr.png", - "screenshots": [{"url":"screenshot_time.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"gallifr.app.js","url":"app.js"}, - {"name":"gallifr.img","url":"app-icon.js","evaluate":true}, - {"name":"gallifr.settings.js","url":"settings.js"} - ], - "data": [{"name":"gallifr.json"}] - }, - { - "id": "rndmclk", - "name": "Random Clock Loader", - "version": "0.03", - "description": "Load a different clock whenever the LCD is switched on.", - "icon": "rndmclk.png", - "type": "widget", - "tags": "widget,clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"rndmclk.wid.js","url":"widget.js"} - ] - }, - { - "id": "dotmatrixclock", - "name": "Dotmatrix Clock", - "version": "0.01", - "description": "A clear white-on-blue dotmatrix simulated clock", - "icon": "dotmatrixclock.png", - "type": "clock", - "tags": "clock,dotmatrix,retro", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"dotmatrixclock.app.js","url":"app.js"}, - {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true} - ] - }, - { - "id": "jbm8b", - "name": "Magic 8 Ball", - "shortName": "Magic 8 Ball", - "version": "0.03", - "description": "A simple fortune telling app", - "icon": "app.png", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"jbm8b.app.js","url":"app.js"}, - {"name":"jbm8b.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "jbm8b_IT", - "name": "Magic 8 Ball Italiano", - "shortName": "Magic 8 Ball IT", - "version": "0.01", - "description": "La palla predice il futuro", - "icon": "app.png", - "screenshots": [{"url":"bangle1-magic-8-ball-italiano-screenshot.png"}], - "tags": "game", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"jbm8b_IT.app.js","url":"app.js"}, - {"name":"jbm8b_IT.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "BLEcontroller", - "name": "BLE Customisable Controller with Joystick", - "shortName": "BLE Controller", - "version": "0.01", - "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.", - "icon": "BLEcontroller.png", - "tags": "tool,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "storage": [ - {"name":"BLEcontroller.app.js","url":"app.js"}, - {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widviz", - "name": "Widget Visibility Widget", - "shortName": "Viz Widget", - "version": "0.03", - "description": "Swipe left to hide top bar widgets, swipe right to redisplay.", - "icon": "eye.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widviz.wid.js","url":"widget.js"} - ] - }, - { - "id": "binclock", - "name": "Binary Clock", - "shortName": "Binary Clock", - "version": "0.03", - "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.", - "icon": "app.png", - "type": "clock", - "tags": "clock,binary", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"binclock.app.js","url":"app.js"}, - {"name":"binclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pizzatimer", - "name": "Pizza Timer", - "shortName": "Pizza Timer", - "version": "0.01", - "description": "A timer app for when you cook Pizza. Some say it can also time other things", - "icon": "pizza.png", - "tags": "timer,tool,pizza", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"pizzatimer.app.js","url":"app.js"}, - {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "animclk", - "name": "Animated Clock", - "shortName": "Anim Clock", - "version": "0.03", - "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", - "icon": "app.png", - "type": "clock", - "tags": "clock,animated", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"animclk.app.js","url":"app.js"}, - {"name":"animclk.pixels1","url":"animclk.pixels1"}, - {"name":"animclk.pixels2","url":"animclk.pixels2"}, - {"name":"animclk.pal","url":"animclk.pal"}, - {"name":"animclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "analogimgclk", - "name": "Analog Clock (Image background)", - "shortName": "Analog Clock", - "version": "0.03", - "description": "An analog clock with an image background", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"analogimgclk.app.js","url":"app.js"}, - {"name":"analogimgclk.bg.img","url":"bg.img"}, - {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "verticalface", - "name": "Vertical watch face", - "shortName": "Vertical Face", - "version": "0.09", - "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "allow_emulator": true, - "screenshots": [{"url":"bangle1-vertical-watch-face-screenshot.png"}], - "storage": [ - {"name":"verticalface.app.js","url":"app.js"}, - {"name":"verticalface.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "sleepphasealarm", - "name": "SleepPhaseAlarm", - "shortName": "SleepPhaseAlarm", - "version": "0.02", - "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", - "icon": "app.png", - "tags": "alarm", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"sleepphasealarm.app.js","url":"app.js"}, - {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "life", - "name": "Game of Life", - "version": "0.04", - "description": "Conway's Game of Life - 16x16 board", - "icon": "life.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-game-of-life-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"life.app.js","url":"life.min.js"}, - {"name":"life.img","url":"life-icon.js","evaluate":true} - ] - }, - { - "id": "magnav", - "name": "Navigation Compass", - "version": "0.05", - "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", - "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}], - "icon": "magnav.png", - "tags": "tool,outdoors", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]}, - {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]}, - {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} - ], - "data": [{"name":"magnav.json"}] - }, - { - "id": "gpspoilog", - "name": "GPS POI Logger", - "shortName": "GPS POI Log", - "version": "0.01", - "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial", - "icon": "app.png", - "tags": "outdoors", - "supports": ["BANGLEJS"], - "interface": "interface.html", - "storage": [ - {"name":"gpspoilog.app.js","url":"app.js"}, - {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "miclock2", - "name": "Mixed Clock 2", - "version": "0.01", - "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", - "icon": "clock-mixed.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-mixed-clock-2-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"miclock2.app.js","url":"clock-mixed.js"}, - {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { - "id": "1button", - "name": "One-Button-Tracker", - "version": "0.01", - "description": "A widget that turns BTN1 into a tracker, records time of button press/release.", - "icon": "widget.png", - "type": "widget", - "tags": "tool,quantifiedself,widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"1button.wid.js","url":"widget.js"} - ], - "data": [{"name":"one_button_presses.csv","storageFile":true}] - }, - { - "id": "gpsautotime", - "name": "GPS auto time", - "shortName": "GPS auto time", - "version": "0.01", - "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", - "icon": "widget.png", - "type": "widget", - "tags": "widget,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gpsautotime.wid.js","url":"widget.js"} - ] - }, - { - "id": "espruinoctrl", - "name": "Espruino Control", - "shortName": "Espruino Ctrl", - "version": "0.01", - "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"espruinoctrl.app.js"}, - {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "multiclock", - "name": "Multi Clock", - "version": "0.09", - "description": "Clock with multiple faces. Switch between faces with BTN1 & BTN3 (Bangle 2 touch top-right, bottom right). For best display set theme Background 2 to cyan or some other bright colour in settings.", - "screenshots": [{"url":"screen-ana.png"},{"url":"screen-big.png"},{"url":"screen-td.png"},{"url":"screen-nifty.png"},{"url":"screen-word.png"},{"url":"screen-sec.png"}], - "icon": "multiclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"multiclock.app.js","url":"multiclock.app.js"}, - {"name":"big.face.js","url":"big.face.js"}, - {"name":"ana.face.js","url":"ana.face.js"}, - {"name":"digi.face.js","url":"digi.face.js"}, - {"name":"txt.face.js","url":"txt.face.js"}, - {"name":"dk.face.js","url":"dk.face.js"}, - {"name":"nifty.face.js","url":"nifty.face.js"}, - {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} - ] - }, - { - "id": "widancs", - "name": "Apple Notification Widget", - "shortName": "ANCS Widget", - "version": "0.07", - "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"widancs.wid.js","url":"ancs.min.js"}, - {"name":"widancs.settings.js","url":"settings.js"} - ] - }, - { - "id": "accelrec", - "name": "Acceleration Recorder", - "shortName": "Accel Rec", - "version": "0.02", - "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"accelrec.app.js","url":"app.js"}, - {"name":"accelrec.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"wildcard":"accelrec.?.csv"}] - }, - { - "id": "accellog", - "name": "Acceleration Logger", - "shortName": "Accel Log", - "version": "0.03", - "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", - "icon": "app.png", - "tags": "outdoor", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"accellog.app.js","url":"app.js"}, - {"name":"accellog.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"wildcard":"accellog.?.csv"}] - }, - { - "id": "cprassist", - "name": "CPR Assist", - "version": "0.01", - "description": "Provides assistance while performing a CPR", - "icon": "cprassist-icon.png", - "tags": "tool,firstaid", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], - "storage": [ - {"name":"cprassist.app.js","url":"cprassist.js"}, - {"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true}, - {"name":"cprassist.settings.js","url":"settings.js"} - ] - }, - { - "id": "osgridref", - "name": "Ordnance Survey Grid Reference", - "shortName": "OS Grid ref", - "version": "0.01", - "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", - "icon": "app.png", - "tags": "outdoors,gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"osgridref.app.js","url":"app.js"}, - {"name":"osgridref.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "openseizure", - "name": "OpenSeizureDetector Widget", - "shortName": "Short Name", - "version": "0.01", - "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"openseizure.wid.js","url":"widget.js"} - ] - }, - { - "id": "counter", - "name": "Counter", - "version": "0.03", - "description": "Simple counter", - "icon": "counter_icon.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-counter-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"counter.app.js","url":"counter.js"}, - {"name":"counter.img","url":"counter-icon.js","evaluate":true} - ] - }, - { - "id": "bootgattbat", - "name": "BLE GATT Battery Service", - "shortName": "BLE Battery Service", - "version": "0.01", - "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n", - "icon": "bluetooth.png", - "type": "bootloader", - "tags": "battery,ble,bluetooth,gatt", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"gattbat.boot.js","url":"boot.js"} - ] - }, - { - "id": "viewstl", - "name": "STL file viewer", - "shortName": "ViewSTL", - "version": "0.02", - "description": "This app allows you to view STL 3D models on your watch", - "icon": "icons8-octahedron-48.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"viewstl.app.js","url":"viewstl.min.js"}, - {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, - {"name":"tetra.stl","url":"tetra.stl"}, - {"name":"cube.stl","url":"cube.stl"}, - {"name":"icosa.stl","url":"icosa.stl"} - ] - }, - { - "id": "cscsensor", - "name": "Cycling speed sensor", - "shortName": "CSCSensor", - "version": "0.06", - "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch", - "icon": "icons8-cycling-48.png", - "tags": "outdoors,exercise,ble,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"cscsensor.app.js","url":"cscsensor.app.js"}, - {"name":"cscsensor.settings.js","url":"settings.js"}, - {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true} - ] - }, - { - "id": "fileman", - "name": "File manager", - "shortName": "FileManager", - "version": "0.03", - "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", - "icon": "icons8-filing-cabinet-48.png", - "tags": "tools", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"fileman.app.js","url":"fileman.app.js"}, - {"name":"fileman.img","url":"fileman-icon.js","evaluate":true} - ] - }, - { - "id": "worldclock", - "name": "World Clock - 4 time zones", - "shortName": "World Clock", - "version": "0.05", - "description": "Current time zone plus up to four others", - "icon": "app.png", - "screenshots": [{"url":"screenshot_world.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"worldclock.app.js","url":"app.js"}, - {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true} - ], - "data": [{"name":"worldclock.settings.json"}] - }, - { - "id": "digiclock", - "name": "Digital Clock Face", - "shortName": "Digi Clock", - "version": "0.02", - "description": "A simple digital clock with the time, day, month, and year", - "icon": "digiclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"digiclock.app.js","url":"digiclock.js"}, - {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true} - ] - }, - { - "id": "dsdrelay", - "name": "DSD BLE Relay controller", - "shortName": "DSDRelay", - "version": "0.01", - "description": "Control BLE relay board from the watch", - "icon": "icons8-relay-48.png", - "tags": "ble,bluetooth", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"}, - {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true} - ] - }, - { - "id": "mandel", - "name": "Mandelbrot", - "shortName": "Mandel", - "version": "0.01", - "description": "Draw a zoomable Mandelbrot set", - "icon": "mandel.png", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mandel.app.js","url":"mandel.min.js"}, - {"name":"mandel.img","url":"mandel-icon.js","evaluate":true} - ] - }, - { - "id": "petrock", - "name": "Pet rock", - "version": "0.02", - "description": "A virtual pet rock with wobbly eyes", - "icon": "petrock.png", - "type": "app", - "tags": "game", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"petrock.app.js","url":"app.js"}, - {"name":"petrock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "smartibot", - "name": "Smartibot controller", - "shortName": "Smartibot", - "version": "0.01", - "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"smartibot.app.js","url":"app.js"}, - {"name":"smartibot.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widncr", - "name": "NCR Logo Widget", - "version": "0.01", - "description": "Show the NodeConf Remote logo in the top left", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"widncr.wid.js","url":"widget.js"} - ] - }, - { - "id": "ncrclk", - "name": "NCR Clock", - "shortName": "NCR Clock", - "version": "0.02", - "description": "NodeConf Remote clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"ncrclk.app.js","url":"app.js"}, - {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "isoclock", - "name": "ISO Compliant Clock Face", - "shortName": "ISO Clock", - "version": "0.02", - "description": "Tweaked fork of digiclock for ISO date and time", - "icon": "isoclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"isoclock.app.js","url":"isoclock.js"}, - {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true} - ] - }, - { - "id": "gpstimeserver", - "name": "GPS Time Server", - "version": "0.01", - "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"gpstimeserver.wid.js","url":"widget.js"} - ] - }, - { - "id": "tilthydro", - "name": "Tilt Hydrometer Display", - "shortName": "Tilt Hydro", - "version": "0.01", - "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", - "icon": "app.png", - "tags": "tools,bluetooth", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"tilthydro.app.js","url":"app.js"}, - {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "supmariodark", - "name": "Super mario clock night mode", - "shortName": "supmariodark", - "version": "0.01", - "description": "Super mario clock in night mode", - "icon": "supmariodark.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"supmariodark.app.js","url":"supmariodark.js"}, - {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, - {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"}, - {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"}, - {"name":"banner-up.img","url":"banner-up.js","evaluate":true}, - {"name":"banner-down.img","url":"banner-down.js","evaluate":true}, - {"name":"brick2.img","url":"brick2.js","evaluate":true}, - {"name":"enemy.img","url":"enemy.js","evaluate":true}, - {"name":"flower.img","url":"flower.js","evaluate":true}, - {"name":"flower_b.img","url":"flower_b.js","evaluate":true}, - {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true}, - {"name":"pipe.img","url":"pipe.js","evaluate":true} - ] - }, - { - "id": "gmeter", - "name": "G-Meter", - "shortName": "G-Meter", - "version": "0.01", - "description": "Simple G-Meter", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"gmeter.app.js","url":"app.js"}, - {"name":"gmeter.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "dtlaunch", - "name": "Desktop Launcher", - "version": "0.07", - "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", - "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], - "icon": "icon.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, - {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, - {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]}, - {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]}, - {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"dtlaunch.json"}] - }, - { - "id": "HRV", - "name": "Heart Rate Variability monitor", - "shortName": "HRV monitor", - "version": "0.04", - "description": "Heart Rate Variability monitor, see Readme for more info", - "icon": "hrv.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"HRV.app.js","url":"app.js"}, - {"name":"HRV.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hardalarm", - "name": "Hard Alarm", - "shortName": "HardAlarm", - "version": "0.02", - "description": "Make sure you wake up! Count to the right number to turn off the alarm", - "icon": "app.png", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"hardalarm.app.js","url":"app.js"}, - {"name":"hardalarm.boot.js","url":"boot.js"}, - {"name":"hardalarm.js","url":"hardalarm.js"}, - {"name":"hardalarm.img","url":"app-icon.js","evaluate":true}, - {"name":"hardalarm.wid.js","url":"widget.js"} - ], - "data": [{"name":"hardalarm.json"}] - }, - { - "id": "edisonsball", - "name": "Edison's Ball", - "shortName": "Edison's Ball", - "version": "0.01", - "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", - "icon": "app-icon.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"edisonsball.app.js","url":"app.js"}, - {"name":"edisonsball.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hrrawexp", - "name": "HRM Data Exporter", - "shortName": "HRM Data Exporter", - "version": "0.01", - "description": "export raw hrm signal data to a csv file", - "icon": "app-icon.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"hrrawexp.app.js","url":"app.js"}, - {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "breath", - "name": "Breathing App", - "shortName": "Breathing App", - "version": "0.01", - "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR", - "icon": "app-icon.png", - "tags": "tools,health", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"breath.app.js","url":"app.js"}, - {"name":"breath.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"breath.settings.json","url":"settings.json"}] - }, - { - "id": "lazyclock", - "name": "Lazy Clock", - "version": "0.03", - "description": "Tells the time, roughly", - "icon": "lazyclock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "screenshots": [{"url":"bangle1-lazy-clock-screenshot.png"}], - "allow_emulator": true, - "storage": [ - {"name":"lazyclock.app.js","url":"lazyclock-app.js"}, - {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true} - ] - }, - { - "id": "astral", - "name": "Astral Clock", - "version": "0.03", - "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", - "icon": "app-icon.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"astral.app.js","url":"app.js"}, - {"name":"astral.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "alpinenav", - "name": "Alpine Nav", - "version": "0.01", - "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime", - "icon": "app-icon.png", - "tags": "outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"alpinenav.app.js","url":"app.js"}, - {"name":"alpinenav.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "lifeclk", - "name": "Game of Life Clock", - "shortName": "Conway's Clock", - "version": "0.06", - "description": "Modification and clockification of Conway's Game of Life", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"lifeclk.app.js","url":"app.min.js"}, - {"name":"lifeclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "speedalt", - "name": "GPS Adventure Sports", - "shortName": "GPS Adv Sport", - "version": "1.02", - "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", - "icon": "app.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"speedalt.app.js","url":"app.js"}, - {"name":"speedalt.img","url":"app-icon.js","evaluate":true}, - {"name":"speedalt.settings.js","url":"settings.js"} - ], - "data": [{"name":"speedalt.json"}] - }, - { - "id": "speedalt2", - "name": "GPS Adventure Sports II", - "shortName": "GPS Adv Sport II", - "version": "0.07", - "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", - "icon": "app.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"speedalt2.app.js","url":"app.js"}, - {"name":"speedalt2.img","url":"app-icon.js","evaluate":true}, - {"name":"speedalt2.settings.js","url":"settings.js"} - ], - "data": [{"name":"speedalt2.json"}] - }, - { - "id": "slomoclock", - "name": "SloMo Clock", - "shortName": "SloMo Clock", - "version": "0.10", - "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", - "icon": "watch.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-slow-mo-clock-screenshot.png"}], - "storage": [ - {"name":"slomoclock.app.js","url":"app.js"}, - {"name":"slomoclock.img","url":"app-icon.js","evaluate":true}, - {"name":"slomoclock.settings.js","url":"settings.js"} - ], - "data": [{"name":"slomoclock.json"}] - }, - { - "id": "de-stress", - "name": "De-Stress", - "shortName": "De-Stress", - "version": "0.02", - "description": "Simple haptic heartbeat", - "icon": "app.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"de-stress.app.js","url":"app.js"}, - {"name":"de-stress.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mclockplus", - "name": "Morph Clock+", - "shortName": "Morph Clock+", - "version": "0.02", - "description": "Morphing Clock with more readable seconds and date and additional stopwatch", - "icon": "mclockplus.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, - {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} - ] - }, - { - "id": "intervals", - "name": "Intervals App", - "shortName": "Intervals", - "version": "0.01", - "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", - "icon": "intervals.png", - "tags": "", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"intervals.app.js","url":"intervals.app.js"}, - {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} - ] - }, - { - "id": "planetarium", - "name": "Planetarium", - "shortName": "Planetarium", - "version": "0.03", - "description": "Planetarium showing up to 500 stars using the watch location and time", - "icon": "planetarium.png", - "tags": "", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"planetarium.app.js","url":"planetarium.app.js"}, - {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, - {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, - {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, - {"name":"planetarium.settings.js","url":"settings.js"}, - {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} - ], - "data": [{"name":"planetarium.json"}] - }, - { - "id": "tapelauncher", - "name": "Tape Launcher", - "version": "0.02", - "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", - "icon": "icon.png", - "type": "launch", - "tags": "tool,system,launcher", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"tapelauncher.app.js","url":"app.js"}, - {"name":"tapelauncher.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "oblique", - "name": "Oblique Strategies", - "version": "0.01", - "description": "Oblique Strategies for creativity. Copied from Brian Eno.", - "icon": "eno.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"oblique.app.js","url":"app.js"}, - {"name":"oblique.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "testuserinput", - "name": "Test User Input", - "shortName": "Test User Input", - "version": "0.06", - "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.", - "icon": "app.png", - "tags": "input,interface,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"testuserinput.app.js","url":"app.js"}, - {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gpssetup", - "name": "GPS Setup", - "shortName": "GPS Setup", - "version": "0.02", - "description": "Configure the GPS power options and store them in the GPS nvram", - "icon": "gpssetup.png", - "tags": "gps,tools,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"gpssetup","url":"gpssetup.js"}, - {"name":"gpssetup.settings.js","url":"settings.js"}, - {"name":"gpssetup.app.js","url":"app.js"}, - {"name":"gpssetup.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"gpssetup.settings.json","url":"settings.json"}] - }, - { - "id": "walkersclock", - "name": "Walkers Clock", - "shortName": "Walkers Clock", - "version": "0.04", - "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference", - "icon": "walkersclock48.png", - "type": "clock", - "tags": "clock,gps,tools,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"walkersclock.app.js","url":"app.js"}, - {"name":"walkersclock.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "widgps", - "name": "GPS Widget", - "version": "0.03", - "description": "Tiny widget to show the power on/off status of the GPS", - "icon": "widget.png", - "type": "widget", - "tags": "widget,gps", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widgps.wid.js","url":"widget.js"} - ] - }, - { - "id": "widhrt", - "name": "HRM Widget", - "version": "0.03", - "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor", - "icon": "widget.png", - "type": "widget", - "tags": "widget,hrm", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widhrt.wid.js","url":"widget.js"} - ] - }, - { - "id": "countdowntimer", - "name": "Countdown Timer", - "version": "0.01", - "description": "A simple countdown timer with a focus on usability", - "icon": "countdowntimer.png", - "tags": "timer,tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"countdowntimer.app.js","url":"countdowntimer.js"}, - {"name":"countdowntimer.img","url":"countdowntimer-icon.js","evaluate":true} - ] - }, - { - "id": "helloworld", - "name": "hello, world!", - "shortName": "hello world", - "version": "0.02", - "description": "A cross cultural hello world!/hola mundo! app with colors and languages", - "icon": "app.png", - "tags": "input,interface,buttons,touch", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"helloworld.app.js","url":"app.js"}, - {"name":"helloworld.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widcom", - "name": "Compass Widget", - "version": "0.02", - "description": "Tiny widget to show the power on/off status of the Compass", - "icon": "widget.png", - "type": "widget", - "tags": "widget,compass", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widcom.wid.js","url":"widget.js"} - ] - }, - { - "id": "arrow", - "name": "Arrow Compass", - "version": "0.05", - "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass", - "icon": "arrow.png", - "type": "app", - "tags": "tool,outdoors", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"arrow.app.js","url":"app.js"}, - {"name":"arrow.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "waypointer", - "name": "Way Pointer", - "version": "0.01", - "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", - "icon": "waypointer.png", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"waypointer.app.js","url":"app.js"}, - {"name":"waypointer.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "color_catalog", - "name": "Colors Catalog", - "shortName": "Colors Catalog", - "version": "0.01", - "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", - "icon": "app.png", - "tags": "Color,input,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"color_catalog.app.js","url":"app.js"}, - {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "UI4swatch", - "name": "UI 4 swatch", - "shortName": "UI 4 swatch", - "version": "0.01", - "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.", - "icon": "app.png", - "tags": "Color,input,buttons,touch,UI", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"UI4swatch.app.js","url":"app.js"}, - {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "simplest", - "name": "Simplest Clock", - "version": "0.03", - "description": "The simplest working clock, acts as a tutorial piece", - "icon": "simplest.png", - "screenshots": [{"url":"screenshot_simplest.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"simplest.app.js","url":"app.js"}, - {"name":"simplest.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "stepo", - "name": "Stepometer Clock", - "version": "0.03", - "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed", - "icon": "stepo.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"stepo.app.js","url":"app.js"}, - {"name":"stepo.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "gbmusic", - "name": "Gadgetbridge Music Controls", - "shortName": "Music Controls", - "version": "0.08", - "description": "Control the music on your Gadgetbridge-connected phone", - "icon": "icon.png", - "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], - "type": "app", - "tags": "tools,bluetooth,gadgetbridge,music", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"gbmusic.app.js","url":"app.js"}, - {"name":"gbmusic.settings.js","url":"settings.js"}, - {"name":"gbmusic.wid.js","url":"widget.js"}, - {"name":"gbmusic.img","url":"icon.js","evaluate":true} - ], - "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}] - }, - { - "id": "battleship", - "name": "Battleship", - "version": "0.01", - "description": "The classic game of battleship", - "icon": "battleship-icon.png", - "tags": "game", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-battle-ship-screenshot.png"}], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"battleship.app.js","url":"battleship.js"}, - {"name":"battleship.img","url":"battleship-icon.js","evaluate":true} - ] - }, - { - "id": "kitchen", - "name": "Kitchen Combo", - "version": "0.13", - "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'", - "icon": "kitchen.png", - "type": "clock", - "tags": "tool,outdoors,gps", - "supports": ["BANGLEJS"], - "readme": "README.md", - "interface": "waypoints.html", - "storage": [ - {"name":"kitchen.app.js","url":"kitchen.app.js"}, - {"name":"stepo2.kit.js","url":"stepo2.kit.js"}, - {"name":"swatch.kit.js","url":"swatch.kit.js"}, - {"name":"gps.kit.js","url":"gps.kit.js"}, - {"name":"compass.kit.js","url":"compass.kit.js"}, - {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} - ], - "data": [{"name":"waypoints.json","url":"waypoints.json"}] - }, - { - "id": "banglebridge", - "name": "BangleBridge", - "shortName": "BangleBridge", - "version": "0.01", - "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", - "icon": "widget.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"banglebridge.wid.js","url":"widget.js"}, - {"name":"banglebridge.watch.img","url":"watch.img"}, - {"name":"banglebridge.heart.img","url":"heart.img"} - ] - }, - { - "id": "qmsched", - "name": "Quiet Mode Schedule and Widget", - "shortName": "Quiet Mode", - "version": "0.05", - "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", - "icon": "app.png", - "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, - {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}], - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"qmsched","url":"lib.js"}, - {"name":"qmsched.app.js","url":"app.js"}, - {"name":"qmsched.boot.js","url":"boot.js"}, - {"name":"qmsched.img","url":"icon.js","evaluate":true}, - {"name":"qmsched.wid.js","url":"widget.js"} - ], - "data": [{"name":"qmsched.json"}] - }, - { - "id": "hourstrike", - "name": "Hour Strike", - "shortName": "Hour Strike", - "version": "0.08", - "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!", - "icon": "app-icon.png", - "tags": "tool,alarm", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"hourstrike.app.js","url":"app.js"}, - {"name":"hourstrike.boot.js","url":"boot.js"}, - {"name":"hourstrike.img","url":"app-icon.js","evaluate":true}, - {"name":"hourstrike.json","url":"hourstrike.json"} - ] - }, - { - "id": "whereworld", - "name": "Where in the World?", - "shortName": "Where World", - "version": "0.01", - "description": "Shows your current location on the world map", - "icon": "app.png", - "tags": "gps", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"whereworld.app.js","url":"app.js"}, - {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, - {"name":"whereworld.worldmap","url":"worldmap"} - ] - }, - { - "id": "omnitrix", - "name": "Omnitrix", - "version": "0.01", - "description": "An Omnitrix Showpiece", - "icon": "omnitrix.png", - "screenshots": [{"url":"screenshot.png"}], - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"omnitrix.app.js","url":"omnitrix.app.js"}, - {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true} - ] - }, - { - "id": "batclock", - "name": "Bat Clock", - "shortName": "Bat Clock", - "version": "0.02", - "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", - "icon": "bat-clock.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"batclock.app.js","url":"bat-clock.app.js"}, - {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true} - ] - }, - { - "id": "doztime", - "name": "Dozenal Time", - "shortName": "Dozenal Time", - "version": "0.04", - "description": "A dozenal Holocene calendar and dozenal diurnal clock", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"doztime.app.js","url":"app.js"}, - {"name":"doztime.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "gbtwist", - "name": "Gadgetbridge Twist Control", - "shortName": "Twist Control", - "version": "0.01", - "description": "Shake your wrist to control your music app via Gadgetbridge", - "icon": "app.png", - "type": "app", - "tags": "tools,bluetooth,gadgetbridge,music", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": false, - "storage": [ - {"name":"gbtwist.app.js","url":"app.js"}, - {"name":"gbtwist.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "thermom", - "name": "Thermometer", - "version": "0.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"thermom.app.js","url":"app.js"}, - {"name":"thermom.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "mysticdock", - "name": "Mystic Dock", - "version": "1.00", - "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.", - "icon": "mystic-dock.png", - "type": "dock", - "tags": "dock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"mysticdock.app.js","url":"mystic-dock-app.js"}, - {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"}, - {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"}, - {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true} - ] - }, - { - "id": "mysticclock", - "name": "Mystic Clock", - "version": "1.01", - "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.", - "icon": "mystic-clock.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"bangle1-mystic-clock-screenshot.png"}], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"mysticclock.app.js","url":"mystic-clock-app.js"}, - {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"}, - {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true} - ] - }, - { - "id": "hcclock", - "name": "Hi-Contrast Clock", - "version": "0.02", - "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", - "icon": "hcclock-icon.png", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}], - "supports": ["BANGLEJS"], - "allow_emulator": true, - "storage": [ - {"name":"hcclock.app.js","url":"hcclock.app.js"}, - {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} - ] - }, - { - "id": "thermomF", - "name": "Fahrenheit Temp", - "version": "0.01", - "description": "A modification of the Thermometer App to display temprature in Fahrenheit", - "icon": "thermf.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"thermomF.app.js","url":"app.js"}, - {"name":"thermomF.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "nixie", - "name": "Nixie Clock", - "shortName": "Nixie", - "version": "0.01", - "description": "A nixie tube clock for both Bangle 1 and 2.", - "icon": "nixie.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"nixie.app.js","url":"app.js"}, - {"name":"nixie.img","url":"app-icon.js","evaluate":true}, - {"name":"m_vatch.js","url":"m_vatch.js"} - ] - }, - { - "id": "carcrazy", - "name": "Car Crazy", - "shortName": "Car Crazy", - "version": "0.03", - "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.", - "icon": "carcrash.png", - "tags": "game", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"carcrazy.app.js","url":"app.js"}, - {"name":"carcrazy.img","url":"app-icon.js","evaluate":true}, - {"name":"carcrazy.settings.js","url":"settings.js"} - ], - "data": [{"name":"CarCrazy.csv"}] - }, - { - "id": "shortcuts", - "name": "Shortcuts", - "shortName": "Shortcuts", - "version": "0.01", - "description": "Quickly load your favourite apps from (almost) any watch face.", - "icon": "app.png", - "type": "bootloader", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "storage": [ - {"name":"shortcuts.boot.js","url":"boot.js"}, - {"name":"shortcuts.settings.js","url":"settings.js"} - ], - "data": [{"name":"shortcuts.json"}] - }, - { - "id": "vectorclock", - "name": "Vector Clock", - "version": "0.03", - "description": "A digital clock that uses the built-in vector font.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS", "BANGLEJS2"], - "allow_emulator": true, - "screenshots": [ - {"url":"bangle2-vector-clock-screenshot.png"}, - {"url":"bangle1-vector-clock-screenshot.png"} - ], - "storage": [ - {"name":"vectorclock.app.js","url":"app.js"}, - {"name":"vectorclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "fd6fdetect", - "name": "fd6fdetect", - "shortName": "fd6fdetect", - "version": "0.2", - "description": "Allows you to see 0xFD6F beacons near you.", - "icon": "app.png", - "tags": "tool", - "readme": "README.md", - "supports": ["BANGLEJS"], - "storage": [ - {"name":"fd6fdetect.app.js","url":"app.js"}, - {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "choozi", - "name": "Choozi", - "version": "0.01", - "description": "Choose people or things at random using Bangle.js.", - "icon": "app.png", - "tags": "tool", - "supports": ["BANGLEJS"], - "readme": "README.md", - "allow_emulator": true, - "screenshots": [{"url":"bangle1-choozi-screenshot1.png"},{"url":"bangle1-choozi-screenshot2.png"}], - "storage": [ - {"name":"choozi.app.js","url":"app.js"}, - {"name":"choozi.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "widclkbttm", - "name": "Digital clock (Bottom) widget", - "shortName": "Digital clock Bottom Widget", - "version": "0.03", - "description": "Displays time in the bottom area.", - "icon": "widclkbttm.png", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"} - ] - }, - { - "id": "pastel", - "name": "Pastel Clock", - "shortName": "Pastel", - "version": "0.08", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", - "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"f_architect","url":"f_architect.js"}, - {"name":"f_gochihand","url":"f_gochihand.js"}, - {"name":"f_cabin","url":"f_cabin.js"}, - {"name":"f_orbitron","url":"f_orbitron.js"}, - {"name":"f_monoton","url":"f_monoton.js"}, - {"name":"f_elite","url":"f_elite.js"}, - {"name":"f_lato","url":"f_lato.js"}, - {"name":"f_latosmall","url":"f_latosmall.js"}, - {"name":"pastel.app.js","url":"pastel.app.js"}, - {"name":"pastel.img","url":"pastel.icon.js","evaluate":true}, - {"name":"pastel.settings.js","url":"pastel.settings.js"} - ], - "data": [{"name":"pastel.json"}] - }, - { - "id": "antonclk", - "name": "Anton Clock", - "version": "0.03", - "description": "A simple clock using the bold Anton font.", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"antonclk.app.js","url":"app.js"}, - {"name":"antonclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "waveclk", - "name": "Wave Clock", - "version": "0.02", - "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"waveclk.app.js","url":"app.js"}, - {"name":"waveclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "floralclk", - "name": "Floral Clock", - "version": "0.01", - "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**", - "icon": "app.png", - "screenshots": [{"url":"screenshot_floral.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"floralclk.app.js","url":"app.js"}, - {"name":"floralclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "score", - "name": "Score Tracker", - "version": "0.01", - "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.", - "icon": "score.app.png", - "screenshots": [{"url":"screenshot_score.png"}], - "type": "app", - "tags": "", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"score.app.js","url":"score.app.js"}, - {"name":"score.settings.js","url":"score.settings.js"}, - {"name":"score.presets.json","url":"score.presets.json"}, - {"name":"score.img","url":"score.app-icon.js","evaluate":true} - ], - "data": [{"name":"score.json"}] - }, - { - "id": "menusmall", - "name": "Small Menus", - "version": "0.02", - "description": "Replace Bangle.js 2's menus with a version that contains smaller text", - "icon": "app.png", - "type": "boot", - "tags": "system", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"menusmall.boot.js","url":"boot.js"} - ] - }, - { - "id": "ffcniftya", - "name": "Nifty-A Clock", - "version": "0.01", - "description": "A nifty clock with time and date", - "icon": "app.png", - "screenshots": [{"url":"screenshot_nifty.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"ffcniftya.app.js","url":"app.js"}, - {"name":"ffcniftya.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "ffcniftyb", - "name": "Nifty-B Clock", - "version": "0.02", - "description": "A nifty clock (series B) with time, date and color configuration", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"ffcniftyb.app.js","url":"app.js"}, - {"name":"ffcniftyb.img","url":"app-icon.js","evaluate":true}, - {"name":"ffcniftyb.settings.js","url":"settings.js"} - ], - "data": [{"name":"ffcniftyb.json"}] - }, - { - "id": "stopwatch", - "name": "Stopwatch Touch", - "version": "0.01", - "description": "A touch based stop watch for Bangle JS 2", - "icon": "stopwatch.png", - "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], - "tags": "tools,app", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"stopwatch.app.js","url":"stopwatch.app.js"}, - {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true} - ] - }, - { - "id": "vernierrespirate", - "name": "Vernier Go Direct Respiration Belt", - "shortName": "Respiration Belt", - "version": "0.01", - "description": "Connects to a Go Direct Respiration Belt and shows respiration rate", - "icon": "app.png", - "tags": "health,bluetooth", - "supports": ["BANGLEJS","BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"vernierrespirate.app.js","url":"app.js"}, - {"name":"vernierrespirate.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"vernierrespirate.json"}] - }, - { - "id": "gpstouch", - "name": "GPS Touch", - "version": "0.01", - "description": "A touch based GPS watch, shows OS map reference", - "icon": "gpstouch.png", - "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], - "tags": "tools,app", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"geotools","url":"geotools.js"}, - {"name":"gpstouch.app.js","url":"gpstouch.app.js"}, - {"name":"gpstouch.img","url":"gpstouch.icon.js","evaluate":true} - ] - }, - { - "id": "swiperclocklaunch", - "name": "Swiper Clock Launch", - "version": "0.02", - "description": "Navigate between clock and launcher with Swipe action", - "icon": "swiperclocklaunch.png", - "type": "bootloader", - "tags": "tools, system", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - {"name":"swiperclocklaunch.boot.js","url":"boot.js"}, - {"name":"swiperclocklaunch.img","url":"icon.js","evaluate":true} - ] - }, - { - "id": "qalarm", - "name": "Q Alarm and Timer", - "shortName": "Q Alarm", - "icon": "app.png", - "version": "0.03", - "description": "Alarm and timer app with days of week and 'hard' option.", - "tags": "tool,alarm,widget", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - { "name": "qalarm.app.js", "url": "app.js" }, - { "name": "qalarm.boot.js", "url": "boot.js" }, - { "name": "qalarm.js", "url": "qalarm.js" }, - { "name": "qalarmcheck.js", "url": "qalarmcheck.js" }, - { "name": "qalarm.img", "url": "app-icon.js", "evaluate": true }, - { "name": "qalarm.wid.js", "url": "widget.js" } - ], - "data": [{ "name": "qalarm.json" }] - }, - { - "id": "emojuino", - "name": "Emojuino", - "shortName": "Emojuino", - "version": "0.03", - "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", - "icon": "emojuino.png", - "screenshots": [ - { "url": "screenshot-tx.png" }, - { "url": "screenshot-swipe.png" }, - { "url": "screenshot-welcome.png" } - ], - "type": "app", - "tags": "emoji", - "supports" : [ "BANGLEJS2" ], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - { "name": "emojuino.app.js", "url": "emojuino.js" }, - { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } - ] - }, - { - "id": "cliclockJS2Enhanced", - "name": "Commandline-Clock JS2 Enhanced", - "shortName": "CLI-Clock JS2", - "version": "0.03", - "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design. Also added HID media controlls, just swipe on the clock face to controll the media! Gadgetbride support coming soon(hopefully) Thanks to t0m1o1 for media controls!", - "icon": "app.png", - "screenshots": [{"url":"screengrab.png"}], - "type": "clock", - "tags": "clock,cli,command,bash,shell", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, - {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} - ] - }, - { - "id": "wid_a_battery_widget", - "name": "A Battery Widget (with percentage)", - "shortName":"A Battery Widget", - "icon": "widget.png", - "version":"1.02", - "type": "widget", - "supports": ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "description": "Simple and slim battery widget with charge status and percentage", - "tags": "widget,battery", - "storage": [ - {"name":"wid_a_battery_widget.wid.js","url":"widget.js"} - ] - }, - { - "id": "lcars", - "name": "LCARS Clock", - "shortName":"LCARS", - "icon": "lcars.png", - "version":"0.06", - "readme": "README.md", - "supports": ["BANGLEJS2"], - "description": "Library Computer Access Retrieval System (LCARS) clock.", - "type": "clock", - "tags": "clock", - "screenshots": [{"url":"screenshot.png"}], - "storage": [ - {"name":"lcars.app.js","url":"lcars.app.js"}, - {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} - ] - }, - { "id": "binwatch", - "name": "Binary Watch", - "shortName":"BinWatch", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.04", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "allow_emulator":true, - "description": "Famous binary watch", - "tags": "clock", - "type": "clock", - "storage": [ - {"name":"binwatch.app.js","url":"app.js"}, - {"name":"binwatch.bg176.img","url":"Background176_center.img"}, - {"name":"binwatch.bg240.img","url":"Background240_center.img"}, - {"name":"binwatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "hidmsicswipe", - "name": "Bluetooth Music Swipe Controls", - "shortName": "Swipe Control", - "version": "0.01", - "description": "Based on the original Bluetooth Music Controls. Swipe up/down for volume, left/right for previous and next, tap for play/pause and btn1 to lock and unlock the controls. Enable HID in settings, pair with your phone, then use this app to control music from your watch!", - "icon": "hidmsicswipe.png", - "tags": "bluetooth", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"hidmsicswipe.app.js","url":"hidmsicswipe.js"}, - {"name":"hidmsicswipe.img","url":"hidmsicswipe-icon.js","evaluate":true} - ] - }, - { - "id": "authentiwatch", - "name": "2FA Authenticator", - "shortName": "AuthWatch", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "version": "0.04", - "description": "Google Authenticator compatible tool.", - "tags": "tool", - "interface": "interface.html", - "supports": ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"authentiwatch.app.js","url":"app.js"}, - {"name":"authentiwatch.img","url":"app-icon.js","evaluate":true} - ], - "data": [{"name":"authentiwatch.json"}] - }, - { "id": "schoolCalendar", - "name": "School Calendar", - "shortName":"SCalendar", - "icon": "CalenderLogo.png", - "version": "0.01", - "description": "A simple calendar that you can see your upcoming events that you create in the customizer. Keep in note that your events reapeat weekly.(Beta)", - "tags": "tool", - "readme":"README.md", - "custom":"custom.html", - "supports": ["BANGLEJS"], - "screenshots": [{"url":"screenshot_basic.png"},{"url":"screenshot_info.png"}], - "storage": [ - {"name":"schoolCalendar.app.js"}, - {"name":"schoolCalendar.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"calendarItems.csv"} - ] - }, - { "id": "timecal", - "name": "TimeCal", - "shortName":"TimeCal", - "icon": "icon.png", - "version":"0.01", - "description": "TimeCal shows the Time along with a 3 week calendar", - "tags": "clock", - "type": "clock", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"timecal.app.js","url":"timecal.app.js"} - ] - }, - { - "id": "a_clock_timer", - "name": "A Clock with Timer", - "version": "0.01", - "description": "A Clock with Timer, Map and Time Zones", - "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - {"name":"a_clock_timer.app.js","url":"app.js"}, - {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id":"intervalTimer", - "name":"Interval Timer", - "shortName":"Interval Timer", - "icon": "app.png", - "version":"0.01", - "description": "Interval Timer for workouts, HIIT, or whatever else.", - "tags": "timer, interval, hiit, workout", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"intervalTimer.app.js","url":"app.js"}, - {"name":"intervalTimer.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "93dub", - "name": "93 Dub", - "shortName":"93 Dub", - "icon": "93dub.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.05", - "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", - "tags": "clock", - "type": "clock", - "supports":["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"93dub.app.js","url":"app.js"}, - {"name":"93dub.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "poweroff", - "name": "Poweroff", - "shortName":"Poweroff", - "version":"0.01", - "description": "Simple app to power off your Bangle.js", - "icon": "app.png", - "tags": "tool, poweroff, shutdown", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"poweroff.app.js","url":"app.js"}, - {"name":"poweroff.img","url":"app-icon.js","evaluate":true} - ] -}, -{ - "id": "sensible", - "name": "SensiBLE", - "shortName": "SensiBLE", - "version": "0.04", - "description": "Collect, display and advertise real-time sensor data.", - "icon": "sensible.png", - "screenshots": [ - { "url": "screenshot-top.png" }, - { "url": "screenshot-acc.png" }, - { "url": "screenshot-bar.png" }, - { "url": "screenshot-gps.png" }, - { "url": "screenshot-hrm.png" }, - { "url": "screenshot-mag.png" } - ], - "type": "app", - "tags": "tool,sensors", - "supports" : [ "BANGLEJS2" ], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - { "name": "sensible.app.js", "url": "sensible.js" }, - { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } - ] -}, - { - "id": "widbars", - "name": "Bars Widget", - "version": "0.01", - "description": "Display several measurements as vertical bars.", - "icon": "icon.png", - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "type": "widget", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widbars.wid.js","url":"widget.js"} - ] -}, -{ - "id":"a_speech_timer", - "name":"Speech Timer", - "icon": "app.png", - "version":"1.01", - "description": "A timer designed to help keeping your speeches and presentations to time.", - "tags": "tool,timer", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"a_speech_timer.app.js","url":"app.js"}, - {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} - ] -}, - { "id": "mylocation", - "name": "My Location", - "shortName":"My Location", - "icon": "mylocation.png", - "type": "app", - "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.01", - "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", - "readme": "README.md", - "tags": "tool,utility", - "supports": ["BANGLEJS", "BANGLEJS2"], - "storage": [ - {"name":"mylocation.app.js","url":"mylocation.app.js"}, - {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } - ], - "data": [ - {"name":"mylocation.json"} - ] - }, - { - "id": "pebble", - "name": "Pebble Clock", - "shortName": "Pebble", - "version": "0.04", - "description": "A pebble style clock to keep the rebellion going", - "readme": "README.md", - "icon": "pebble.png", - "screenshots": [{"url":"pebble_screenshot.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"pebble.app.js","url":"pebble.app.js"}, - {"name":"pebble.settings.js","url":"pebble.settings.js"}, - {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} - ] - }, - { "id": "pooqroman", - "name": "pooq Roman watch face", - "shortName":"pooq Roman", - "version":"0.03", - "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"pooqroman.app.js","url":"app.js"}, - {"name":"pooqroman.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"pooqroman.json"} - ] - }, - { - "id": "widbata", - "name": "Battery Level Widget (Themed)", - "shortName":"Battery Theme", - "icon": "widbata.png", - "screenshots": [{"url":"screenshot_widbata_1.png"}], - "version":"0.01", - "type": "widget", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "description": "Shows the current battery level status in the top right using the clocks colour theme", - "tags": "widget,battery", - "storage": [ - {"name":"widbata.wid.js","url":"widbata.wid.js"} - ] - }, - { - "id": "weatherClock", - "name": "Weather Clock", - "version": "0.04", - "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", - "icon": "app.png", - "screenshots": [{"url":"screens/screen1.png"}], - "type": "clock", - "tags": "clock, weather", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "readme": "README.md", - "storage": [ - {"name":"weatherClock.app.js","url":"app.js"}, - {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "menuwheel", - "name": "Wheel Menus", - "version": "0.01", - "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button", - "readme": "README.md", - "icon": "icon.png", - "screenshots": [ - {"url":"screenshot_b1_dark.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_light.png"}, - {"url":"screenshot_b2_dark.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_light.png"} - ], - "type": "boot", - "tags": "system", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"menuwheel.boot.js","url":"boot.js"} - ] - }, - { "id": "widChargingStatus", - "name": "Charging Status", - "shortName":"ChargingStatus", - "icon": "widget.png", - "version":"0.1", - "type": "widget", - "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.", - "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"widChargingStatus.wid.js","url":"widget.js"} - ] - }, - { - "id": "flow", - "name": "FLOW", - "shortName": "FLOW", - "version": "0.01", - "description": "A game where you have to help a flow avoid white obstacles thing by tapping! This is a demake of an app which I forgot the name of. Press BTN(1) to restart. See if you can get to 2500 score!", - "icon": "app.png", - "tags": "game", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name": "flow.app.js", "url": "app.js" }, - {"name": "flow.img", "url": "app-icon.js","evaluate": true } - ] - }, - { "id": "scribble", - "name": "Scribble", - "shortName":"Scribble", - "version":"0.01", - "type": "app", - "description": "A keyboard on your wrist! Swipe right for space, left for delete.", - "icon": "app.png", - "allow_emulator": true, - "tags": "tools, keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"scribble.app.js","url":"app.js"}, - {"name":"scribble.img","url":"app-icon.js","evaluate":true} - ], - "screenshots":[ - { "url":"screenshot.png" } - ] - }, - { - "id": "ptlaunch", - "name": "Pattern Launcher", - "shortName": "Pattern Launcher", - "version": "0.10", - "description": "Directly launch apps from the clock screen with custom patterns.", - "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], - "tags": "tools", - "supports": ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - { "name": "ptlaunch.app.js", "url": "app.js" }, - { "name": "ptlaunch.boot.js", "url": "boot.js" }, - { "name": "ptlaunch.img", "url": "app-icon.js", "evaluate": true } - ], - "data": [{"name":"ptlaunch.patterns.json"}] - }, - { - "id": "rebble", - "name": "Rebble Clock", - "shortName": "Rebble", - "version": "0.02", - "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", - "readme": "README.md", - "icon": "rebble.png", - "dependencies": {"mylocation":"app"}, - "screenshots": [{"url":"screenshot_rebble.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"rebble.app.js","url":"rebble.app.js"}, - {"name":"rebble.settings.js","url":"rebble.settings.js"}, - {"name":"rebble.img","url":"rebble.icon.js","evaluate":true} - ] - }, - { "id": "snaky", - "name": "Snaky", - "shortName":"Snaky", - "version":"0.01", - "description": "The classic snake game. Eat apples and don't bite your tail. Control the snake with the touch screen.", - "tags": "game,fun", - "icon": "snaky.png", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"snaky.app.js","url":"snaky.js"}, - {"name":"snaky.img","url":"snaky-icon.js","evaluate":true} - ] - }, - { - "id": "clicompleteclk", - "name": "CLI complete clock", - "shortName":"CLI cmplt clock", - "version":"0.03", - "description": "Command line styled clock with lots of information", - "icon": "app.png", - "allow_emulator": true, - "type": "clock", - "tags": "clock,cli,command,bash,shell,weather,hrt", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, - {"name":"clicompleteclk.settings.js","url":"settings.js"} - ], - "data": [{"name":"clicompleteclk.json"}] - }, - { - "id":"awairmonitor", - "name":"Awair Monitor", - "icon": "app.png", - "allow_emulator": true, - "version":"0.01", - "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "tool,health", - "readme":"README.md", - "supports":["BANGLEJS2"], - "storage": [ - {"name":"awairmonitor.app.js","url":"app.js"}, - {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "pooqround", - "name": "pooq Round watch face", - "shortName":"pooq Round", - "version":"0.00", - "description": "A 24 hour analogue watchface with high legibility and a novel style.", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"pooqround.app.js","url":"app.js"}, - {"name":"pooqround.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"pooqround.json"} - ] - }, - { - "id": "coretemp", - "name": "Core Temp Display", - "version": "0.01", - "description": "Display CoreTemp device sensor data", - "icon": "coretemp.png", - "type": "app", - "tags": "health", - "readme": "README.md", - "supports": ["BANGLEJS","BANGLEJS2"], - "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, - {"name":"coretemp.app.js","url":"coretemp.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] - }, - { - "id": "ltherm", - "name": "Thermometer", - "version": "0.01", - "description": "Displays the current temperature in localized units.", - "icon": "thermf.png", - "tags": "tool", - "supports": ["BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"ltherm.app.js","url":"app.js"}, - {"name":"thermf.img","url":"icon.js","evaluate":true} - ] - } -] \ No newline at end of file From 9769934d71457725e262e3189751c6aa4c18c5e0 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Wed, 15 Dec 2021 06:04:14 -0500 Subject: [PATCH 012/503] Add files via upload --- apps.json | 4990 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4990 insertions(+) create mode 100644 apps.json diff --git a/apps.json b/apps.json new file mode 100644 index 000000000..5813561cf --- /dev/null +++ b/apps.json @@ -0,0 +1,4990 @@ +[ + { + "id": "fwupdate", + "name": "Firmware Update", + "version": "0.02", + "description": "[BETA] Uploads new Espruino firmwares to Bangle.js 2. For now, please use the instructions under https://www.espruino.com/Bangle.js2#firmware-updates", + "icon": "app.png", + "type": "RAM", + "tags": "tools,system", + "supports": ["BANGLEJS2"], + "custom": "custom.html", + "customConnect": true, + "storage": [], + "sortorder": 20 + }, + { + "id": "boot", + "name": "Bootloader", + "version": "0.38", + "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", + "icon": "bootloader.png", + "type": "bootloader", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":".boot0","url":"boot0.js"}, + {"name":".bootcde","url":"bootloader.js"}, + {"name":"bootupdate.js","url":"bootupdate.js"} + ], + "sortorder": -10 + }, + { + "id": "hebrew_calendar", + "name": "Hebrew Calendar", + "shortName": "HebCal", + "version": "0.04", + "description": "lists the date according to the hebrew calendar", + "icon": "app.png", + "allow_emulator": false, + "tags": "tool,locale", + "supports": [ + "BANGLEJS", + "BANGLEJS2" + ], + "readme": "README.md", + "storage": [ + { + "name": "hebrew_calendar.app.js", + "url": "app.js" + }, + { + "name": "hebrewDate", + "url": "hebrewDate.js" + }, + { + "name": "hebrew_calendar.img", + "url": "app-icon.js", + "evaluate": true + } + ] + }, + { "id": "golfscore", + "name": "Golf Score", + "shortName":"golfscore", + "version":"0.02", + "description": "keeps track of strokes during a golf game", + "icon": "app.png", + "tags": "outdoors", + "allow_emulator": true, + "supports" : ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"golfscore.app.js","url":"app.js"}, + {"name":"golfscore.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "messages", + "name": "Messages", + "version": "0.13", + "description": "App to display notifications from iOS and Gadgetbridge", + "icon": "app.png", + "type": "app", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"messages.app.js","url":"app.js"}, + {"name":"messages.settings.js","url":"settings.js"}, + {"name":"messages.img","url":"app-icon.js","evaluate":true}, + {"name":"messages.wid.js","url":"widget.js"}, + {"name":"messages","url":"lib.js"} + ], + "data": [{"name":"messages.json"},{"name":"messages.settings.json"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot-notify.gif"}], + "sortorder": -9 + }, + { + "id": "android", + "name": "Android Integration", + "shortName": "Android", + "version": "0.05", + "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", + "icon": "app.png", + "tags": "tool,system,messages,notifications", + "dependencies": {"messages":"app"}, + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"android.app.js","url":"app.js"}, + {"name":"android.settings.js","url":"settings.js"}, + {"name":"android.img","url":"app-icon.js","evaluate":true}, + {"name":"android.boot.js","url":"boot.js"} + ], + "sortorder": -8 + }, + { + "id": "ios", + "name": "iOS Integration", + "version": "0.07", + "description": "Display notifications/music/etc from iOS devices", + "icon": "app.png", + "tags": "tool,system,ios,apple,messages,notifications", + "dependencies": {"messages":"app"}, + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"ios.app.js","url":"app.js"}, + {"name":"ios.img","url":"app-icon.js","evaluate":true}, + {"name":"ios.boot.js","url":"boot.js"} + ], + "sortorder": -8 + }, + { + "id": "health", + "name": "Health Tracking", + "version": "0.08", + "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", + "icon": "app.png", + "tags": "tool,system,health", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"health.app.js","url":"app.js"}, + {"name":"health.img","url":"app-icon.js","evaluate":true}, + {"name":"health.boot.js","url":"boot.js"}, + {"name":"health","url":"lib.js"} + ] + }, + { + "id": "launch", + "name": "Launcher", + "shortName": "Launcher", + "version": "0.10", + "description": "This is needed to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"launch.app.js","url":"app-bangle1.js","supports":["BANGLEJS"]}, + {"name":"launch.app.js","url":"app-bangle2.js","supports":["BANGLEJS2"]}, + {"name":"launch.settings.js","url":"settings.js","supports":["BANGLEJS2"]} + ], + "data": [{"name":"launch.json"}], + "sortorder": -10 + }, + { + "id": "setting", + "name": "Settings", + "version": "0.36", + "description": "A menu for setting up Bangle.js", + "icon": "settings.png", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"setting.app.js","url":"settings.js"}, + {"name":"setting.img","url":"settings-icon.js","evaluate":true} + ], + "data": [{"name":"setting.json","url":"settings.min.json","evaluate":true}], + "sortorder": -5 + }, + { + "id": "about", + "name": "About", + "version": "0.12", + "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", + "icon": "app.png", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-about-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"about.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"about.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"about.img","url":"app-icon.js","evaluate":true} + ], + "sortorder": -4 + }, + { + "id": "alarm", + "name": "Default Alarm & Timer", + "shortName": "Alarms", + "version": "0.14", + "description": "Set and respond to alarms and timers", + "icon": "app.png", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"alarm.app.js","url":"app.js"}, + {"name":"alarm.boot.js","url":"boot.js"}, + {"name":"alarm.js","url":"alarm.js"}, + {"name":"alarm.img","url":"app-icon.js","evaluate":true}, + {"name":"alarm.wid.js","url":"widget.js"} + ], + "data": [{"name":"alarm.json"}] + }, + { + "id": "locale", + "name": "Languages", + "version": "0.14", + "description": "Translations for different countries", + "icon": "locale.png", + "type": "locale", + "tags": "tool,system,locale,translate", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "locale.html", + "storage": [ + {"name":"locale"} + ], + "sortorder": -10 + }, + { + "id": "notify", + "name": "Notifications (default)", + "shortName": "Notifications", + "version": "0.11", + "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen", + "icon": "notify.png", + "type": "notify", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"notify","url":"notify.js"} + ] + }, + { + "id": "notifyfs", + "name": "Fullscreen Notifications", + "shortName": "Notifications", + "version": "0.12", + "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.", + "icon": "notify.png", + "type": "notify", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"notify","url":"notify.js"} + ] + }, + { + "id": "welcome", + "name": "Welcome", + "shortName": "Welcome", + "version": "0.14", + "description": "Appears at first boot and explains how to use Bangle.js", + "icon": "app.png", + "screenshots": [{"url":"screenshot_welcome.png"}], + "tags": "start,welcome", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"welcome.boot.js","url":"boot.js"}, + {"name":"welcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"welcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"welcome.settings.js","url":"settings.js"}, + {"name":"welcome.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"welcome.json"}] + }, + { + "id": "mywelcome", + "name": "Customised Welcome", + "shortName": "My Welcome", + "version": "0.13", + "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", + "icon": "app.png", + "tags": "start,welcome", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "screenshots": [{"url":"bangle1-customized-welcome-screenshot.png"}], + "storage": [ + {"name":"mywelcome.boot.js","url":"boot.js"}, + {"name":"mywelcome.app.js","url":"app-bangle1.js","supports": ["BANGLEJS"]}, + {"name":"mywelcome.app.js","url":"app-bangle2.js","supports": ["BANGLEJS2"]}, + {"name":"mywelcome.settings.js","url":"settings.js"}, + {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"mywelcome.json"}] + }, + { + "id": "gbridge", + "name": "Gadgetbridge", + "version": "0.25", + "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "icon": "app.png", + "type": "widget", + "tags": "tool,system,android,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "dependencies": {"notify":"type"}, + "readme": "README.md", + "storage": [ + {"name":"gbridge.settings.js","url":"settings.js"}, + {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, + {"name":"gbridge.wid.js","url":"widget.js"} + ], + "data": [{"name":"gbridge.json"}] + }, + { "id": "gbdebug", + "name": "Gadgetbridge Debug", + "shortName":"GB Debug", + "version":"0.01", + "description": "Debug info for Gadgetbridge. Run this app and when Gadgetbridge messages arrive they are displayed on-screen.", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"gbdebug.app.js","url":"app.js"}, + {"name":"gbdebug.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mclock", + "name": "Morphing Clock", + "version": "0.07", + "description": "7 segment clock that morphs between minutes and hours", + "icon": "clock-morphing.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-morphing-clock-screenshot.png"}], + "storage": [ + {"name":"mclock.app.js","url":"clock-morphing.js"}, + {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} + ], + "sortorder": -9 + }, + { + "id": "moonphase", + "name": "Moonphase", + "version": "0.02", + "description": "Shows current moon phase. Now with GPS function.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-moon-phase-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"moonphase.app.js","url":"app.js"}, + {"name":"moonphase.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "daysl", + "name": "Days left", + "version": "0.03", + "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "allow_emulator": false, + "storage": [ + {"name":"daysl.app.js","url":"app.js"}, + {"name":"daysl.img","url":"app-icon.js","evaluate":true}, + {"name":"daysl.wid.js","url":"widget.js"} + ] + }, + { + "id": "wclock", + "name": "Word Clock", + "version": "0.03", + "description": "Display Time as Text", + "icon": "clock-word.png", + "screenshots": [{"url":"screenshot_word.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"wclock.app.js","url":"clock-word.js"}, + {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} + ] + }, + { + "id": "fontclock", + "name": "Font Clock", + "version": "0.01", + "description": "Choose the font and design of clock face from a library of available designs", + "icon": "fontclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"fontclock.app.js","url":"fontclock.js"}, + {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, + {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, + {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, + {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, + {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, + {"name":"fontclock.font.js","url":"fontclock.font.js"}, + {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, + {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, + {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, + {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, + {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, + {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} + ] + }, + { + "id": "slidingtext", + "name": "Sliding Clock", + "version": "0.07", + "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported", + "icon": "slidingtext.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"slidingtext.app.js","url":"slidingtext.js"}, + {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true}, + {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"}, + {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"}, + {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"}, + {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"}, + {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"}, + {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"}, + {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"}, + {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"} + ] + }, + { + "id": "solarclock", + "name": "Solar Clock", + "version": "0.02", + "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position", + "icon": "solar_clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "allow_emulator": false, + "storage": [ + {"name":"solarclock.app.js","url":"solar_clock.js"}, + {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true}, + {"name":"solar_colors.js","url":"solar_colors.js"}, + {"name":"solar_controller.js","url":"solar_controller.js"}, + {"name":"solar_date_utils.js","url":"solar_date_utils.js"}, + {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"}, + {"name":"solar_location.js","url":"solar_location.js"}, + {"name":"solar_math_utils.js","url":"solar_math_utils.js"}, + {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"}, + {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"}, + {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"}, + {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"}, + {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"}, + {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"} + ] + }, + { + "id": "sweepclock", + "name": "Sweep Clock", + "version": "0.04", + "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", + "icon": "sweepclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-sweep-clock-screenshot.png"}], + "storage": [ + {"name":"sweepclock.app.js","url":"sweepclock.js"}, + {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} + ] + }, + { + "id": "matrixclock", + "name": "Matrix Clock", + "version": "0.02", + "description": "inspired by The Matrix, a clock of the same style", + "icon": "matrixclock.png", + "screenshots": [{"url":"screenshot_matrix.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"matrixclock.app.js","url":"matrixclock.js"}, + {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true} + ] + }, + { + "id": "mandelbrotclock", + "name": "Mandelbrot Clock", + "version": "0.01", + "description": "A mandelbrot set themed clock cool", + "icon": "mandelbrotclock.png", + "screenshots": [{ "url": "screenshot_mandelbrotclock.png" }], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + { "name": "mandelbrotclock.app.js", "url": "mandelbrotclock.js" }, + { + "name": "mandelbrotclock.img", + "url": "mandelbrotclock-icon.js", + "evaluate": true + } + ] + }, + { + "id": "imgclock", + "name": "Image background clock", + "shortName": "Image Clock", + "version": "0.08", + "description": "A clock with an image as a background", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"imgclock.app.js","url":"app.js"}, + {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, + {"name":"imgclock.face.img"}, + {"name":"imgclock.face.json"}, + {"name":"imgclock.face.bg","content":""} + ] + }, + { + "id": "impwclock", + "name": "Imprecise Word Clock", + "version": "0.03", + "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", + "icon": "clock-impword.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-impercise-word-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"impwclock.app.js","url":"clock-impword.js"}, + {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} + ] + }, + { + "id": "aclock", + "name": "Analog Clock", + "version": "0.15", + "description": "An Analog Clock", + "icon": "clock-analog.png", + "screenshots": [{"url":"screenshot_analog.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"aclock.app.js","url":"clock-analog.js"}, + {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} + ] + }, + { + "id": "clock2x3", + "name": "2x3 Pixel Clock", + "version": "0.05", + "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", + "icon": "clock2x3.png", + "screenshots": [{"url":"screenshot_pixel.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, + {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} + ] + }, + { + "id": "geissclk", + "name": "Geiss Clock", + "version": "0.03", + "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", + "icon": "clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"geissclk.app.js","url":"clock.js"}, + {"name":"geissclk.precompute.js","url":"precompute.js"}, + {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} + ], + "data": [{"name":"geissclk.0.map"},{"name":"geissclk.1.map"},{"name":"geissclk.2.map"},{"name":"geissclk.3.map"},{"name":"geissclk.4.map"},{"name":"geissclk.5.map"},{"name":"geissclk.0.pal"},{"name":"geissclk.1.pal"},{"name":"geissclk.2.pal"}] + }, + { + "id": "trex", + "name": "T-Rex", + "version": "0.04", + "description": "T-Rex game in the style of Chrome's offline game", + "icon": "trex.png", + "screenshots": [{"url":"screenshot_trex.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"trex.app.js","url":"trex.js"}, + {"name":"trex.img","url":"trex-icon.js","evaluate":true}, + {"name":"trex.settings.js","url":"settings.js"} + ], + "data": [{"name":"trex.score","storageFile":true}] + }, + { + "id": "cubescramble", + "name": "Cube Scramble", + "version":"0.04", + "description": "A random scramble generator for the 3x3 Rubik's cube with a basic timer", + "icon": "cube-scramble.png", + "tags": "", + "supports" : ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle2-cube-scramble-screenshot.png"},{"url":"bangle1-cube-scramble-screenshot.png"}], + "storage": [ + {"name":"cubescramble.app.js","url":"cube-scramble.js"}, + {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} + ] + }, + { + "id": "astroid", + "name": "Asteroids!", + "version": "0.03", + "description": "Retro asteroids game", + "icon": "asteroids.png", + "screenshots": [{"url":"screenshot_asteroids.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"astroid.app.js","url":"asteroids.js"}, + {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} + ] + }, + { + "id": "clickms", + "name": "Click Master", + "version": "0.01", + "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", + "icon": "click-master.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"clickms.app.js","url":"click-master.js"}, + {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} + ] + }, + { + "id": "horsey", + "name": "Horse Race!", + "version": "0.01", + "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", + "icon": "horse-race.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"horsey.app.js","url":"horse-race.js"}, + {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} + ] + }, + { + "id": "compass", + "name": "Compass", + "version": "0.05", + "description": "Simple compass that points North", + "icon": "compass.png", + "screenshots": [{"url":"screenshot_compass.png"}], + "tags": "tool,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"compass.app.js","url":"compass.js"}, + {"name":"compass.img","url":"compass-icon.js","evaluate":true} + ] + }, + { + "id": "gpstime", + "name": "GPS Time", + "version": "0.05", + "description": "Update the Bangle.js's clock based on the time from the GPS receiver", + "icon": "gpstime.png", + "tags": "tool,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"gpstime.app.js","url":"gpstime.js"}, + {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} + ] + }, + { + "id": "openloc", + "name": "Open Location / Plus Codes", + "shortName": "Open Location", + "version": "0.01", + "description": "Convert your current GPS location to a series of characters", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"openloc.app.js","url":"app.js"}, + {"name":"openloc.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "speedo", + "name": "Speedo", + "version": "0.05", + "description": "Show the current speed according to the GPS", + "icon": "speedo.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"speedo.app.js","url":"speedo.js"}, + {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} + ] + }, + { + "id": "gpsrec", + "name": "GPS Recorder", + "version": "0.27", + "description": "Application that allows you to record a GPS track. Can run in background", + "icon": "app.png", + "tags": "tool,outdoors,gps,widget", + "screenshots": [{"url":"screenshot.png"}], + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"gpsrec.app.js","url":"app.js"}, + {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, + {"name":"gpsrec.wid.js","url":"widget.js"}, + {"name":"gpsrec.settings.js","url":"settings.js"} + ], + "data": [{"name":"gpsrec.json"},{"wildcard":".gpsrc?","storageFile":true}] + }, + { + "id": "recorder", + "name": "Recorder (BETA)", + "shortName": "Recorder", + "version": "0.04", + "description": "Record GPS position, heart rate and more in the background, then download to your PC.", + "icon": "app.png", + "tags": "tool,outdoors,gps,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"recorder.app.js","url":"app.js"}, + {"name":"recorder.img","url":"app-icon.js","evaluate":true}, + {"name":"recorder.wid.js","url":"widget.js"}, + {"name":"recorder.settings.js","url":"settings.js"} + ], + "data": [{"name":"recorder.json"},{"wildcard":"recorder.log?.csv","storageFile":true}] + }, + { + "id": "gpsnav", + "name": "GPS Navigation", + "version": "0.05", + "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", + "icon": "icon.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"gpsnav.app.js","url":"app.min.js"}, + {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "heart", + "name": "Heart Rate Recorder", + "shortName": "HRM Record", + "version": "0.07", + "description": "Application that allows you to record your heart rate. Can run in background", + "icon": "app.png", + "tags": "tool,health,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "interface": "interface.html", + "storage": [ + {"name":"heart.app.js","url":"app.js"}, + {"name":"heart.img","url":"app-icon.js","evaluate":true}, + {"name":"heart.wid.js","url":"widget.js"} + ], + "data": [{"name":"heart.json"},{"wildcard":".heart?","storageFile":true}] + }, + { + "id": "slevel", + "name": "Spirit Level", + "version": "0.02", + "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", + "icon": "spiritlevel.png", + "tags": "tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"slevel.app.js","url":"spiritlevel.js"}, + {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} + ] + }, + { + "id": "files", + "name": "App Manager", + "version": "0.07", + "description": "Show currently installed apps, free space, and allow their deletion from the watch", + "icon": "files.png", + "tags": "tool,system,files", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"files.app.js","url":"files.js"}, + {"name":"files.img","url":"files-icon.js","evaluate":true} + ] + }, + { + "id": "weather", + "name": "Weather", + "version": "0.13", + "description": "Show Gadgetbridge weather report", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "tags": "widget,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "readme.md", + "storage": [ + {"name":"weather.app.js","url":"app.js"}, + {"name":"weather.wid.js","url":"widget.js"}, + {"name":"weather","url":"lib.js"}, + {"name":"weather.img","url":"icon.js","evaluate":true}, + {"name":"weather.settings.js","url":"settings.js"} + ], + "data": [{"name":"weather.json"}] + }, + { + "id": "chargeanim", + "name": "Charge Animation", + "version": "0.02", + "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.", + "icon": "icon.png", + "tags": "battery", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-charge-animation-screenshot.png"},{"url":"bangle-charge-animation-screenshot.png"}], + "storage": [ + {"name":"chargeanim.app.js","url":"app.js"}, + {"name":"chargeanim.boot.js","url":"boot.js"}, + {"name":"chargeanim.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "bluetoothdock", + "name": "Bluetooth Dock", + "shortName": "Dock", + "version": "0.01", + "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", + "icon": "app.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"bluetoothdock.app.js","url":"app.js"}, + {"name":"bluetoothdock.boot.js","url":"boot.js"}, + {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widbat", + "name": "Battery Level Widget", + "version": "0.09", + "description": "Show the current battery level and charging status in the top right of the clock", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbat.wid.js","url":"widget.js"} + ] + }, + { + "id": "widbatv", + "name": "Battery Level Widget (Vertical)", + "version": "0.01", + "description": "Slim, vertical battery widget that only takes up 14px", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbatv.wid.js","url":"widget.js"} + ] + }, + { + "id": "widlock", + "name": "Lock Widget", + "version": "0.03", + "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", + "icon": "widget.png", + "type": "widget", + "tags": "widget,lock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widlock.wid.js","url":"widget.js"} + ] + }, + { + "id": "widbatpc", + "name": "Battery Level Widget (with percentage)", + "shortName": "Battery Widget", + "version": "0.14", + "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", + "icon": "widget.png", + "type": "widget", + "tags": "widget,battery", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widbatpc.wid.js","url":"widget.js"}, + {"name":"widbatpc.settings.js","url":"settings.js"} + ], + "data": [{"name":"widbatpc.json"}] + }, + { + "id": "widbatwarn", + "name": "Battery Warning", + "shortName": "Battery Warning", + "version": "0.02", + "description": "Show a warning when the battery runs low.", + "icon": "widget.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "widget", + "tags": "tool,battery", + "supports": ["BANGLEJS"], + "dependencies": {"notify":"type"}, + "readme": "README.md", + "storage": [ + {"name":"widbatwarn.wid.js","url":"widget.js"}, + {"name":"widbatwarn.settings.js","url":"settings.js"} + ], + "data": [{"name":"widbatwarn.json"}] + }, + { + "id": "widbt", + "name": "Bluetooth Widget", + "version": "0.07", + "description": "Show the current Bluetooth connection status in the top right of the clock", + "icon": "widget.png", + "type": "widget", + "tags": "widget,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbt.wid.js","url":"widget.js"} + ] + }, + { + "id": "widchime", + "name": "Hour Chime", + "version": "0.02", + "description": "Buzz or beep on every whole hour.", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widchime.wid.js","url":"widget.js"}, + {"name":"widchime.settings.js","url":"settings.js"} + ], + "data": [{"name":"widchime.json"}] + }, + { + "id": "widram", + "name": "RAM Widget", + "shortName": "RAM Widget", + "version": "0.01", + "description": "Display your Bangle's available RAM percentage in a widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widram.wid.js","url":"widget.js"} + ] + }, + { + "id": "hrm", + "name": "Heart Rate Monitor", + "version": "0.06", + "description": "Measure your heart rate and see live sensor data", + "icon": "heartrate.png", + "tags": "health", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"hrm.app.js","url":"heartrate.js"}, + {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} + ] + }, + { + "id": "widhrm", + "name": "Simple Heart Rate widget", + "version": "0.05", + "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", + "icon": "widget.png", + "type": "widget", + "tags": "health,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widhrm.wid.js","url":"widget.js"} + ] + }, + { + "id": "bthrm", + "name": "Bluetooth Heart Rate Monitor", + "shortName": "BT HRM", + "version": "0.01", + "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", + "icon": "app.png", + "type": "boot", + "tags": "health,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"bthrm.boot.js","url":"boot.js"}, + {"name":"bthrm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "stetho", + "name": "Stethoscope", + "version": "0.01", + "description": "Hear your heart rate", + "icon": "stetho.png", + "tags": "health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"stetho.app.js","url":"stetho.js"}, + {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} + ] + }, + { + "id": "swatch", + "name": "Stopwatch", + "version": "0.07", + "description": "Simple stopwatch with Lap Time logging to a JSON file", + "icon": "stopwatch.png", + "tags": "health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-stopwatch-screenshot.png"}], + "storage": [ + {"name":"swatch.app.js","url":"stopwatch.js"}, + {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} + ] + }, + { + "id": "hidmsic", + "name": "Bluetooth Music Controls", + "shortName": "Music Control", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", + "icon": "hid-music.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidmsic.app.js","url":"hid-music.js"}, + {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} + ] + }, + { + "id": "hidkbd", + "name": "Bluetooth Keyboard", + "shortName": "Bluetooth Kbd", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", + "icon": "hid-keyboard.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, + {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} + ] + }, + { + "id": "hidbkbd", + "name": "Binary Bluetooth Keyboard", + "shortName": "Binary BT Kbd", + "version": "0.02", + "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", + "icon": "hid-binary-keyboard.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, + {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} + ] + }, + { + "id": "animals", + "name": "Animals Game", + "version": "0.01", + "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", + "icon": "animals.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"animals.app.js","url":"animals.js"}, + {"name":"animals.img","url":"animals-icon.js","evaluate":true}, + {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, + {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, + {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, + {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, + {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, + {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, + {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, + {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} + ] + }, + { + "id": "qrcode", + "name": "Custom QR Code", + "version": "0.04", + "description": "Use this to upload a customised QR code to Bangle.js", + "icon": "app.png", + "tags": "qrcode", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "customConnect": true, + "storage": [ + {"name":"qrcode.app.js"}, + {"name":"qrcode.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "beer", + "name": "Beer Compass", + "version": "0.01", + "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"beer.app.js"}, + {"name":"beer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "route", + "name": "Route Viewer", + "version": "0.02", + "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [ + {"name":"route.app.js"}, + {"name":"route.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ncstart", + "name": "NCEU Startup", + "version": "0.06", + "description": "NodeConfEU 2019 'First Start' Sequence", + "icon": "start.png", + "tags": "start,welcome", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncstart.app.js","url":"start.js"}, + {"name":"ncstart.boot.js","url":"boot.js"}, + {"name":"ncstart.settings.js","url":"settings.js"}, + {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, + {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, + {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, + {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, + {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, + {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} + ], + "data": [{"name":"ncstart.json"}] + }, + { + "id": "ncfrun", + "name": "NCEU 5K Fun Run", + "version": "0.01", + "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", + "icon": "nceu-funrun.png", + "tags": "health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, + {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} + ] + }, + { + "id": "widnceu", + "name": "NCEU Logo Widget", + "version": "0.02", + "description": "Show the NodeConf EU logo in the top left", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widnceu.wid.js","url":"widget.js"} + ] + }, + { + "id": "sclock", + "name": "Simple Clock", + "version": "0.07", + "description": "A Simple Digital Clock", + "icon": "clock-simple.png", + "screenshots": [{"url":"screenshot_simplec.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"sclock.app.js","url":"clock-simple.js"}, + {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} + ] + }, + { + "id": "s7clk", + "name": "Simple 7 segment Clock", + "version": "0.03", + "description": "A simple 7 segment Clock with date", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_s7segment.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"s7clk.app.js","url":"app.js"}, + {"name":"s7clk.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "vibrclock", + "name": "Vibrate Clock", + "version": "0.03", + "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-vibrate-clock-screenshot.png"}], + "storage": [ + {"name":"vibrclock.app.js","url":"app.js"}, + {"name":"vibrclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "svclock", + "name": "Simple V-Clock", + "version": "0.04", + "description": "Modification of Simple Clock 0.04 to use Vectorfont", + "icon": "vclock-simple.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-simple-v-clock-screenshot.png"}], + "storage": [ + {"name":"svclock.app.js","url":"vclock-simple.js"}, + {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true} + ] + }, + { + "id": "dclock", + "name": "Dev Clock", + "version": "0.10", + "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", + "icon": "clock-dev.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-dev-clock-screenshot.png"},{"url":"bangle1-dev-clock-screenshot.png"}], + "storage": [ + {"name":"dclock.app.js","url":"clock-dev.js"}, + {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} + ] + }, + { + "id": "gesture", + "name": "Gesture Test", + "version": "0.01", + "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", + "icon": "gesture.png", + "type": "app", + "tags": "gesture,ai", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gesture.app.js","url":"gesture.js"}, + {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, + {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, + {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} + ] + }, + { + "id": "pparrot", + "name": "Party Parrot", + "version": "0.01", + "description": "Party with a parrot on your wrist", + "icon": "party-parrot.png", + "type": "app", + "tags": "party,parrot,lol", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-party-parrot-screenshot.png"}], + "storage": [ + {"name":"pparrot.app.js","url":"party-parrot.js"}, + {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} + ] + }, + { + "id": "hrings", + "name": "Hypno Rings", + "version": "0.01", + "description": "Experiment with trippy rings, press buttons for change", + "icon": "hypno-rings.png", + "type": "app", + "tags": "rings,hypnosis,psychadelic", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-hypno-rings-screenshot.png"}], + "storage": [ + {"name":"hrings.app.js","url":"hypno-rings.js"}, + {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} + ] + }, + { + "id": "morse", + "name": "Morse Code", + "version": "0.01", + "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", + "icon": "morse-code.png", + "type": "app", + "tags": "morse,sound,visual,input", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"morse.app.js","url":"morse-code.js"}, + {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} + ] + }, + { + "id": "blescan", + "name": "BLE Scanner", + "version": "0.01", + "description": "Scan for advertising BLE devices", + "icon": "blescan.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"blescan.app.js","url":"blescan.js"}, + {"name":"blescan.img","url":"blescan-icon.js","evaluate":true} + ] + }, + { + "id": "mmonday", + "name": "Manic Monday Tone", + "version": "0.02", + "description": "The Bangles make a comeback", + "icon": "manic-monday-icon.png", + "tags": "sound", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"mmonday.app.js","url":"manic-monday.js"}, + {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} + ] + }, + { + "id": "jbells", + "name": "Jingle Bells", + "version": "0.01", + "description": "Play Jingle Bells", + "icon": "jbells.png", + "type": "app", + "tags": "sound", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"jbells.app.js","url":"jbells.js"}, + {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} + ] + }, + { + "id": "scolor", + "name": "Show Color", + "version": "0.01", + "description": "Display all available Colors and Names", + "icon": "show-color.png", + "type": "app", + "tags": "tool", + "screenshots": [{"url":"bangle1-view-color-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"scolor.app.js","url":"show-color.js"}, + {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} + ] + }, + { + "id": "miclock", + "name": "Mixed Clock", + "version": "0.05", + "description": "A mix of analog and digital Clock", + "icon": "clock-mixed.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-mixed-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"miclock.app.js","url":"clock-mixed.js"}, + {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} + ] + }, + { + "id": "bclock", + "name": "Binary Clock", + "version": "0.03", + "description": "A simple binary clock watch face", + "icon": "clock-binary.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-binary-clock-screenshot.png"}], + "storage": [ + {"name":"bclock.app.js","url":"clock-binary.js"}, + {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} + ] + }, + { + "id": "clotris", + "name": "Clock-Tris", + "version": "0.01", + "description": "A fully functional clone of a classic game of falling blocks", + "icon": "clock-tris.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-clock-tris-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"clotris.app.js","url":"clock-tris.js"}, + {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, + {"name":".trishig","url":"clock-tris-high"} + ] + }, + { + "id": "flappy", + "name": "Flappy Bird", + "version": "0.05", + "description": "A Flappy Bird game clone", + "icon": "app.png", + "screenshots": [{"url":"screenshot1_flappy.png"},{"url":"screenshot2_flappy.png"}], + "tags": "game", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"flappy.app.js","url":"app.js"}, + {"name":"flappy.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gpsinfo", + "name": "GPS Info", + "version": "0.05", + "description": "An application that displays information about altitude, lat/lon, satellites and time", + "icon": "gps-info.png", + "type": "app", + "tags": "gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"gpsinfo.app.js","url":"gps-info.js"}, + {"name":"gpsinfo.img","url":"gps-info-icon.js","evaluate":true} + ] + }, + { + "id": "assistedgps", + "name": "Assisted GPS Update (AGPS)", + "version": "0.01", + "description": "Downloads assisted GPS (AGPS) data to Bangle.js 1 for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.", + "icon": "app.png", + "type": "RAM", + "tags": "tool,outdoors,agps", + "supports": ["BANGLEJS"], + "custom": "custom.html", + "storage": [] + }, + { + "id": "pomodo", + "name": "Pomodoro", + "version": "0.02", + "description": "A simple pomodoro timer.", + "icon": "pomodoro.png", + "type": "app", + "tags": "pomodoro,cooking,tools", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-pomodoro-screenshot.png"}], + "storage": [ + {"name":"pomodo.app.js","url":"pomodoro.js"}, + {"name":"pomodo.img","url":"pomodoro-icon.js","evaluate":true} + ] + }, + { + "id": "blobclk", + "name": "Large Digit Blob Clock", + "shortName": "Blob Clock", + "version": "0.06", + "description": "A clock with big digits", + "icon": "clock-blob.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-large-digit-blob-clock-screenshot.png"},{"url":"bangle1-large-digit-blob-clock-screenshot.png"}], + "storage": [ + {"name":"blobclk.app.js","url":"clock-blob.js"}, + {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} + ] + }, + { + "id": "boldclk", + "name": "Bold Clock", + "version": "0.05", + "description": "Simple, readable and practical clock", + "icon": "bold_clock.png", + "screenshots": [{"url":"screenshot_bold.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"boldclk.app.js","url":"bold_clock.js"}, + {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} + ] + }, + { + "id": "widclk", + "name": "Digital clock widget", + "version": "0.06", + "description": "A simple digital clock widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget,clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widclk.wid.js","url":"widget.js"} + ] + }, + { + "id": "widpedom", + "name": "Pedometer widget", + "version": "0.19", + "description": "Daily pedometer widget", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widpedom.wid.js","url":"widget.js"}, + {"name":"widpedom.settings.js","url":"settings.js"} + ] + }, + { + "id": "berlinc", + "name": "Berlin Clock", + "version": "0.05", + "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", + "icon": "berlin-clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"berlin-clock-screenshot.png"}], + "storage": [ + {"name":"berlinc.app.js","url":"berlin-clock.js"}, + {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} + ] + }, + { + "id": "ctrclk", + "name": "Centerclock", + "version": "0.03", + "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-center-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"ctrclk.app.js","url":"app.js"}, + {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "demoapp", + "name": "Demo Loop", + "version": "0.02", + "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", + "icon": "app.png", + "type": "app", + "tags": "", + "screenshots": [{"url":"bangle1-demo-loop-screenshot1.png"},{"url":"bangle1-demo-loop-screenshot2.png"},{"url":"bangle1-demo-loop-screenshot3.png"},{"url":"bangle1-demo-loop-screenshot4.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"demoapp.app.js","url":"app.js"}, + {"name":"demoapp.img","url":"app-icon.js","evaluate":true} + ], + "sortorder": -9 + }, + { + "id": "flagrse", + "name": "Espruino Flag Raiser", + "version": "0.01", + "description": "App to send a command to another Espruino to cause it to raise a flag", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"flagrse.app.js","url":"app.js"}, + {"name":"flagrse.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pipboy", + "name": "Pipboy", + "version": "0.04", + "description": "Pipboy themed clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-pipboy-themed-clock-screenshot.png"}], + "storage": [ + {"name":"pipboy.app.js","url":"app.js"}, + {"name":"pipboy.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "torch", + "name": "Torch", + "shortName": "Torch", + "version": "0.02", + "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", + "icon": "app.png", + "tags": "tool,torch", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"torch.app.js","url":"app.js"}, + {"name":"torch.wid.js","url":"widget.js"}, + {"name":"torch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rtorch", + "name": "Red Torch", + "shortName": "RedTorch", + "version": "0.02", + "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", + "icon": "app.png", + "tags": "tool,torch", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"rtorch.app.js","url":"app.js"}, + {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]}, + {"name":"rtorch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "wohrm", + "name": "Workout HRM", + "version": "0.08", + "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", + "icon": "app.png", + "type": "app", + "tags": "hrm,workout", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], + "storage": [ + {"name":"wohrm.app.js","url":"app.js"}, + {"name":"wohrm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widid", + "name": "Bluetooth ID Widget", + "version": "0.03", + "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", + "icon": "widget.png", + "type": "widget", + "tags": "widget,address,mac", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widid.wid.js","url":"widget.js"} + ] + }, + { + "id": "grocery", + "name": "Grocery", + "version": "0.02", + "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", + "icon": "grocery.png", + "type": "app", + "tags": "tool,outdoors,shopping,list", + "supports": ["BANGLEJS"], + "custom": "grocery.html", + "storage": [ + {"name":"grocery.app.js","url":"app.js"}, + {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} + ] + }, + { + "id": "marioclock", + "name": "Mario Clock", + "version": "0.15", + "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", + "icon": "marioclock.png", + "type": "clock", + "tags": "clock,mario,retro", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "screenshots": [{"url":"bangle1-mario-clock-screenshot.png"}], + "storage": [ + {"name":"marioclock.app.js","url":"marioclock-app.js"}, + {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} + ] + }, + { + "id": "cliock", + "name": "Commandline-Clock", + "shortName": "CLI-Clock", + "version": "0.15", + "description": "Simple CLI-Styled Clock", + "icon": "app.png", + "screenshots": [{"url":"screenshot_cli.png"}], + "type": "clock", + "tags": "clock,cli,command,bash,shell", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"cliock.app.js","url":"app.js"}, + {"name":"cliock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widver", + "name": "Firmware Version Widget", + "version": "0.03", + "description": "Display the version of the installed firmware in the top widget section.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widver.wid.js","url":"widget.js"} + ] + }, + { + "id": "barclock", + "name": "Bar Clock", + "version": "0.09", + "description": "A simple digital clock showing seconds as a bar", + "icon": "clock-bar.png", + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"barclock.app.js","url":"clock-bar.js"}, + {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} + ] + }, + { + "id": "dotclock", + "name": "Dot Clock", + "version": "0.03", + "description": "A Minimal Dot Analog Clock", + "icon": "clock-dot.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle2-dot-clcok-screenshot.png"},{"url":"bangle1-dot-clock-screenshot.png"}], + "storage": [ + {"name":"dotclock.app.js","url":"clock-dot.js"}, + {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} + ] + }, + { + "id": "widtbat", + "name": "Tiny Battery Widget", + "version": "0.02", + "description": "Tiny blueish battery widget, vibs and changes level color when charging", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widtbat.wid.js","url":"widget.js"} + ] + }, + { + "id": "chrono", + "name": "Chrono", + "shortName": "Chrono", + "version": "0.01", + "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", + "icon": "chrono.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"chrono.app.js","url":"chrono.js"}, + {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} + ] + }, + { + "id": "astrocalc", + "name": "Astrocalc", + "version": "0.02", + "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", + "icon": "astrocalc.png", + "tags": "app,sun,moon,cycles,tool,outdoors", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, + {"name":"suncalc.js","url":"suncalc.js"}, + {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, + {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, + {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, + {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, + {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, + {"name":"full.img","url":"full-icon.js","evaluate":true}, + {"name":"new.img","url":"new-icon.js","evaluate":true}, + {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, + {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} + ] + }, + { + "id": "widhwt", + "name": "Hand Wash Timer", + "version": "0.01", + "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widhwt.wid.js","url":"widget.js"} + ] + }, + { + "id": "toucher", + "name": "Touch Launcher", + "shortName": "Toucher", + "version": "0.07", + "description": "Touch enable left to right launcher.", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"toucher.app.js","url":"app.js"}, + {"name":"toucher.settings.js","url":"settings.js"} + ], + "data": [{"name":"toucher.json"}] + }, + { + "id": "balltastic", + "name": "Balltastic", + "version": "0.02", + "description": "Simple but fun ball eats dots game.", + "icon": "app.png", + "type": "app", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"balltastic.app.js","url":"app.js"}, + {"name":"balltastic.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rpgdice", + "name": "RPG dice", + "version": "0.02", + "description": "Simple RPG dice rolling app.", + "icon": "rpgdice.png", + "type": "app", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-rpg-dice-screenshot.png"}], + "storage": [ + {"name":"rpgdice.app.js","url":"app.js"}, + {"name":"rpgdice.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widmp", + "name": "Moon Phase Widget", + "version": "0.02", + "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widmp.wid.js","url":"widget.js"} + ] + }, + { + "id": "widmpsh", + "name": "Moon Phase Widget Southern Hemisphere", + "version": "0.01", + "description": "Display the current moon phase in blueish for the southern hemisphere in eight phases", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widmpsh.wid.js","url":"widget.js"} + ] + }, + { + "id": "minionclk", + "name": "Minion clock", + "version": "0.05", + "description": "Minion themed clock.", + "icon": "minionclk.png", + "type": "clock", + "tags": "clock,minion", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-minion-clock-screenshot.png"}], + "storage": [ + {"name":"minionclk.app.js","url":"app.js"}, + {"name":"minionclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "openstmap", + "name": "OpenStreetMap", + "shortName": "OpenStMap", + "version": "0.11", + "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", + "icon": "app.png", + "tags": "outdoors,gps,osm", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "custom": "custom.html", + "customConnect": true, + "storage": [ + {"name":"openstmap","url":"openstmap.js"}, + {"name":"openstmap.app.js","url":"app.js"}, + {"name":"openstmap.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "activepedom", + "name": "Active Pedometer", + "shortName": "Active Pedometer", + "version": "0.09", + "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", + "icon": "app.png", + "tags": "outdoors,widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"activepedom.wid.js","url":"widget.js"}, + {"name":"activepedom.settings.js","url":"settings.js"}, + {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, + {"name":"activepedom.app.js","url":"app.js"} + ] + }, + { + "id": "chronowid", + "name": "Chrono Widget", + "shortName": "Chrono Widget", + "version": "0.04", + "description": "Chronometer (timer) which runs as widget.", + "icon": "app.png", + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"chronowid.wid.js","url":"widget.js"}, + {"name":"chronowid.app.js","url":"app.js"}, + {"name":"chronowid.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "tabata", + "name": "Tabata", + "shortName": "Tabata - Control High-Intensity Interval Training", + "version": "0.01", + "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", + "icon": "tabata.png", + "tags": "workout,health", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"tabata.app.js","url":"tabata.js"}, + {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} + ] + }, + { + "id": "custom", + "name": "Custom Boot Code ", + "version": "0.01", + "description": "Add code you want to run at boot time", + "icon": "custom.png", + "type": "bootloader", + "tags": "tool,system", + "supports": ["BANGLEJS","BANGLEJS2"], + "custom": "custom.html", + "storage": [ + {"name":"custom"} + ] + }, + { + "id": "devstopwatch", + "name": "Dev Stopwatch", + "shortName": "Dev Stopwatch", + "version": "0.03", + "description": "Stopwatch with 5 laps supported (cyclically replaced)", + "icon": "app.png", + "tags": "stopwatch,chrono,timer,chronometer", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"bangle1-dev-stopwatch-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"devstopwatch.app.js","url":"app.js"}, + {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "batchart", + "name": "Battery Chart", + "shortName": "Battery Chart", + "version": "0.10", + "description": "A widget and an app for recording and visualizing battery percentage over time.", + "icon": "app.png", + "tags": "app,widget,battery,time,record,chart,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"batchart.wid.js","url":"widget.js"}, + {"name":"batchart.app.js","url":"app.js"}, + {"name":"batchart.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "nato", + "name": "NATO Alphabet", + "shortName": "NATOAlphabet", + "version": "0.01", + "description": "Learn the NATO Phonetic alphabet plus some numbers.", + "icon": "nato.png", + "type": "app", + "tags": "app,learn,visual", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-NATO-alphabet-screenshot.png"},{"url":"bangle1-NATO-alphabet-screenshot2.png"}], + "storage": [ + {"name":"nato.app.js","url":"nato.js"}, + {"name":"nato.img","url":"nato-icon.js","evaluate":true} + ] + }, + { + "id": "numerals", + "name": "Numerals Clock", + "shortName": "Numerals Clock", + "version": "0.10", + "description": "A simple big numerals clock", + "icon": "numerals.png", + "type": "clock", + "tags": "numerals,clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-numerals-screenshot.png"}], + "storage": [ + {"name":"numerals.app.js","url":"numerals.app.js"}, + {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, + {"name":"numerals.settings.js","url":"numerals.settings.js"} + ], + "data": [{"name":"numerals.json"}] + }, + { + "id": "bledetect", + "name": "BLE Detector", + "shortName": "BLE Detector", + "version": "0.03", + "description": "Detect BLE devices and show some informations.", + "icon": "bledetect.png", + "tags": "app,bluetooth,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"bledetect.app.js","url":"bledetect.js"}, + {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} + ] + }, + { + "id": "snake", + "name": "Snake", + "shortName": "Snake", + "version": "0.02", + "description": "The classic snake game. Eat apples and don't bite your tail.", + "icon": "snake.png", + "tags": "game,fun", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"snake.app.js","url":"snake.js"}, + {"name":"snake.img","url":"snake-icon.js","evaluate":true} + ] + }, + { "id": "snek", + "name": "The snek game", + "shortName":"Snek", + "version": "0.02", + "description": "A snek game where you control a snek to eat all the apples!", + "screenshots": [{"url":"screenshot_snek.png"}], + "icon": "snek.png", + "supports": ["BANGLEJS2"], + "tags": "game,fun", + "storage": [ + {"name":"snek.app.js","url":"snek.js"}, + {"name":"snek.img","url":"snek.icon.js","evaluate":true} + ] + }, + { + "id": "calculator", + "name": "Calculator", + "shortName": "Calculator", + "version": "0.04", + "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", + "icon": "calculator.png", + "screenshots": [{"url":"screenshot_calculator.png"}], + "tags": "app,tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"calculator.app.js","url":"app.js"}, + {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} + ] + }, + { + "id": "dane", + "name": "Digital Assistant, not EDITH", + "shortName": "DANE", + "version": "0.16", + "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"dane.app.js","url":"app.js"}, + {"name":"dane.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "dane_tcr", + "name": "DANE Touch Launcher", + "shortName": "DANE Toucher", + "version": "0.07", + "description": "Touch enable left to right launcher in the style of the DANE Watchface", + "icon": "app.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"dane_tcr.app.js","url":"app.js"}, + {"name":"dane_tcr.settings.js","url":"settings.js"} + ], + "data": [{"name":"dane_tcr.json"}] + }, + { + "id": "buffgym", + "name": "BuffGym", + "version": "0.02", + "description": "BuffGym is the famous 5x5 workout program for the BangleJS", + "icon": "buffgym.png", + "type": "app", + "tags": "tool,outdoors,gym,exercise", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "buffgym.html", + "allow_emulator": false, + "storage": [ + {"name":"buffgym.app.js","url":"buffgym.app.js"}, + {"name":"buffgym-set.js","url":"buffgym-set.js"}, + {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, + {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, + {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, + {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, + {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, + {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} + ] + }, + { + "id": "banglerun", + "name": "BangleRun", + "shortName": "BangleRun", + "version": "0.10", + "description": "An app for running sessions. Displays info and logs your run for later viewing.", + "icon": "banglerun.png", + "tags": "run,running,fitness,outdoors", + "supports": ["BANGLEJS"], + "interface": "interface.html", + "allow_emulator": false, + "storage": [ + {"name":"banglerun.app.js","url":"app.js"}, + {"name":"banglerun.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "metronome", + "name": "Metronome", + "version": "0.07", + "readme": "README.md", + "description": "Makes the watch blinking and vibrating with a given rate", + "icon": "metronome_icon.png", + "tags": "tool", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-metronome-screenshot.png"}], + "storage": [ + {"name":"metronome.app.js","url":"metronome.js"}, + {"name":"metronome.img","url":"metronome-icon.js","evaluate":true}, + {"name":"metronome.settings.js","url":"settings.js"} + ] + }, + { + "id": "blackjack", + "name": "Black Jack game", + "shortName": "Black Jack game", + "version": "0.02", + "description": "Simple implementation of card game Black Jack", + "icon": "blackjack.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-black-jack-game-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"blackjack.app.js","url":"blackjack.app.js"}, + {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} + ] + }, + { + "id": "hidcam", + "name": "Camera shutter", + "shortName": "Cam shutter", + "version": "0.03", + "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", + "icon": "app.png", + "tags": "bluetooth,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hidcam.app.js","url":"app.js"}, + {"name":"hidcam.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "swlclk", + "name": "SWL Clock / Short Wave Listner Clock", + "shortName": "SWL Clock", + "version": "0.02", + "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies", + "icon": "swlclk.png", + "type": "clock", + "tags": "tool,clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-SWL-clock-screenshot.png"}], + "storage": [ + {"name":"swlclk.app.js","url":"app.js"}, + {"name":"swlclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "rclock", + "name": "Round clock with seconds, minutes and date", + "shortName": "Round Clock", + "version": "0.06", + "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"rclock.app.js","url":"rclock.app.js"}, + {"name":"rclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "fclock", + "name": "fclock", + "shortName": "F Clock", + "version": "0.02", + "description": "Simple design of a digital clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"fclock.app.js","url":"fclock.app.js"}, + {"name":"fclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hamloc", + "name": "QTH Locator / Maidenhead Locator System", + "shortName": "QTH Locator", + "version": "0.01", + "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hamloc.app.js","url":"app.js"}, + {"name":"hamloc.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "osmpoi", + "name": "POI Compass", + "version": "0.03", + "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", + "icon": "app.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"osmpoi.app.js"}, + {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pong", + "name": "Pong", + "shortName": "Pong", + "version": "0.03", + "description": "A clone of the Atari game Pong", + "icon": "pong.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-pong-screenshot.png"}], + "storage": [ + {"name":"pong.app.js","url":"app.js"}, + {"name":"pong.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ballmaze", + "name": "Ball Maze", + "version": "0.02", + "description": "Navigate a ball through a maze by tilting your watch.", + "icon": "icon.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"ballmaze.app.js","url":"app.js"}, + {"name":"ballmaze.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"ballmaze.json"}] + }, + { + "id": "calendar", + "name": "Calendar", + "version": "0.03", + "description": "Simple calendar", + "icon": "calendar.png", + "screenshots": [{"url":"screenshot_calendar.png"}], + "tags": "calendar", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"calendar.app.js","url":"calendar.js"}, + {"name":"calendar.settings.js","url":"settings.js"}, + {"name":"calendar.img","url":"calendar-icon.js","evaluate":true} + ], + "data": [{"name":"calendar.json"}] + }, + { + "id": "hidjoystick", + "name": "Bluetooth Joystick", + "shortName": "Joystick", + "version": "0.01", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", + "icon": "app.png", + "tags": "bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hidjoystick.app.js","url":"app.js"}, + {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "largeclock", + "name": "Large Clock", + "version": "0.10", + "description": "A readable and informational digital watch, with date, seconds and moon phase", + "icon": "largeclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-large-clock-screenshot.png"}], + "storage": [ + {"name":"largeclock.app.js","url":"largeclock.js"}, + {"name":"largeclock.img","url":"largeclock-icon.js","evaluate":true}, + {"name":"largeclock.settings.js","url":"settings.js"} + ], + "data": [{"name":"largeclock.json"}] + }, + { + "id": "smtswch", + "name": "Smart Switch", + "shortName": "Smart Switch", + "version": "0.01", + "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", + "icon": "app.png", + "type": "app", + "tags": "bluetooth,btle,smart,switch", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"smtswch.app.js","url":"app.js"}, + {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, + {"name":"light-on.img","url":"light-on.js","evaluate":true}, + {"name":"light-off.img","url":"light-off.js","evaluate":true}, + {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, + {"name":"switch-off.img","url":"switch-off.js","evaluate":true} + ] + }, + { + "id": "miplant", + "name": "Xiaomi Plant Sensor", + "shortName": "Mi Plant", + "version": "0.02", + "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors", + "icon": "app.png", + "tags": "xiaomi,mi,plant,ble,bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"miplant.app.js","url":"app.js"}, + {"name":"miplant.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "simpletimer", + "name": "Timer", + "version": "0.07", + "description": "Simple timer, useful when playing board games or cooking", + "icon": "app.png", + "tags": "timer", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-timer-screenshot.png"}], + "storage": [ + {"name":"simpletimer.app.js","url":"app.js"}, + {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, + {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, + {"name":"simpletimer.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"simpletimer.json"}] + }, + { + "id": "beebclock", + "name": "Beeb Clock", + "version": "0.05", + "description": "Clock face that may be coincidentally familiar to BBC viewers", + "icon": "beebclock.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-beeb-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"beebclock.app.js","url":"beebclock.js"}, + {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} + ] + }, + { + "id": "findphone", + "name": "Find Phone", + "shortName": "Find Phone", + "version": "0.03", + "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.", + "icon": "app.png", + "tags": "tool,android", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"findphone.app.js","url":"app.js"}, + {"name":"findphone.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "getup", + "name": "Get Up", + "shortName": "Get Up", + "version": "0.01", + "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!", + "icon": "app.png", + "tags": "tools,health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "screenshots": [{"url":"bangle1-get-up-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"getup.app.js","url":"app.js"}, + {"name":"getup.settings.js","url":"settings.js"}, + {"name":"getup.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gallifr", + "name": "Time Traveller's Chronometer", + "shortName": "Time Travel Clock", + "version": "0.02", + "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", + "icon": "gallifr.png", + "screenshots": [{"url":"screenshot_time.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"gallifr.app.js","url":"app.js"}, + {"name":"gallifr.img","url":"app-icon.js","evaluate":true}, + {"name":"gallifr.settings.js","url":"settings.js"} + ], + "data": [{"name":"gallifr.json"}] + }, + { + "id": "rndmclk", + "name": "Random Clock Loader", + "version": "0.03", + "description": "Load a different clock whenever the LCD is switched on.", + "icon": "rndmclk.png", + "type": "widget", + "tags": "widget,clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"rndmclk.wid.js","url":"widget.js"} + ] + }, + { + "id": "dotmatrixclock", + "name": "Dotmatrix Clock", + "version": "0.01", + "description": "A clear white-on-blue dotmatrix simulated clock", + "icon": "dotmatrixclock.png", + "type": "clock", + "tags": "clock,dotmatrix,retro", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"dotmatrixclock.app.js","url":"app.js"}, + {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true} + ] + }, + { + "id": "jbm8b", + "name": "Magic 8 Ball", + "shortName": "Magic 8 Ball", + "version": "0.03", + "description": "A simple fortune telling app", + "icon": "app.png", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"jbm8b.app.js","url":"app.js"}, + {"name":"jbm8b.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "jbm8b_IT", + "name": "Magic 8 Ball Italiano", + "shortName": "Magic 8 Ball IT", + "version": "0.01", + "description": "La palla predice il futuro", + "icon": "app.png", + "screenshots": [{"url":"bangle1-magic-8-ball-italiano-screenshot.png"}], + "tags": "game", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"jbm8b_IT.app.js","url":"app.js"}, + {"name":"jbm8b_IT.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "BLEcontroller", + "name": "BLE Customisable Controller with Joystick", + "shortName": "BLE Controller", + "version": "0.01", + "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.", + "icon": "BLEcontroller.png", + "tags": "tool,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "storage": [ + {"name":"BLEcontroller.app.js","url":"app.js"}, + {"name":"BLEcontroller.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widviz", + "name": "Widget Visibility Widget", + "shortName": "Viz Widget", + "version": "0.03", + "description": "Swipe left to hide top bar widgets, swipe right to redisplay.", + "icon": "eye.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widviz.wid.js","url":"widget.js"} + ] + }, + { + "id": "binclock", + "name": "Binary Clock", + "shortName": "Binary Clock", + "version": "0.03", + "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.", + "icon": "app.png", + "type": "clock", + "tags": "clock,binary", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"binclock.app.js","url":"app.js"}, + {"name":"binclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "pizzatimer", + "name": "Pizza Timer", + "shortName": "Pizza Timer", + "version": "0.01", + "description": "A timer app for when you cook Pizza. Some say it can also time other things", + "icon": "pizza.png", + "tags": "timer,tool,pizza", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"pizzatimer.app.js","url":"app.js"}, + {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "animclk", + "name": "Animated Clock", + "shortName": "Anim Clock", + "version": "0.03", + "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", + "icon": "app.png", + "type": "clock", + "tags": "clock,animated", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"animclk.app.js","url":"app.js"}, + {"name":"animclk.pixels1","url":"animclk.pixels1"}, + {"name":"animclk.pixels2","url":"animclk.pixels2"}, + {"name":"animclk.pal","url":"animclk.pal"}, + {"name":"animclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "analogimgclk", + "name": "Analog Clock (Image background)", + "shortName": "Analog Clock", + "version": "0.03", + "description": "An analog clock with an image background", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"analogimgclk.app.js","url":"app.js"}, + {"name":"analogimgclk.bg.img","url":"bg.img"}, + {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "verticalface", + "name": "Vertical watch face", + "shortName": "Vertical Face", + "version": "0.09", + "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "screenshots": [{"url":"bangle1-vertical-watch-face-screenshot.png"}], + "storage": [ + {"name":"verticalface.app.js","url":"app.js"}, + {"name":"verticalface.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "sleepphasealarm", + "name": "SleepPhaseAlarm", + "shortName": "SleepPhaseAlarm", + "version": "0.02", + "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", + "icon": "app.png", + "tags": "alarm", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"sleepphasealarm.app.js","url":"app.js"}, + {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "life", + "name": "Game of Life", + "version": "0.04", + "description": "Conway's Game of Life - 16x16 board", + "icon": "life.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-game-of-life-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"life.app.js","url":"life.min.js"}, + {"name":"life.img","url":"life-icon.js","evaluate":true} + ] + }, + { + "id": "magnav", + "name": "Navigation Compass", + "version": "0.05", + "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", + "screenshots": [{"url":"screenshot-b2.png"},{"url":"screenshot-light-b2.png"}], + "icon": "magnav.png", + "tags": "tool,outdoors", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"magnav.app.js","url":"magnav_b1.js","supports":["BANGLEJS"]}, + {"name":"magnav.app.js","url":"magnav_b2.js","supports":["BANGLEJS2"]}, + {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} + ], + "data": [{"name":"magnav.json"}] + }, + { + "id": "gpspoilog", + "name": "GPS POI Logger", + "shortName": "GPS POI Log", + "version": "0.01", + "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial", + "icon": "app.png", + "tags": "outdoors", + "supports": ["BANGLEJS"], + "interface": "interface.html", + "storage": [ + {"name":"gpspoilog.app.js","url":"app.js"}, + {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "miclock2", + "name": "Mixed Clock 2", + "version": "0.01", + "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", + "icon": "clock-mixed.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-mixed-clock-2-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"miclock2.app.js","url":"clock-mixed.js"}, + {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} + ] + }, + { + "id": "1button", + "name": "One-Button-Tracker", + "version": "0.01", + "description": "A widget that turns BTN1 into a tracker, records time of button press/release.", + "icon": "widget.png", + "type": "widget", + "tags": "tool,quantifiedself,widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"1button.wid.js","url":"widget.js"} + ], + "data": [{"name":"one_button_presses.csv","storageFile":true}] + }, + { + "id": "gpsautotime", + "name": "GPS auto time", + "shortName": "GPS auto time", + "version": "0.01", + "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", + "icon": "widget.png", + "type": "widget", + "tags": "widget,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gpsautotime.wid.js","url":"widget.js"} + ] + }, + { + "id": "espruinoctrl", + "name": "Espruino Control", + "shortName": "Espruino Ctrl", + "version": "0.01", + "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"espruinoctrl.app.js"}, + {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "multiclock", + "name": "Multi Clock", + "version": "0.09", + "description": "Clock with multiple faces. Switch between faces with BTN1 & BTN3 (Bangle 2 touch top-right, bottom right). For best display set theme Background 2 to cyan or some other bright colour in settings.", + "screenshots": [{"url":"screen-ana.png"},{"url":"screen-big.png"},{"url":"screen-td.png"},{"url":"screen-nifty.png"},{"url":"screen-word.png"},{"url":"screen-sec.png"}], + "icon": "multiclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"multiclock.app.js","url":"multiclock.app.js"}, + {"name":"big.face.js","url":"big.face.js"}, + {"name":"ana.face.js","url":"ana.face.js"}, + {"name":"digi.face.js","url":"digi.face.js"}, + {"name":"txt.face.js","url":"txt.face.js"}, + {"name":"dk.face.js","url":"dk.face.js"}, + {"name":"nifty.face.js","url":"nifty.face.js"}, + {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} + ] + }, + { + "id": "widancs", + "name": "Apple Notification Widget", + "shortName": "ANCS Widget", + "version": "0.07", + "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"widancs.wid.js","url":"ancs.min.js"}, + {"name":"widancs.settings.js","url":"settings.js"} + ] + }, + { + "id": "accelrec", + "name": "Acceleration Recorder", + "shortName": "Accel Rec", + "version": "0.02", + "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"accelrec.app.js","url":"app.js"}, + {"name":"accelrec.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"wildcard":"accelrec.?.csv"}] + }, + { + "id": "accellog", + "name": "Acceleration Logger", + "shortName": "Accel Log", + "version": "0.03", + "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", + "icon": "app.png", + "tags": "outdoor", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"accellog.app.js","url":"app.js"}, + {"name":"accellog.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"wildcard":"accellog.?.csv"}] + }, + { + "id": "cprassist", + "name": "CPR Assist", + "version": "0.01", + "description": "Provides assistance while performing a CPR", + "icon": "cprassist-icon.png", + "tags": "tool,firstaid", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], + "storage": [ + {"name":"cprassist.app.js","url":"cprassist.js"}, + {"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true}, + {"name":"cprassist.settings.js","url":"settings.js"} + ] + }, + { + "id": "osgridref", + "name": "Ordnance Survey Grid Reference", + "shortName": "OS Grid ref", + "version": "0.01", + "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", + "icon": "app.png", + "tags": "outdoors,gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"osgridref.app.js","url":"app.js"}, + {"name":"osgridref.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "openseizure", + "name": "OpenSeizureDetector Widget", + "shortName": "Short Name", + "version": "0.01", + "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"openseizure.wid.js","url":"widget.js"} + ] + }, + { + "id": "counter", + "name": "Counter", + "version": "0.03", + "description": "Simple counter", + "icon": "counter_icon.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-counter-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"counter.app.js","url":"counter.js"}, + {"name":"counter.img","url":"counter-icon.js","evaluate":true} + ] + }, + { + "id": "bootgattbat", + "name": "BLE GATT Battery Service", + "shortName": "BLE Battery Service", + "version": "0.01", + "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n", + "icon": "bluetooth.png", + "type": "bootloader", + "tags": "battery,ble,bluetooth,gatt", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"gattbat.boot.js","url":"boot.js"} + ] + }, + { + "id": "viewstl", + "name": "STL file viewer", + "shortName": "ViewSTL", + "version": "0.02", + "description": "This app allows you to view STL 3D models on your watch", + "icon": "icons8-octahedron-48.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"viewstl.app.js","url":"viewstl.min.js"}, + {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, + {"name":"tetra.stl","url":"tetra.stl"}, + {"name":"cube.stl","url":"cube.stl"}, + {"name":"icosa.stl","url":"icosa.stl"} + ] + }, + { + "id": "cscsensor", + "name": "Cycling speed sensor", + "shortName": "CSCSensor", + "version": "0.06", + "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch", + "icon": "icons8-cycling-48.png", + "tags": "outdoors,exercise,ble,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"cscsensor.app.js","url":"cscsensor.app.js"}, + {"name":"cscsensor.settings.js","url":"settings.js"}, + {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true} + ] + }, + { + "id": "fileman", + "name": "File manager", + "shortName": "FileManager", + "version": "0.03", + "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", + "icon": "icons8-filing-cabinet-48.png", + "tags": "tools", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"fileman.app.js","url":"fileman.app.js"}, + {"name":"fileman.img","url":"fileman-icon.js","evaluate":true} + ] + }, + { + "id": "worldclock", + "name": "World Clock - 4 time zones", + "shortName": "World Clock", + "version": "0.05", + "description": "Current time zone plus up to four others", + "icon": "app.png", + "screenshots": [{"url":"screenshot_world.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "custom": "custom.html", + "storage": [ + {"name":"worldclock.app.js","url":"app.js"}, + {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true} + ], + "data": [{"name":"worldclock.settings.json"}] + }, + { + "id": "digiclock", + "name": "Digital Clock Face", + "shortName": "Digi Clock", + "version": "0.02", + "description": "A simple digital clock with the time, day, month, and year", + "icon": "digiclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"digiclock.app.js","url":"digiclock.js"}, + {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true} + ] + }, + { + "id": "dsdrelay", + "name": "DSD BLE Relay controller", + "shortName": "DSDRelay", + "version": "0.01", + "description": "Control BLE relay board from the watch", + "icon": "icons8-relay-48.png", + "tags": "ble,bluetooth", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"}, + {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true} + ] + }, + { + "id": "mandel", + "name": "Mandelbrot", + "shortName": "Mandel", + "version": "0.01", + "description": "Draw a zoomable Mandelbrot set", + "icon": "mandel.png", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mandel.app.js","url":"mandel.min.js"}, + {"name":"mandel.img","url":"mandel-icon.js","evaluate":true} + ] + }, + { + "id": "petrock", + "name": "Pet rock", + "version": "0.02", + "description": "A virtual pet rock with wobbly eyes", + "icon": "petrock.png", + "type": "app", + "tags": "game", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"petrock.app.js","url":"app.js"}, + {"name":"petrock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "smartibot", + "name": "Smartibot controller", + "shortName": "Smartibot", + "version": "0.01", + "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"smartibot.app.js","url":"app.js"}, + {"name":"smartibot.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widncr", + "name": "NCR Logo Widget", + "version": "0.01", + "description": "Show the NodeConf Remote logo in the top left", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"widncr.wid.js","url":"widget.js"} + ] + }, + { + "id": "ncrclk", + "name": "NCR Clock", + "shortName": "NCR Clock", + "version": "0.02", + "description": "NodeConf Remote clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"ncrclk.app.js","url":"app.js"}, + {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "isoclock", + "name": "ISO Compliant Clock Face", + "shortName": "ISO Clock", + "version": "0.02", + "description": "Tweaked fork of digiclock for ISO date and time", + "icon": "isoclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"isoclock.app.js","url":"isoclock.js"}, + {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true} + ] + }, + { + "id": "gpstimeserver", + "name": "GPS Time Server", + "version": "0.01", + "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"gpstimeserver.wid.js","url":"widget.js"} + ] + }, + { + "id": "tilthydro", + "name": "Tilt Hydrometer Display", + "shortName": "Tilt Hydro", + "version": "0.01", + "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", + "icon": "app.png", + "tags": "tools,bluetooth", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"tilthydro.app.js","url":"app.js"}, + {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "supmariodark", + "name": "Super mario clock night mode", + "shortName": "supmariodark", + "version": "0.01", + "description": "Super mario clock in night mode", + "icon": "supmariodark.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"supmariodark.app.js","url":"supmariodark.js"}, + {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, + {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"}, + {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"}, + {"name":"banner-up.img","url":"banner-up.js","evaluate":true}, + {"name":"banner-down.img","url":"banner-down.js","evaluate":true}, + {"name":"brick2.img","url":"brick2.js","evaluate":true}, + {"name":"enemy.img","url":"enemy.js","evaluate":true}, + {"name":"flower.img","url":"flower.js","evaluate":true}, + {"name":"flower_b.img","url":"flower_b.js","evaluate":true}, + {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true}, + {"name":"pipe.img","url":"pipe.js","evaluate":true} + ] + }, + { + "id": "gmeter", + "name": "G-Meter", + "shortName": "G-Meter", + "version": "0.01", + "description": "Simple G-Meter", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"gmeter.app.js","url":"app.js"}, + {"name":"gmeter.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "dtlaunch", + "name": "Desktop Launcher", + "version": "0.07", + "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", + "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], + "icon": "icon.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"dtlaunch.app.js","url":"app-b1.js", "supports": ["BANGLEJS"]}, + {"name":"dtlaunch.app.js","url":"app-b2.js", "supports": ["BANGLEJS2"]}, + {"name":"dtlaunch.settings.js","url":"settings-b1.js", "supports": ["BANGLEJS"]}, + {"name":"dtlaunch.settings.js","url":"settings-b2.js", "supports": ["BANGLEJS2"]}, + {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"dtlaunch.json"}] + }, + { + "id": "HRV", + "name": "Heart Rate Variability monitor", + "shortName": "HRV monitor", + "version": "0.04", + "description": "Heart Rate Variability monitor, see Readme for more info", + "icon": "hrv.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"HRV.app.js","url":"app.js"}, + {"name":"HRV.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hardalarm", + "name": "Hard Alarm", + "shortName": "HardAlarm", + "version": "0.02", + "description": "Make sure you wake up! Count to the right number to turn off the alarm", + "icon": "app.png", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"hardalarm.app.js","url":"app.js"}, + {"name":"hardalarm.boot.js","url":"boot.js"}, + {"name":"hardalarm.js","url":"hardalarm.js"}, + {"name":"hardalarm.img","url":"app-icon.js","evaluate":true}, + {"name":"hardalarm.wid.js","url":"widget.js"} + ], + "data": [{"name":"hardalarm.json"}] + }, + { + "id": "edisonsball", + "name": "Edison's Ball", + "shortName": "Edison's Ball", + "version": "0.01", + "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", + "icon": "app-icon.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"edisonsball.app.js","url":"app.js"}, + {"name":"edisonsball.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hrrawexp", + "name": "HRM Data Exporter", + "shortName": "HRM Data Exporter", + "version": "0.01", + "description": "export raw hrm signal data to a csv file", + "icon": "app-icon.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "interface.html", + "storage": [ + {"name":"hrrawexp.app.js","url":"app.js"}, + {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "breath", + "name": "Breathing App", + "shortName": "Breathing App", + "version": "0.01", + "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR", + "icon": "app-icon.png", + "tags": "tools,health", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"breath.app.js","url":"app.js"}, + {"name":"breath.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"breath.settings.json","url":"settings.json"}] + }, + { + "id": "lazyclock", + "name": "Lazy Clock", + "version": "0.03", + "description": "Tells the time, roughly", + "icon": "lazyclock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "screenshots": [{"url":"bangle1-lazy-clock-screenshot.png"}], + "allow_emulator": true, + "storage": [ + {"name":"lazyclock.app.js","url":"lazyclock-app.js"}, + {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true} + ] + }, + { + "id": "astral", + "name": "Astral Clock", + "version": "0.03", + "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"astral.app.js","url":"app.js"}, + {"name":"astral.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "alpinenav", + "name": "Alpine Nav", + "version": "0.01", + "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime", + "icon": "app-icon.png", + "tags": "outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"alpinenav.app.js","url":"app.js"}, + {"name":"alpinenav.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "lifeclk", + "name": "Game of Life Clock", + "shortName": "Conway's Clock", + "version": "0.06", + "description": "Modification and clockification of Conway's Game of Life", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"lifeclk.app.js","url":"app.min.js"}, + {"name":"lifeclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "speedalt", + "name": "GPS Adventure Sports", + "shortName": "GPS Adv Sport", + "version": "1.02", + "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", + "icon": "app.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"speedalt.app.js","url":"app.js"}, + {"name":"speedalt.img","url":"app-icon.js","evaluate":true}, + {"name":"speedalt.settings.js","url":"settings.js"} + ], + "data": [{"name":"speedalt.json"}] + }, + { + "id": "speedalt2", + "name": "GPS Adventure Sports II", + "shortName": "GPS Adv Sport II", + "version": "0.07", + "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", + "icon": "app.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"speedalt2.app.js","url":"app.js"}, + {"name":"speedalt2.img","url":"app-icon.js","evaluate":true}, + {"name":"speedalt2.settings.js","url":"settings.js"} + ], + "data": [{"name":"speedalt2.json"}] + }, + { + "id": "slomoclock", + "name": "SloMo Clock", + "shortName": "SloMo Clock", + "version": "0.10", + "description": "Simple 24h clock face with large digits, hour above minute. Uses Layout library.", + "icon": "watch.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-slow-mo-clock-screenshot.png"}], + "storage": [ + {"name":"slomoclock.app.js","url":"app.js"}, + {"name":"slomoclock.img","url":"app-icon.js","evaluate":true}, + {"name":"slomoclock.settings.js","url":"settings.js"} + ], + "data": [{"name":"slomoclock.json"}] + }, + { + "id": "de-stress", + "name": "De-Stress", + "shortName": "De-Stress", + "version": "0.02", + "description": "Simple haptic heartbeat", + "icon": "app.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"de-stress.app.js","url":"app.js"}, + {"name":"de-stress.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mclockplus", + "name": "Morph Clock+", + "shortName": "Morph Clock+", + "version": "0.02", + "description": "Morphing Clock with more readable seconds and date and additional stopwatch", + "icon": "mclockplus.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, + {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} + ] + }, + { + "id": "intervals", + "name": "Intervals App", + "shortName": "Intervals", + "version": "0.01", + "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", + "icon": "intervals.png", + "tags": "", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"intervals.app.js","url":"intervals.app.js"}, + {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} + ] + }, + { + "id": "planetarium", + "name": "Planetarium", + "shortName": "Planetarium", + "version": "0.03", + "description": "Planetarium showing up to 500 stars using the watch location and time", + "icon": "planetarium.png", + "tags": "", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"planetarium.app.js","url":"planetarium.app.js"}, + {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, + {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, + {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, + {"name":"planetarium.settings.js","url":"settings.js"}, + {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} + ], + "data": [{"name":"planetarium.json"}] + }, + { + "id": "tapelauncher", + "name": "Tape Launcher", + "version": "0.02", + "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", + "icon": "icon.png", + "type": "launch", + "tags": "tool,system,launcher", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"tapelauncher.app.js","url":"app.js"}, + {"name":"tapelauncher.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "oblique", + "name": "Oblique Strategies", + "version": "0.01", + "description": "Oblique Strategies for creativity. Copied from Brian Eno.", + "icon": "eno.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"oblique.app.js","url":"app.js"}, + {"name":"oblique.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "testuserinput", + "name": "Test User Input", + "shortName": "Test User Input", + "version": "0.06", + "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.", + "icon": "app.png", + "tags": "input,interface,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"testuserinput.app.js","url":"app.js"}, + {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gpssetup", + "name": "GPS Setup", + "shortName": "GPS Setup", + "version": "0.02", + "description": "Configure the GPS power options and store them in the GPS nvram", + "icon": "gpssetup.png", + "tags": "gps,tools,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"gpssetup","url":"gpssetup.js"}, + {"name":"gpssetup.settings.js","url":"settings.js"}, + {"name":"gpssetup.app.js","url":"app.js"}, + {"name":"gpssetup.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"gpssetup.settings.json","url":"settings.json"}] + }, + { + "id": "walkersclock", + "name": "Walkers Clock", + "shortName": "Walkers Clock", + "version": "0.04", + "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference", + "icon": "walkersclock48.png", + "type": "clock", + "tags": "clock,gps,tools,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"walkersclock.app.js","url":"app.js"}, + {"name":"walkersclock.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "widgps", + "name": "GPS Widget", + "version": "0.03", + "description": "Tiny widget to show the power on/off status of the GPS", + "icon": "widget.png", + "type": "widget", + "tags": "widget,gps", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widgps.wid.js","url":"widget.js"} + ] + }, + { + "id": "widhrt", + "name": "HRM Widget", + "version": "0.03", + "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor", + "icon": "widget.png", + "type": "widget", + "tags": "widget,hrm", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widhrt.wid.js","url":"widget.js"} + ] + }, + { + "id": "countdowntimer", + "name": "Countdown Timer", + "version": "0.01", + "description": "A simple countdown timer with a focus on usability", + "icon": "countdowntimer.png", + "tags": "timer,tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"countdowntimer.app.js","url":"countdowntimer.js"}, + {"name":"countdowntimer.img","url":"countdowntimer-icon.js","evaluate":true} + ] + }, + { + "id": "helloworld", + "name": "hello, world!", + "shortName": "hello world", + "version": "0.02", + "description": "A cross cultural hello world!/hola mundo! app with colors and languages", + "icon": "app.png", + "tags": "input,interface,buttons,touch", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"helloworld.app.js","url":"app.js"}, + {"name":"helloworld.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widcom", + "name": "Compass Widget", + "version": "0.02", + "description": "Tiny widget to show the power on/off status of the Compass", + "icon": "widget.png", + "type": "widget", + "tags": "widget,compass", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widcom.wid.js","url":"widget.js"} + ] + }, + { + "id": "arrow", + "name": "Arrow Compass", + "version": "0.05", + "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass", + "icon": "arrow.png", + "type": "app", + "tags": "tool,outdoors", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"arrow.app.js","url":"app.js"}, + {"name":"arrow.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "waypointer", + "name": "Way Pointer", + "version": "0.01", + "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", + "icon": "waypointer.png", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"waypointer.app.js","url":"app.js"}, + {"name":"waypointer.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "color_catalog", + "name": "Colors Catalog", + "shortName": "Colors Catalog", + "version": "0.01", + "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", + "icon": "app.png", + "tags": "Color,input,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"color_catalog.app.js","url":"app.js"}, + {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "UI4swatch", + "name": "UI 4 swatch", + "shortName": "UI 4 swatch", + "version": "0.01", + "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.", + "icon": "app.png", + "tags": "Color,input,buttons,touch,UI", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"UI4swatch.app.js","url":"app.js"}, + {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "simplest", + "name": "Simplest Clock", + "version": "0.03", + "description": "The simplest working clock, acts as a tutorial piece", + "icon": "simplest.png", + "screenshots": [{"url":"screenshot_simplest.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"simplest.app.js","url":"app.js"}, + {"name":"simplest.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "stepo", + "name": "Stepometer Clock", + "version": "0.03", + "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed", + "icon": "stepo.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"stepo.app.js","url":"app.js"}, + {"name":"stepo.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "gbmusic", + "name": "Gadgetbridge Music Controls", + "shortName": "Music Controls", + "version": "0.08", + "description": "Control the music on your Gadgetbridge-connected phone", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_v1.png"},{"url":"screenshot_v2.png"}], + "type": "app", + "tags": "tools,bluetooth,gadgetbridge,music", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"gbmusic.app.js","url":"app.js"}, + {"name":"gbmusic.settings.js","url":"settings.js"}, + {"name":"gbmusic.wid.js","url":"widget.js"}, + {"name":"gbmusic.img","url":"icon.js","evaluate":true} + ], + "data": [{"name":"gbmusic.json"},{"name":"gbmusic.load.json"}] + }, + { + "id": "battleship", + "name": "Battleship", + "version": "0.01", + "description": "The classic game of battleship", + "icon": "battleship-icon.png", + "tags": "game", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-battle-ship-screenshot.png"}], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"battleship.app.js","url":"battleship.js"}, + {"name":"battleship.img","url":"battleship-icon.js","evaluate":true} + ] + }, + { + "id": "kitchen", + "name": "Kitchen Combo", + "version": "0.13", + "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'", + "icon": "kitchen.png", + "type": "clock", + "tags": "tool,outdoors,gps", + "supports": ["BANGLEJS"], + "readme": "README.md", + "interface": "waypoints.html", + "storage": [ + {"name":"kitchen.app.js","url":"kitchen.app.js"}, + {"name":"stepo2.kit.js","url":"stepo2.kit.js"}, + {"name":"swatch.kit.js","url":"swatch.kit.js"}, + {"name":"gps.kit.js","url":"gps.kit.js"}, + {"name":"compass.kit.js","url":"compass.kit.js"}, + {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} + ], + "data": [{"name":"waypoints.json","url":"waypoints.json"}] + }, + { + "id": "banglebridge", + "name": "BangleBridge", + "shortName": "BangleBridge", + "version": "0.01", + "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"banglebridge.wid.js","url":"widget.js"}, + {"name":"banglebridge.watch.img","url":"watch.img"}, + {"name":"banglebridge.heart.img","url":"heart.img"} + ] + }, + { + "id": "qmsched", + "name": "Quiet Mode Schedule and Widget", + "shortName": "Quiet Mode", + "version": "0.05", + "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", + "icon": "app.png", + "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, + {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}], + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"qmsched","url":"lib.js"}, + {"name":"qmsched.app.js","url":"app.js"}, + {"name":"qmsched.boot.js","url":"boot.js"}, + {"name":"qmsched.img","url":"icon.js","evaluate":true}, + {"name":"qmsched.wid.js","url":"widget.js"} + ], + "data": [{"name":"qmsched.json"}] + }, + { + "id": "hourstrike", + "name": "Hour Strike", + "shortName": "Hour Strike", + "version": "0.08", + "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!", + "icon": "app-icon.png", + "tags": "tool,alarm", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"hourstrike.app.js","url":"app.js"}, + {"name":"hourstrike.boot.js","url":"boot.js"}, + {"name":"hourstrike.img","url":"app-icon.js","evaluate":true}, + {"name":"hourstrike.json","url":"hourstrike.json"} + ] + }, + { + "id": "whereworld", + "name": "Where in the World?", + "shortName": "Where World", + "version": "0.01", + "description": "Shows your current location on the world map", + "icon": "app.png", + "tags": "gps", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"whereworld.app.js","url":"app.js"}, + {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, + {"name":"whereworld.worldmap","url":"worldmap"} + ] + }, + { + "id": "omnitrix", + "name": "Omnitrix", + "version": "0.01", + "description": "An Omnitrix Showpiece", + "icon": "omnitrix.png", + "screenshots": [{"url":"screenshot.png"}], + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"omnitrix.app.js","url":"omnitrix.app.js"}, + {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true} + ] + }, + { + "id": "batclock", + "name": "Bat Clock", + "shortName": "Bat Clock", + "version": "0.02", + "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", + "icon": "bat-clock.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"batclock.app.js","url":"bat-clock.app.js"}, + {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true} + ] + }, + { + "id": "doztime", + "name": "Dozenal Time", + "shortName": "Dozenal Time", + "version": "0.04", + "description": "A dozenal Holocene calendar and dozenal diurnal clock", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"doztime.app.js","url":"app.js"}, + {"name":"doztime.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "gbtwist", + "name": "Gadgetbridge Twist Control", + "shortName": "Twist Control", + "version": "0.01", + "description": "Shake your wrist to control your music app via Gadgetbridge", + "icon": "app.png", + "type": "app", + "tags": "tools,bluetooth,gadgetbridge,music", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": false, + "storage": [ + {"name":"gbtwist.app.js","url":"app.js"}, + {"name":"gbtwist.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "thermom", + "name": "Thermometer", + "version": "0.04", + "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"thermom.app.js","url":"app.js"}, + {"name":"thermom.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "mysticdock", + "name": "Mystic Dock", + "version": "1.00", + "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.", + "icon": "mystic-dock.png", + "type": "dock", + "tags": "dock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"mysticdock.app.js","url":"mystic-dock-app.js"}, + {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"}, + {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"}, + {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true} + ] + }, + { + "id": "mysticclock", + "name": "Mystic Clock", + "version": "1.01", + "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.", + "icon": "mystic-clock.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"bangle1-mystic-clock-screenshot.png"}], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"mysticclock.app.js","url":"mystic-clock-app.js"}, + {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"}, + {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true} + ] + }, + { + "id": "hcclock", + "name": "Hi-Contrast Clock", + "version": "0.02", + "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", + "icon": "hcclock-icon.png", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"bangle1-high-contrast-clock-screenshot.png"}], + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"hcclock.app.js","url":"hcclock.app.js"}, + {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} + ] + }, + { + "id": "thermomF", + "name": "Fahrenheit Temp", + "version": "0.01", + "description": "A modification of the Thermometer App to display temprature in Fahrenheit", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"thermomF.app.js","url":"app.js"}, + {"name":"thermomF.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "nixie", + "name": "Nixie Clock", + "shortName": "Nixie", + "version": "0.01", + "description": "A nixie tube clock for both Bangle 1 and 2.", + "icon": "nixie.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"nixie.app.js","url":"app.js"}, + {"name":"nixie.img","url":"app-icon.js","evaluate":true}, + {"name":"m_vatch.js","url":"m_vatch.js"} + ] + }, + { + "id": "carcrazy", + "name": "Car Crazy", + "shortName": "Car Crazy", + "version": "0.03", + "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.", + "icon": "carcrash.png", + "tags": "game", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"carcrazy.app.js","url":"app.js"}, + {"name":"carcrazy.img","url":"app-icon.js","evaluate":true}, + {"name":"carcrazy.settings.js","url":"settings.js"} + ], + "data": [{"name":"CarCrazy.csv"}] + }, + { + "id": "shortcuts", + "name": "Shortcuts", + "shortName": "Shortcuts", + "version": "0.01", + "description": "Quickly load your favourite apps from (almost) any watch face.", + "icon": "app.png", + "type": "bootloader", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"shortcuts.boot.js","url":"boot.js"}, + {"name":"shortcuts.settings.js","url":"settings.js"} + ], + "data": [{"name":"shortcuts.json"}] + }, + { + "id": "vectorclock", + "name": "Vector Clock", + "version": "0.03", + "description": "A digital clock that uses the built-in vector font.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "screenshots": [ + {"url":"bangle2-vector-clock-screenshot.png"}, + {"url":"bangle1-vector-clock-screenshot.png"} + ], + "storage": [ + {"name":"vectorclock.app.js","url":"app.js"}, + {"name":"vectorclock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "fd6fdetect", + "name": "fd6fdetect", + "shortName": "fd6fdetect", + "version": "0.2", + "description": "Allows you to see 0xFD6F beacons near you.", + "icon": "app.png", + "tags": "tool", + "readme": "README.md", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"fd6fdetect.app.js","url":"app.js"}, + {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "choozi", + "name": "Choozi", + "version": "0.01", + "description": "Choose people or things at random using Bangle.js.", + "icon": "app.png", + "tags": "tool", + "supports": ["BANGLEJS"], + "readme": "README.md", + "allow_emulator": true, + "screenshots": [{"url":"bangle1-choozi-screenshot1.png"},{"url":"bangle1-choozi-screenshot2.png"}], + "storage": [ + {"name":"choozi.app.js","url":"app.js"}, + {"name":"choozi.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widclkbttm", + "name": "Digital clock (Bottom) widget", + "shortName": "Digital clock Bottom Widget", + "version": "0.03", + "description": "Displays time in the bottom area.", + "icon": "widclkbttm.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"} + ] + }, + { + "id": "pastel", + "name": "Pastel Clock", + "shortName": "Pastel", + "version": "0.08", + "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "icon": "pastel.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_pastel.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"f_architect","url":"f_architect.js"}, + {"name":"f_gochihand","url":"f_gochihand.js"}, + {"name":"f_cabin","url":"f_cabin.js"}, + {"name":"f_orbitron","url":"f_orbitron.js"}, + {"name":"f_monoton","url":"f_monoton.js"}, + {"name":"f_elite","url":"f_elite.js"}, + {"name":"f_lato","url":"f_lato.js"}, + {"name":"f_latosmall","url":"f_latosmall.js"}, + {"name":"pastel.app.js","url":"pastel.app.js"}, + {"name":"pastel.img","url":"pastel.icon.js","evaluate":true}, + {"name":"pastel.settings.js","url":"pastel.settings.js"} + ], + "data": [{"name":"pastel.json"}] + }, + { + "id": "antonclk", + "name": "Anton Clock", + "version": "0.03", + "description": "A simple clock using the bold Anton font.", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"antonclk.app.js","url":"app.js"}, + {"name":"antonclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "waveclk", + "name": "Wave Clock", + "version": "0.02", + "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"waveclk.app.js","url":"app.js"}, + {"name":"waveclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "floralclk", + "name": "Floral Clock", + "version": "0.01", + "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**", + "icon": "app.png", + "screenshots": [{"url":"screenshot_floral.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"floralclk.app.js","url":"app.js"}, + {"name":"floralclk.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "score", + "name": "Score Tracker", + "version": "0.01", + "description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.", + "icon": "score.app.png", + "screenshots": [{"url":"screenshot_score.png"}], + "type": "app", + "tags": "", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"score.app.js","url":"score.app.js"}, + {"name":"score.settings.js","url":"score.settings.js"}, + {"name":"score.presets.json","url":"score.presets.json"}, + {"name":"score.img","url":"score.app-icon.js","evaluate":true} + ], + "data": [{"name":"score.json"}] + }, + { + "id": "menusmall", + "name": "Small Menus", + "version": "0.02", + "description": "Replace Bangle.js 2's menus with a version that contains smaller text", + "icon": "app.png", + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"menusmall.boot.js","url":"boot.js"} + ] + }, + { + "id": "ffcniftya", + "name": "Nifty-A Clock", + "version": "0.01", + "description": "A nifty clock with time and date", + "icon": "app.png", + "screenshots": [{"url":"screenshot_nifty.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"ffcniftya.app.js","url":"app.js"}, + {"name":"ffcniftya.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "ffcniftyb", + "name": "Nifty-B Clock", + "version": "0.02", + "description": "A nifty clock (series B) with time, date and color configuration", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ffcniftyb.app.js","url":"app.js"}, + {"name":"ffcniftyb.img","url":"app-icon.js","evaluate":true}, + {"name":"ffcniftyb.settings.js","url":"settings.js"} + ], + "data": [{"name":"ffcniftyb.json"}] + }, + { + "id": "stopwatch", + "name": "Stopwatch Touch", + "version": "0.01", + "description": "A touch based stop watch for Bangle JS 2", + "icon": "stopwatch.png", + "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "tags": "tools,app", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"stopwatch.app.js","url":"stopwatch.app.js"}, + {"name":"stopwatch.img","url":"stopwatch.icon.js","evaluate":true} + ] + }, + { + "id": "vernierrespirate", + "name": "Vernier Go Direct Respiration Belt", + "shortName": "Respiration Belt", + "version": "0.01", + "description": "Connects to a Go Direct Respiration Belt and shows respiration rate", + "icon": "app.png", + "tags": "health,bluetooth", + "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"vernierrespirate.app.js","url":"app.js"}, + {"name":"vernierrespirate.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"vernierrespirate.json"}] + }, + { + "id": "gpstouch", + "name": "GPS Touch", + "version": "0.01", + "description": "A touch based GPS watch, shows OS map reference", + "icon": "gpstouch.png", + "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], + "tags": "tools,app", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"geotools","url":"geotools.js"}, + {"name":"gpstouch.app.js","url":"gpstouch.app.js"}, + {"name":"gpstouch.img","url":"gpstouch.icon.js","evaluate":true} + ] + }, + { + "id": "swiperclocklaunch", + "name": "Swiper Clock Launch", + "version": "0.02", + "description": "Navigate between clock and launcher with Swipe action", + "icon": "swiperclocklaunch.png", + "type": "bootloader", + "tags": "tools, system", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"swiperclocklaunch.boot.js","url":"boot.js"}, + {"name":"swiperclocklaunch.img","url":"icon.js","evaluate":true} + ] + }, + { + "id": "qalarm", + "name": "Q Alarm and Timer", + "shortName": "Q Alarm", + "icon": "app.png", + "version": "0.03", + "description": "Alarm and timer app with days of week and 'hard' option.", + "tags": "tool,alarm,widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + { "name": "qalarm.app.js", "url": "app.js" }, + { "name": "qalarm.boot.js", "url": "boot.js" }, + { "name": "qalarm.js", "url": "qalarm.js" }, + { "name": "qalarmcheck.js", "url": "qalarmcheck.js" }, + { "name": "qalarm.img", "url": "app-icon.js", "evaluate": true }, + { "name": "qalarm.wid.js", "url": "widget.js" } + ], + "data": [{ "name": "qalarm.json" }] + }, + { + "id": "emojuino", + "name": "Emojuino", + "shortName": "Emojuino", + "version": "0.03", + "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", + "icon": "emojuino.png", + "screenshots": [ + { "url": "screenshot-tx.png" }, + { "url": "screenshot-swipe.png" }, + { "url": "screenshot-welcome.png" } + ], + "type": "app", + "tags": "emoji", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "emojuino.app.js", "url": "emojuino.js" }, + { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } + ] + }, + { + "id": "cliclockJS2Enhanced", + "name": "Commandline-Clock JS2 Enhanced", + "shortName": "CLI-Clock JS2", + "version": "0.03", + "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design. Also added HID media controlls, just swipe on the clock face to controll the media! Gadgetbride support coming soon(hopefully) Thanks to t0m1o1 for media controls!", + "icon": "app.png", + "screenshots": [{"url":"screengrab.png"}], + "type": "clock", + "tags": "clock,cli,command,bash,shell", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, + {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} + ] + }, + { + "id": "wid_a_battery_widget", + "name": "A Battery Widget (with percentage)", + "shortName":"A Battery Widget", + "icon": "widget.png", + "version":"1.02", + "type": "widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "description": "Simple and slim battery widget with charge status and percentage", + "tags": "widget,battery", + "storage": [ + {"name":"wid_a_battery_widget.wid.js","url":"widget.js"} + ] + }, + { + "id": "lcars", + "name": "LCARS Clock", + "shortName":"LCARS", + "icon": "lcars.png", + "version":"0.06", + "readme": "README.md", + "supports": ["BANGLEJS2"], + "description": "Library Computer Access Retrieval System (LCARS) clock.", + "type": "clock", + "tags": "clock", + "screenshots": [{"url":"screenshot.png"}], + "storage": [ + {"name":"lcars.app.js","url":"lcars.app.js"}, + {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} + ] + }, + { "id": "binwatch", + "name": "Binary Watch", + "shortName":"BinWatch", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.04", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "allow_emulator":true, + "description": "Famous binary watch", + "tags": "clock", + "type": "clock", + "storage": [ + {"name":"binwatch.app.js","url":"app.js"}, + {"name":"binwatch.bg176.img","url":"Background176_center.img"}, + {"name":"binwatch.bg240.img","url":"Background240_center.img"}, + {"name":"binwatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "hidmsicswipe", + "name": "Bluetooth Music Swipe Controls", + "shortName": "Swipe Control", + "version": "0.01", + "description": "Based on the original Bluetooth Music Controls. Swipe up/down for volume, left/right for previous and next, tap for play/pause and btn1 to lock and unlock the controls. Enable HID in settings, pair with your phone, then use this app to control music from your watch!", + "icon": "hidmsicswipe.png", + "tags": "bluetooth", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"hidmsicswipe.app.js","url":"hidmsicswipe.js"}, + {"name":"hidmsicswipe.img","url":"hidmsicswipe-icon.js","evaluate":true} + ] + }, + { + "id": "authentiwatch", + "name": "2FA Authenticator", + "shortName": "AuthWatch", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "version": "0.04", + "description": "Google Authenticator compatible tool.", + "tags": "tool", + "interface": "interface.html", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"authentiwatch.app.js","url":"app.js"}, + {"name":"authentiwatch.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"authentiwatch.json"}] + }, + { "id": "schoolCalendar", + "name": "School Calendar", + "shortName":"SCalendar", + "icon": "CalenderLogo.png", + "version": "0.01", + "description": "A simple calendar that you can see your upcoming events that you create in the customizer. Keep in note that your events reapeat weekly.(Beta)", + "tags": "tool", + "readme":"README.md", + "custom":"custom.html", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"screenshot_basic.png"},{"url":"screenshot_info.png"}], + "storage": [ + {"name":"schoolCalendar.app.js"}, + {"name":"schoolCalendar.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"calendarItems.csv"} + ] + }, + { "id": "timecal", + "name": "TimeCal", + "shortName":"TimeCal", + "icon": "icon.png", + "version":"0.01", + "description": "TimeCal shows the Time along with a 3 week calendar", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"timecal.app.js","url":"timecal.app.js"} + ] + }, + { + "id": "a_clock_timer", + "name": "A Clock with Timer", + "version": "0.01", + "description": "A Clock with Timer, Map and Time Zones", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"a_clock_timer.app.js","url":"app.js"}, + {"name":"a_clock_timer.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id":"intervalTimer", + "name":"Interval Timer", + "shortName":"Interval Timer", + "icon": "app.png", + "version":"0.01", + "description": "Interval Timer for workouts, HIIT, or whatever else.", + "tags": "timer, interval, hiit, workout", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"intervalTimer.app.js","url":"app.js"}, + {"name":"intervalTimer.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "93dub", + "name": "93 Dub", + "shortName":"93 Dub", + "icon": "93dub.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.05", + "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"93dub.app.js","url":"app.js"}, + {"name":"93dub.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "poweroff", + "name": "Poweroff", + "shortName":"Poweroff", + "version":"0.01", + "description": "Simple app to power off your Bangle.js", + "icon": "app.png", + "tags": "tool, poweroff, shutdown", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"poweroff.app.js","url":"app.js"}, + {"name":"poweroff.img","url":"app-icon.js","evaluate":true} + ] +}, +{ + "id": "sensible", + "name": "SensiBLE", + "shortName": "SensiBLE", + "version": "0.04", + "description": "Collect, display and advertise real-time sensor data.", + "icon": "sensible.png", + "screenshots": [ + { "url": "screenshot-top.png" }, + { "url": "screenshot-acc.png" }, + { "url": "screenshot-bar.png" }, + { "url": "screenshot-gps.png" }, + { "url": "screenshot-hrm.png" }, + { "url": "screenshot-mag.png" } + ], + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "sensible.app.js", "url": "sensible.js" }, + { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } + ] +}, + { + "id": "widbars", + "name": "Bars Widget", + "version": "0.01", + "description": "Display several measurements as vertical bars.", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbars.wid.js","url":"widget.js"} + ] +}, +{ + "id":"a_speech_timer", + "name":"Speech Timer", + "icon": "app.png", + "version":"1.01", + "description": "A timer designed to help keeping your speeches and presentations to time.", + "tags": "tool,timer", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"a_speech_timer.app.js","url":"app.js"}, + {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} + ] +}, + { "id": "mylocation", + "name": "My Location", + "shortName":"My Location", + "icon": "mylocation.png", + "type": "app", + "screenshots": [{"url":"screenshot_1.png"}], + "version":"0.01", + "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", + "readme": "README.md", + "tags": "tool,utility", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"mylocation.app.js","url":"mylocation.app.js"}, + {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } + ], + "data": [ + {"name":"mylocation.json"} + ] + }, + { + "id": "pebble", + "name": "Pebble Clock", + "shortName": "Pebble", + "version": "0.04", + "description": "A pebble style clock to keep the rebellion going", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"pebble.app.js","url":"pebble.app.js"}, + {"name":"pebble.settings.js","url":"pebble.settings.js"}, + {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} + ] + }, + { "id": "pooqroman", + "name": "pooq Roman watch face", + "shortName":"pooq Roman", + "version":"0.03", + "description": "A classic watch face with a certain dynamicity. Most amusing in 24h mode. Slide up to show more hands, down for less(!). By design does not support standard widgets, sorry!", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"pooqroman.app.js","url":"app.js"}, + {"name":"pooqroman.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"pooqroman.json"} + ] + }, + { + "id": "widbata", + "name": "Battery Level Widget (Themed)", + "shortName":"Battery Theme", + "icon": "widbata.png", + "screenshots": [{"url":"screenshot_widbata_1.png"}], + "version":"0.01", + "type": "widget", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "description": "Shows the current battery level status in the top right using the clocks colour theme", + "tags": "widget,battery", + "storage": [ + {"name":"widbata.wid.js","url":"widbata.wid.js"} + ] + }, + { + "id": "weatherClock", + "name": "Weather Clock", + "version": "0.04", + "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", + "icon": "app.png", + "screenshots": [{"url":"screens/screen1.png"}], + "type": "clock", + "tags": "clock, weather", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"weatherClock.app.js","url":"app.js"}, + {"name":"weatherClock.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "menuwheel", + "name": "Wheel Menus", + "version": "0.01", + "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button", + "readme": "README.md", + "icon": "icon.png", + "screenshots": [ + {"url":"screenshot_b1_dark.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_light.png"}, + {"url":"screenshot_b2_dark.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_light.png"} + ], + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"menuwheel.boot.js","url":"boot.js"} + ] + }, + { "id": "widChargingStatus", + "name": "Charging Status", + "shortName":"ChargingStatus", + "icon": "widget.png", + "version":"0.1", + "type": "widget", + "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widChargingStatus.wid.js","url":"widget.js"} + ] + }, + { + "id": "flow", + "name": "FLOW", + "shortName": "FLOW", + "version": "0.01", + "description": "A game where you have to help a flow avoid white obstacles thing by tapping! This is a demake of an app which I forgot the name of. Press BTN(1) to restart. See if you can get to 2500 score!", + "icon": "app.png", + "tags": "game", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name": "flow.app.js", "url": "app.js" }, + {"name": "flow.img", "url": "app-icon.js","evaluate": true } + ] + }, + { "id": "scribble", + "name": "Scribble", + "shortName":"Scribble", + "version":"0.01", + "type": "app", + "description": "A keyboard on your wrist! Swipe right for space, left for delete.", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"scribble.app.js","url":"app.js"}, + {"name":"scribble.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } + ] + }, + { + "id": "ptlaunch", + "name": "Pattern Launcher", + "shortName": "Pattern Launcher", + "version": "0.10", + "description": "Directly launch apps from the clock screen with custom patterns.", + "icon": "app.png", + "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "ptlaunch.app.js", "url": "app.js" }, + { "name": "ptlaunch.boot.js", "url": "boot.js" }, + { "name": "ptlaunch.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"ptlaunch.patterns.json"}] + }, + { + "id": "rebble", + "name": "Rebble Clock", + "shortName": "Rebble", + "version": "0.02", + "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", + "readme": "README.md", + "icon": "rebble.png", + "dependencies": {"mylocation":"app"}, + "screenshots": [{"url":"screenshot_rebble.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"rebble.app.js","url":"rebble.app.js"}, + {"name":"rebble.settings.js","url":"rebble.settings.js"}, + {"name":"rebble.img","url":"rebble.icon.js","evaluate":true} + ] + }, + { "id": "snaky", + "name": "Snaky", + "shortName":"Snaky", + "version":"0.01", + "description": "The classic snake game. Eat apples and don't bite your tail. Control the snake with the touch screen.", + "tags": "game,fun", + "icon": "snaky.png", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"snaky.app.js","url":"snaky.js"}, + {"name":"snaky.img","url":"snaky-icon.js","evaluate":true} + ] + }, + { + "id": "clicompleteclk", + "name": "CLI complete clock", + "shortName":"CLI cmplt clock", + "version":"0.03", + "description": "Command line styled clock with lots of information", + "icon": "app.png", + "allow_emulator": true, + "type": "clock", + "tags": "clock,cli,command,bash,shell,weather,hrt", + "supports" : ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, + {"name":"clicompleteclk.settings.js","url":"settings.js"} + ], + "data": [{"name":"clicompleteclk.json"}] + }, + { + "id":"awairmonitor", + "name":"Awair Monitor", + "icon": "app.png", + "allow_emulator": true, + "version":"0.01", + "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", + "tags": "tool,health", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"awairmonitor.app.js","url":"app.js"}, + {"name":"awairmonitor.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "pooqround", + "name": "pooq Round watch face", + "shortName":"pooq Round", + "version":"0.00", + "description": "A 24 hour analogue watchface with high legibility and a novel style.", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"pooqround.app.js","url":"app.js"}, + {"name":"pooqround.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"pooqround.json"} + ] + }, + { + "id": "coretemp", + "name": "Core Temp Display", + "version": "0.01", + "description": "Display CoreTemp device sensor data", + "icon": "coretemp.png", + "type": "app", + "tags": "health", + "readme": "README.md", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + ] + }, + { + "id": "ltherm", + "name": "Thermometer", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "tool", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ltherm.app.js","url":"app.js"}, + {"name":"ltherm.img","url":"icon.js","evaluate":true} + ] + } +] \ No newline at end of file From 6679922bfb853c6f214d8d0ce15815c1a89cc022 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:00:12 +0300 Subject: [PATCH 013/503] feat: add pebbleDistance app --- apps.json | 20 +++- apps/pebbleDistance/ChangeLog | 1 + apps/pebbleDistance/LECO 1976-Regular.otf | Bin 0 -> 26432 bytes apps/pebbleDistance/README.md | 10 ++ apps/pebbleDistance/pebble.app.js | 123 ++++++++++++++++++++++ apps/pebbleDistance/pebble.icon.js | 1 + apps/pebbleDistance/pebble.png | Bin 0 -> 2004 bytes apps/pebbleDistance/pebble.settings.js | 48 +++++++++ apps/pebbleDistance/pebble_screenshot.png | Bin 0 -> 25140 bytes 9 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 apps/pebbleDistance/ChangeLog create mode 100644 apps/pebbleDistance/LECO 1976-Regular.otf create mode 100644 apps/pebbleDistance/README.md create mode 100644 apps/pebbleDistance/pebble.app.js create mode 100644 apps/pebbleDistance/pebble.icon.js create mode 100644 apps/pebbleDistance/pebble.png create mode 100644 apps/pebbleDistance/pebble.settings.js create mode 100644 apps/pebbleDistance/pebble_screenshot.png diff --git a/apps.json b/apps.json index c379a1de4..abeb920c0 100644 --- a/apps.json +++ b/apps.json @@ -4981,7 +4981,7 @@ "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} @@ -5003,5 +5003,23 @@ {"name":"lapcounter.app.js","url":"app.js"}, {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "pebbleDistance", + "name": "Pebble Clock with distance", + "shortName": "Pebble with distance", + "version": "0.1", + "description": "Fork of pebble clock with distance", + "readme": "README.md", + "icon": "pebble.png", + "screenshots": [{"url":"pebble_screenshot.png"}], + "type": "clock", + "tags": "clock, distance, pebble", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"pebble.app.js","url":"pebble.app.js"}, + {"name":"pebble.settings.js","url":"pebble.settings.js"}, + {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} + ] } ] diff --git a/apps/pebbleDistance/ChangeLog b/apps/pebbleDistance/ChangeLog new file mode 100644 index 000000000..a678cffdb --- /dev/null +++ b/apps/pebbleDistance/ChangeLog @@ -0,0 +1 @@ +0.1: first release diff --git a/apps/pebbleDistance/LECO 1976-Regular.otf b/apps/pebbleDistance/LECO 1976-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..05a318224400bacae73f2529f448f780f61b414f GIT binary patch literal 26432 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 F{|A0DE;axF literal 0 HcmV?d00001 diff --git a/apps/pebbleDistance/README.md b/apps/pebbleDistance/README.md new file mode 100644 index 000000000..7f34aa3c4 --- /dev/null +++ b/apps/pebbleDistance/README.md @@ -0,0 +1,10 @@ +# Pebble with distance and steps + +- Forked from [Pebble](https://github.com/espruino/BangleApps/tree/master/apps/pebble) +- Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) +- Battery warning changed to 15% instead of 30% + +![](pebble_screenshot.png) + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) +Forked and changed by [RomanistHere](https://github.com/RomanistHere) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js new file mode 100644 index 000000000..a9e737fa0 --- /dev/null +++ b/apps/pebbleDistance/pebble.app.js @@ -0,0 +1,123 @@ +Graphics.prototype.setFontLECO1976Regular42 = function(scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); +}; + +Graphics.prototype.setFontLECO1976Regular22 = function(scale) { + // Actual height 22 (21 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); +}; + +const SETTINGS_FILE = "pebbleDistance.json"; +let settings; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; +} + +var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); + +const h = g.getHeight(); +const w = g.getWidth(); +const ha = 2*h/5 - 11; +const h2 = 3*h/5 - 19; +const h3 = 7*h/8 - 10; + +let batteryWarning = false; + +function draw() { + let date = new Date(); + let da = date.toString().split(" "); + let timeStr = da[4].substr(0,5); + const t = 6; + const stps = getSteps(); + + // turn the warning on once we have dipped below 15% + if (E.getBattery() < 15) + batteryWarning = true; + + // turn the warning off once we have dipped above 20% + if (E.getBattery() > 20) + batteryWarning = false; + + g.reset(); + g.setColor(settings.bg); + g.fillRect(0, 0, w, h2 - t); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h2 - t, w, h2); + + // day and steps + if (settings.color == 'Blue' || settings.color == 'Red') + g.setColor('#fff'); // white on blue or red best contrast + else + g.setColor('#000'); // otherwise black regardless of theme + + g.setFontLECO1976Regular22(); + g.setFontAlign(0, -1); + g.drawString(da[0].toUpperCase(), w/4, ha); // day of week + g.drawString(stps, 3*w/4, ha); + + // time + // white on red for battery warning + g.setColor(!batteryWarning ? g.theme.bg : '#f00'); + g.fillRect(0, h2, w, h3); + + g.setFontLECO1976Regular42(); + g.setFontAlign(0, -1); + g.setColor(!batteryWarning ? g.theme.fg : '#fff'); + g.drawString(timeStr, w/2, h2 + 8); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h3, w, h3 + t); + + // the bottom + g.setColor(settings.bg); + g.fillRect(0, h3 + t, w, h); + + g.setColor(settings.bg); + g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); + drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); + g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); +} + +// at x,y width:wi thicknes:th +function drawCalendar(x,y,wi,th,str) { + g.setColor(g.theme.fg); + g.fillRect(x, y, x + wi, y + wi); + g.setColor(g.theme.bg); + g.fillRect(x + th, y + th, x + wi - th, y + wi - th); + g.setColor(g.theme.fg); + + let hook_t = 6; + // first calendar hook, one third in + g.fillRect(x + (wi/3) - (th/2), y - hook_t, x + wi/3 + th - (th/2), y + hook_t); + // second calendar hook, two thirds in + g.fillRect(x + (2*wi/3) -(th/2), y - hook_t, x + 2*wi/3 + th - (th/2), y + hook_t); + + g.setFontLECO1976Regular22(); + g.setFontAlign(0, 0); + g.drawString(str, x + wi/2, y + wi/2 + th); +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '375'; +} + +g.clear(); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} +loadSettings(); +setInterval(draw, 15000); // refresh every 15s +draw(); +Bangle.setUI("clock"); diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js new file mode 100644 index 000000000..38f2ad40e --- /dev/null +++ b/apps/pebbleDistance/pebble.icon.js @@ -0,0 +1 @@ +var img = require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) diff --git a/apps/pebbleDistance/pebble.png b/apps/pebbleDistance/pebble.png new file mode 100644 index 0000000000000000000000000000000000000000..cb836f39f993235aeb616c208173989c44adae0b GIT binary patch literal 2004 zcmV;_2P^oAP)2IEn4pj_t(B`$%d0=f$bN`T6&L?~i{rFfPoA zIm}`K2F}uJ0RnThb-~$N^!S8Ducq^A*y{q1uuIELqlq!Vz^Gs`_oIXvoTs&AcncVp z2Ax?0|Kl!Rpgtm+CyQ{c z4co>Vh9JJUGG@JpPAh5>X^@+^6xU6}6Ic3I7Pg4VC$=AsF79**tB56VG;ya>SVd%k z!;3rJ!YV90$70xypzxuXfgds5!ZJmt5)VZYPm+Q?-A`yzG!Pd~ly&t5&Oy#N+vG_KXf4@^^ z^;4jFz5ke(KkR%q6=-;j-9j$M$k_6fIJIwpja%O3+(Ngvol99*rocWohXarmvc~l* za@lqjrgu5EWEQelV76MdKTSB!Eh0y-#VKK}Kgg$k>|d6JXWYJ(QDSfXgfuB8GqXHH z*w4rel(%GXvt>1T<^9mxv;#yHYz+a+Hh->XE;Y+#tHJ$J+xvc&NuW*Yw zM(&{gOUE@R-)lO)ST#O^Sar^k&pD#NRwT=H3u~`m!^m*A)coATQD$N^YoP0v%V`%lWQ(=SYMFj?*CLJ|IHIQ`Ex@NZ+@-}(U!u_Gs`gzJL_o7 z%+K*BKl2wpv1`rA4AWY6&ho`!p6fIG%yOADeQjb|a(o^w>T=x~E*ZQ$R8mZW9~P+7 z-<9!tP6WgMknF_ZU)(~TP}cg?NbCU|@~~;ZR!m*LezPaX3ihpg)PIt~Gt<%$S24~a z^XLKc_*AK0IwF@aN}nt*{~C6&k;T*fvJuw}=P#2vb(WC@Qc!+UNzILC&4vbOpjrUtR1gFPw

5&nPkjackn*GG;?_F=0000 color_options[v], + onchange: v => { + s.color = color_options[v]; + s.bg = bg_code[v]; + save(); + }, + }, + 'Step length': { + value: 0.75 || s.avStep, + min: 0.2, + max: 1.5, + step: 0.05, + onchange : v => { + s.avStep = v; + save(); + } + } + }); +}); diff --git a/apps/pebbleDistance/pebble_screenshot.png b/apps/pebbleDistance/pebble_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..35ae3b5686b52be4325ceff2ac1a8cab2d8b216f GIT binary patch literal 25140 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 literal 0 HcmV?d00001 From d57ccb5073514ac85c271d5a77f493490e4a4a01 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:06:43 +0300 Subject: [PATCH 014/503] fix: update icon.js --- apps/pebbleDistance/pebble.app.js | 2 +- apps/pebbleDistance/pebble.icon.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js index a9e737fa0..14cc9e398 100644 --- a/apps/pebbleDistance/pebble.app.js +++ b/apps/pebbleDistance/pebble.app.js @@ -106,7 +106,7 @@ function getSteps() { if (WIDGETS.wpedom !== undefined) { return WIDGETS.wpedom.getSteps(); } - return '375'; + return '0'; } g.clear(); diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js index 38f2ad40e..c6b8950db 100644 --- a/apps/pebbleDistance/pebble.icon.js +++ b/apps/pebbleDistance/pebble.icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) +require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) From 99e75b8e11fe07127dd98d074f27710c2173de34 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:11:48 +0300 Subject: [PATCH 015/503] fix: change version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index abeb920c0..00aea6139 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbleDistance", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.1", + "version": "0.11", "description": "Fork of pebble clock with distance", "readme": "README.md", "icon": "pebble.png", From 8e0ba23aa8ff485b402df652e9b748475a4bf76f Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:23:38 +0300 Subject: [PATCH 016/503] fix: play with syntax --- apps/pebbleDistance/pebble.app.js | 18 +++++++++--------- apps/pebbleDistance/pebble.icon.js | 2 +- apps/pebbleDistance/pebble.settings.js | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/pebbleDistance/pebble.app.js b/apps/pebbleDistance/pebble.app.js index 14cc9e398..9caee62c9 100644 --- a/apps/pebbleDistance/pebble.app.js +++ b/apps/pebbleDistance/pebble.app.js @@ -8,7 +8,7 @@ Graphics.prototype.setFontLECO1976Regular22 = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); }; -const SETTINGS_FILE = "pebbleDistance.json"; +const SETTINGS_FILE = "pbd.json"; let settings; function loadSettings() { @@ -23,22 +23,22 @@ const ha = 2*h/5 - 11; const h2 = 3*h/5 - 19; const h3 = 7*h/8 - 10; -let batteryWarning = false; +let batWarn = false; function draw() { let date = new Date(); let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; - const stps = getSteps(); + const stp = getSteps(); // turn the warning on once we have dipped below 15% if (E.getBattery() < 15) - batteryWarning = true; + batWarn = true; // turn the warning off once we have dipped above 20% if (E.getBattery() > 20) - batteryWarning = false; + batWarn = false; g.reset(); g.setColor(settings.bg); @@ -57,16 +57,16 @@ function draw() { g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); g.drawString(da[0].toUpperCase(), w/4, ha); // day of week - g.drawString(stps, 3*w/4, ha); + g.drawString(stp, 3*w/4, ha); // time // white on red for battery warning - g.setColor(!batteryWarning ? g.theme.bg : '#f00'); + g.setColor(!batWarn ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.setColor(!batteryWarning ? g.theme.fg : '#fff'); + g.setColor(!batWarn ? g.theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 + 8); // contrast bar @@ -80,7 +80,7 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); - g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); + g.drawString((stp / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } // at x,y width:wi thicknes:th diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js index c6b8950db..5f7b157df 100644 --- a/apps/pebbleDistance/pebble.icon.js +++ b/apps/pebbleDistance/pebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")) +require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")); diff --git a/apps/pebbleDistance/pebble.settings.js b/apps/pebbleDistance/pebble.settings.js index 6b8702c56..ea1845e57 100644 --- a/apps/pebbleDistance/pebble.settings.js +++ b/apps/pebbleDistance/pebble.settings.js @@ -1,8 +1,8 @@ (function(back) { - const SETTINGS_FILE = "pebbleDistance.json"; + const SETTINGS_FILE = "pbd.json"; // initialize with default settings... - let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}}; + let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -10,13 +10,13 @@ let settings = storage.readJSON(SETTINGS_FILE, 1) || s; const saved = settings || {}; for (const key in saved) { - s[key] = saved[key] - }; + s[key] = saved[key]; + } function save() { settings = s; storage.write(SETTINGS_FILE, settings); - }; + } var color_options = ['Green','Orange','Cyan','Purple','Red','Blue']; var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; From 7cd6748d84fc2b848b10a1e1fed090413468af40 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:24:02 +0300 Subject: [PATCH 017/503] fix: version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 00aea6139..00a9a21c9 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbleDistance", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.11", + "version": "0.12", "description": "Fork of pebble clock with distance", "readme": "README.md", "icon": "pebble.png", From 4ffa694c6496f54a4a20bfaed5122412c5e1f35f Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Wed, 15 Dec 2021 22:36:31 +0300 Subject: [PATCH 018/503] fix: try to fix empty source error --- apps.json | 8 ++++---- apps/pebbleDistance/pebble.icon.js | 1 - apps/pebbleDistance/pebble.png | Bin 2004 -> 0 bytes apps/{pebbleDistance => pebbled}/ChangeLog | 0 .../LECO 1976-Regular.otf | Bin apps/{pebbleDistance => pebbled}/README.md | 0 apps/{pebbleDistance => pebbled}/pebble.app.js | 0 apps/pebbled/pebble.icon.js | 1 + apps/pebbled/pebble.png | Bin 0 -> 1591 bytes .../pebble.settings.js | 0 .../pebble_screenshot.png | Bin 11 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 apps/pebbleDistance/pebble.icon.js delete mode 100644 apps/pebbleDistance/pebble.png rename apps/{pebbleDistance => pebbled}/ChangeLog (100%) rename apps/{pebbleDistance => pebbled}/LECO 1976-Regular.otf (100%) rename apps/{pebbleDistance => pebbled}/README.md (100%) rename apps/{pebbleDistance => pebbled}/pebble.app.js (100%) create mode 100644 apps/pebbled/pebble.icon.js create mode 100644 apps/pebbled/pebble.png rename apps/{pebbleDistance => pebbled}/pebble.settings.js (100%) rename apps/{pebbleDistance => pebbled}/pebble_screenshot.png (100%) diff --git a/apps.json b/apps.json index 00a9a21c9..07783d340 100644 --- a/apps.json +++ b/apps.json @@ -5005,16 +5005,16 @@ ] }, { - "id": "pebbleDistance", + "id": "pebbled", "name": "Pebble Clock with distance", "shortName": "Pebble with distance", - "version": "0.12", - "description": "Fork of pebble clock with distance", + "version": "0.1", + "description": "Fork of pebble clock with distance in KM", "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", - "tags": "clock, distance, pebble", + "tags": "clock,distance", "supports": ["BANGLEJS2"], "storage": [ {"name":"pebble.app.js","url":"pebble.app.js"}, diff --git a/apps/pebbleDistance/pebble.icon.js b/apps/pebbleDistance/pebble.icon.js deleted file mode 100644 index 5f7b157df..000000000 --- a/apps/pebbleDistance/pebble.icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("q9XwgVShOZAAg+hFAwtiFJYsdFJwsbFKAAByBUnLDAqVFagpVQigqXFaJ/WQiYqbFZwqcFZoqdFZgqeFZYqfFZQqgFZIqhFZIqhyAqpFZAqiFY6siVw4qkFYoqlFYoqlVwgqlFYiBmQQYqnKwYqmFYZWnQQQqoFYQqoQQJWqFVIrBFVOQK35W/AAIqUmc5zOTmeYAoQGCAgQAbz/zAQP/xOP/4mC///NbwkByYCBzH/GIOZF4P5Kz4nBEQImB/CBBK0QqCFwM/QQIDBK0BRCKwP4KQIDDKzwABxJWCFAOT+ZWgFYRWC/KCB/+DKyKYCKxfzx/zKwRYCFwJWCLgIqMHpitBCAKuBQAJeBQYIYDHQIqMKxs5KIP5AQOJIIRWEFZYqOKwQeBnJWBFoM5KwgrLFRxWCbgWIKwOTQ4JWDFY8JFSQAQFYsAFUYrFyBWCFUIrFKwQqiFYhWCFQPzmYAgEgRWBhOP/4Al/EAgGYFU3/wBWBRAP/QMMzEgM5KwIrCcAQAffoQqBgDgEFUWQFcwqCzIqChIriFQxWBFcIqDQIYriFRCCBFb4qDQIgrF/Iqaz4qIFYhWdFRCuCAEKsEFcoqHFcQqIVwQAfFQ4riFRArhFRIrgFRQrfFRYreFRgrdFRorcFRwABFLGQFSArYFSSEXFKQrXFSiEUP6ZYVFLAsRFLQsOFLotKDKQA=")); diff --git a/apps/pebbleDistance/pebble.png b/apps/pebbleDistance/pebble.png deleted file mode 100644 index cb836f39f993235aeb616c208173989c44adae0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmV;_2P^oAP)2IEn4pj_t(B`$%d0=f$bN`T6&L?~i{rFfPoA zIm}`K2F}uJ0RnThb-~$N^!S8Ducq^A*y{q1uuIELqlq!Vz^Gs`_oIXvoTs&AcncVp z2Ax?0|Kl!Rpgtm+CyQ{c z4co>Vh9JJUGG@JpPAh5>X^@+^6xU6}6Ic3I7Pg4VC$=AsF79**tB56VG;ya>SVd%k z!;3rJ!YV90$70xypzxuXfgds5!ZJmt5)VZYPm+Q?-A`yzG!Pd~ly&t5&Oy#N+vG_KXf4@^^ z^;4jFz5ke(KkR%q6=-;j-9j$M$k_6fIJIwpja%O3+(Ngvol99*rocWohXarmvc~l* za@lqjrgu5EWEQelV76MdKTSB!Eh0y-#VKK}Kgg$k>|d6JXWYJ(QDSfXgfuB8GqXHH z*w4rel(%GXvt>1T<^9mxv;#yHYz+a+Hh->XE;Y+#tHJ$J+xvc&NuW*Yw zM(&{gOUE@R-)lO)ST#O^Sar^k&pD#NRwT=H3u~`m!^m*A)coATQD$N^YoP0v%V`%lWQ(=SYMFj?*CLJ|IHIQ`Ex@NZ+@-}(U!u_Gs`gzJL_o7 z%+K*BKl2wpv1`rA4AWY6&ho`!p6fIG%yOADeQjb|a(o^w>T=x~E*ZQ$R8mZW9~P+7 z-<9!tP6WgMknF_ZU)(~TP}cg?NbCU|@~~;ZR!m*LezPaX3ihpg)PIt~Gt<%$S24~a z^XLKc_*AK0IwF@aN}nt*{~C6&k;T*fvJuw}=P#2vb(WC@Qc!+UNzILC&4vbOpjrUtR1gFPw

5&nPkjackn*GG;?_F=0000 Date: Wed, 15 Dec 2021 23:03:01 +0300 Subject: [PATCH 021/503] fix: rename everything --- apps.json | 12 ++++++------ apps/pebbled/README.md | 5 +++++ .../pebbled/{pebble.app.js => pebbled.app.js} | 18 +++++++++--------- .../{pebble.icon.js => pebbled.icon.js} | 0 apps/pebbled/{pebble.png => pebbled.png} | Bin ...pebble.settings.js => pebbled.settings.js} | 2 +- 6 files changed, 21 insertions(+), 16 deletions(-) rename apps/pebbled/{pebble.app.js => pebbled.app.js} (96%) rename apps/pebbled/{pebble.icon.js => pebbled.icon.js} (100%) rename apps/pebbled/{pebble.png => pebbled.png} (100%) rename apps/pebbled/{pebble.settings.js => pebbled.settings.js} (96%) diff --git a/apps.json b/apps.json index 89249848b..e2501dbcb 100644 --- a/apps.json +++ b/apps.json @@ -5007,19 +5007,19 @@ { "id": "pebbled", "name": "Pebble Clock with distance", - "shortName": "Pebble with distance", + "shortName": "Pebble + distance", "version": "0.02", - "description": "Fork of pebble clock with distance in KM. See step count and the distance together. Default step length = 0.75m (can be changed in settings).", + "description": "Fork of Pebble Clock with distance in KM. Both step count and the distance are on the main screen. Default step length = 0.75m (can be changed in settings).", "readme": "README.md", - "icon": "pebble.png", + "icon": "pebbled.png", "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock,distance", "supports": ["BANGLEJS2"], "storage": [ - {"name":"pebble.app.js","url":"pebble.app.js"}, - {"name":"pebble.settings.js","url":"pebble.settings.js"}, - {"name":"pebble.img","url":"pebble.icon.js","evaluate":true} + {"name":"pebbled.app.js","url":"pebbled.app.js"}, + {"name":"pebbled.settings.js","url":"pebbled.settings.js"}, + {"name":"pebbled.img","url":"pebbled.icon.js","evaluate":true} ] } ] diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 7f34aa3c4..7b393d0fc 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -7,4 +7,9 @@ ![](pebble_screenshot.png) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) + Forked and changed by [RomanistHere](https://github.com/RomanistHere) + +## Plans + +Make step length depend on height/sex/age. diff --git a/apps/pebbled/pebble.app.js b/apps/pebbled/pebbled.app.js similarity index 96% rename from apps/pebbled/pebble.app.js rename to apps/pebbled/pebbled.app.js index 9caee62c9..14cc9e398 100644 --- a/apps/pebbled/pebble.app.js +++ b/apps/pebbled/pebbled.app.js @@ -8,7 +8,7 @@ Graphics.prototype.setFontLECO1976Regular22 = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); }; -const SETTINGS_FILE = "pbd.json"; +const SETTINGS_FILE = "pebbleDistance.json"; let settings; function loadSettings() { @@ -23,22 +23,22 @@ const ha = 2*h/5 - 11; const h2 = 3*h/5 - 19; const h3 = 7*h/8 - 10; -let batWarn = false; +let batteryWarning = false; function draw() { let date = new Date(); let da = date.toString().split(" "); let timeStr = da[4].substr(0,5); const t = 6; - const stp = getSteps(); + const stps = getSteps(); // turn the warning on once we have dipped below 15% if (E.getBattery() < 15) - batWarn = true; + batteryWarning = true; // turn the warning off once we have dipped above 20% if (E.getBattery() > 20) - batWarn = false; + batteryWarning = false; g.reset(); g.setColor(settings.bg); @@ -57,16 +57,16 @@ function draw() { g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); g.drawString(da[0].toUpperCase(), w/4, ha); // day of week - g.drawString(stp, 3*w/4, ha); + g.drawString(stps, 3*w/4, ha); // time // white on red for battery warning - g.setColor(!batWarn ? g.theme.bg : '#f00'); + g.setColor(!batteryWarning ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); - g.setColor(!batWarn ? g.theme.fg : '#fff'); + g.setColor(!batteryWarning ? g.theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 + 8); // contrast bar @@ -80,7 +80,7 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); - g.drawString((stp / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); + g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } // at x,y width:wi thicknes:th diff --git a/apps/pebbled/pebble.icon.js b/apps/pebbled/pebbled.icon.js similarity index 100% rename from apps/pebbled/pebble.icon.js rename to apps/pebbled/pebbled.icon.js diff --git a/apps/pebbled/pebble.png b/apps/pebbled/pebbled.png similarity index 100% rename from apps/pebbled/pebble.png rename to apps/pebbled/pebbled.png diff --git a/apps/pebbled/pebble.settings.js b/apps/pebbled/pebbled.settings.js similarity index 96% rename from apps/pebbled/pebble.settings.js rename to apps/pebbled/pebbled.settings.js index ea1845e57..3d82f0700 100644 --- a/apps/pebbled/pebble.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "pbd.json"; + const SETTINGS_FILE = "pebbleDistance.json"; // initialize with default settings... let s = {'bg': '#0f0', 'color': 'Green', 'avStep': 0.75}; From 13525cd11dca59b47c815ae909637c4720bd003b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:11:18 +0000 Subject: [PATCH 022/503] Change to skin temp characteristic. Add logging --- apps/coretemp/boot.js | 64 +++++++++++++++++++++++++----------- apps/coretemp/coretemp.js | 24 +++++++++----- apps/recorder/interface.html | 6 ++++ apps/recorder/widget.js | 28 ++++++++++++++++ 4 files changed, 93 insertions(+), 29 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 59e227dad..a73c67b47 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,23 +1,47 @@ (function() { - var gatt; - - //Would it be better to scan by uuid rather than name? - NRF.requestDevice({ timeout: 20000, filters: [{ name: 'CORE [a]' }] }).then(function(device) { - return device.gatt.connect(); - }).then(function(g) { - gatt = g; - return gatt.getPrimaryService("1809"); - }).then(function(service) { - return service.getCharacteristic("2A1C"); - }).then(function(characteristic) { - characteristic.on('characteristicvaluechanged', function(event) { - var dv = event.target.value; - var core = (dv.buffer[2]*256+dv.buffer[1])/100; - Bangle.emit('Core',{ - temp:core - }); - }); - return characteristic.startNotifications(); - }).then(function() { + +var state = {gatt : null, primary : null, temp : null, data : null}; +// Would it be better to scan by uuid rather than name? +NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + // NRF.requestDevice({timeout : 20000, filters : [ {services : + // '1809','2100'} ]}) + .then(function(device) { + return device.gatt.connect(); + }) + .then(function(g) { + state.gatt = g; + return state.gatt + .getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121') + .then(function(service) { + state.primary = service; + return state.primary.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + state.data = c; + state.data.on('characteristicvaluechanged', function(event) { + var dv = event.target.value; + var flags = dv.buffer[0]; + var unit, core = -1, skin = -1; + + if (flags & 8) { + unit = "F"; + } else { + unit = "C"; + } + + if (flags & 1) + skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) + core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', {core : core, skin : skin, unit : unit}); + }); + return c.startNotifications(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); }); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 226508c83..1856057a4 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,19 +1,25 @@ + + Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); -var btm = g.getHeight()-1; +var btm = g.getHeight() - 1; function onCore(c) { - var px = g.getWidth()/2; - g.setFontAlign(0,0); - g.clearRect(0,24,g.getWidth(),80); - var str = c.temp + "C"; - g.setFontVector(40).drawString(str,px,45); + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + + var core = "Core: " + c.core + c.unit; + var skin = "Skin: " + c.skin + c.unit; + + g.setFontVector(24).drawString(core, px, 45); + g.setFontVector(24).drawString(skin, px, 65); } -Bangle.on('Core', onCore); +Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); -g.reset().setFont("6x8",2).setFontAlign(0,0); -g.drawString("Please wait...",g.getWidth()/2,g.getHeight()/2 - 16); +g.reset().setFont("6x8", 2).setFontAlign(0, 0); +g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index ad0de4887..81ce71e5d 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -19,6 +19,9 @@ ${track[0].Heartrate!==undefined ? ` Step Count`:``} +${track[0].Core!==undefined ? ` + Core Temp + `:``} @@ -37,6 +40,9 @@ ${track.map(pt=>` ${0|pt.Heartrate}\n`).join("") ${track[0].Steps!==undefined ? ` ${track.map(pt=>` ${0|pt.Steps}\n`).join("")} `:``} +${track[0].Core!==undefined ? ` +${track.map(pt=>` ${0|pt.Core}\n`).join("")} + `:``} diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 09893bbb7..144164f4c 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -82,6 +82,34 @@ draw : (x,y) => g.setColor(hasBPM?"#f00":"#888").drawImage(atob("DAyBAAAAAD/H/n/n/j/D/B+AYAAAAA=="),x,y) }; }, + + temp:function() { + var temp = 0; + var hasCore = false; + function onCore(c) { + temp=c.core; + hasCore = true; + } + return { + name : "Core", + fields : ["Core"], + getValues : () => { + var r = temp; + return r; + }, + start : () => { + hasCore = false; + Bangle.on('CoreTemp', onCore); +// Bangle.setHRMPower(1,"recorder"); + }, + stop : () => { + hasCore = false; + Bangle.removeListener('CoreTemp', onCore); +// Bangle.setHRMPower(0,"recorder"); + }, + draw : (x,y) => g.reset().drawImage(atob("DAyBAAADDHnnnnnnnnnnjDmDnDnAAA=="),x,y) + }; + }, steps:function() { var lastSteps = 0; return { From 6d9c95045aa7c6c7a08aa3b3f81c5ec8be5acc23 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:19:58 +0000 Subject: [PATCH 023/503] Increase versions --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..595603578 100644 --- a/apps.json +++ b/apps.json @@ -768,7 +768,7 @@ "id": "recorder", "name": "Recorder (BETA)", "shortName": "Recorder", - "version": "0.04", + "version": "0.05", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", @@ -4960,7 +4960,7 @@ { "id": "coretemp", "name": "Core Temp Display", - "version": "0.01", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", From c852e1a215e3606a9f06a35ddb42cf72d213374a Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 10:52:47 +0300 Subject: [PATCH 024/503] fix: dark theme color --- apps.json | 2 +- apps/pebbled/pebbled.app.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e2501dbcb..6f249171a 100644 --- a/apps.json +++ b/apps.json @@ -5008,7 +5008,7 @@ "id": "pebbled", "name": "Pebble Clock with distance", "shortName": "Pebble + distance", - "version": "0.02", + "version": "0.1", "description": "Fork of Pebble Clock with distance in KM. Both step count and the distance are on the main screen. Default step length = 0.75m (can be changed in settings).", "readme": "README.md", "icon": "pebbled.png", diff --git a/apps/pebbled/pebbled.app.js b/apps/pebbled/pebbled.app.js index 14cc9e398..bbe98823f 100644 --- a/apps/pebbled/pebbled.app.js +++ b/apps/pebbled/pebbled.app.js @@ -80,6 +80,12 @@ function draw() { g.setColor(settings.bg); g.drawImage(img, w/2 + ((w/2) - 64)/2, -2, { scale: 1 }); drawCalendar(((w/2) - 42)/2, 11, 42, 4, da[2]); + + // distance + if (settings.color == 'Blue' || settings.color == 'Red') + g.setColor('#fff'); // white on blue or red best contrast + else + g.setColor('#000'); // otherwise black regardless of theme g.drawString((stps / 1000 * settings.avStep).toFixed(2) + ' KM', w/2, ha + 107); } From 676de1775ccc72ea60567228ba18c28461fc7ddb Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 10:54:35 +0300 Subject: [PATCH 025/503] fix: update step length setting --- apps/pebbled/pebbled.settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pebbled/pebbled.settings.js b/apps/pebbled/pebbled.settings.js index 3d82f0700..d6c84d5d1 100644 --- a/apps/pebbled/pebbled.settings.js +++ b/apps/pebbled/pebbled.settings.js @@ -24,7 +24,7 @@ E.showMenu({ '': { 'title': 'Pebble Clock' }, '< Back': back, - 'Colour': { + 'Color': { value: 0 | color_options.indexOf(s.color), min: 0, max: 5, format: v => color_options[v], @@ -38,7 +38,7 @@ value: 0.75 || s.avStep, min: 0.2, max: 1.5, - step: 0.05, + step: 0.01, onchange : v => { s.avStep = v; save(); From 6e9611b913f0a072354eda812eb87349276aaa59 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:04:47 +0300 Subject: [PATCH 026/503] feat: add photo --- apps/pebbled/README.md | 1 + apps/pebbled/photo.jpg | Bin 0 -> 57580 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/pebbled/photo.jpg diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 7b393d0fc..8e87525f4 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -5,6 +5,7 @@ - Battery warning changed to 15% instead of 30% ![](pebble_screenshot.png) +![](photo.jpg) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/pebbled/photo.jpg b/apps/pebbled/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3635ff4dc22e970fa823cf9156b08303ce38690 GIT binary patch literal 57580 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 Pw-kI)a!uUezmNY9M3zbm literal 0 HcmV?d00001 From bcf9f07d17418f8b2560bbac6059a5d6009a4a64 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:10:18 +0300 Subject: [PATCH 027/503] fix: set width to images --- apps/pebbled/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 8e87525f4..fc41f13ec 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -4,8 +4,10 @@ - Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) - Battery warning changed to 15% instead of 30% -![](pebble_screenshot.png) -![](photo.jpg) +

+ screenshot + photo +
Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From 6ef60ff6c5eed6c9ca23755750cad25cd6dcbf08 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:17:37 +0300 Subject: [PATCH 028/503] fix: reset width, update image --- apps/pebbled/README.md | 6 ++---- apps/pebbled/photo.jpg | Bin 57580 -> 165060 bytes 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index fc41f13ec..8e87525f4 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -4,10 +4,8 @@ - Added distance in km (kilometers) based on step length (can be changed in settings and is equal 0.75m by default) - Battery warning changed to 15% instead of 30% -
- screenshot - photo -
+![](pebble_screenshot.png) +![](photo.jpg) Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/pebbled/photo.jpg b/apps/pebbled/photo.jpg index d3635ff4dc22e970fa823cf9156b08303ce38690..d9590bd181210dfae7828a5c48b33176c1c080bd 100644 GIT binary patch literal 165060 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%0D;9@-K8xXZ8fI-^hfJQ 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 GGyey8I$%@) literal 57580 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 Pw-kI)a!uUezmNY9M3zbm From 2b8bcf55b9245e79654e3b1dddccf122d5fe9844 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:27:43 +0300 Subject: [PATCH 029/503] chore: update readme --- apps/pebbled/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 8e87525f4..166a77963 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -11,6 +11,10 @@ Written by: [Hugh Barney](https://github.com/hughbarney) For support and discus Forked and changed by [RomanistHere](https://github.com/RomanistHere) +## How to measure step length + +It's much easier than you think. When you're walking, just note number of current steps at two points and then see the distance in any map service. For example, your route from bus station to home. Write number of steps at bus station (let's say 3451) and when you entered your home (3921). You passed 3921 - 3451 = 470 steps. Then see the actual distance in Google maps. Let's say it shows 300 meters. So your step length (in settings) used in app should be 300 / 470 = 0.64. After you have set it, the displayed distance at the main screen should be more accurate. + ## Plans -Make step length depend on height/sex/age. +Make step length depend on height/sex/age for lazy ones who don't want to measure it. From 040c3eeaa5500332decc903ff9a1f9240007c713 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:29:23 +0300 Subject: [PATCH 030/503] fix: update readme [2] --- apps/pebbled/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/pebbled/README.md b/apps/pebbled/README.md index 166a77963..0d587ade8 100644 --- a/apps/pebbled/README.md +++ b/apps/pebbled/README.md @@ -7,10 +7,12 @@ ![](pebble_screenshot.png) ![](photo.jpg) -Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) +Initially written by: [Hugh Barney](https://github.com/hughbarney) Forked and changed by [RomanistHere](https://github.com/RomanistHere) +For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) + ## How to measure step length It's much easier than you think. When you're walking, just note number of current steps at two points and then see the distance in any map service. For example, your route from bus station to home. Write number of steps at bus station (let's say 3451) and when you entered your home (3921). You passed 3921 - 3451 = 470 steps. Then see the actual distance in Google maps. Let's say it shows 300 meters. So your step length (in settings) used in app should be 300 / 470 = 0.64. After you have set it, the displayed distance at the main screen should be more accurate. From d5b3bdc0d52ff6486e71016c924ba5e88a5fffb2 Mon Sep 17 00:00:00 2001 From: RomanistHere Date: Thu, 16 Dec 2021 11:39:58 +0300 Subject: [PATCH 031/503] fix: remove semicolon from the image --- apps/pebbled/pebbled.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pebbled/pebbled.icon.js b/apps/pebbled/pebbled.icon.js index ea59dd1cb..646e242b5 100644 --- a/apps/pebbled/pebbled.icon.js +++ b/apps/pebbled/pebbled.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4kB78A/4ACj/fn8Rz/Or987+M38hv8Rn++z9Cn8y/9rj9Tr+diIAHiAxDgIOICpYADCywyNCxQYMSxouVGBIWODBDgRC7hGQJAwWRGAguSC7JICCyYXYJAQXWLyhICC94LKu8Gqk1gGD+AjQ//C6Ei2HS0AXQ/U2gEquFVC6Pyk8AlssmwXK3oGF+fi2Et0v2C4ONoAPFhsiwBfFhU0lvS2wXBsVUC4vSkwHF90Etlso0L6CSBkowEFwNgM5sImQwEFw4AJGAguQGAsQ6UvxAAQ2UloMYkQAU0MZmUjmYAQmUi+MRSowAM4UmiMRSowALhiKBC4MQGCIuBgAXCGCAuCgIXBiLGCFyQXCGAJINsToBC4cQgGMI50AIwYwCACAWEGAQAOFwowRCwwwPFw4wPCxAYNCxRJLCxYxKCxwyGORI")); +require("heatshrink").decompress(atob("mEw4kB78A/4ACj/fn8Rz/Or987+M38hv8Rn++z9Cn8y/9rj9Tr+diIAHiAxDgIOICpYADCywyNCxQYMSxouVGBIWODBDgRC7hGQJAwWRGAguSC7JICCyYXYJAQXWLyhICC94LKu8Gqk1gGD+AjQ//C6Ei2HS0AXQ/U2gEquFVC6Pyk8AlssmwXK3oGF+fi2Et0v2C4ONoAPFhsiwBfFhU0lvS2wXBsVUC4vSkwHF90Etlso0L6CSBkowEFwNgM5sImQwEFw4AJGAguQGAsQ6UvxAAQ2UloMYkQAU0MZmUjmYAQmUi+MRSowAM4UmiMRSowALhiKBC4MQGCIuBgAXCGCAuCgIXBiLGCFyQXCGAJINsToBC4cQgGMI50AIwYwCACAWEGAQAOFwowRCwwwPFw4wPCxAYNCxRJLCxYxKCxwyGORI")) From cb32ad6121e347f5a92be5e6c2c160c167dbd9f8 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 11:20:37 +0100 Subject: [PATCH 032/503] Update app.js --- apps/toucher/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/toucher/app.js b/apps/toucher/app.js index 8ac198f52..aab50fbda 100644 --- a/apps/toucher/app.js +++ b/apps/toucher/app.js @@ -293,9 +293,9 @@ Bangle.on('swipe', dir => { else next(); }); -// close launcher when lcd is off -Bangle.on('lcdPower', on => { - if(!on) return load(); +// close launcher when screen is locked +Bangle.on('lock', on => { + if(on) return load(); }); if (process.env.HWVERSION == 1) { From 16cba6794f1840bcdc8fbb84dc37b20062c01a1a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:04:15 +0100 Subject: [PATCH 033/503] Update README.md --- apps/showimg/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/showimg/README.md b/apps/showimg/README.md index 9d7c0067a..0624fd962 100644 --- a/apps/showimg/README.md +++ b/apps/showimg/README.md @@ -1,3 +1,3 @@ Displays an image. I use this app to show my vaccination certificate. -The image is read from the file "showimage.user.img". +The image is read from the file "showimg.user.img". Returns to watch face after 60s/button push. From 6802e28e3007ae9886178b7245b7b7395bb61bd7 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:05:00 +0100 Subject: [PATCH 034/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8b4e86d52..109324fb6 100644 --- a/apps.json +++ b/apps.json @@ -4980,7 +4980,7 @@ "name": "simple image viewer", "shortName":"showImage", "version":"0.2", - "description": "Displays the image in \"showimage.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", + "description": "Displays the image in \"showimg.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], From 2fbffb3a44f4bc9cb9cd6cc9e41a2b12179b8e53 Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 16:03:50 +0100 Subject: [PATCH 035/503] Update locales: de_DE, de_AT and es_ES --- apps/locale/locales.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 2e3fa8713..fd6554f70 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -154,7 +154,8 @@ var locales = { month: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", "< Back": "< Zurück" } + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_US": { lang: "en_US", @@ -333,7 +334,8 @@ var locales = { month: "Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember", abday: "So,Mo,Di,Mi,Do,Fr,Sa", day: "Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag", - trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus" } + trans: { yes: "ja", Yes: "Ja", no: "nein", No: "Nein", ok: "ok", on: "an", off: "aus", + "< Back": "< Zurück", "Delete": "Löschen", "Mark Unread": "Als ungelesen markieren" } }, "en_IL": { lang: "en_IL", @@ -369,7 +371,8 @@ var locales = { month: "enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre", abday: "dom,lun,mar,mié,jue,vie,sáb", day: "domingo,lunes,martes,miércoles,jueves,viernes,sábado", - trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off" } + trans: { yes: "sí", Yes: "Sí", no: "no", No: "No", ok: "ok", on: "on", off: "off", + "< Back": "< Atrás", "Delete": "Borrar ", "Mark Unread": "Marcar como no leído" } }, "fr_BE": { lang: "fr_BE", From e3e2ee9ea001e6b6dc91d16ac7d1b4dda48fadec Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 16:19:00 +0100 Subject: [PATCH 036/503] Fix missing ampm in de_AT --- apps/locale/locales.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index fd6554f70..b607998a0 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -328,6 +328,7 @@ var locales = { speed: "kmh", distance: { 0: "m", 1: "km" }, temperature: "°C", + ampm: { 0: "", 1: "" }, timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, datePattern: { 0: "%A, %d. %B %Y", "1": "%d.%m.%y" }, // Sonntag, 1. März 2020 // 01.03.20 abmonth: "Jän,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez", From 3ce407caf4a9470a4cf131948441ae3db7330445 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:26:52 +0100 Subject: [PATCH 037/503] Add setting for battery warn level and color battery text red if below level --- apps/circlesclock/app.js | 11 ++++++----- apps/circlesclock/settings.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 8474b7f4e..a7ec05868 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -11,13 +11,15 @@ let settings; function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { 'maxHR': 200, - 'stepGoal': 10000 + 'stepGoal': 10000, + 'batteryWarn': 30 }; } const colorFg = '#fff'; const colorBg = '#000'; const colorGrey = '#808080'; +const colorRed = '#ff0000'; let hrtValue; @@ -89,13 +91,12 @@ function drawSteps() { } function drawHeartRate() { - const red = '#ff0000'; g.setColor(colorGrey); g.fillCircle(w2, h3, radiusOuter); if (hrtValue != undefined) { const percent = hrtValue / settings.maxHR; - drawGauge(w2, h3, percent, red); + drawGauge(w2, h3, percent, colorRed); } g.setColor(colorBg); @@ -106,7 +107,7 @@ function drawHeartRate() { g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(hrtValue != undefined ? hrtValue : 0, w2, h3); + g.drawString(hrtValue != undefined ? hrtValue : "-", w2, h3); g.drawImage(heartIcon, w2 - 6, h3 + radiusOuter - 6); } @@ -129,7 +130,7 @@ function drawBattery() { g.setFont("Vector:12"); g.setFontAlign(0, 0); - g.setColor(colorFg); + g.setColor(settings.batteryWarn == undefined || battery > settings.batteryWarn ? colorFg : colorRed); g.drawString(battery + '%', w3, h3); g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 2de278b47..ffda51538 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -28,6 +28,16 @@ }, onchange: x => save('stepGoal', x), }, + 'battery warn lvl': { + value: "batteryWarn" in settings ? settings.batteryWarn : 30, + min: 10, + max : 100, + step: 10, + format: x => { + return x + '%'; + }, + onchange: x => save('batteryWarn', x), + }, '< Back': back, }); }); From ace239047be095330b6a61ff55219bc981f4926d Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:55:39 +0100 Subject: [PATCH 038/503] Resize icon to 48x48 --- apps/circlesclock/app-icon.js | 2 +- apps/circlesclock/app.png | Bin 3576 -> 18474 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app-icon.js b/apps/circlesclock/app-icon.js index ad727251a..a5a7fdfed 100644 --- a/apps/circlesclock/app-icon.js +++ b/apps/circlesclock/app-icon.js @@ -1 +1 @@ - require("heatshrink").decompress(atob("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")) + require("heatshrink").decompress(atob("mEwwcCIf4ALv///gFCv0Agf+CJP/wAODAwPAEpAjCCIX8h4RMj/+g/8gP4CA4LBDoP/GpkH8EP4/8LIIRMAQIOCCJU/CgQOBEwMPI5ARCR4YRJgP/gB3CI5Z0CCIiABfHRfEj+BAoN+n4FBLIkP/8chwRBx5cC//8v4REhytDgYRCv//8fxEYwRFgfxA4I1FRgI1D+JHE/7FINZzCBAAc4CRU4/kB44FCjgRKLQRlBPQ4RHgYCB/jpBABB6BPoKzBCJYAGuD/vAB1JkgLJm3bAgUCpMnwDdCPwIFChu27dgAoMSCIP+FAQRB+AFBtoRBtgFByQCBRIIoBAocDtonBAQWQdgXAgVIAocDEAUNwEEyEHBYUSoE//gRCsI7BxvACIILDCIcBCIYFCCJ3/wIRCIIYRBI4h6CAoJrDLJYRDDwJ9LAoKhBoMDUIcEgFwUIQREgUBaAcIkhPCAAQzBAAUBdIhhDAAMGCIkAkAFEdAQAFA==")) diff --git a/apps/circlesclock/app.png b/apps/circlesclock/app.png index 94ff885faba99f8be0bed9a3dc9c3523e32de816..493bfa5675a3856adeeed89b12a0dcde79679d66 100644 GIT binary patch literal 18474 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 literal 3576 zcmai1`8U*!|9#Jxu~$r~&|_)r+sKwI>6v6-vJZ-}W*uZ{?1Pl-lqF&kW62DIv4*Dd z3`u-U*0Ie)Sz}};)yL-#_@3|UoY%eQb{L~x&=hr@K+cM6Jy>ftR2-YD43GO(s!!^ zYbk+50Q5OE_RC@B=foDLmy1LeU`)uxMIZf?D$vD26=kx0NvU#5%`=}EdJ!r7a?oXv z|FZZLNJqZ&agzuD_aA_SfRCG(_&rv(#LTkgzQt<6$}hyg19ui}a)*+B%!zMCxU`oR zwD*7cQ$%~8W{tMc0Ti*KkIhJMVOj!uEF#J`+K81Q$% zaRgRMb8^?8zd;*uCl8q86bIRdnlJi4kIqZBb@hkt6|$NQ$b|ZDt;-2k!Ix`=&L)L_ zP+pSrZ5d>NHX<`gAOjK8NIN*YiMPU=m5M4s)pu`Vp&L+T9tmw1wkyt(!*?3ioO%(i z3A$)9v8=`?f4fZgDvt$tzAlY^I`uC^J~tZ?th>B>u45rNrn&YX%jsvGEo^0cA=9Ty6 zWJ{bAjo&<>Y*%2*Go`7Z=NZ*;X6h8APl;$YeKpqveoIgj&Y?2ulg~F}z8*^OscWRO zv#bR)VU2ywrecvV5TLPuVU8tip@<{@^AW7?kB8Wv)i-9)mYo<*l*OaA#esvy3UOl^l6DhikKA7E`7G znti_*eoN~AG*$3WhY`>AjsDoNZOQ$6S5<{$_+8ypXlH?e#F^#7VBF9RgLCmT+6}QT zo7&Njb;7#8`%XQ*a88pIG6P%(j~A^ecCafoPNIVUGcg$s@7>4t3Vlvf8x&w_zbt1l zqo;y@#|M@-Gk9B|?Lr^wrlLEaUEpf$TPOnxAbIo5lNa88Me;& zkERbXVV~UqZzh`d>Pg#Pj5YLn=6*+q4ro*Np4FjuXHCXBIGE>j<(xasFBdK-xmz+D z8%HXNvO`mxOe2TCGW-Y0KmpnZ^mVw%$Y2-JX7{fy;9VzX?b3-JA#Tf1&63?{ez12G zKKf!KMv6;Go=QKOL{6)Sy&DH_JS;O5$R2cq8ZuBaD2C>LcF!^)DEHl=5O$?g)PWRsX5j4MSDG(j%?gTHzts6QjSpSfSa4KF<+acnW} zRhPH9{lbjPXnCi>K@s;AKoKSq?Pg#zDc(a2Cn%fqRpll~!ES-^W2`oR94}^|v~JBS>BG_^Oh-Mf(>Ol~m<331 zd^s)3&a`ItXPtqw1e)qyRDuePE$I3ybU${(L8b^s5%44P(ueF^aU247!d0bzE3}rLGi&a%vs7;jA=~?ql(q zaVT>O^91|OjCmDD4i2OT&J0LW;#K+BgQcAD2{8eWmXtuWP=V`>wl&*}q>?>|<|Wf( zNaVt!rPZI6zqS#F?R+t_NN=B`z3dxOPHOU-`rcmEk!K5d74j2^)HK14;ujF?)!qwV ziUEZ8GUh&vIdjR?EC}3LSoY?lG44TV%#|*#P4`C|QqrK=&p-azk^28kTwv7C)F1p7 zaT!Gk@lMWfA+eB&HBPeCOshXgPMbfZGdnKsNMdWw!tJ?*M{-NVeMDgiu$Q?1O#4ia z0;TzfRDYtB;k%#fjY*$R1JNI%W2$F=+Q?cqB^_HK)}ZTs$|vOoZ2+O;gX2?<5+10f zl>Zy+6od$7jozHHmH}lx+z*0w-z--uNqusQ;8|ar?80B?+i$b!^tu7eL}BOLf7>&q z#V~SrdFQMC9YvafiOCmM#)g``u+ewC#R&o_1eHE}PhZ`&5XH_uFV`lG#*N(w(XG@! z2b>T_)T-4}(qi6X5?5qAdHO;RL$h=wvS$EHqlOQ0g(~gnprHnev97dsbADX3 z%(~SRew+k0+fP0tXFl7#ke#ViX)+lRn9Yz*8g z{IJe0Ck{#;C*+`}=&S2<2^`*bwc8Qe08=(AbL-8&I{s5&lu=Ly*1K2xrUqGww-F*c zR)O12u_oDUB@Rak48tYo?zC@Q4Ug$XH26o7hjrc-23~RgmF;&mMqOy#TZzVB#rV3( zgI^y&g8~=pjjOWhK^+tzCeiBXBL`Qi-Y*9a@GD#T!G`>t{7moVh7Qaa4HNjzdAq)n zbZ$F5!1QXl!z5Cy<#+dS9!uw&slK@k+&ZzsE`gu0pMg!Lgqx+VIp|tPBm1HgLrOx2^GgKXzwcSppx3{x*^Ap;HsigCX0?U)vJI7R7 z_#Bjn2&kt7zkxzVx6XLh7-nxcx-d73*h(B!0!$0U0uckLq!zdVjv&%j>6*Bwvq9MI z8rH;-7;3XBQKB4eVZO+8FMX3WNBQ7As@}eK@0`=snDGTkSCs1;AbscYuy%8#WB6-o z^Yw;GR|X1hht6oJt$Lt56=-p|t!@(f9@JeFJQqvoPoAzR)vfAvL04~+wfoia`DFM6}411$jVuFs39P!5*Tk3KK^)RM`;;n5_ zl}vtFDDy{&=E^0;f_h0&zA5-1HhIKgRW)lj+yv*CW9?_iKGAho=;$tI=f19P2@L(f z2KpYaV6sshj>f5XbL&~Fc?WK3?B=zB#P=|wahN`aJKhhj)@{K-HmDdurgM`kFaPbt zL45Dz`d3_a(;QUe_2pQH%6G5HV{p#ng+i3{-37ujUIZ^`qLwkhuq*} z-kw~e^$#&M$b{~WczHv*{6C~?nYQk%2qgXEfeA2u!QC=P&f}f2ODj3oMfuVwxs=aT zOAtFGFYXlFotwnF-(Ux;y`NS%V!HB0Yc96>#l?F2_cjQ}1k0SF{no*2m!@;Fay>sC z&)Pm6+@)A>xg)S|x$Ykc>Pb?YBVIw51fqE7`OUoYW?T1aD0{58L9fZ8k_8$`->@|> z)lHFY!jIB!AwbD)L8ve#_8X;1H|HN6U!_K9g8Yv)wNW!cy&re!IFYxB3ZO$9ySezA zwCKZCVAHX@;&tjoR^@(s$YbuXViPM9!KaIcqK24N_%fh+*wi92&|c@E4Zg!2lJWYumOH_M2w|-W-I?ezk_T1RY7teb`+l{o4AT4Z z#d15WBo3drKN=)jEZslwcC7_)>9v+ETa$^^?&POFs2KMbw@6k`aY%YlUfdQJ9`{U@ zG%nVx8f`x>(#6^}Ky}PRx5$HMQ=D?g91hA~#C~4{*)NH-jUkCKZo6dJ@oF!o8}3Wt d08WwZ51V4}M)R57;s5=1fblI0{W>H%@xRtAyzu}4 From 696d46e7172d67abaef90a253bd741d4624961fa Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 17:56:31 +0100 Subject: [PATCH 039/503] Bump version to v0.02 --- apps.json | 2 +- apps/circlesclock/Changelog | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..ee3e164b1 100644 --- a/apps.json +++ b/apps.json @@ -5009,7 +5009,7 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.01", + "version":"0.02", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", "dependencies": {"widpedom":"app"}, diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog index af119ab59..fa2139fff 100644 --- a/apps/circlesclock/Changelog +++ b/apps/circlesclock/Changelog @@ -1 +1,2 @@ -0.01: New clock +0.01: New clock +0.02: Fix icon & add battery warn functionality From 47706cf1724a06ae80e2901cca777318f12b06a6 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 18:08:12 +0100 Subject: [PATCH 040/503] Fixed name of ChangeLog file --- apps/circlesclock/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/circlesclock/ChangeLog diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog new file mode 100644 index 000000000..fa2139fff --- /dev/null +++ b/apps/circlesclock/ChangeLog @@ -0,0 +1,2 @@ +0.01: New clock +0.02: Fix icon & add battery warn functionality From a49513d18a5a252cfa3eea36ae473d6c57f6fd0e Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 20:03:00 +0100 Subject: [PATCH 041/503] Delete Changelog --- apps/circlesclock/Changelog | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 apps/circlesclock/Changelog diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog deleted file mode 100644 index fa2139fff..000000000 --- a/apps/circlesclock/Changelog +++ /dev/null @@ -1,2 +0,0 @@ -0.01: New clock -0.02: Fix icon & add battery warn functionality From b192f75b55bc99f7b5f41c448d58c1bef9fe3e45 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 14:44:52 -0500 Subject: [PATCH 042/503] Have it average readings After 10 consecutive readings it starts averaging the temp displayed from a FIFO cache. It slows down the responsiveness but delivers better figures over time instead of jumping degrees +/-. --- apps/ltherm/app.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/ltherm/app.js b/apps/ltherm/app.js index 06ff92e18..7accae2ed 100644 --- a/apps/ltherm/app.js +++ b/apps/ltherm/app.js @@ -1,26 +1,25 @@ -function onTemperature(p) { +function drawTemperature() { g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); g.setFont("6x8",2).setFontAlign(0,0); var x = g.getWidth()/2; var y = g.getHeight()/2 + 10; g.drawString("Temp", x, y - 45); g.setFontVector(70).setFontAlign(0,0); - var t = require('locale').temp(p.temperature); + var h = E.getTemperature(); + if (avg.length < 10) { + avg[avg.length] = h; + } else { + avg.shift(); + avg[avg.length] = h; + h = ((avg[0] + avg[1] + avg[2] + avg[3] + avg[4] + avg[5] + avg[6] + avg[7] + avg[8] + avg[9]) / 10); + } + var t = require('locale').temp(h); g.drawString(t, x, y); } - -function drawTemperature() { - onTemperature({ - temperature : E.getTemperature() - }); - -} - - +const avg = []; setInterval(function() { drawTemperature(); }, 2000); -drawTemperature(); E.showMessage("Loading..."); Bangle.loadWidgets(); Bangle.drawWidgets(); From 0984dfb463e95a1d6202decc163934feee453c8b Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Thu, 16 Dec 2021 12:22:34 -0800 Subject: [PATCH 043/503] Update README.md Clarify that the autobacklight is only needed for older firmware. --- apps/pooqroman/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pooqroman/README.md b/apps/pooqroman/README.md index 87acea9ca..f88cc4fbd 100644 --- a/apps/pooqroman/README.md +++ b/apps/pooqroman/README.md @@ -16,8 +16,8 @@ the ability to check the _exact_ time, hands free, without the impact on battery Although we generally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. You can also override the system 12/24 hour setting just for this face here, since it's, well, a rather different experience than with numeric displays. -By default, there is a backlight that comes on when you twist your wrist. This, of course, somewhat increases power draw and could be -annoying in an intentionally dark environment, so there is an option to disable it. +In some previous versions of the Bangle.js firmware, the backlight doesn't come on automatically when you twist your wrist. There's currently a +workaround for this integrated into the watchface; you can disable it in the menu, if you prefer. One other thing: there's some integration with system timers and alarms; they will show as small pips at the appropriate places in the day around the display. When they come within an hour, the pips turn to crosses relating to the minute hand, and the minute From aa365bc1de6de1e816f3cb50e16fd8a55f8eb7d6 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 16 Dec 2021 21:11:51 +0000 Subject: [PATCH 044/503] Setting: restructed menus as per forum discussion --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 59 ++++++++++++++++++++++++++++------------ 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..876b95d7f 100644 --- a/apps.json +++ b/apps.json @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.37", + "version": "0.38", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 64844dcbc..143144d51 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -40,3 +40,4 @@ 0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey +0.38: Restructed menus as per forum discussion diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 9cba09d6c..1a9463858 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -61,6 +61,37 @@ if (!settings) resetSettings(); const boolFormat = v => v ? /*LANG*/"On" : /*LANG*/"Off"; function showMainMenu() { + + const mainmenu = { + '': { 'title': 'Settings' }, + '< Back': ()=>load(), + /*LANG*/'Apps': ()=>showAppSettingsMenu(), + /*LANG*/'Bluetooth': ()=>showBLEMenu(), + /*LANG*/'System': ()=>showSystemMenu(), + /*LANG*/'Alerts': ()=>showAlertsMenu(), + /*LANG*/'Utils': ()=>showUtilMenu(), + /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() } + }; + + return E.showMenu(mainmenu); +} + +function showSystemMenu() { + + const mainmenu = { + '': { 'title': 'System' }, + '< Back': ()=>showMainMenu(), + /*LANG*/'Theme': ()=>showThemeMenu(), + /*LANG*/'LCD': ()=>showLCDMenu(), + /*LANG*/'Locale': ()=>showLocaleMenu(), + /*LANG*/'Select Clock': ()=>showClockMenu(), + /*LANG*/'Set Time': ()=>showSetTimeMenu() + }; + + return E.showMenu(mainmenu); +} + +function showAlertsMenu() { var beepMenuItem; if (BANGLEJS2) { beepMenuItem = { @@ -91,12 +122,9 @@ function showMainMenu() { }; } - const mainmenu = { - '': { 'title': 'Settings' }, - '< Back': ()=>load(), - /*LANG*/'App Settings': ()=>showAppSettingsMenu(), - /*LANG*/'BLE': ()=>showBLEMenu(), + '': { 'title': 'Alerts' }, + '< Back': ()=>showMainMenu(), /*LANG*/'Beep': beepMenuItem, /*LANG*/'Vibration': { value: settings.vibrate, @@ -119,23 +147,18 @@ function showMainMenu() { updateOptions(); if ("qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); }, - }, - /*LANG*/'Locale': ()=>showLocaleMenu(), - /*LANG*/'Select Clock': ()=>showClockMenu(), - /*LANG*/'Set Time': ()=>showSetTimeMenu(), - /*LANG*/'LCD': ()=>showLCDMenu(), - /*LANG*/'Theme': ()=>showThemeMenu(), - /*LANG*/'Utils': ()=>showUtilMenu(), - /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() }, + } }; return E.showMenu(mainmenu); } + function showBLEMenu() { var hidV = [false, "kbmedia", "kb", "joy"]; var hidN = ["Off", "Kbrd & Media", "Kbrd","Joystick"]; E.showMenu({ + '': { 'title': 'Bluetooth' }, '< Back': ()=>showMainMenu(), 'Make Connectable': ()=>makeConnectable(), 'BLE': { @@ -190,7 +213,7 @@ function showThemeMenu() { } var m = E.showMenu({ '':{title:'Theme'}, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'Dark BW': ()=>{ upd({ fg:cl("#fff"), bg:cl("#000"), @@ -335,7 +358,7 @@ function showWhitelistMenu() { function showLCDMenu() { const lcdMenu = { '': { 'title': 'LCD' }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'LCD Brightness': { value: settings.brightness, min: 0.1, @@ -447,7 +470,7 @@ function showLCDMenu() { function showLocaleMenu() { const localemenu = { '': { 'title': 'Locale' }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), 'Time Zone': { value: settings.timezone, min: -11, @@ -551,7 +574,7 @@ function showClockMenu() { '': { 'title': 'Select Clock', }, - '< Back': ()=>showMainMenu(), + '< Back': ()=>showSystemMenu(), }; clockApps.forEach((app, index) => { var label = app.name; @@ -578,7 +601,7 @@ function showSetTimeMenu() { '': { 'title': 'Set Time' }, '< Back': function () { setTime(d.getTime() / 1000); - showMainMenu(); + showSystemMenu(); }, 'Hour': { value: d.getHours(), From b1e4b82ecc844902e33ca94731c5b7f1e4667782 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 16 Dec 2021 21:34:06 +0000 Subject: [PATCH 045/503] fix temp --- apps/recorder/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 144164f4c..0c86ff09a 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -94,7 +94,7 @@ name : "Core", fields : ["Core"], getValues : () => { - var r = temp; + var r = [temp]; return r; }, start : () => { From 89f385c68ada36acd50f313476790409fe31674d Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:10:18 -0500 Subject: [PATCH 046/503] Update apps.json Merged upstream --- apps.json | 86 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/apps.json b/apps.json index 5813561cf..4e79025be 100644 --- a/apps.json +++ b/apps.json @@ -16,7 +16,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.38", + "version": "0.39", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", @@ -100,7 +100,7 @@ "name": "Android Integration", "shortName": "Android", "version": "0.05", - "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", + "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.", "icon": "app.png", "tags": "tool,system,messages,notifications", "dependencies": {"messages":"app"}, @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.36", + "version": "0.37", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", @@ -304,7 +304,7 @@ "id": "gbridge", "name": "Gadgetbridge", "version": "0.25", - "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "description": "(NOT RECOMMENDED) Displays Gadgetbridge notifications from Android. Please use the 'Android' Bangle.js app instead.", "icon": "app.png", "type": "widget", "tags": "tool,system,android,widget", @@ -1590,7 +1590,7 @@ { "id": "widpedom", "name": "Pedometer widget", - "version": "0.19", + "version": "0.20", "description": "Daily pedometer widget", "icon": "widget.png", "type": "widget", @@ -3478,8 +3478,8 @@ { "id": "speedalt2", "name": "GPS Adventure Sports II", - "shortName": "GPS Adv Sport II", - "version": "0.07", + "shortName":"GPS Adv Sport II", + "version":"1.10", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "icon": "app.png", "type": "app", @@ -4209,10 +4209,10 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.08", + "version": "0.09", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", - "dependencies": {"mylocation":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", @@ -4723,8 +4723,9 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.04", + "version": "0.06", "description": "A pebble style clock to keep the rebellion going", + "dependencies": {"widpedom":"app"}, "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], @@ -4858,10 +4859,10 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.10", + "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "screenshots": [{"url":"manage_patterns_light.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", @@ -4876,11 +4877,11 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.02", + "version": "0.03", "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", "readme": "README.md", "icon": "rebble.png", - "dependencies": {"mylocation":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_rebble.png"}], "type": "clock", "tags": "clock", @@ -4918,6 +4919,7 @@ "supports" : ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "storage": [ + {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, {"name":"clicompleteclk.settings.js","url":"settings.js"} ], @@ -4941,7 +4943,7 @@ { "id": "pooqround", "name": "pooq Round watch face", "shortName":"pooq Round", - "version":"0.00", + "version":"0.01", "description": "A 24 hour analogue watchface with high legibility and a novel style.", "icon": "app.png", "type": "clock", @@ -4973,6 +4975,58 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, + { + "id": "showimg", + "name": "simple image viewer", + "shortName":"showImage", + "version":"0.2", + "description": "Displays the image in \"showimage.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", + "icon": "app.png", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"showimg.app.js","url":"app.js"}, + {"name":"showimg.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "lapcounter", + "name": "Lap Counter", + "version": "0.01", + "description": "Click button to count laps. Shows count and total time snapshot (like a stopwatch, but laid back).", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "app", + "tags": "tool,outdoors", + "readme":"README.md", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"lapcounter.app.js","url":"app.js"}, + {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "circlesclock", + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.png", + "dependencies": {"widpedom":"app"}, + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"circlesclock.app.js","url":"app.js"}, + {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, + {"name":"circlesclock.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"circlesclock.json"} + ] + }, { "id": "ltherm", "name": "Thermometer", @@ -4987,4 +5041,4 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] } -] \ No newline at end of file +] From 45521e9fe5e6cc05e3fa52c13bd2e32b178ecec3 Mon Sep 17 00:00:00 2001 From: elrod16 <95036593+elrod16@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:15:43 -0500 Subject: [PATCH 047/503] Update readme.md Added content about new revisions. --- apps/ltherm/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ltherm/readme.md b/apps/ltherm/readme.md index 477c51bd6..b68cb1fc1 100644 --- a/apps/ltherm/readme.md +++ b/apps/ltherm/readme.md @@ -1,3 +1,3 @@ # Thermometer -Localized Bangle.js 2 thermometer app. +Localized Bangle.js 2 thermometer app. It also starts maintaining an average of the temperature to help lower the margin of error after 10 consecutive readings; due to the low quality die-thermometer. From 66e75055a4a3c707b046b7e333b709e1293bbde6 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 19:39:45 -0500 Subject: [PATCH 048/503] messages: Hide widget when all unread messages are dismissed --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/lib.js | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..211c4749b 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.13", + "version": "0.14", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 16d0010cc..94848a26c 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -20,3 +20,4 @@ 0.13: Add /*LANG*/ comments for internationalisation Add 'Delete All' option to message options Now update correctly when 'require("messages").clearAll()' is called +0.14: Hide widget when all unread notifications are dismissed from phone diff --git a/apps/messages/lib.js b/apps/messages/lib.js index 63f55dd03..b3cb7d9d4 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -30,6 +30,10 @@ exports.pushMessage = function(event) { require("Storage").writeJSON("messages.json",messages); // if in app, process immediately if (inApp) return onMessagesModified(mIdx<0 ? {id:event.id} : messages[mIdx]); + // if we've removed the last new message, hide the widget + if (event.t=="remove" && !messages.some(m=>m.new)) { + if (global.WIDGETS && WIDGETS.messages) WIDGETS.messages.hide(); + } // ok, saved now - we only care if it's new if (event.t!="add") { return; From c31997936604994268fddee981c2f9add4482c17 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:12 -0800 Subject: [PATCH 049/503] Update README.md --- apps/dtlaunch/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index ba2301d91..d9119c50c 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -1,7 +1,14 @@ # Desktop style App Launcher +Bangle 1: ![](screenshot.jpg) +Bangle 2: +![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) +![shot2](https://user-images.githubusercontent.com/89286474/146471758-3a9fce80-e047-4c7a-829a-e780c764b921.png) +![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) + + In the picture above, the Settings app is selected. ## Controls- Bangle @@ -21,4 +28,4 @@ In the picture above, the Settings app is selected. **Swipe Left** - move to next page of app icons -**Swipe Right** - move to previous page of app icons \ No newline at end of file +**Swipe Right** - move to previous page of app icons From 21e77411cabe79ee57f5a157b626d7943471babd Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:27 -0800 Subject: [PATCH 050/503] Update README.md --- apps/dtlaunch/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index d9119c50c..7ecb58e11 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -1,9 +1,11 @@ # Desktop style App Launcher Bangle 1: + ![](screenshot.jpg) Bangle 2: + ![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) ![shot2](https://user-images.githubusercontent.com/89286474/146471758-3a9fce80-e047-4c7a-829a-e780c764b921.png) ![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) From 163c0e3abdabb6edb2c6bd73b34486799ebdb24f Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:53 -0800 Subject: [PATCH 051/503] Update README.md --- apps/dtlaunch/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index 7ecb58e11..bea20ef65 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -4,6 +4,8 @@ Bangle 1: ![](screenshot.jpg) +In the picture above, the Settings app is selected. + Bangle 2: ![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) @@ -11,7 +13,6 @@ Bangle 2: ![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) -In the picture above, the Settings app is selected. ## Controls- Bangle **BTN1** - move backward through app icons on a page From a588280af738516a7bd6c1adf72863eb1a40ac92 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 21:52:48 -0500 Subject: [PATCH 052/503] sanitycheck: Warn about incorrectly sized js icons --- bin/sanitycheck.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 572364224..9a9986fd4 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -3,6 +3,7 @@ */ var fs = require("fs"); +var heatshrink = require("../core/lib/heatshrink"); var acorn; try { acorn = require("acorn"); @@ -175,6 +176,20 @@ apps.forEach((app,appIdx) => { for (const key in file) { if (!STORAGE_KEYS.includes(key)) ERROR(`App ${app.id} file ${file.name} has unknown key ${key}`); } + // warn if JS icon is the wrong size + if (file.name == app.id+".img") { + let icon; + let match = fileContents.match(/E\.toArrayBuffer\(atob\(\"([^"]*)\"\)\)/); + if (match) icon = Buffer.from(match[1], 'base64'); + else { + match = fileContents.match(/require\(\"heatshrink\"\)\.decompress\(\s*atob\(\s*\"([^"]*)\"\s*\)\s*\)/); + if (match) icon = heatshrink.decompress(Buffer.from(match[1], 'base64')); + else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); + } + if (match) { + if (icon[0] != 48 || icon[1] != 48) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + } + } }); let dataNames = []; (app.data||[]).forEach((data)=>{ From 0944f732818814b07ac957b4892013c354659ecd Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Thu, 16 Dec 2021 22:11:29 -0500 Subject: [PATCH 053/503] sanitycheck: error for newly added mis-sized icons --- bin/sanitycheck.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 9a9986fd4..104fc4c1f 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -60,6 +60,7 @@ const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'suppo const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; +const GRANDFATHERED_ICONS = ["hebrew_calendar", "fontclock", "slidingtext", "solarclock", "sweepclock", "matrixclock", "speedo", "s7clk", "mmonday", "bclock", "snek", "dane", "fclock", "digiclock", "astral", "alpinenav", "slomoclock", "tapelauncher", "arrow", "doztime", "swiperclocklaunch", "pebble", "rebble"]; function globToRegex(pattern) { const ESCAPE = '.*+-?^${}()|[]\\'; @@ -187,7 +188,10 @@ apps.forEach((app,appIdx) => { else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); } if (match) { - if (icon[0] != 48 || icon[1] != 48) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + if (icon[0] != 48 || icon[1] != 48) { + if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + else ERROR(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + } } } }); From 622c94b1e87905602628d3dec9150d2e7ebd73ee Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 08:34:28 +0100 Subject: [PATCH 054/503] Color battery text and icon in green when charging Color battery icon in red when battery low --- apps/circlesclock/app.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index a7ec05868..7607fa71f 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -1,9 +1,11 @@ const locale = require("locale"); const heatshrink = require("heatshrink"); -var shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); -var heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); -var powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); +const shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); +const heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); +const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); +const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); +const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); const SETTINGS_FILE = "circlesclock.json"; let settings; @@ -20,6 +22,7 @@ const colorFg = '#fff'; const colorBg = '#000'; const colorGrey = '#808080'; const colorRed = '#ff0000'; +const colorGreen = '#00ff00'; let hrtValue; @@ -130,10 +133,23 @@ function drawBattery() { g.setFont("Vector:12"); g.setFontAlign(0, 0); - g.setColor(settings.batteryWarn == undefined || battery > settings.batteryWarn ? colorFg : colorRed); + + let icon = powerIcon; + let color = colorFg; + if (Bangle.isCharging()) { + color = colorGreen; + icon = powerIconGreen; + } + else { + if (settings.batteryWarn != undefined && battery <= settings.batteryWarn) { + color = colorRed; + icon = powerIconRed; + } + } + g.setColor(color); g.drawString(battery + '%', w3, h3); - g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); + g.drawImage(icon, w3 - 6, h3 + radiusOuter - 6); } function radians(a) { From 1a6ff78b7107468223c615744b56c1cb40ba1088 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 08:37:59 +0100 Subject: [PATCH 055/503] Update README --- apps/circlesclock/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 87edd5981..27c0566d3 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -5,7 +5,7 @@ A clock with circles for different data at the bottom in a probably familiar sty It shows besides time, date and day of week the following information: * Steps (requires [pedometer widget](https://banglejs.com/apps/#pedometer)) * Heart rate (when screen is on and unlocked) - * Battery + * Battery (including charging and battery low) ## Screenshot @@ -14,6 +14,8 @@ It shows besides time, date and day of week the following information: ## TODO * Show weather information - ## Creator Marco ([myxor](https://github.com/myxor)) + +## Icons +Icons taken from [materialdesignicons](https://materialdesignicons.com) under Apache License 2.0 From 70924cb17ae7744ba515a240d39889a54e01c465 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 08:55:09 +0000 Subject: [PATCH 056/503] trying to fix the worst sanity check errors that have crept in --- apps.json | 2 +- apps/authentiwatch/ChangeLog | 6 +++--- apps/bclock/clock-binary-icon.js | 2 +- apps/clicompleteclk/ChangeLog | 1 + apps/coretemp/ChangeLog | 2 +- apps/digiclock/digiclock-icon.js | 2 +- apps/dtlaunch/ChangeLog | 2 +- apps/fclock/app-icon.js | 2 +- apps/hebrew_calendar/app-icon.js | 2 +- apps/hebrew_calendar/app.png | Bin 32788 -> 3416 bytes apps/mmonday/manic-monday-icon.js | 2 +- apps/speedalt2/ChangeLog | 1 + apps/tapelauncher/icon.js | 2 +- apps/vectorclock/ChangeLog | 3 +++ apps/vectorclock/Changelog | 3 --- apps/widclkbttm/{Changelog => ChangeLog} | 0 16 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 apps/vectorclock/ChangeLog delete mode 100644 apps/vectorclock/Changelog rename apps/widclkbttm/{Changelog => ChangeLog} (100%) diff --git a/apps.json b/apps.json index 04004f5b1..ee6660db7 100644 --- a/apps.json +++ b/apps.json @@ -554,7 +554,7 @@ { "id": "impwclock", "name": "Imprecise Word Clock", - "version": "0.03", + "version": "0.04", "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", "icon": "clock-impword.png", "type": "clock", diff --git a/apps/authentiwatch/ChangeLog b/apps/authentiwatch/ChangeLog index e1b8ed5bc..7a902a731 100644 --- a/apps/authentiwatch/ChangeLog +++ b/apps/authentiwatch/ChangeLog @@ -1,4 +1,4 @@ -0.04: Fix tapping at very bottom of list, exit on inactivity -0.03: Add "Calculating" placeholder, update JSON save format -0.02: Fix JSON save format 0.01: First release +0.02: Fix JSON save format +0.03: Add "Calculating" placeholder, update JSON save format +0.04: Fix tapping at very bottom of list, exit on inactivity diff --git a/apps/bclock/clock-binary-icon.js b/apps/bclock/clock-binary-icon.js index 1c167ff57..2e5cb31c1 100644 --- a/apps/bclock/clock-binary-icon.js +++ b/apps/bclock/clock-binary-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAMGAAAAAAYDAAAAAAwBgAAAABgAwAAAABAAQAAAABAAQAAAABAAQAAAABAAQAAAABAAQAAAABgAwAAAAAwBgAAAAAYDAAAAAAMGAAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAAAAP+AAAAAAf/AAAAAA//gAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAB//wAAAAA//gAAAAAf/AAAAAAP+AAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgIurg/wAocMjAFDjEMIAkGAodggYFDoBLEAq4jFF4o7FI4pTFOLsP/AFDj/8Aoc//wFDv//As4vFHYpHFOLoAPA==")) diff --git a/apps/clicompleteclk/ChangeLog b/apps/clicompleteclk/ChangeLog index ee05bd582..50c84593e 100644 --- a/apps/clicompleteclk/ChangeLog +++ b/apps/clicompleteclk/ChangeLog @@ -1,2 +1,3 @@ 0.01: New clock! 0.02: Load steps from Health Tracking app (if installed) +0.03: ... diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index c7b309a74..115067b80 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1 @@ -0.1: New app +0.01: New app diff --git a/apps/digiclock/digiclock-icon.js b/apps/digiclock/digiclock-icon.js index 737561863..da6305724 100644 --- a/apps/digiclock/digiclock-icon.js +++ b/apps/digiclock/digiclock-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("/wA/AH4A/AH4A/ACmsAEQuMlcAAD0rGBQKBFr4ADGBOsqwvjqwvJRsCRFF/8Gg4ADEZYQEgwvWg8+AAgwKCJgvQDgoABF5IRMF5xEBJpBhGCJwvNDQM4AYMNAAQaBnCAFCJ4vNIwQeBAAkxQAwGCmIRFFwIRDF64dDgwGBgwRNF/4v/F/4v/F/4v/F/4dJmIdECIkxF7MHFwUHhoACg4eCAYIACCJ4vNDQIgCAAgICKwoROF5yAEAAgtFCKAvQJpAAICJgvQgEGg4ADFxIwCAAcGBYovRADov6qwvjqwvJ1gvjEoIvHGASRgRoIuJGAYAhFxQA/AH4A/AH4A/ABQ")) +require("heatshrink").decompress(atob("mEw4UA///A4N551ulxL/ACkK1QAG0ALBlNVAA1oBYOlBY9aBYO1BY9eBYOVBY9WBbf/+oIBr//BYlX//9BYN///VC599qtX6oBBqt9BYYRBr/1AIIdBBf4L/BY6bLZcb7MBau1BY9eBYOlBY9aBYMpBY9oBYMK1QAG0ALBAH4ASA")) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index c414c1ddc..62a0cab9f 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -4,4 +4,4 @@ 0.04: reset to clock after 2 mins of inactivity 0.05: add Bangle 2 version 0.06: Adds settings page (hide clocks or launchers) -0.06: Adds setting for directly launching app on touch for Bangle 2 +0.07: Adds setting for directly launching app on touch for Bangle 2 diff --git a/apps/fclock/app-icon.js b/apps/fclock/app-icon.js index ba506d3ac..b9075b857 100644 --- a/apps/fclock/app-icon.js +++ b/apps/fclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("7OwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAAB//AAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAB//8AAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAB///wAAAAAAAAAAAAAAAAAAAAAAAAB//8AAAAAAB////AAAAAAAAAAAAAAAAAAAAAAAAB///AAAAAAB////8AAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAB/////wAAAAAAAAAAAAAAAAAAAAAAA///8AAAAAB//////AAAAAAAAAAAAAAAAAAAAAAAf///AAAAAA//////4AAAAAAAAAAAAAAAAAAAAAAf///wAAAAAP/////+AAAAAAAAAAAAAAAAAAAAAAP///8AAAAAH//////wAAAAAAAAAAAAAAAAAAAAAP////AAAAAB//////8AAAAAAAAAAAAAAAAAAAAAH////wAAAAA///////gAAAAAAAAAAAAAAAAAAAAH////8AAAAAP//////4AAAAAAAAAAAAAAAAAAAAB//9//AAAAAH//AAH//AAAAAAAAAAAAAAAAAAAAAf/+f/wAAAAB//gAA//wAAAAAAAAAAAAAAAAAAAAH/+H/8AAAAA//wAAH/+AAAAAAAAAAAAAAAAAAAAB//B//AAAAAP/4AAA//gAAAAAAAAAAAAAAAAAAAAf/Af/wAAAAH/8AAAH/8AAAAAAAAAAAAAAAAAAAAH/gH/8AAAAB/+AAAA//AAAAAAAAAAAAAAAAAAAAB/gB//AAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAfwAf/wAAAAH/4AAAAAAAAAAAAAAAAAAAAAAAAAAHwAH/8AAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAB4AB//AAAAAf/gAAAAAAAAP4AAAAD8AAAAAAAAAAYAAf/wAAAAH/4AAAAAAAAH+AAAAB/AAAAAAAAAAEAAH/8AAAAB/+AAAAAAAAH/gAAAAfwAAAAAAAAAAAAB//AAAAAf/gf/wAAAAD/4AAAAP8AAAAAAAAAAAAAf/wAAAAH/4f//AAAAD/+AAAAH/AAAAAAAAAAAAAH/8AAAAB/+f//8AAAB//gAAAD/wAAAAAAAAAAAAB//AAAAAf/v///wAAA/34AAAA/8AAAAAAAAAAAAAf/wAAAAH/7////AAAP5+AAAAf/AAAAAAAAAAAAAH/8AAAAB/+////8AAD8fgAAAP/wAAAAAAAAAAAAB//AAAAAf/v////wAA8H4AAAD/8AAAAAAAAAAAAAf/wAAAAH/7////+AAOB+AAAB+/AAAAAAAAAAAAAH/8AAAAB/+/////gACAfgAAA/vwAAAAAAAAAAAAB//AAAAAf/v////8AAAH4AAAfz8AAPAB/AAAAAAAf/wAAAAH/7/////AAAB+AAAH4/AAPwA/8AAAAAAH/8AAAAB/+/////4AAAfgAAD8PwAH8AP/AAAAAAB//AAAAAf/v////+AAAH4AAB/D8AB3AHB4AAAAAAf/wAAAAH/7wAB//wAAB+AAAfg/AARwAAOAAAAAAH/8AAAAB/+4AAP/8AAAfgAAPwPwAAcAADgAAAAAB//AAAAAf/sAAB//gAAH4AAH4D8AAHAAB4AAAAAAf/wAAAAH/6AAAP/4AAB+AAD+A/AABwAH8AAAAAAH/8AAAAB/+AAAB//AAAfgAA/APwAAcAB/AAAAAAB//AAAAAf/gAAAP/wAAH4AAfgD8AAHAAfwAAAAAAf/wAAAAH/4AAAD/8AAB+AAH///4ABwAA8AAAAAAH/8AAAAB/+AAAA//AAAfgAB///+AAcAAHgAAAAAB//AAAAAf/gAAAP/wAAH4AAf///gAHAAA4AAAAAAf/wAAAAH/4AAAD/8AAB+AAH///4ABwAAOAAAAAAH/8AAAAB/+AAAA//AAAfgAB///+AAcAcHAAAAAAB//AAAAAf/gAAAP/wAAH4AAf///gB/+D/wAAAAAAf/wAAAAH/4AAAD/8AAB+AAAAA/AAf/g/4AAAAAAH/8AAAAB/+AAAA//AAAfgAAAAPwAH/4D8AAAAAAB//AAAAAf/gAAAP/wAAH4AAAAD8AAAAAAAAAAAAAf/wAAAAH/4AAAD/8AP///wAAA/AAAAAAAAAAAAAH/8AAAAB/+AAAA//AD///8AAAPwAAAAAAAAAAAAB//AAAAAf/gAAAP/wA////AAAD8AAAAAAAAAAAAAf/wAAAAH/4AAAD/8AP///wAAA/AAAAAAAAAAAAAH/8AAAAB//AAAB//AD///8AAAPwAAAAAAAAAAAAB//AAAAAP/4AAA//gA////AAAD8AAAAAAAAAAAAAf/wAAAAD//AAAf/4AP///wAAA/AAAAAAAAAAAAAH/8AAAAAf/4AAP/8AAAAAAAAAAAAAAAAAAAAAAAB//AAAAAH//AAH//AAAAAAAAAAAAAAAAAAAAAAAAf/wAAAAA//4AD//gAAAAAAAAAAAAAAAAAAAAH///////8AAP//////4AAAAAAAAAAAAAAAAAAAAB////////AAB//////8AAAAAAAAAAAAAAAAAAAAAf///////wAAf//////AAAAAAAAAAAAAAAAAAAAAH///////8AAD//////gAAAAAAAAAAAAAAAAAAAAB////////AAA//////4AAAAAAAAAAAAAAAAAAAAAf///////wAAH/////8AAAAAAAAAAAAAAAAAAAAAH///////8AAA/////+AAAAAAAAAAAAAAAAAAAAAB////////AAAD////+AAAAAAAAAAAAAAAAAAAAAAf///////wAAAP///+AAAAAAAAAAAAAAAAAAAAAAH///////8AAAA///+AAAAAAAAAAAAAAAAAAAAAAB////////AAAAD//+AAAAAAAAAAAAAAAAAAAAAAAf///////wAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P4DDwDAMPB4PAwAAAAAAAAAAAAAAAAAAAAAAAAfj+Ax+BwDH4/H48AAAAAAAAAAAAAAAAAAAAAAAAGMgAYYwcBhjMZjLAAAAAAAAAAAAAAAAAAAAAAAABDIAGEMPAYAyGAwwAAAAAAAAAAAAAAAAAAAAAAAAQx8DBDGwMAYhgYMAAAAAAAAAAAAAAAAAAAAAAAAEM/AwQzMDAOIYODAAAAAAAAAAAAAAAAAAAAAAAABDAYYEM/hgHCGHAwAAAAAAAAAAAAAAAAAAAAAAAAQwGGBDP4YDAhjAMAAAAAAAAAAAAAAAAAAAAAAAAEMhjAQwMMBgIZgDAAAAAAAAAAAAAAAAAAAAAAAAB+PwwH4DDAfz8fz+AAAAAAAAAAAAAAAAAAAAAAAAPB4YA8AxgH8eH8/gAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgRC/AH4AfgkBBA0BqADBAQQAEhfwAQP+BY1/BYM///ABQkC//wgm///gBYkT+4XB/sDAYIXEwfwgP4qFQlMAlBGCCYMB/47B/sA3gYCoYLC//R90R/kUikAC4f/8Mdifslm9BYf9g/wl0LnkYloLD/FC+kdh/+jttF4PxiP4qX0t1G3suvAXD/kC+v/6E8KYWn+2Q/1b+OqyMYO4REB8F/CoKDFKAUv/+AqtAXweq1WQgWof+IA/AE0GsNRiqnEBYe21Vq1WABY2p1WKXAILFgNUqFFqtQHBw")) diff --git a/apps/hebrew_calendar/app-icon.js b/apps/hebrew_calendar/app-icon.js index b6b0a53ae..372033d58 100644 --- a/apps/hebrew_calendar/app-icon.js +++ b/apps/hebrew_calendar/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("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/4ABIn4C/AXWQX/4C/X/6/DghH/AX4C5wC/DgBH/AX4C5Xwi//AX6//gESI/4C/AW8gX4sCI/4C/AW6+FAAMJJX4C/AWtAX48BJX4C/AWq+HAAMEJX4C/AWeAX5MAgRN/AX4CxXpQADn//AH4A/AFn8Xxy//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X7n7tu/CaH27YnRE3d/EyO3X/4AG/3btu2CZ/t23bt4mS74mRtom1/4mSX+32JQXbCZwRCtu/E34mvX+xcCAQN/CRn7OIe3E34muX+39JSQRDTH4mO2wmSt6//X5JKNX4hxNE34mhX/6Y/E36/29qY/E3NtX/6/W/yY/EyffX/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X7hKMX4xxME34mgX+RZGARBiDLIwCIE34mkX+xcOAQISB/YROtu3EyV/E34mOX+39JSFv/4RPAQIm/E0S/29pKR/xxSE0vfTCNtX6QmUX/4CJTCYm/E0C/3LiACB+xxSE0vbTCW+E0u/X/4C/AXy//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//ARX2L6PfTHO+CiXtX/6/wOKX+E3C//ABaY/E34CHTSS//TH6//X+1vOKQmm7/9TCQmmX+xKRt5xSE34miX/6Y/E36/2/5KQv///ZxP24m/E0S//TH4m/X+/2JR4TCOJ+/E34mjX/4CG75xSE0yYC/yYS9omlX+xKPTAZxPE34mkX+3/JRwSD/pxNt4m/E0i/3/ZKM24TEOJt/E34mlX+3/JRm/CQn2OJgm/E0y/39pKLCQv+OJffE3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")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cBz3v///s/immVkf27Xu+ec5PikmSpMt21JAoNbtgIBkm27IOCAQVt23JkmW7dt2VJku27YREpdkyQaBy3JkoRBloLDF4YCDHAQCBHAQ7DyVeAQN2km8BAPsBwfYAQMlDwYbGK4VdkmJlMk2fpCIVn6QRC5+kC4WRCIO774ICu+/CIXvvwRDAQOXt5gCl3eQIIyB3qNEAQP7CIUl+wRCpftCIwCglbmBABvRkzQBZoICLEoMAAB0JCIUUgNogXQgughdAi2AlARF2WBsEC4EEwEJoESwNlCLGLssW5UsylZtGy6IRFgiNLwARXrMk2VJbYPJkrYBCIsFyWLksWpRHClGyqNk0BrIoBrCgB9KssC5QRBrNABAQRIgFJomC5AIECIkSgAEBrMsy1KgGQgMgCI8sagJ6BqEFygRHi1QgmUCgICCwELdIxoBQAOALIMBPQJuBCI3KKYImBEAMlJoNACIpoBoEWpJZBpMogRuBCI0JHwLIByRrBiwiCCIovCLIY7CCI5TBBwJHBCgJfBCI7+CLIb4CCJAvBLIY7CCJMC7JZBpZXDCJA4CGQgRbgXbtmW7Y1MLIJHBLIkC6ARGBwIRCBQYRigu2CI4AHCIOACJxrEQ44AHpIA=")) diff --git a/apps/hebrew_calendar/app.png b/apps/hebrew_calendar/app.png index 0dae731cddda69ecfca2d3de516546061c63103d..ad9ec9af7df269fec2c89df6f1a00877f0ed4372 100644 GIT binary patch literal 3416 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

J`x+vYx@wLq< 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 diff --git a/apps/mmonday/manic-monday-icon.js b/apps/mmonday/manic-monday-icon.js index feba5fe86..2b1ee7f79 100644 --- a/apps/mmonday/manic-monday-icon.js +++ b/apps/mmonday/manic-monday-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("MDABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) +require("heatshrink").decompress(atob("mEwwIHEgPAAocP+AFDv4FDgf/Aoc/AocB/4FDh4FEv4FEAgIFIDgQFR+FwAoeAAof8gAFDLoIFC/wyBAoQ4CAoXgAoh0CAtybCAoJPBAoahDAoMHAoicBAoM54EfAoJqCAoQUBAoYUBAoYCBAoXgZAIFC4AFCCgOAYYI1CZIRHB/AFDcwmAAoj9Dj6mCdoQaBAAYWDgA")) diff --git a/apps/speedalt2/ChangeLog b/apps/speedalt2/ChangeLog index bd338f8b2..fa2e32f5b 100644 --- a/apps/speedalt2/ChangeLog +++ b/apps/speedalt2/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial import. 0.07: Add swipe to change screens. 1.06: Misc memory and screen optimisations. +1.10: ... diff --git a/apps/tapelauncher/icon.js b/apps/tapelauncher/icon.js index bf323e5bf..25ca0a4c6 100644 --- a/apps/tapelauncher/icon.js +++ b/apps/tapelauncher/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4A/ACXd7vQC6vUpoBBDaQXEDaQXIDZwXMAIQZHC4R6BAAIZJDAwXIDY4XHAAodJ7oXMDpQXSAAiRHhoWN7zFLDY/e9ve9zeMhvQCIIBFC5ARIC5oVNC5EOCpwABC4vuCZYXPCIwXOCJAAFC5gAJ8AXFCpwuHgDjCFqQXC6lN6gbFf5gXEAInd6AXVDYndhoXKBoIbMC5QZLC44AFDpIXNDpQXdhoYMAAbwIC6oZQbxhOKC5gbKC6BUGC6oA/AHgA==")) +require("heatshrink").decompress(atob("mEw4UA///sH8ov+8GyJf4AIgt8BZV9voNIBYQNIBYgNGBYwMEBYNVqoMEoALGBoYLDBQILCAQVQBYoOEBZIABBYUAgILGsBiEBodWy2gN4soywACBYcI1QJDBYoJFBYkCBQ2qBYUKBIoLHBAQLHBAYACBYwAEwALBgwKG1S/DC4wWCa4Y3Efa19mALKvrLDfY7XGBwjvVBYjuHfYgLLBg4LEAAMVBZQNEBZBPCBZQA+A")) diff --git a/apps/vectorclock/ChangeLog b/apps/vectorclock/ChangeLog new file mode 100644 index 000000000..8addc7170 --- /dev/null +++ b/apps/vectorclock/ChangeLog @@ -0,0 +1,3 @@ +0.01: New watch face +0.02: Use Bangle.setUI for button/launcher handling +0.03: Bangle.js 2 support diff --git a/apps/vectorclock/Changelog b/apps/vectorclock/Changelog deleted file mode 100644 index c2a6fbcf4..000000000 --- a/apps/vectorclock/Changelog +++ /dev/null @@ -1,3 +0,0 @@ -0.1: New watch face -0.2: Use Bangle.setUI for button/launcher handling -0.3: Bangle.js 2 support \ No newline at end of file diff --git a/apps/widclkbttm/Changelog b/apps/widclkbttm/ChangeLog similarity index 100% rename from apps/widclkbttm/Changelog rename to apps/widclkbttm/ChangeLog From 81169b41108c32bdc50e5c4737375d7883bbca47 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 08:55:30 +0000 Subject: [PATCH 057/503] updated core --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index b033af017..2a8e872ec 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit b033af017f6789a6a7777e6ef1428d94995a9b8b +Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 From 9b429fff228761d79492dd85afc483cf31451d64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 09:09:33 +0000 Subject: [PATCH 058/503] health 0.09: Fix file naming so months are 1-based (not 0) (fix #1119) --- apps.json | 2 +- apps/health/ChangeLog | 1 + apps/health/boot.js | 2 +- apps/health/lib.js | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index ee6660db7..2e4b97259 100644 --- a/apps.json +++ b/apps.json @@ -132,7 +132,7 @@ { "id": "health", "name": "Health Tracking", - "version": "0.08", + "version": "0.09", "description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)", "icon": "app.png", "tags": "tool,system,health", diff --git a/apps/health/ChangeLog b/apps/health/ChangeLog index bde4f8ab8..c65cc3ab4 100644 --- a/apps/health/ChangeLog +++ b/apps/health/ChangeLog @@ -7,3 +7,4 @@ 0.06: Fix daily health summary for movement (a line got deleted!) 0.07: Added coloured bar charts 0.08: Suppress bleed through of E.showMenu's when displaying bar charts +0.09: Fix file naming so months are 1-based (not 0) (fix #1119) diff --git a/apps/health/boot.js b/apps/health/boot.js index 386d75833..c72e62b41 100644 --- a/apps/health/boot.js +++ b/apps/health/boot.js @@ -27,7 +27,7 @@ Bangle.on("health", health => { const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; function getRecordFN(d) { - return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; + return "health-"+d.getFullYear()+"-"+(d.getMonth()+1)+".raw"; } function getRecordIdx(d) { return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + diff --git a/apps/health/lib.js b/apps/health/lib.js index 70305bff8..2e3e0c002 100644 --- a/apps/health/lib.js +++ b/apps/health/lib.js @@ -6,7 +6,7 @@ const DB_HEADER_LEN = 8; const DB_FILE_LEN = DB_HEADER_LEN + DB_RECORDS_PER_MONTH*DB_RECORD_LEN; function getRecordFN(d) { - return "health-"+d.getFullYear()+"-"+d.getMonth()+".raw"; + return "health-"+d.getFullYear()+"-"+(d.getMonth()+1)+".raw"; } function getRecordIdx(d) { return (DB_RECORDS_PER_DAY*(d.getDate()-1)) + From 62900059ad87ee8efce0ae9306dd91da41243bdb Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 11:24:46 +0000 Subject: [PATCH 059/503] thermom 0.05: Use temperature from current locale + Update every 10s, average last 5 readings + Changes based on #1092 --- apps.json | 6 +++--- apps/thermom/ChangeLog | 3 +++ apps/thermom/app.js | 29 +++++++++++++++++++++-------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/apps.json b/apps.json index 2e4b97259..cf948ed48 100644 --- a/apps.json +++ b/apps.json @@ -4014,8 +4014,8 @@ { "id": "thermom", "name": "Thermometer", - "version": "0.04", - "description": "Displays the current temperature in degree Celsius, updated every 20 seconds", + "version": "0.05", + "description": "Displays the current temperature in degree Celsius/Fahrenheit (depending on locale), updates every 10 seconds with average of last 5 readings.", "icon": "app.png", "tags": "tool", "supports": ["BANGLEJS", "BANGLEJS2"], @@ -4080,7 +4080,7 @@ "id": "thermomF", "name": "Fahrenheit Temp", "version": "0.01", - "description": "A modification of the Thermometer App to display temprature in Fahrenheit", + "description": "[NOT RECOMMENDED] A modification of the Thermometer App to display temprature in Fahrenheit. Please use the 'Thermometer App' and install 'Languages' to get the temperature in the correct format for your locale.", "icon": "thermf.png", "tags": "tool", "supports": ["BANGLEJS"], diff --git a/apps/thermom/ChangeLog b/apps/thermom/ChangeLog index 6183ac17b..6d3a966e3 100644 --- a/apps/thermom/ChangeLog +++ b/apps/thermom/ChangeLog @@ -1,3 +1,6 @@ 0.02: New App! 0.03: Improved messages and added Celsius sign 0.04: Make temperature value readable on smaller screens +0.05: Use temperature from current locale + Update every 10s, average last 5 readings + Changes based on #1092 diff --git a/apps/thermom/app.js b/apps/thermom/app.js index 145854765..0e45ed3e7 100644 --- a/apps/thermom/app.js +++ b/apps/thermom/app.js @@ -1,13 +1,27 @@ +// history of temperature readings +var history = []; + + +// When we get temperature... function onTemperature(p) { - g.reset(1).clearRect(0,24,g.getWidth(),g.getHeight()); + var rect = Bangle.appRect; + g.reset(1).clearRect(rect.x, rect.y, rect.x2, rect.y2); g.setFont("6x8",2).setFontAlign(0,0); - var x = g.getWidth()/2; - var y = g.getHeight()/2 + 10; + var x = (rect.x+rect.x2)/2; + var y = (rect.y+rect.y2)/2 + 10; g.drawString("Temperature:", x, y - 45); - g.setFontVector(g.getWidth() > 200 ? 70 : 40).setFontAlign(0,0); - g.drawString(p.temperature.toFixed(1) + " °C", x, y); + g.setFontVector(g.getWidth() > 200 ? 70 : 50).setFontAlign(0,0); + + // Average the last 5 temperature readings + while (history.length>4) history.shift(); + history.push(p.temperature); + var avrTemp = E.sum(history) / history.length; + // Draw the temperature + var t = require('locale').temp(avrTemp).replace("'","°"); + g.drawString(t, x, y); } +// Gets the temperature in the most accurate way (pressure sensor or inbuilt thermistor) function drawTemperature() { if (Bangle.getPressure) { Bangle.getPressure().then(onTemperature); @@ -18,11 +32,10 @@ function drawTemperature() { } } - setInterval(function() { drawTemperature(); -}, 20000); -drawTemperature(); +}, 10000); E.showMessage("Reading temperature..."); +drawTemperature(); Bangle.loadWidgets(); Bangle.drawWidgets(); From df810fc7bbf5980a47bfec01b7d506a7b392f035 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 11:26:34 +0000 Subject: [PATCH 060/503] screenshot --- apps.json | 1 + apps/thermom/screenshot.png | Bin 0 -> 2466 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/thermom/screenshot.png diff --git a/apps.json b/apps.json index cf948ed48..836840ac5 100644 --- a/apps.json +++ b/apps.json @@ -4019,6 +4019,7 @@ "icon": "app.png", "tags": "tool", "supports": ["BANGLEJS", "BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, "storage": [ {"name":"thermom.app.js","url":"app.js"}, diff --git a/apps/thermom/screenshot.png b/apps/thermom/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a12bbef1c7b448624a952f53ac9e9b75cd5a3baf GIT binary patch literal 2466 zcmds3`#;kS8{WQ+<`{c;B8ME4bMz=|NtuKYik#0WVpEwJ%C{53oI*~msASBH7&7+M zyh5dvO~V{k&vG7W=;Yb^PrN_8_vdrp*Du%Sx_`Lu`*Yn{C*7Uoq<2X}AP_m{<7h82 zHvKo@lHy9Ge+m`@^pcm;QApz(^;rl+D$p5y z^@%gX?JZx(*D(e{j_Qw*wV~m|S4BV9SJqQzo7Q7o3;iUz$IMA|?QctI3p?Uf{Mr

BvF?UvY81AgTY3UFxM^{ez*@^J&WwPYrUp$hbf2 z=t}LPvl5u_1;eeEYN{O5z7^I{hQs<;2XgY|lS4OE7MZQJa;Tf5-aLOF$}+2N$hp0z zKygKdBEnfjJ|_9Pykb~E;OUPkkZ0hhwsVMOBZWqX}Ckc7mE9j=s{t`hpr1)0Ip8F zE2Sgm=mmvm{9!+ZWt~uPhJd=W2xKJ$$k07|?YNlZTsk@}mQ%O*1C6ksI^M~WH%Mnr zXO?LdLI9^>eVjEEChznL_CIeqZU+r%4uCI{LOD(3h1zTZq19CBx zMh>aoxPD~&v&JnVda7dC!23B~<}Cp*I?_nx{7yUf!2Je&=cr8k++MN*xhRARVH4}w z(Ts3E{*wgCbE9d>CTAn}GM7v9MqQwr`PH?C^voAw6T1{2nq6Yk#uZT z58HEu=iN)iWv!LU?Ubye+`c`Z*h^bV3!o#&JYA~!EYm0qb|qD37sEMb0-+^Ls-@vz z`prh^ooKTAJFX|Ak2B*Z@Z>A?`23FPO3ePSOA!CFP`<%7yEDs6!#_^Kf4$t3uZR!) zTnB_Wo~*8uuMVcq(CoUsG&~khj}R!OLY`oifuZX^Ilsan6^ zMA(Oh+(TEKfPeLt$h-ru^Ni$H;+kc{TaZH z>z}+{&&?~~H)iGO+q`cv9J7O*!mM~jmU5 zNu?{E`E&T}$`T7sveMu@eq?jRRw*K}Ykhu9>H_q`50#jmU~HAGS7`6)D)<~8V?kMY zEHiFQYF+z!d0DmBGXVaLP^XS^X-o2J2N-d68) z4Su11`t4qQ;gaL1-&EC-@-00J^{$88sD&KY&Y<|}YHK_G63cn<1w_1P#`1b$b)UCs6!!qaHHaB77rwiij=#FkY8hY(t{n428 literal 0 HcmV?d00001 From bae67ecf6d6907d3e95dc9335ab4f3845c4406c7 Mon Sep 17 00:00:00 2001 From: "Minges, Alexander Ralph Michael (almin100)" Date: Fri, 17 Dec 2021 13:51:18 +0100 Subject: [PATCH 061/503] calendar: use non-dithering colors by default; localize strings; remove unused variables --- apps.json | 2 +- apps/calendar/ChangeLog | 1 + apps/calendar/README.md | 1 + apps/calendar/calendar-icon.js | 6 +- apps/calendar/calendar.js | 140 +++++++++++++++++++------- apps/calendar/calendar.png | Bin 540 -> 7227 bytes apps/calendar/screenshot_calendar.png | Bin 3866 -> 1174 bytes apps/calendar/settings.js | 20 +++- 8 files changed, 122 insertions(+), 48 deletions(-) diff --git a/apps.json b/apps.json index b4ff19d42..2c2073f9e 100644 --- a/apps.json +++ b/apps.json @@ -2429,7 +2429,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.03", + "version": "0.04", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index de887bfa7..fc0fb287b 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -1,3 +1,4 @@ 0.01: Basic calendar 0.02: Make Bangle 2 compatible 0.03: Add setting to start week on Sunday +0.04: Add setting to switch color schemes. Default color scheme will now use colors that are not dithered on Bangle 2. Use localized names for months and days of the week (Language app needed). diff --git a/apps/calendar/README.md b/apps/calendar/README.md index e22d06573..ec759eb26 100644 --- a/apps/calendar/README.md +++ b/apps/calendar/README.md @@ -10,4 +10,5 @@ Basic calendar ## Settings - Starts on Sunday: whether the calendar should start on Sunday (default is Monday). +- Non-dithering Colors: use non-dithering colors (default, recommended for Bangle 2) or the original color scheme. diff --git a/apps/calendar/calendar-icon.js b/apps/calendar/calendar-icon.js index ed1bf3667..dd65290b0 100644 --- a/apps/calendar/calendar-icon.js +++ b/apps/calendar/calendar-icon.js @@ -1,5 +1 @@ -require("heatshrink").decompress( - atob( - "mEwxH+AH4A/ADuIUCARRDhgePCKIv13YAEDoYJFAA4RJFyQvcGBYRGy4dDy4uLCJgv/DoOBDgOBF5oRLF6IeBDgIvNCJYvQDwQuNCJovRADov/F9OsAEgv/F/4vhwIACAqYv/F/4vnd94vvX/4v/F/7vvF96//F/4v/d94v/F/4wsFxQwjFxgA/AH4A/AH4AZA==" - ) -) +E.toArrayBuffer(atob("MDCDAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgEkkkkkkkgEkkkkkkkkkkkkkPwkkkkkkkPwkkkkkkkkkkkkkPwkkkkkkkPwkkkkkkkkkgAAAPwAAAAAAAPwAAAEkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSQCSSSSSSSQCSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkh////////////////+EkkkkkkAAAAAAAAAAAAAAAAAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkg==")) \ No newline at end of file diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 5707bd97a..7da903923 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -1,6 +1,6 @@ const maxX = g.getWidth(); const maxY = g.getHeight(); -const fontSize = g.getWidth()>200?2:1; +const fontSize = g.getWidth() > 200 ? 2 : 1; const rowN = 7; const colN = 7; const headerH = maxY / 7; @@ -10,26 +10,105 @@ const color1 = "#035AA6"; const color2 = "#4192D9"; const color3 = "#026873"; const color4 = "#038C8C"; -const color5 = "#03A696"; +const gray1 = "#bbbbbb"; const black = "#000000"; const white = "#ffffff"; -const gray1 = "#444444"; -const gray2 = "#888888"; -const gray3 = "#bbbbbb"; const red = "#d41706"; +const blue = "#0000ff"; +const yellow = "#ffff00"; let settings = require('Storage').readJSON("calendar.json", true) || {}; if (settings.startOnSun === undefined) settings.startOnSun = false; +if (settings.ndColor === undefined) + settings.ndColor = true; + +if (settings.ndColor === true) { + let bgColor = white; + let bgColorMonth = blue; + let bgColorDow = black; + let bgColorWeekend = yellow; + let fgOtherMonth = blue; + let fgSameMonth = black; +} else { + let bgColor = color4; + let bgColorMonth = color1; + let bgColorDow = color2; + let bgColorWeekend = color3; + let fgOtherMonth = gray1; + let fgSameMonth = white; +} + +function getDowLbls(locale) { + let dowLbls; + //TODO: Find some clever way to generate this programmatically from locale lib + switch (locale) { + case "de_AT": + case "de_CH": + case "de_DE": + if (settings.startOnSun) { + dowLbls = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; + } else { + dowLbls = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]; + } + break; + case "nl_NL": + if (settings.startOnSun) { + dowLbls = ["zo", "ma", "di", "wo", "do", "vr", "za"]; + } else { + dowLbls = ["ma", "di", "wo", "do", "vr", "za", "zo"]; + } + break; + case "fr_BE": + case "fr_CH": + case "fr_FR": + if (settings.startOnSun) { + dowLbls = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]; + } + break; + case "sv_SE": + if (settings.startOnSun) { + dowLbls = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"]; + } + break; + case "it_CH": + case "it_IT": + if (settings.startOnSun) { + dowLbls = ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"]; + } else { + dowLbls = ["Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"]; + } + break; + case "oc_FR": + if (settings.startOnSun) { + dowLbls = ["dg", "dl", "dm", "dc", "dj", "dv", "ds"]; + } else { + dowLbls = ["dl", "dm", "dc", "dj", "dv", "ds", "dg"]; + } + break; + default: + if (settings.startOnSun) { + dowLbls = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; + } else { + dowLbls = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; + } + break; + } + return dowLbls; +} function drawCalendar(date) { - g.setBgColor(color4); + g.setBgColor(bgColor); g.clearRect(0, 0, maxX, maxY); - g.setBgColor(color1); + g.setBgColor(bgColorMonth); g.clearRect(0, 0, maxX, headerH); - g.setBgColor(color2); + g.setBgColor(bgColorDow); g.clearRect(0, headerH, maxX, headerH + rowH); - g.setBgColor(color3); + g.setBgColor(bgColorWeekend); g.clearRect(colW * 5, headerH + rowH, maxX, maxY); for (let y = headerH; y < maxY; y += rowH) { g.drawLine(0, y, maxX, y); @@ -40,24 +119,11 @@ function drawCalendar(date) { const month = date.getMonth(); const year = date.getFullYear(); - const monthMap = { - 0: "January", - 1: "February", - 2: "March", - 3: "April", - 4: "May", - 5: "June", - 6: "July", - 7: "August", - 8: "September", - 9: "October", - 10: "November", - 11: "December" - }; + const localeMonth = require('locale').month(date); g.setFontAlign(0, 0); g.setFont("6x8", fontSize); g.setColor(white); - g.drawString(`${monthMap[month]} ${year}`, maxX / 2, headerH / 2); + g.drawString(`${localeMonth} ${year}`, maxX / 2, headerH / 2); g.drawPoly([10, headerH / 2, 20, 10, 20, headerH - 10], true); g.drawPoly( [maxX - 10, headerH / 2, maxX - 20, 10, maxX - 20, headerH - 10], @@ -65,12 +131,7 @@ function drawCalendar(date) { ); g.setFont("6x8", fontSize); - let dowLbls; - if (settings.startOnSun) { - dowLbls = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; - } else { - dowLbls = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]; - } + let dowLbls = getDowLbls(require('locale').name); dowLbls.forEach((lbl, i) => { g.drawString(lbl, i * colW + colW / 2, headerH + rowH / 2); }); @@ -120,14 +181,19 @@ function drawCalendar(date) { today.year === year && today.month === month && today.day === day - 50; if (isToday) { g.setColor(red); + let x1 = x * colW; + let y1 = y * rowH + headerH + rowH; + let x2 = x * colW + colW; + let y2 = y * rowH + headerH + rowH + rowH; + g.drawRect(x1, y1, x2, y2); g.drawRect( - x * colW, - y * rowH + headerH + rowH, - x * colW + colW - 1, - y * rowH + headerH + rowH + rowH + x1 + 1, + y1 + 1, + x2 - 1, + y2 - 1 ); } - g.setColor(day < 50 ? gray3 : white); + g.setColor(day < 50 ? fgOtherMonth : fgSameMonth); g.drawString( (day > 50 ? day - 50 : day).toString(), x * colW + colW / 2, @@ -145,10 +211,10 @@ const today = { }; drawCalendar(date); clearWatch(); -Bangle.on("touch",area=>{ +Bangle.on("touch", area => { const month = date.getMonth(); let prevMonth; - if (area==1) { + if (area == 1) { let prevMonth = month > 0 ? month - 1 : 11; if (prevMonth === 11) date.setFullYear(date.getFullYear() - 1); date.setMonth(prevMonth); diff --git a/apps/calendar/calendar.png b/apps/calendar/calendar.png index 056cab3b7e36928e0f00a595b1fa7b9e0fb9b5f4..ccbcce5fff4e578b44d2e1ba87d21339e5dd19e0 100644 GIT binary patch literal 7227 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 GhyMqGu%7Dx delta 527 zcmV+q0`UF2IGhBK7=H)`000120{Mpk000JJOGiWi{{a60|De66lK=n#(Md!>RA_3Yeo!PqkmL}w75xqU4f#*xoI~x=(AHoDK|@6lHAOkK z2|YmzTk@R-qfF0J@5{If_cQs<(eFK9?(y8mdw{|4C&eh;#)q2~>VEp+>k>&h0I9gmq7>NBbn)jhRBa@iL(PxcUDnND%PDHLkV1k+>_pbl| diff --git a/apps/calendar/screenshot_calendar.png b/apps/calendar/screenshot_calendar.png index 4507d77dd0cbf962e6f435c5d310f481a12f254c..8285932c430aa2fee31b769b9d8b7ae071953fc4 100644 GIT binary patch delta 1166 zcmV;91abSC9+nA^7=Hu<00018nfYx10004VQb$4nuFf3k0000FP)t-s000000RR60 z0RR60|NsBV7sHV0O3BsVvz&L&;^=7-TzGU!4|t{ zNsb4TS$K9yIEiG6&*dWIVl$TVo0?4U1iv5Hz71@+2BXHqUVi~weIV5iuv)DhSS_Vk zF)OfQ1&=r!!Kja5vtrf`%;K~*jb>)0m>m>XU<3oD9KnEaENFf!r&!;i+?N~Y%qhh@fEeA_VGes55Bfv zn&6ed%V342;sNY~Vg`d1FN5O2imn(@>waYgNb$;6?0=dSAS(c}!UrpGZp9iZ!-@o# zl2+7GX!2Zyz;W_?@>ZEQ$OQj~z%RAGxP50ze{#piH(K%eyF8wX-&nD0f`t<(jz1rx z$>Yoe*ne|$-L@9fqNL7Qt5Pt3a!P*y5I7{j>k=`&Y}+Q=x~(1TLW&1GE2j8&hr0)O zSt6#FZClr-dIt|kO5s5ypI;xeey(> zwys*XZ54^dz`XOO;(t@|Yhn5iwZCV{JHc-W)_*91Jbro(YDBBY6G9*KBKbkzN~J@B zxJKFLt>W|@>`~3NS5!(6*`I7-+KRhFnCh;@Tal|fST%CaK_?oeux6Nc#p^nxwB~97 z4reQ}1N-}mCmd--Dqi<$I>5@{E^O#{1nU(z6^m$}JQvBydtQ2hy_g*?5!qh2DCBcQjx9!GZO8cb_+N>rp_GDB5uAYkT_rZ!ATao{I z6-~u1v1c7AnBaW__$w=N|JeH&rR{~VLWXt4Irv7CC!z`7cZLro@5AKLe#O0%1b>%u zn>WY=&y=1iJ;84WZeQSu@ioWS_FbgC!xCKDkO4VMLPagbvlP+^<=o zk#d(2Gvb7~9dSY>v?@X&*$~}T>g08&+~ad?*uy=i^Ialg!%aR4qI8G91c9~ z*8m?nm@DdLJPsWHeFqB@zVaT~c|JbKkQK_DhO^vs|u=?(5vW!rZ;+H&CY3Kd;vD zJ|H;Ybx><#P%M4g*7GwZhHm1eNDI<(5~REWDAI5%jt!Y-Ds)z7?c0o)7~aatEUw9E zd`ogX)EfAfxUdFI^9O;Ibhj?E6FTpdQTDcm^QAauyTAKWbfpLty{G_Y%#F{=ul-}x zjTAUd6>9<8-dzJP7y4ezxIGNtE6>?>1$UC&cVg$Cl+_P{$4#jM{XOw?!{xB> zY!9p#P{=ymzg0Hx~BiL>lW&1Fi&jCD76`|sNL{93=s*2TncqULc8vU1fm9zOO zO0qg6Iy|k2qxM~6`KD3C-GK#gi@_xeuZjWY$F&cGE8Ovy-970rK<|vD@9ezZ?a8oU zqr)pEU^Oo4AIqJ=@SPaC!dS&VJVt*N8&f@MGFIqv2i zEYyL2K=6T(T!2*(+8s6x((h~nw)u3+PG%;MbfRqI>#TRBuCM|@jp$T}(l0jQvTTkXvO z6f&>9*uBZ5{H+BdOg=f8u%@%Sx=)H?E}I8S7phpjQPz4Wvm@nsDRe<%r>ysB{TsMz zST3uwcfaWf?zi{6ix0J*)_!+7J=Q@Ci3yd2soLt2|E}+U(SIJ0Wjr8#7k8SWs*{O`oQ#r|1oD zn0N(>3$L*m%tXC}gN(u>Q8y{|!i0l-^QtRT|5J5Y&ph2Z=#$kZp&m>C<>;wXatzi?ztBXb& zQZYFx2pT757|i)>0TjgUGZrU1ASnVAJ#b*WBbczT)RS|q?s7LXL%;+f z@=|{yb#f&Qowx`C-P)9s7BmAVMNY={nA}kG`J#gqCj|%{L|+ezCrt<|O2?v``XnC? z-`;y-N@@KlFim$I*Y=kU6n~W-FOc}JsV=LE99$R-uzP}b!d*!;H6CdvRMq?cdh3;C zJE7x$HaYjc(8fe*Rb7zYH|1CPaAfkf(0%RGCr?3g+$SSJ1R-C>+_n3?6&f9&Kpw>~ zIY_iecm-Ah>2{$Pi1wPot<~tL-Bmn^{VBcd%59aeeVHq@=Lj%?O-i{KxUCoGZO9c33e5DJ^la7K7)Ta)?LcsR)V&oE7 zMa#>=`fNNf2ap%nqAf>El&7`rxVg7S!T`|wjr`sSo4Wdu(}jFNSO5HaS>LT1D6~1K z6(cv>Sd~~TmBJY~a!o6Sem1#OjI*kNo(Enz+PJ1DrXzbB(ZH0+w-ozapq77ZFH3+9 zSB;^wCW?2$5huk|o7U62e8{T$rE#LCrVoNbGK)>S+7(zn<0c7JJl*$~dBeAPQiMIO zjOGr`HPfp6Fsjl3A5{dx0UUKyeAO*Qc!S8B!m`6#-eR~b+%|;%0YkE{z<95V@orRu zd)%mlQfd|g_}m{D{-!aFZo0?7EW!Z4a54>^aJAF`eo3$QyJOb1;dx@D8lQ&LwQqYm zY+Ox|L*lSrSayppEwEf0&#EC@Eo)=`&~>^P?R?7WR&L4CmZ07PNMG60wC618zj_^A zu=5=)1`jUaew=F~YXaQg>p9(v%bosH$Sf{HBH3%m2HKSvg?K~EQHeL(oyGMQ$c+{R zt~-|qAl9==`t7FjI8=xQDz;Fm^X4d)nxkpnmd`RM&8wTpwZXZ5yCHl%9IIu|GUG+b ziOr^T6Ut@?X~NCF`8m4%1f_E^@MGdZeaDC1h?7Hsn*mjrwh9pN11_(O^4!8KS_ z)j9p-a`DVWkxD?{yNN^Ar94ne*m<%s1dX`f83_Sx?sC5*2n1CReesApFUAySZ2&{n zpVtlbv?1pZN3sAW6)oZC9g55b) zQ!|CB{$Xh84$}h~g##!=8Ld}5Osc>1|FEoQxqk5pWs4XbKiIuXq_Z&lqmfz=Dkk2q z-Q)j(J7JSuKi^dYuKusiYM{CCbBU?eVD*`8kD0L-mZ^ijl(e0`xRQ6KV>P%b-dUG# zf{X8eKr-6mM)PJWcTIM>`;oP~X@S1-TeT;LJgbqq?w=D&Z`*sj-RXC`yLJC6QwS{O zo_!_+Ut+25YWvqXXlh9ExG=@|zhQNaYQ}~jNE;{~E z%e4pAUZknRhdj$qKnOdJXH0VWk9td5**ZTwl@uO`Hun|&hr7xHUddXksWptuzy>V| zjoB--uBPVyp`rwo&A3|f^7cEKwCv5k^B363*L7_zJFdJ6^^*#wlkLW>^glKeE{crC z-qV%o+kCnxA(89f6;>GWSZ>HWI8&em=x+R+ct-AAP(mC`XHCdW65DlN^os4WR+TB3 zs!E#NLD?TbmH%ii(USRPolsGjcj2e6Ed1+QSgQTXan5=Uh*}an zYLv;rLhEg(oz_}=HE5F*O1CZCMEgTSa)ph_9bJ-uge-6Cfv2!g_#-R0C#`s>B!O8UzMvyjHs3A9F+~+AR!#5 z!fiJSA$2=G8QR?VGGWRVefOdcx@-0BrUn;#(<26+fs^1r>^%UCfs9lV=MOzURu`B0bns|oC^)Hnq(!rjrGeVi^Wbnj?3*|iESrWz z_CQs%F)~G0Gz7GKr&xFSdo z@a|39={e=fu{Gk%F+bDNyecu=ChwP0kvuwQ*oNp62c00{emCin_XJ-C%G~Mp8__5Y z!LqAxUTEO9r>9>YsB?cSa_PoE$dW)&ZoqJ$h+Y>-hQ$&a`?S?TIObcd}A#N(+)eP=}IV=5fOpPc=_{=l( z6yk^8MUA3H`C~r5U)VbY*QVn@h|6}tZ%3_Sd@I?Z^cf;UDgCAVd0FW`@+!}`i8=E^ z>S&VNIdRmb`%)L#dRacBj$~_);APEISxOOgdTn+L#8Sat`&;QkJd}S)dEiJGo;Gc$ zP1V=(jZ-lTW`LHC$j4QC|1M2Fp_N28)Lx{WO_UM09?tnJM-iR^*D0kZK_Ji2F0H@l zoJdN^n7y zmivoizv9I9>!>Vc{%S4rVs$!_KNgZGkFKgdoRg>xwm0~XL7zzu&f`MaqVhZtBcb^c Uc?BnRAa?nz%xqBQCSJt<11SArXaE2J diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index f9c7783a3..76e2c7455 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -1,24 +1,34 @@ -(function(back) { +(function (back) { var FILE = "calendar.json"; var settings = require('Storage').readJSON(FILE, true) || {}; if (settings.startOnSun === undefined) - settings.startOnSun = true; + settings.startOnSun = false; + if (settings.ndColors === undefined) + settings.ndColors = true; function writeSettings() { require('Storage').writeJSON(FILE, settings); } E.showMenu({ - "" : { "title" : "Calendar" }, - "< Back" : () => back(), + "": { "title": "Calendar" }, + "< Back": () => back(), 'Start on Sunday': { value: settings.startOnSun, - format: v => v?"Yes":"No", + format: v => v ? "Yes" : "No", onchange: v => { settings.startOnSun = v; writeSettings(); } }, + 'Non-dithering colors': { + value: settings.ndColors, + format: v => v ? "Yes" : "No", + onchange: v => { + settings.ndColors = v; + writeSettings(); + } + }, }); }) From 48601f2dde8a1d30751e887ef2ad9276b3548770 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:08:42 +0100 Subject: [PATCH 062/503] Create app.js --- apps/miniclock/app.js | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 apps/miniclock/app.js diff --git a/apps/miniclock/app.js b/apps/miniclock/app.js new file mode 100644 index 000000000..9fdbab985 --- /dev/null +++ b/apps/miniclock/app.js @@ -0,0 +1,55 @@ +const digits = [ +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} +]; + +var drawTimeout, savedOptions; + +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2-31; + //print(y); + g.reset(); + var date = new Date(); + var timeStr = require("locale").time(date,1); + // draw time + g.clearRect(0,y,g.getWidth()-1,y+73+24+18); + //use custom font spacing for overlapping digits + g.drawImage(digits[parseInt(date.getHours()/10)],0,y); + g.drawImage(digits[parseInt(date.getHours()%10)],37,y); + g.drawImage(digits[10],74,y); + g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); + g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); + // Draw day of the week + y += 73; + g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); + g.drawString(require("locale").dow(date).toUpperCase(),x,y); + // Draw Date + y += 24; + g.drawString(require('locale').date(new Date(),1),x,y); + queueDraw(); +} + +require("FontTeletext10x18Ascii").add(Graphics); +Bangle.setUI("clock"); +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From a67ef83bd82149262410f28d6868b8900db6e800 Mon Sep 17 00:00:00 2001 From: "Minges, Alexander Ralph Michael (almin100)" Date: Fri, 17 Dec 2021 14:12:58 +0100 Subject: [PATCH 063/503] calendar: use hardware version to set color scheme --- apps/calendar/ChangeLog | 2 +- apps/calendar/calendar.js | 10 +++++++--- apps/calendar/settings.js | 6 +++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index fc0fb287b..e164d6be9 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -1,4 +1,4 @@ 0.01: Basic calendar 0.02: Make Bangle 2 compatible 0.03: Add setting to start week on Sunday -0.04: Add setting to switch color schemes. Default color scheme will now use colors that are not dithered on Bangle 2. Use localized names for months and days of the week (Language app needed). +0.04: Add setting to switch color schemes. On Bangle 2 non-dithering colors will be used by default. Use localized names for months and days of the week (Language app needed). diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 7da903923..01977570a 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -20,10 +20,14 @@ const yellow = "#ffff00"; let settings = require('Storage').readJSON("calendar.json", true) || {}; if (settings.startOnSun === undefined) settings.startOnSun = false; -if (settings.ndColor === undefined) - settings.ndColor = true; +if (settings.ndColors === undefined) + if (process.env.HWVERSION == 2) { + settings.ndColors = true; + } else { + settings.ndColors = false; + } -if (settings.ndColor === true) { +if (settings.ndColors === true) { let bgColor = white; let bgColorMonth = blue; let bgColorDow = black; diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index 76e2c7455..1c0a3fb51 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -4,7 +4,11 @@ if (settings.startOnSun === undefined) settings.startOnSun = false; if (settings.ndColors === undefined) - settings.ndColors = true; + if (process.env.HWVERSION == 2) { + settings.ndColors = true; + } else { + settings.ndColors = false; + } function writeSettings() { require('Storage').writeJSON(FILE, settings); From d56f9e3a8bfaf4f30313476248050c73ac75db72 Mon Sep 17 00:00:00 2001 From: "Minges, Alexander Ralph Michael (almin100)" Date: Fri, 17 Dec 2021 14:42:47 +0100 Subject: [PATCH 064/503] calendar: shorten settings to prevent clipping --- apps/calendar/README.md | 4 ++-- apps/calendar/settings.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/calendar/README.md b/apps/calendar/README.md index ec759eb26..4fc6962cf 100644 --- a/apps/calendar/README.md +++ b/apps/calendar/README.md @@ -9,6 +9,6 @@ Basic calendar ## Settings -- Starts on Sunday: whether the calendar should start on Sunday (default is Monday). -- Non-dithering Colors: use non-dithering colors (default, recommended for Bangle 2) or the original color scheme. +- Starts Sunday: whether the calendar should start on Sunday (default is Monday). +- B2 Colors: use non-dithering colors (default, recommended for Bangle 2) or the original color scheme. diff --git a/apps/calendar/settings.js b/apps/calendar/settings.js index 1c0a3fb51..3c8f7d8e8 100644 --- a/apps/calendar/settings.js +++ b/apps/calendar/settings.js @@ -17,7 +17,7 @@ E.showMenu({ "": { "title": "Calendar" }, "< Back": () => back(), - 'Start on Sunday': { + 'Start Sunday': { value: settings.startOnSun, format: v => v ? "Yes" : "No", onchange: v => { @@ -25,7 +25,7 @@ writeSettings(); } }, - 'Non-dithering colors': { + 'B2 Colors': { value: settings.ndColors, format: v => v ? "Yes" : "No", onchange: v => { From 22c5f2281c4aaea55577b4016f7b90f799568b6e Mon Sep 17 00:00:00 2001 From: "Minges, Alexander Ralph Michael (almin100)" Date: Fri, 17 Dec 2021 14:51:12 +0100 Subject: [PATCH 065/503] calendar: compress app icon --- apps/calendar/calendar-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/calendar/calendar-icon.js b/apps/calendar/calendar-icon.js index dd65290b0..ed6690033 100644 --- a/apps/calendar/calendar-icon.js +++ b/apps/calendar/calendar-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("MDCDAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgEkkkkkkkgEkkkkkkkkkkkkkPwkkkkkkkPwkkkkkkkkkkkkkPwkkkkkkkPwkkkkkkkkkgAAAPwAAAAAAAPwAAAEkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSPwSSSSSSSPwSSSQkkkkkCSSSQCSSSSSSSQCSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkCSSSSSSSSSSSSSSSSSQkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP//+AB+AB+AB+AB///wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkP/////////////////wkkkkkh////////////////+EkkkkkkAAAAAAAAAAAAAAAAAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkg==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwcCpMkyQC3wAIFgIRJn8JAoeQ/gRYwB0Bn57F/gCBHAgfCn8EDgdI/kSAoIR8oBkFgAFCCIysKCPM//4AKZAgR3/0Aj+Ag/ggP4gF/CPpr/Nf5r/NfYRhw4RL8IRDyEAABUJCIYC/AVI=")) \ No newline at end of file From 806f4280365842879f0480357d8cd46520bcaa55 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:55:34 +0100 Subject: [PATCH 066/503] Update apps.json --- apps.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 109324fb6..f01d55004 100644 --- a/apps.json +++ b/apps.json @@ -5026,5 +5026,16 @@ "data": [ {"name":"circlesclock.json"} ] - } + }, + { "id": "miniclock", + "name": "Minimalist Clock", + "shortName" : "Minimalist Clock", + "icon": "app.png", + "description": "A Minimalist clockface with large Digits.", + "tags": "clock", + "storage": [ + {"name":"myappid.app.js","url":"app.js"}, + {"name":"myappid.img","url":"app-icon.js","evaluate":true} + ], +} ] From 8dd11ff68f8f9e36c4be65dc372cc2e39cfc5f2a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:58:17 +0100 Subject: [PATCH 067/503] Create app-icon.js --- apps/miniclock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/miniclock/app-icon.js diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js new file mode 100644 index 000000000..debedb27e --- /dev/null +++ b/apps/miniclock/app-icon.js @@ -0,0 +1 @@ +var img = require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From 670608ea2487d361748787225228d27ec1876bf2 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:58:51 +0100 Subject: [PATCH 068/503] Update app-icon.js --- apps/miniclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js index debedb27e..38b19c29a 100644 --- a/apps/miniclock/app-icon.js +++ b/apps/miniclock/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) +require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From 425501f7a7cd4ef7f3f3608a1c426089c4a347ee Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 15:01:18 +0100 Subject: [PATCH 069/503] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f01d55004..9bd426bd3 100644 --- a/apps.json +++ b/apps.json @@ -5036,6 +5036,5 @@ "storage": [ {"name":"myappid.app.js","url":"app.js"}, {"name":"myappid.img","url":"app-icon.js","evaluate":true} - ], -} + ]} ] From 20c2491f1a59ef1fcaf8837223b5680875a99664 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:09:52 +0000 Subject: [PATCH 070/503] sanitytest fix --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index ffccf8ac4..0fc049614 100644 --- a/apps.json +++ b/apps.json @@ -5049,6 +5049,7 @@ { "id": "ltherm", "name": "Localized Thermometer", + "shortName": "Thermometer", "version": "0.01", "description": "Displays the current temperature in localized units.", "icon": "thermf.png", From ff13a72b27d9f4f97bddfd6cc0c3205b1fd32c65 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:11:38 +0000 Subject: [PATCH 071/503] link in readme --- apps.json | 1 + apps/ltherm/{readme.md => README.md} | 0 2 files changed, 1 insertion(+) rename apps/ltherm/{readme.md => README.md} (100%) diff --git a/apps.json b/apps.json index 0fc049614..4a333cdbd 100644 --- a/apps.json +++ b/apps.json @@ -5056,6 +5056,7 @@ "tags": "tool", "supports": ["BANGLEJS2"], "allow_emulator": true, + "readme": "README.md", "storage": [ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} diff --git a/apps/ltherm/readme.md b/apps/ltherm/README.md similarity index 100% rename from apps/ltherm/readme.md rename to apps/ltherm/README.md From a8ccc840b7f267fe2c98750a442d0c05c78635d1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 17 Dec 2021 14:16:35 +0000 Subject: [PATCH 072/503] allow slightly lower than 48px icons before erroring --- bin/sanitycheck.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 104fc4c1f..fe59baa25 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -60,7 +60,7 @@ const STORAGE_KEYS = ['name', 'url', 'content', 'evaluate', 'noOverwite', 'suppo const DATA_KEYS = ['name', 'wildcard', 'storageFile', 'url', 'content', 'evaluate']; const FORBIDDEN_FILE_NAME_CHARS = /[,;]/; // used as separators in appid.info const VALID_DUPLICATES = [ '.tfmodel', '.tfnames' ]; -const GRANDFATHERED_ICONS = ["hebrew_calendar", "fontclock", "slidingtext", "solarclock", "sweepclock", "matrixclock", "speedo", "s7clk", "mmonday", "bclock", "snek", "dane", "fclock", "digiclock", "astral", "alpinenav", "slomoclock", "tapelauncher", "arrow", "doztime", "swiperclocklaunch", "pebble", "rebble"]; +const GRANDFATHERED_ICONS = ["s7clk", "snek", "astral", "alpinenav", "slomoclock", "arrow", "pebble", "rebble"]; function globToRegex(pattern) { const ESCAPE = '.*+-?^${}()|[]\\'; @@ -188,9 +188,9 @@ apps.forEach((app,appIdx) => { else ERROR(`JS icon ${file.name} does not match the pattern 'require("heatshrink").decompress(atob("..."))'`); } if (match) { - if (icon[0] != 48 || icon[1] != 48) { - if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); - else ERROR(`JS icon ${file.name} should be 48x48px but is instead ${icon[0]}x${icon[1]}px`); + if (icon[0] > 48 || icon[0] < 24 || icon[1] > 48 || icon[1] < 24) { + if (GRANDFATHERED_ICONS.includes(app.id)) WARN(`JS icon ${file.name} should be 48x48px (or slightly under) but is instead ${icon[0]}x${icon[1]}px`); + else ERROR(`JS icon ${file.name} should be 48x48px (or slightly under) but is instead ${icon[0]}x${icon[1]}px`); } } } From e09baafafae6da2e63d76d9b01f1c399749f8d42 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 17 Dec 2021 16:24:05 +0100 Subject: [PATCH 073/503] Set settings for each row --- apps.json | 5 +-- apps/lcars/lcars.app.js | 70 +++++++++++++++++++++++++++--------- apps/lcars/lcars.settings.js | 54 ++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 apps/lcars/lcars.settings.js diff --git a/apps.json b/apps.json index c379a1de4..1148f41c4 100644 --- a/apps.json +++ b/apps.json @@ -4495,7 +4495,8 @@ "screenshots": [{"url":"screenshot.png"}], "storage": [ {"name":"lcars.app.js","url":"lcars.app.js"}, - {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} + {"name":"lcars.img","url":"lcars.icon.js","evaluate":true}, + {"name":"lcars.settings.js","url":"lcars.settings.js"} ] }, { "id": "binwatch", @@ -4981,7 +4982,7 @@ "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8ac01d90c..859e999a5 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,8 +1,21 @@ -const filename = "lcars.setting.json"; +const SETTINGS_FILE = "lcars.setting.json"; const Storage = require("Storage"); -let settings = Storage.readJSON(filename,1) || { + + +// ...and overwrite them with any saved values +// This way saved values are preserved if a new version adds more settings +const storage = require('Storage') +let settings = { alarm: -1, + dataRow1: "Battery", + dataRow2: "Steps", + dataRow3: "Temp." }; +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} +let hrmValue = 0; /* * Requirements and globals @@ -95,6 +108,33 @@ function queueDraw() { } +function printData(key, y){ + g.setFontAlign(-1,-1,0); + + if(key == "Battery"){ + var bat = E.getBattery(); + g.drawString("BAT:", 30, y); + g.drawString(bat+ "%", 68, y); + + } else if(key == "Steps"){ + var steps = getSteps(); + g.drawString("STEP:", 30, y); + g.drawString(steps, 68, y); + + } else if(key == "Temp."){ + var temperature = Math.floor(E.getTemperature()); + g.drawString("TEMP:", 30, y); + g.drawString(temperature + "C", 69, y); + + } else if(key == "HRM"){ + g.drawString("HRM:", 30, y); + g.drawString(hrmValue, 69, y); + + } else { + g.drawString("NOT FOUND", 30, y); + } +} + function draw(){ // First handle alarm to show this correctly afterwards @@ -147,19 +187,9 @@ function draw(){ g.drawString(dayName, 100, 55); // Draw battery - g.drawString("BAT:", 30, 98); - g.drawString(bat+ "%", 68, 98); - - // Draw steps - var steps = getSteps(); - g.drawString("STEP:", 30, 121); - g.drawString(steps, 68, 121); - - // Temperature - var temperature = Math.floor(E.getTemperature()); - g.setFontAlign(-1,-1,0); - g.drawString("TEMP:", 30, 144); - g.drawString(temperature + "C", 69, 144); + printData(settings.dataRow1, 98); + printData(settings.dataRow2, 121); + printData(settings.dataRow3, 144); // Queue draw in one minute queueDraw(); @@ -183,6 +213,12 @@ function stepsWidget() { return undefined; } +/* + * HRM Listener + */ +Bangle.on('HRM', function (hrm) { + hrmValue = hrm.bpm; +}); /* * Handle alarm @@ -221,7 +257,7 @@ function handleAlarm(){ // Update alarm state to disabled settings.alarm = -1; - Storage.writeJSON(filename, settings); + Storage.writeJSON(SETTINGS_FILE, settings); } @@ -251,7 +287,7 @@ Bangle.on('swipe',function(dir) { draw(); // Update alarm state - Storage.writeJSON(filename, settings); + Storage.writeJSON(SETTINGS_FILE, settings); }); diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js new file mode 100644 index 000000000..f449c8fc7 --- /dev/null +++ b/apps/lcars/lcars.settings.js @@ -0,0 +1,54 @@ +(function(back) { + const SETTINGS_FILE = "lcars.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + alarm: -1, + dataRow1: "Battery", + dataRow2: "Steps", + dataRow3: "Temp." + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + var data_options = ['Battery', 'Steps', 'Temp.', "HRM"]; + + E.showMenu({ + '': { 'title': 'Rebble Clock' }, + '< Back': back, + 'Row 1': { + value: 0 | data_options.indexOf(settings.dataRow1), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow1 = data_options[v]; + save(); + }, + }, + 'Row 2': { + value: 0 | data_options.indexOf(settings.dataRow2), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow2 = data_options[v]; + save(); + }, + }, + 'Row 3': { + value: 0 | data_options.indexOf(settings.dataRow3), + min: 0, max: 3, + format: v => data_options[v], + onchange: v => { + settings.dataRow3 = data_options[v]; + save(); + }, + } + }); +}) From 2d192f486da5becc7e1a8313868aceea3a85969a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 17 Dec 2021 16:27:36 +0100 Subject: [PATCH 074/503] Updated changelog --- apps.json | 2 +- apps/lcars/ChangeLog | 3 ++- apps/lcars/README.md | 7 +++---- apps/lcars/lcars.settings.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 1148f41c4..3c0645903 100644 --- a/apps.json +++ b/apps.json @@ -4486,7 +4486,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.06", + "version":"0.07", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 85bcbad36..c5f8187b7 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -3,4 +3,5 @@ 0.03: New design with different icons if gps, hrm or compass is on. 0.04: Inluded LCARS Logo. 0.05: Additional icons for (1) charging and (2) bat < 30%. -0.06: Fix - Alarm disabled, if clock was closed \ No newline at end of file +0.06: Fix - Alarm disabled, if clock was closed. +0.07: Added settings to adjust data that is shown for each row. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 3acaacb4d..15009e838 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -5,10 +5,9 @@ Note: To display the steps, its necessary to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). ## Features - * Shows the time - * Shows the date - * Shows the current battery level in % - * Shows the number of daily steps + * LCARS Style watch face + * Shows satate (charging, out of battery etc.) + * SHows data that can be configured (steps, HRM, temperature etc.) * Swipe left/right to activate an alarm ## Icons diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index f449c8fc7..2255caf9b 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -21,7 +21,7 @@ var data_options = ['Battery', 'Steps', 'Temp.', "HRM"]; E.showMenu({ - '': { 'title': 'Rebble Clock' }, + '': { 'title': 'LCARS Clock' }, '< Back': back, 'Row 1': { value: 0 | data_options.indexOf(settings.dataRow1), From 8948e9f2ae993a07f2dd50a9bc875a44e8684d10 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 17 Dec 2021 16:32:08 +0100 Subject: [PATCH 075/503] Updated screenshot --- apps/lcars/screenshot.png | Bin 26993 -> 2921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 70db639ebf28b9df978e731ee731fda5a5e61e3a..d74635f64c385138e0b08b685db984ef3387f0a9 100644 GIT binary patch literal 2921 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%0A;2nDme<@4SRQ6~RNe>i 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 Date: Fri, 17 Dec 2021 17:42:53 +0100 Subject: [PATCH 076/503] qmsched: fix #1117 Properly check WIDGETS is set before redrawing the widget --- apps.json | 2 +- apps/qmsched/ChangeLog | 3 ++- apps/qmsched/lib.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 4a333cdbd..537641b17 100644 --- a/apps.json +++ b/apps.json @@ -3896,7 +3896,7 @@ "id": "qmsched", "name": "Quiet Mode Schedule and Widget", "shortName": "Quiet Mode", - "version": "0.05", + "version": "0.06", "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", "icon": "app.png", "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, diff --git a/apps/qmsched/ChangeLog b/apps/qmsched/ChangeLog index f41fe3416..35832a300 100644 --- a/apps/qmsched/ChangeLog +++ b/apps/qmsched/ChangeLog @@ -2,4 +2,5 @@ 0.02: Add widget 0.03: Bangle.js 2 support 0.04: Move Quiet Mode LCD options from global settings to this app -0.05: Avoid immediately redrawing widgets on load \ No newline at end of file +0.05: Avoid immediately redrawing widgets on load +0.06: Fix: don't try to redraw widget when widgets not loaded \ No newline at end of file diff --git a/apps/qmsched/lib.js b/apps/qmsched/lib.js index 9b307769a..e9ed3ec90 100644 --- a/apps/qmsched/lib.js +++ b/apps/qmsched/lib.js @@ -19,5 +19,5 @@ exports.setMode = function(mode) { {quiet:mode} )); exports.applyOptions(mode); - if (WIDGETS && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); + if (typeof WIDGETS === "object" && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); }; From c93bbe4fb8362617541e1300558caf209c44e271 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 15:40:22 -0500 Subject: [PATCH 077/503] Corrected magnetic field Z negative encoding --- apps/sensible/sensible.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 3da39998e..e7e07a71b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -196,8 +196,8 @@ function encodeMagServiceData() { if(yEncoded < 0) { yEncoded += 0x10000; } - if(yEncoded < 0) { - yEncoded += 0x10000; + if(zEncoded < 0) { + zEncoded += 0x10000; } let x = [ xEncoded & 0xff, (xEncoded >> 8) & 0xff ]; From 43f2252bbf74500d95a0cee8a4bf25fea3166a56 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 17 Dec 2021 21:54:02 +0100 Subject: [PATCH 078/503] messages: don't buzz during Quiet Mode --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/app.js | 2 +- apps/messages/lib.js | 5 +++-- apps/messages/widget.js | 1 + 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..e37bfd908 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.14", + "version": "0.15", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 94848a26c..76407cb45 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -21,3 +21,4 @@ Add 'Delete All' option to message options Now update correctly when 'require("messages").clearAll()' is called 0.14: Hide widget when all unread notifications are dismissed from phone +0.15: Don't buzz when Quiet Mode is active diff --git a/apps/messages/app.js b/apps/messages/app.js index 79009e77e..eb066acb9 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -52,7 +52,7 @@ var MESSAGES = require("Storage").readJSON("messages.json",1)||[]; if (!Array.isArray(MESSAGES)) MESSAGES=[]; var onMessagesModified = function(msg) { // TODO: if new, show this new one - if (msg && msg.new) { + if (msg && msg.new && !((require('Storage').readJSON('setting.json', 1) || {}).quiet)) { if (WIDGETS["messages"]) WIDGETS["messages"].buzz(); else Bangle.buzz(); } diff --git a/apps/messages/lib.js b/apps/messages/lib.js index b3cb7d9d4..32dff78ba 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -43,7 +43,8 @@ exports.pushMessage = function(event) { // otherwise load messages/show widget var loadMessages = Bangle.CLOCK || event.important; // first, buzz - if (loadMessages && global.WIDGETS && WIDGETS.messages) + var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; + if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages) WIDGETS.messages.buzz(); // after a delay load the app, to ensure we have all the messages if (exports.messageTimeout) clearTimeout(exports.messageTimeout); @@ -51,7 +52,7 @@ exports.pushMessage = function(event) { exports.messageTimeout = undefined; // if we're in a clock or it's important, go straight to messages app if (loadMessages) return load("messages.app.js"); - if (!global.WIDGETS || !WIDGETS.messages) return Bangle.buzz(); // no widgets - just buzz to let someone know + if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz to let someone know WIDGETS.messages.show(); }, 500); } diff --git a/apps/messages/widget.js b/apps/messages/widget.js index f01d22ec7..e831e5b68 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -26,6 +26,7 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { WIDGETS["messages"].width=0; Bangle.drawWidgets(); },buzz:function() { + if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return; // never buzz during Quiet Mode let v = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."; function b() { var c = v[0]; From 00116b760ce493afd50c1fa474e778ce89a9756f Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:28:30 -0500 Subject: [PATCH 079/503] Refactored byte array conversions for efficiency and readability --- apps/sensible/sensible.js | 76 ++++++++++++++------------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e7e07a71b..e3a9df847 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -130,21 +130,9 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { - let tEncoded = Math.round(bar.temperature * 100); - let pEncoded = Math.round(bar.pressure * 100); - let eEncoded = Math.round(bar.altitude * 100); - - if(bar.temperature < 0) { - tEncoded += 0x10000; - } - if(bar.altitude < 0) { - eEncoded += 0x1000000; - } - - let t = [ tEncoded & 0xff, (tEncoded >> 8) & 0xff ]; - let p = [ pEncoded & 0xff, (pEncoded >> 8) & 0xff, (pEncoded >> 16) & 0xff, - (pEncoded >> 24) & 0xff ]; - let e = [ eEncoded & 0xff, (eEncoded >> 8) & 0xff, (eEncoded >> 16) & 0xff ]; + let t = toByteArray(Math.round(bar.temperature * 100), 2, true); + let p = toByteArray(Math.round(bar.pressure * 100), 4, false); + let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ 0x02, 0x01, 0x06, // Flags @@ -157,24 +145,10 @@ function encodeBarServiceData() { // Encode the GPS service data using the Location and Speed characteristic function encodeGpsServiceData() { - let latEncoded = Math.round(gps.lat * 10000000); - let lonEncoded = Math.round(gps.lon * 10000000); - let hEncoded = Math.round(gps.course * 100); - let sEncoded = Math.round(1000 * gps.speed / 36); - - if(gps.lat < 0) { - latEncoded += 0x100000000; - } - if(gps.lon < 0) { - lonEncoded += 0x100000000; - } - - let s = [ sEncoded & 0xff, (sEncoded >> 8) & 0xff ]; - let lat = [ latEncoded & 0xff, (latEncoded >> 8) & 0xff, - (latEncoded >> 16) & 0xff, (latEncoded >> 24) & 0xff ]; - let lon = [ lonEncoded & 0xff, (lonEncoded >> 8) & 0xff, - (lonEncoded >> 16) & 0xff, (lonEncoded >> 24) & 0xff ]; - let h = [ hEncoded & 0xff, (hEncoded >> 8) & 0xff ]; + let s = toByteArray(Math.round(1000 * gps.speed / 36), 2, false); + let lat = toByteArray(Math.round(gps.lat * 10000000), 4, true); + let lon = toByteArray(Math.round(gps.lon * 10000000), 4, true); + let h = toByteArray(Math.round(gps.course * 100), 2, false); return [ 0x02, 0x01, 0x06, // Flags @@ -186,23 +160,9 @@ function encodeGpsServiceData() { // Encode the mag service data using the magnetic flux density 3D characteristic function encodeMagServiceData() { - let xEncoded = mag.x; // TODO: units??? - let yEncoded = mag.y; - let zEncoded = mag.z; - - if(xEncoded < 0) { - xEncoded += 0x10000; - } - if(yEncoded < 0) { - yEncoded += 0x10000; - } - if(zEncoded < 0) { - zEncoded += 0x10000; - } - - let x = [ xEncoded & 0xff, (xEncoded >> 8) & 0xff ]; - let y = [ yEncoded & 0xff, (yEncoded >> 8) & 0xff ]; - let z = [ zEncoded & 0xff, (zEncoded >> 8) & 0xff ]; + let x = toByteArray(mag.x, 2, true); + let y = toByteArray(mag.y, 2, true); + let z = toByteArray(mag.z, 2, true); return [ 0x02, 0x01, 0x06, // Flags @@ -211,6 +171,22 @@ function encodeMagServiceData() { } +// Convert the given value to a little endian byte array +function toByteArray(value, numberOfBytes, isSigned) { + let byteArray = new Array(numberOfBytes); + + if(isSigned && (value < 0)) { + value += 1 << (numberOfBytes * 8); + } + + for(let index = 0; index < numberOfBytes; index++) { + byteArray[index] = (value >> (index * 8)) & 0xff; + } + + return byteArray; +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; From 37504ec5533e2d04081b0dd42355f779cc81e2f2 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 22:36:34 +0100 Subject: [PATCH 080/503] Circles clock v0.03 --- apps.json | 3 ++- apps/circlesclock/ChangeLog | 1 + apps/circlesclock/app.js | 28 +++++++++++++++++----------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..8bdc54276 100644 --- a/apps.json +++ b/apps.json @@ -5029,9 +5029,10 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.02", + "version":"0.03", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "dependencies": {"widpedom":"app"}, "type": "clock", "tags": "clock", diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index fa2139fff..c0aa4e2f8 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: New clock 0.02: Fix icon & add battery warn functionality +0.03: Theming support & minor fixes diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 7607fa71f..57b46bb8d 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -18,8 +18,8 @@ function loadSettings() { }; } -const colorFg = '#fff'; -const colorBg = '#000'; +const colorFg = g.theme.dark ? '#fff' : '#000'; +const colorBg = g.theme.dark ? '#000' : '#fff'; const colorGrey = '#808080'; const colorRed = '#ff0000'; const colorGreen = '#00ff00'; @@ -73,7 +73,7 @@ function drawSteps() { g.setColor(colorGrey); g.fillCircle(w1, h3, radiusOuter); - const stepGoal = settings.stepGoal; + const stepGoal = settings.stepGoal || 10000; if (stepGoal > 0) { let percent = steps / stepGoal; if (stepGoal < steps) percent = 1; @@ -97,7 +97,7 @@ function drawHeartRate() { g.setColor(colorGrey); g.fillCircle(w2, h3, radiusOuter); - if (hrtValue != undefined) { + if (hrtValue != undefined && hrtValue > 0) { const percent = hrtValue / settings.maxHR; drawGauge(w2, h3, percent, colorRed); } @@ -156,7 +156,6 @@ function radians(a) { return a * Math.PI / 180; } - function drawGauge(cx, cy, percent, color) { let offset = 30; let end = 300; @@ -166,15 +165,16 @@ function drawGauge(cx, cy, percent, color) { if (percent > 1) percent = 1; var startrot = -offset; - var endrot = startrot - ((end - offset) * percent); + var endrot = startrot - ((end - offset) * percent) - 15; g.setColor(color); + const size = 4; // draw gauge - for (i = startrot; i > endrot; i -= 4) { + for (i = startrot; i > endrot - size; i -= size) { x = cx + r * Math.sin(radians(i)); y = cy + r * Math.cos(radians(i)); - g.fillCircle(x, y, 4); + g.fillCircle(x, y, size); } } @@ -201,6 +201,10 @@ function getSteps() { Bangle.on('lock', function(isLocked) { if (!isLocked) { Bangle.setHRMPower(1, "watch"); + if (hrtValue == undefined) { + hrtValue = '...'; + drawHeartRate(); + } } else { Bangle.setHRMPower(0, "watch"); } @@ -225,9 +229,11 @@ Bangle.loadWidgets(); * so we will blank out the draw() functions of each widget and change the * area to the top bar doesn't get cleared. */ -for (let wd of WIDGETS) { - wd.draw = () => {}; - wd.area = ""; +if (typeof WIDGETS === "object") { + for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; + } } loadSettings(); setInterval(draw, 60000); From 904e3e39f0351df81be63bbd1da9eb6cb2ac06f3 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:43:33 -0500 Subject: [PATCH 081/503] Added GPS elevation (altitude) to location and speed service --- apps/sensible/sensible.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e3a9df847..0529bf30b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -148,12 +148,14 @@ function encodeGpsServiceData() { let s = toByteArray(Math.round(1000 * gps.speed / 36), 2, false); let lat = toByteArray(Math.round(gps.lat * 10000000), 4, true); let lon = toByteArray(Math.round(gps.lon * 10000000), 4, true); + let e = toByteArray(Math.round(gps.alt * 100), 3, true); let h = toByteArray(Math.round(gps.course * 100), 2, false); return [ - 0x02, 0x01, 0x06, // Flags - 0x11, 0x16, 0x67, 0x2a, 0x95, 0x02, s[0], s[1], lat[0], lat[1], lat[2], - lat[3], lon[0], lon[1], lon[2], lon[3], h[0], h[1] // Location and Speed + 0x02, 0x01, 0x06, // Flags + 0x14, 0x16, 0x67, 0x2a, 0x9d, 0x02, s[0], s[1], lat[0], lat[1], lat[2], + lat[3], lon[0], lon[1], lon[2], lon[3], e[0], e[1], e[2], h[0], h[1] + // Location and Speed ]; } From 6a1c14088364b3a2f7f522f41eb2359f4bbb388d Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:47:53 -0500 Subject: [PATCH 082/503] Use dynamic advertising interval based on number of distinct packets --- apps/sensible/sensible.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 0529bf30b..ec972e368 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -124,7 +124,8 @@ function transmitUpdatedSensorData() { isNewMagData = false; } - NRF.setAdvertising(data, { showName: false, interval: 200 }); + let interval = 1000 / data.length; + NRF.setAdvertising(data, { showName: false, interval: interval }); } From 4aaccb87d54c1ac024d859ea7c3ed863e6a942cf Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:50:23 -0500 Subject: [PATCH 083/503] Corrected pressure resolution --- apps/sensible/sensible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index ec972e368..d5cfd033b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -132,7 +132,7 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { let t = toByteArray(Math.round(bar.temperature * 100), 2, true); - let p = toByteArray(Math.round(bar.pressure * 100), 4, false); + let p = toByteArray(Math.round(bar.pressure * 10), 4, false); let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ From 8f6823694785694b029f1d20ea16b418ff4f5272 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:53:45 -0500 Subject: [PATCH 084/503] Corrected pressure resolution for real this time! --- apps/sensible/sensible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index d5cfd033b..73c348556 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -132,7 +132,7 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { let t = toByteArray(Math.round(bar.temperature * 100), 2, true); - let p = toByteArray(Math.round(bar.pressure * 10), 4, false); + let p = toByteArray(Math.round(bar.pressure * 1000), 4, false); let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ From 0dce0afbbe25e87f3e8a7ca5524ffade99d7455e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:56:20 -0500 Subject: [PATCH 085/503] Version bump --- apps.json | 2 +- apps/sensible/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..f5be04136 100644 --- a/apps.json +++ b/apps.json @@ -4652,7 +4652,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.04", + "version": "0.05", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "screenshots": [ diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog index c50431f51..33e44b70c 100644 --- a/apps/sensible/ChangeLog +++ b/apps/sensible/ChangeLog @@ -2,3 +2,4 @@ 0.02: Corrected variable initialisation 0.03: Advertise app name, added screenshots 0.04: Advertise bar, GPS, HRM and mag services +0.05: Refactored for efficiency, corrected sensor value inaccuracies \ No newline at end of file From 7ad29b48b4bbf224bfa96e8d3f7625089b2398c3 Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:11:41 +0100 Subject: [PATCH 086/503] Disable screen turn on on bluetooth status change --- apps/widbt/widget.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 88be3d5c9..c7ef8c0ad 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -7,7 +7,6 @@ WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); },changed:function() { WIDGETS["bluetooth"].draw(); - Bangle.setLCDPower(1); // turn screen on }}; NRF.on('connect',WIDGETS["bluetooth"].changed); NRF.on('disconnect',WIDGETS["bluetooth"].changed); From b0dbe1d7d56052a870131342d0e17ad1f132f90e Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:13:34 +0100 Subject: [PATCH 087/503] Disable screen turn on on bluetooth status change --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 7aa96ce5c..4c2132122 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -4,3 +4,4 @@ 0.05: Make Bluetooth widget thinner, and when on a bright theme use light grey for disabled color 0.06: Tweaking colors for dark/light themes and low bpp screens 0.07: Memory usage improvements +0.08: Disable LCD on, on bluetooth status change From 8a2fbc47bd8486a4aadf5f96ca1b1abbeca0044c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:56:14 +0100 Subject: [PATCH 088/503] Update apps.json --- apps.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps.json b/apps.json index 9bd426bd3..60de1672f 100644 --- a/apps.json +++ b/apps.json @@ -5027,14 +5027,14 @@ {"name":"circlesclock.json"} ] }, - { "id": "miniclock", - "name": "Minimalist Clock", - "shortName" : "Minimalist Clock", + { "id": "contourclock", + "name": "Contour Clock", + "shortName" : "Contour Clock", "icon": "app.png", - "description": "A Minimalist clockface with large Digits.", + "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", "tags": "clock", "storage": [ - {"name":"myappid.app.js","url":"app.js"}, - {"name":"myappid.img","url":"app-icon.js","evaluate":true} + {"name":"contourclock.app.js","url":"app.js"}, + {"name":"contourclock.img","url":"app-icon.js","evaluate":true} ]} ] From 79e5a6e0a06edb390db9c7145aca12b34b4b6379 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:57:17 +0100 Subject: [PATCH 089/503] Create app-icon.js --- apps/contourclock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/contourclock/app-icon.js diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js new file mode 100644 index 000000000..38b19c29a --- /dev/null +++ b/apps/contourclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From f408e7d3b5b68ba3668c37effe046a59cb8be3f4 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:57:56 +0100 Subject: [PATCH 090/503] Create app.js --- apps/contourclock/app.js | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 apps/contourclock/app.js diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js new file mode 100644 index 000000000..9fdbab985 --- /dev/null +++ b/apps/contourclock/app.js @@ -0,0 +1,55 @@ +const digits = [ +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} +]; + +var drawTimeout, savedOptions; + +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2-31; + //print(y); + g.reset(); + var date = new Date(); + var timeStr = require("locale").time(date,1); + // draw time + g.clearRect(0,y,g.getWidth()-1,y+73+24+18); + //use custom font spacing for overlapping digits + g.drawImage(digits[parseInt(date.getHours()/10)],0,y); + g.drawImage(digits[parseInt(date.getHours()%10)],37,y); + g.drawImage(digits[10],74,y); + g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); + g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); + // Draw day of the week + y += 73; + g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); + g.drawString(require("locale").dow(date).toUpperCase(),x,y); + // Draw Date + y += 24; + g.drawString(require('locale').date(new Date(),1),x,y); + queueDraw(); +} + +require("FontTeletext10x18Ascii").add(Graphics); +Bangle.setUI("clock"); +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From f30ec77662ff9d80f4470c1608529a6729d6d4ec Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:58:14 +0100 Subject: [PATCH 091/503] Delete apps/miniclock directory --- apps/miniclock/app-icon.js | 1 - apps/miniclock/app.js | 55 -------------------------------------- 2 files changed, 56 deletions(-) delete mode 100644 apps/miniclock/app-icon.js delete mode 100644 apps/miniclock/app.js diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js deleted file mode 100644 index 38b19c29a..000000000 --- a/apps/miniclock/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) diff --git a/apps/miniclock/app.js b/apps/miniclock/app.js deleted file mode 100644 index 9fdbab985..000000000 --- a/apps/miniclock/app.js +++ /dev/null @@ -1,55 +0,0 @@ -const digits = [ -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} -]; - -var drawTimeout, savedOptions; - -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -} - -function draw() { - var x = g.getWidth()/2; - var y = g.getHeight()/2-31; - //print(y); - g.reset(); - var date = new Date(); - var timeStr = require("locale").time(date,1); - // draw time - g.clearRect(0,y,g.getWidth()-1,y+73+24+18); - //use custom font spacing for overlapping digits - g.drawImage(digits[parseInt(date.getHours()/10)],0,y); - g.drawImage(digits[parseInt(date.getHours()%10)],37,y); - g.drawImage(digits[10],74,y); - g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); - g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); - // Draw day of the week - y += 73; - g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); - g.drawString(require("locale").dow(date).toUpperCase(),x,y); - // Draw Date - y += 24; - g.drawString(require('locale').date(new Date(),1),x,y); - queueDraw(); -} - -require("FontTeletext10x18Ascii").add(Graphics); -Bangle.setUI("clock"); -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); -draw(); From bccac2e2bb9d0ce2b9fd6a8319832c9e2713492c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:10:37 +0100 Subject: [PATCH 092/503] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index 38b19c29a..d7c3d5255 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) +var img = require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) From 588e55a3f5d1575415f4e50b8f9af9d0c06ca0a3 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:10:57 +0100 Subject: [PATCH 093/503] Add files via upload --- apps/contourclock/contour_apploader.png | Bin 0 -> 15659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/contour_apploader.png diff --git a/apps/contourclock/contour_apploader.png b/apps/contourclock/contour_apploader.png new file mode 100644 index 0000000000000000000000000000000000000000..9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3 GIT binary patch literal 15659 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 DyUl?1 literal 0 HcmV?d00001 From 0b6b6a60ac343d9352b1269198281d47f164abb5 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:13:31 +0100 Subject: [PATCH 094/503] Delete contour_apploader.png --- apps/contourclock/contour_apploader.png | Bin 15659 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/contourclock/contour_apploader.png diff --git a/apps/contourclock/contour_apploader.png b/apps/contourclock/contour_apploader.png deleted file mode 100644 index 9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15659 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 DyUl?1 From 269e3e4831b1d57897f9aa4e3813be55f0ef02cf Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:13:52 +0100 Subject: [PATCH 095/503] Add files via upload --- apps/contourclock/app.png | Bin 0 -> 10662 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/app.png diff --git a/apps/contourclock/app.png b/apps/contourclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..4c31cc007a190e93fb4ed970dc0176c2ef56ad4a GIT binary patch literal 10662 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 M07*qoM6N<$f@jW2LjV8( literal 0 HcmV?d00001 From 3b469d305459a8c29950e3b92413f264e642cde4 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:16:40 +0100 Subject: [PATCH 096/503] Update apps.json --- apps.json | 60 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/apps.json b/apps.json index 60de1672f..47022306c 100644 --- a/apps.json +++ b/apps.json @@ -5007,34 +5007,36 @@ ] }, { "id": "circlesclock", - "name": "Circles clock", - "shortName":"Circles clock", - "version":"0.01", - "description": "A clock with circles for different data at the bottom in a probably familiar style", - "icon": "app.png", - "dependencies": {"widpedom":"app"}, - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"circlesclock.app.js","url":"app.js"}, - {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, - {"name":"circlesclock.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"circlesclock.json"} - ] - }, + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.png", + "dependencies": {"widpedom":"app"}, + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"circlesclock.app.js","url":"app.js"}, + {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, + {"name":"circlesclock.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"circlesclock.json"} + ] + }, { "id": "contourclock", - "name": "Contour Clock", - "shortName" : "Contour Clock", - "icon": "app.png", - "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "tags": "clock", - "storage": [ - {"name":"contourclock.app.js","url":"app.js"}, - {"name":"contourclock.img","url":"app-icon.js","evaluate":true} - ]} + "name": "Contour Clock", + "shortName" : "Contour Clock", + "icon": "app.png", + "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", + "screenshots" : [ { url:"screenshot.png" } ] + "tags": "clock", + "storage": [ + {"name":"contourclock.app.js","url":"app.js"}, + {"name":"contourclock.img","url":"app-icon.js","evaluate":true} + ] + } ] From 808a5f58faf63a97e4d14845346c8227a37f01df Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:17:59 +0100 Subject: [PATCH 097/503] Add files via upload --- apps/contourclock/screenshot.png | Bin 0 -> 15659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/screenshot.png diff --git a/apps/contourclock/screenshot.png b/apps/contourclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3 GIT binary patch literal 15659 zcmZ{LV{j!*u=Y90iEZ27Y;4|t+8Z0c@l1^~Ek?qq8unsmg9{_BWr16eiTOE+x{(EG)bHHvCfmGzcRb^fGdIUMZ) z?b|~Mc7F8zd)gNGeuzU>d1Xvny((XM`bFq5Ji)Q!_x<6Gz`wQkXYc(TuU9Wgd1*v;7JskKuG$3LZ2k1g{Pd{3`|7{ao+sYFuUx*aglT+z346b9 zM%O;fzAqelzvDix8h>H^d)ez~z%H}zLD%c1A)njR%S(LrlT7+o^tI!G(s$;S_jq>Z z*X?@y(bh-5`+DcA#Us$?o9o+!KD$ ztr;vwPQy^FTAv+5rzo!7^*7w3QOI{K1%}x6B-!{Es_ykg$+41HA9i(_Pfp*yG=n^z z>nGQ9??;&KpOB1{QQx<5A4NppJbt~u&iOiiL-+dqqPwM=v~EYxlJ|R}g-6|8%f!_A z^>O6;i1#na5Dk;Qbvg$s+t-J&LHg}LXW}~BUGHJzuYyIeYcFFz>cd7z77PsB8?G`8 z+Z(1aT!72qqK4Gg=g%N&Xz}zVx!@9L`L>>`119o9?CT=N?rBQV@ z-1m~>SeTgzcL&GX=iaMQgjB*M+liGN7U9 z^1}AHaWvQ8`H2#$yWDQ0Squ$rj}$cx9iJFBj@zau#;)7e4??e8_eGLV1-_Xa-_Z;X zUEPaQo!>n-e|T=a-!^5K`W`Q>>-ru}-Ku=FUfR^*`ZRCrYA}1NDWgoi^gayPe785- zWIzK_2{ZMY)4(VWEkIaoW5ylH8THhJnXhPIp=dQ`WVBNteJI2eLPPicj;jFuYnrPQ z#XlL>C_ghUs--Uu`ZJSGrm3&p-+l%yEDS~DEb)bk)|X4*>+S3bk@MWy?-Zu^ltx#aChvmVb7B-e|lYL5c1OJjDvUPdav`J!X__kE9&-`IHFG zf1AHPzPxz2L2|IbX%+mc*^`{<3q;!oa9tbWmyqN8r8bQqU#6S><^F{A#C0F>sq4&` zt1-4rS+X)dbJp7k%G-d(odcFB_d@#ChS=Xu!J&S z7p>Ug+u<{9j+ix`@^x?Sr{{8w6BCj)k`GC5uJNu*?MCC3pip{O9;9e23W<8jTEX;jHn+l($K3{(fQo5XGA{(P36)MCUph-mFP5ap4M+_Xjd|%bROAm*x zKhL0w26SCp=UqovF19rt#RM>-hI#iMi(Q$S<}a{1H(2sGVM^zM_Y)_ZkS%w*WD>S& zkPh`a(|KX(;-!D#!C#p$KL7(yD?ozcTuS1pn^b5qESLAx!LE|5RVy9O@9Y-Ue6LR)T3#$nT5NnV8Fxs5bU7iAHj& z_ul(mcPDLfqtwMZUT%eV`y!qC=dqh=#cZm4mU%YIrj&2?;ePFd} zv>d9tIh?9t=J)G>RqT?4yB6;igziVPJ|L#(3ZXx^Oe>hu2=0BhT`l*swvD2bJUvYH zb^K_9ISx)zef!t}?;s z=0-L8r3nHoK-xo+1Cg)t{eDhi%Ad^`AgM>;qz{E_W?;0J$7e=r{&;oIJL5srj1el#w$zp>BkcJz0=;_ZD6s{^3C3 zvz9B3v7f{DBaPbuY|(|=xUz);6L?SY{X{Yfi^w(~QT#W6ORHJ`5zVF#R>s5-+&Y$^ z@$rG4tqaXwgXz;>QY8IwJ05u+{!PC}SJ=5N{k4geR-%OwNMOikFM!XU>R{ayu-5-u*&VH;R{`8`>1n+-FvH!) z*nvN{eW8Iw-GI0uQnzDHg4T{aw7=(oBnS$GSUQC9hqUL&A4f2BdW^?hpW$$x%_v1a z6l_%rg?C3QL>AsnJ|77u<@J%SdpIKIb;!#Y1Z5POGfpp!+1o+~2H!NmP2QpRgIpbn z-Y(eVPm^F5v;4+JLvz~kP>%@o>9S|y40~E%e5Cg%Xi)MSn`dvvd`xze73sux*Nw@^ z@6>GYYpC6@h@!v)D4I)0q+gv z8RUAhAg5i~i{XgSqb?N&LRuIo3oVTXn(};XyRE8Lx+_-B)AFhzriAky!u@zQF;RXF zykuRQc=&bz;v?@;%I2Xe$ZaBxk zS(I3FjI`XS;}rV@LWk7tr5qUG;`p>QaoliViy>B)sW!nl)Eb;@Df}ajWxALkHP*_y z=xK@w@qT^JYjIgsK_fh!+wdSbDr9Wp!RGOhD7C(OTJt;~X8N(On4mY5;ubm39%nV! zQKYI#6&r_Fz4~x~mM}&b(Tmd(XX;0ySg<(qNbC!NH2I`YJiHJw7rnI<6s9DBwC{mgy>4;CQA4bfZ`c9-AdL{)U{G=Ahz z(RyE^15zE~!?c#TK(xZc2#g*_I5~^Igw8FdV1Ci1cOUlB4`V8 z22vGd@zfEsB?q6wE?^I7F<`m#Tnmi|U`pNjT^uHfaYpM1yN3ncCP!IIyBCTZs_Nsz zu7ZfKD?--7M8I^^IZL1*_W%fEB@y3=X;@QEyuhn1sK4mJu<74iFonwChj{U7Ym9dbTm`LrJa?vsyyJ$!HCB&S6FEI*Imd6D;?A`)YfD4>IzXQp{ zM#y=iOu-Q!FuoyiCzkSSdsDBpitqy@jY8IKVynZ^9-!O;;Mp9mIAaWj^N6XRDr&U| zHPDu7Q)GeguKNWhU=ZZ`e7aDuag!%hnL)=iiJl9h`_RtN;+&Xtd8<@z;CbU5)RzZ3 zssX;r@j~vgM@bK@AGaAep(x^{yDnO3}dwLjFMVio6> zo~ZKgO5gaZE8!Bg={U{mEZ!LMVIzrHHAzVb1Ku;#ufn;S!iY5zD7Jb?$6T3Ui$AsU z(~1%4ah2iDgh_J`Oc@f{j}&nh^DH5y%p^?#;sf`7$ly z&O91ptnJ9yNdH8HN_$k%4uC&stR9GErPB59#Jl1dL*VW0&M#s0@Y9x6(MpXl)O-Tk zyRS7(`#I#&Iql({v>z$enoxu?)Wl1kqyp|EUz`EBxs^ur9{p7ojsE`pWkIQ*9K;no z$EP32Rr2~=mCN>8kHkRVFr_$6c6b*%(V;-TTy-%+(hD~W5(iB?Yv&Gu`G1ub3lFyd zy8YBQ?0}zEnaRSefL7^YNt!oij)~281?a*JYsWwwMzqpOtP0KEEtm{MEi$G+TsE?y zadPkZ(U1ht2{~_?j>sp4X=7?x(EZ@z1WF5fGUcF+)YMR*(nfmvegAz|fycPmXwGvn zgwuY$avmXXX#Ek=5zQQ0aZ)zSKeGqJxb3ZEav&6GH--h=FfwM?`}-IK#cXlYfkj)v z+B+&oyHN^WtI7c@f`my8-#QYL$kZb_3_rR%6syr)N!XQz?qOazX^xnN2R}8|?n(h$ zL^CwsxCR{vZ;y*yZTU%;A$mrE`EFaPey6dkr~)@m&R^6Dc0?1Q_AZjLp2z9 zQ5>3bJ8B$-nJh)MQW7{V@(NWH@!k!KflU1iB4A;p7d^)HwEJl4z0mTES4cq=IdoR4 zd19@y>tM^%oISas9m%PIpasKx5;5VcB(;MKVNa-RI|MpLqmc#JA5uU+?`O&x*k>2V zDw12dKcc;=Kz@+Dj=jT`Ejxid|%pqHkH*w=f8WyV=pUAO;I3pz-*oA9PT?UB9SeHL=js$$X-d{3KM9mjbeIb7B30yuLm}9Js?Xyt9(<`nFNEL3;X&tT>PHxk z6uS2owvvpR>GzaZIx#h)WWTgukLG#>*?AxBg9MOc9J0a8X67|EYtg5trq72>Fdfqegi>mLQ_5eCJcN%E)3 z6c&Yait6tEfo5qlpiTLY`X8^$sYiX(*evg`YhBl7gmPD{%$qsC}xQe&^(oRC&V1;Jq?&R+)ql z;dq}{k&V}a>=)VP?|3(4KJPl;0;O6ihz8IicqC_BRk~IRe)~LaSGLc@5(qoK=Cu{V zaseGSTv)U*d>;71eJA=TSWRZ9cUcDnKYNDqnt?<_4UCx5Tes9{XIB98>Nw;X!1D$i ztp-u9ttXmR$7rXrzcbVr%Uo#Qc6AY&v}h8^MR zVzakB6D?}ExShBV3etd&N+Aw%$O^YX0tZMYw!sO@Gcc0o?fH=t&6DUVavp{smMx%* zCU{@~q9859y`2G~X_^Xz?>2wkv}Vx`5`IMrL<#6&S{m9w&SIcZ3^Yx=UhVwv*spT& zSgU(-sf4e!Bxz((J8&;4$Lf7&IMBji%2SE*6s_8_IIlsWvIw0>i8Ovhix?NeL4OKQ z;^;yIuj$4L1{<{9ggS!W8z7RM{_#X}@eG3iLv2{ZuX){}ddcCh9Zi`xv>H`i1^v&E zr|r!HvnU_L?hA?w#|N(o?yqHfpejseJ&-$9Mz3lL!#GEc z#z6?{(h>P0*^m$v`F_t!g!?e5?x!~l^>D#)(5iTC<^3_ z@;^{8)gzN6dPrrZOJRu!(%i8Joh zU0=i=hWm^}G6jJ6bQScHrh^n$$HGvXmj;(VS|f;NI#|sh%9Fa@H~>NQHNe39~7 z7~_y)VDR5X+N2pdUexk+c~-LtYRK#U+&J3PBZL@w!ldXA#7iL63uP4~sx2whgPuT> zK+}5*jqFdsg_94B{njPS0cq$Y;Zh9=K(bw7(^+}yO4~cZMa3;+Fq#BR><@u}wFJb* z%zTxc7ploL#0Ib<5G9#I9Q)~PQzddR!$BmShFYyV&G%h6E-J|*EGt=Ee^e}`r)!w| z(E@^rkh(qA4*(7?x{J5ke%|7+@G``?eAvIxQcO9qiK;FW3a<#YLL(A4c*+)iSi)sW zn|vK@Z3x6JmeN1_9ajsZX0(E3nIy9WD|2>|ZlCkN@KT07t@vOnv~)%1M2u$gy_D;2 z1nsu@z^%e~+;^Y_xccR)EGs-b3h*O%i-%d9_kg}~~Wts=*6Y@0z0nyW>nHl!{vEk^sOn)9Ko2ZQ6^s_?^)Im9A{yOY&nK~kx~ zOcCoyd}+PB#-(!4gt1VNiJ=EB*e#QfbRaW01K^+{c;T8L5CouEliuZ}Jkb|Pm~1k| z1c&#}6U*XseJP0JGT}xHA+w;d127l`x1S$a@KDrFlrgAoj8xyr+3I6Vo_kjMYfTUc zB~B>DW|Go6eqJ#n*BbGCTVVqgg|MO3N86cGezlKUB6uvb$2 zq*(QG*12=(YjekvW9+-Z3J~|l@f4DLCeN8jM^a(6)fiOAT$YQrLm!CYh0BJn805N)1JBX*kH{i{{_dF& z*1_BrvBw1+oZEv>-kQcdgV-#mg5Eb^HU!XYX^_x^{RL&C_F%Et%0XDH04@*gfD}_B z;cY|M6fS%&j5>`5r4N$rU?W}Bw#xr-WnDe#pPVqNOtt#VO54!h z_~apjGvyY$kGE2`+r|9Xk_PNrs1sVDrSR=FH?ifgmFXd>3j$Jp7SjqW${`ZImDNuu zHxOzXnt>&cJJHt2Joo1zS*O9NbzkuejXLedAZ_^Fb}=VWbSW zq&RlaT-bir;x-9q$!F^ySboYoU4ro~fcJ-&IUH04{Em!w{#G@D-0^AZD2L-W&HfXf zQ!r&L#sbbZ92%;5$GG8^j@r>z{tN!DRjYM8smJxTOh8svlr4kpwb*L;qS9@ERf><7 z{p}6b(qDl9>d_q?oTn5G)O}43uoX5rSPH*K;2P8qH z66Wkbb`h!h6h`dW;*BBj{5OI$f+)qMRA^3*P$Wc!80=F?ZL_RDi|cT$|GB6Mv<6xg zA;GAnMwSD{^E!LBHBc18wg(!qD8%9(#bK?Wd!ZT=(dyfuGk%@d=6_$RTSyw%u81K? zfuGVhM^*At>FbU5!{-PxK-MwFE$j93)>x+&<-+hJQl4i&s*|B?Y%s!VyoUHcoG;n4(h)MKdeK!s?KW` zu`{br2AUdtsjZzgGvvW%>q-=qV0^h}95{Z%9}uFc`4r5}i#8fj@o3E0wHPi%7N_(& zM7sSHwO(JRt*T*eu9?M)%_p^kPDk*|21$bj@FsgVuT0+JETOGd5>~iFrgZ!!%wh?v z!IHDpI%p^%ELFrgA|JoCN*mG%x@)0% z8*AFF`c+jPMUIEIs-j85DBmS~=#-Qh&HVSkc!+yk&TiKh$2D0>=aj!4(AC{Sg-;bz zRrn^Lt%TN7=&i(Es^Us}*TvNfME<+BQU%74TY7s;=8aq2{lw20!fX1a>35FeHll2) z92gA^u`dKUO*9{jNhiLU%-a9LN~2X=i7Ob2arXsnF9$wE2&RoeamdzX2&U@`GJK4` z2Veb@Eg1#6t$m~>hrU-q3XUo+t3X^{G2`-|Qe!z(GNjJb8}ppqw7=M#Rx8gM5g&`+ z&VMMdR+lPRW-F!O0>v~8>YoJMIo`7v|u(f4Vu|{v$Cv&ZCDqutmjf;{}O!PC! zcD`JM?BC0NeD#*%8Fa#4GmS7O*kHbi&7m0D`l;jsB>&nhCxmZR?4p>lgem;5?Nu{! zqo8e4FUDeh&uxwcZOI#r#>_3jY+Ts-!c6*TMVc7QDl}7;z?~cr(!Ov0({UL!9{~2c zDq^%|mM*W373%#N4$G?l$6vFD?&4@@aMINJq9|_;)iaxLEW4@KTcNd@aM=V$+j`%a z6%vv0+aYnNEeIY1TyqQ1K_H@hl0@lFRyO27O42%Vep#yH`RW-Xl-JEe%`2H1c#GqC^e56g{Tf|Lua>k>*RZ_g?plXfCP#-Sbq=a?-U@&pbN!hms z$FJT9Olu-A7FHrp7p{d&xy^tJ;Vi{YMd(G+>aDQ_Iwm^sK)&jq;j#;lz0visQ%$)> zB$;nw+cQ@HYv>T^M!6E3L?g_IQ4Glf+(mWga;s8^D%xhtRqTbm-R?JgrMA_%b9PZi z*OSn4_~L0kas*N3Nttz@hd;P%#u^17#1yWwl`D49e31L#Y!X7Jiphg8SQxPOzkdog zp;S2*xrSDT%kyIi8q55EUq6}9bawGgC|7Hqa=L_q*2LOm-dr{m`w5gQ8#%C)prj6ofi1g4>>0?hQR6?|NRwbgGROx1-Nt?zb zaUJEVdnrh|7xO zWMj)a7`4BlMApzyKscg8SS|LHeSepQqH$Y5akjF~Vwj`KO|c6#3rnZ)T@|5~PkwoQ zm+^#pMdjO${5jBM(<~}f+5xgSSpj^Fqt8oCeerUvotKCDWqn5t|`P+ zL6TM)LAvoMuUP`|yOk)K30H9h!K|3*pa*#4SLZ4AE%+iE9wME_q)lOWQ4Da^__j|8 zOIq_Q@UMxd8wvAIb%&SLtu`I=Z)5_zVlqu=_$}RF!lP7@*neK)Lk9C-OJ@sm0O+8S ze=Z{J$!qpo~+p=GL zRFC%dk9{s%>mMytSGOSKG{s%s3@S~M$tD}SVfBLXWwVwcV8Wf;R`|gpra$>Lp@=c2 zIpH3z3YA^%vD6^-w+V04hh6gM8s2W*3jj-~Ki`r1T8=IeQn=`GMP2iR=-5V{4m-z=il@j_`qV`)BmxH)(LYQ-!I3D7nVv z`&Fdk8XF=#ng>7j%1zf>wEJ^v)Ed+;;p5mAt%MPV#)6FA8%Xlw6mXLYPj{Pj#6Fn( z&4S%A(K*yo;g0 z8@}b-d&3n?3iLo8RZE@>9g)93-9CP{T~>^R#-?2(&U~l)6nz9)F%^sD!ff+ON9%*D zsOY>e#|NP1HnVk~v>+P|Y_5OdxYXrYy59M2^WSHvz42eBTY^Wk*Oz}yV6YWdU1;5! zyOI(mZM@O^6CsHBX?q{4pQtL6jIB)b_Zaf!oN~ispWCQHdB3%72$zFmZ?C4{;|6JV ziE_{C#F*)LF_xRpK~#h)xJ;B;KYsw`1fxy~)-KMhsUvuv8FQc|(Ckwc?H!)h(iTAo zqaX%Dl}}~(4}-Crf-N3uO46cxrrz7O_`KOsp%0%GBSDEaKQY!76lNC!>Eji<@29m;^gOGM!8nQz){#~aU45}ybQ`c~E!QE;kd)1he>ctq53#oo zLfi9VBYD5|4;o@^hOstJ47pZ^mBA-P48LR}I{Uw(9jLD-WdD5pF)@Urn;IWBN;bGj=Acpo#^(a6k#*y&p@bRSvwmY($Vs| z^L+hAa=SeTC=gfVk~gc6COV-0lw*hE27Lo*O3#5W=8sj{)UpY&pu>T21jcFuu5r7_ z{tm(|;Q+S)95NX>ykK1n+6Ft6wYqM1;D@e^n5L}GG9(2~6`g0HrY#L;N2{{f&5PU* z^&IDXu{s6dx{XfFs2vceuE94E^D|U6%s6PNn?|BF%iA=0O7sU>>%?!y+U_RzWT>)+CfFd|+5bW-zo z?>ha#F>*MA%H>+?pwsYv{L1;8A0)6m=DrzUPMeOKybq(Tra~-@rIw^UFT5r}fLxi` zDnI>tRGSmlk=aM9 zq(?O@gy#uzttU@zfQ_85>Dq@8NiX+7FW(Bh z@qVQEYwC6)V@2P0^(<}*loLCzy(#JuDv-$+DK_TzV)Nx^an#S18;Z=PoL}!|wO(90 z@hjzieyd-0$_jO?_Tfp0QVdAjVunwxenEK@G2XEi$p-o<9G&QO|W*&&kaDG(4?I?x=<6~jp1 zoLk^9Ph@CyU{)i*$U@3c-vZj=-}*&VoM#Np6lI65wF4_l{Z+;%`_@nK_*$* zLzXEGPM;OI{E^%QS)9obE4+yig3sm4It2FI&#M+3RMZzgF}7z-EA$$1wTZCHmMe6E z`uTVCO>TbEp*VTu-t3Gib10#6py{m+GF)FK4q>IkZ+=k%WQ3nou{q_ zuleMF;v~6n$d!_A`6D6LMClc*kVJ=+Vlu+~F}&qJLO!b7)YiFJ*>RWg2I{ukm&j`+ z3<9*O4s?~KmQNfW!R2DAD9}9Z!Eb(wiOiLyuf>)WoNJ&UofRa_>JC=_v}IPIuDZUDV0Zl zxrw)!0*kw@wp5hXM5d?tsQjW)#S5Aii2}FipUc;J zQp+Lgj3YX%R<^N`Fr~T0))N0AicOPXFUhy+pao<|Zg-~hV(>uSkB3mio%pHB9WurE=|+f3Kp+ZBvQkb6rteX^@m?HZP%ZA4xsOhU>JkY7D+qPmnT0 zR(c)PA$EN9I&oW;D2gLo7pC)LFse)uK1fa_S%k=h(fm866bMEtYDnFG+5A~oWQIao zNH*NG!u-XyY%}~f9uAB+&9M6TwbB^u52wVnwI5ze3tuHIZu|&73P)Yao0^}E*jHk0 zj_|g~%w(gC9JFjsjmz21c0ysIJX(N9xN_mOQ1h<2LK41L)%nA+=Zdd|V~4nU)^D|Q z&|J`rliy~$&n-@Tt*O^oynk(^MYjX1Y#`XoU~v@-o%8+51(A9OtW@YRP;1jzP#?&e zF5jMM^ohTEd@Q0)Uvrj6!6~Pwt%i{KJUEMqhseX*BDca^>v0!8OUgas=rH{wP<%y* z>`?6%0t-Ut%Dfn=_k}pIKBojscoF{^ll-aX{hRw0O?5?H!}jY0Z0b)3uUw@bhIqKN zqHp5nLSnuarO+uY`Q7epg<*y>Cz5xIg^k9NNM>XWcZqo5{;oGG97d1$t38rS>B_9X z1;GseOrWD`-QI0$hUAKaeO^{h4=4worRL8Jl*H9-P06>Al1KUMVJU*~qlHM=(M5du z@34M*8H>3;IB{e*Z^fzT*$B&_dsak5_766Q1b~iOFpfo0$Pin$HZ*t`PMnTo z#QDY_hGQei3zKOhkbi59Dfnu)_HctbDaGDA7L^F}v-b0i(^irjyB8qaN*)I{wEGMG zupOj8CQuw=xKJxf2o)+Q9Y|%*{E=U0yx~>i)_Q_M=3}M9S_@tBE_2nlYFZuTVtc9; zLU|6E48x^oNM%1plY*5cQ(`{^P^k~dc=7kR4)u51o7$o=8CB_pajirUuHIL;*TuSJ z>YHCT7w}1PX9B_0cU$%TZ9aSt&cog3kyMYe*fv^U>hS9L$iaBa$)bUCzYm^6IE=r9 zvNObY?05KD7V3OJjO;Yq$(RF=KH5Q(LkI;ltlyhIW-AuOdoANu7OpjeoS1SB1y_Z9 zEo-aDSuMy1^m3aof>rgVJZ8XTtC4cr2oT366*p<*sii0CilmSgw8Ne)ucW|B3?A~1 zX8a{>U*&F#>i!u>sLO4>c1Jf?! zg8)X)ImbF6@CciE{+Kp0kLv3_qA_ocdcUW;+lw!vLd8INPM=54IS?Wv4P zwSzi9+hXrRoXVZgEibupUM(`|?2F)5?DRF>+`0jLPvo8I{s14i*NB1GY$e1FYXH0X z_HotLUi-_c#d8rFdaHKeEHT5XuEfXRBWBK@w4k=yB<0VciW-7@!70DRs%qoaDq1)D zV_}tsKrHxvDc^|Be>l2e?xEzySib!}p(%_vG@pES2BW=hhsDmFy<4iyeO&0cQ^ zI$wl`mpOh)kAeVo=nR-H%vJ}E%eK(!{0_gJOtr=gu2N>7TFgxUR-i(HN3(2L6_^dC z?#)vnc+w9{%5I65ab_%zZB`jGFNAAGp|qyrrW{C@PeH1Ol#_jj*E9E;{(XSKwop;~ zV$BWcxq6<4#J|f~>z&JM^YILJRb5>DZ@r&6=#MW_eOytSro#VJs#;RV zmjl#}E}`vtvvbKc346evhq@%Tk-y)l>w+=Fi8I@LV?n68$SSzhFP7z)Z;psfPKGCF zH8QP;gj0O>Kc7zo?G@MXaKz zl3Cs}3htk>ws{EgjmK#cRjfCZac7^5+Cb=1Lsu2>L3wYkTs)vyMwOB`2c=ig!oY|t z1OC}jIevxx`X``QZmH1ydixI`WiH0L0z%pU?{gB2y`+{C0KiE0KLT_w5pey_2<0p# zCkAx_j|u}qdaz51rjU&UsF%((Liv?GNI@@NIYwO5HVd)%Vl{zdWYnFy2{Arkb76VI? zYRa`}lu3EE{S^%mjyGHL`sdlx`tSSmb9)7y801n@$Bm+bf_%u|{@}>;kU)Y&41|6_ zq45V1g8;&S|5c&{-LL;+4jZn4MLv{ipojafD*&-5Xk0D;82}CR|4%7_6_W~vBN1bu z7=^-w8fvDVKtd#zwd9F(tD^@?Mu@rv-|u?erI~hYKT_Lh;yvt=f&Ph9X?LDIbzFJo z*wpr1KXwXR0!jFh>Dpg*;ZExG>(ZJvyrjaa>)TC05&@0O5OT*c`NmePmdNHrY`M zs#H@YdlEQwQgj&PK);W53cxDh@yoaEktpJ_1r`SfIySf9fiT1XlvH^cbi# z>Vv#0cB&2+giIh(*h^_s-&c7RGh3Sdbf~1H{$#1<+bPj0d5wLF&5#JG(R4vrV*d4b z=_rv>TmAWZw|Dg5&Yx#pfzdNI_Fs`V^L&O41D0}Hqi6*J6W%7XG!NX@&(Fha`-Svy z4z-NLx-!x{EeDfcwWzILPBR)7H77TC;3WXo;jZ|)vCC|#JNR8(en#W2Q5Uhgzw&yi z*y@3mYS0X$nn`*xaP;JT#>!(^*PB@wdZRF3OJ8}>OX)mqeWZLev_1huvOXhZryGV4 zp(oY(YZ4;XN;Mosn50fH+wue+s%xy@2v*`jW95%3iAjtW!=6iZf!gi!@*ATJ_VGHg zZEStIPd(I3wRIpI`I6EI)XN*>q3tzSp5Y|z zZm5x)M~aTu)MuZ2FdiGY{Y+%Dp6(+B`MSz}87kO@q(zqi0_p5Y#?~#PrLkKp zN^WV1ecP0jl2=44TCtt)bu(2P-AFPcoLe}Nx+&q@1D^PtPI(UW@2Y$|VXCp*-@ugY zb8e5LMrDpHA-W9%L!n?*PHrfxw9$1XEft=3?nBSS-kS=`_U0|ky`sz|l_ksT4=17X zk&@lac3MS2Y{C&sNhl?1qMk4@7)$pfWDGYbN&bc7l_0XJRmhCP+)@SfBOPYr@~_*YvIU{F0bj$3WICkAdTPX4(*uu zY~K@r^fm@={#MepVUxx%G!6`3R2?svV|Qn1lDA({yD`_C@FHTZ4cyT( zdz`Ee4+}z>HsiKo?W&rSoHlBDd6yowI>ZeWPmMz5$SnqEe82HAr|xM&k2)79Jnzx% z)Vpi~Kh(qDd*<8OsmTc^IU8su(+GWg;S{J1?L};=8T%~J&!I0T z!#7C4zDSuKhCrW?ghpQDZ@nA8?t08w70fl93RMbc8OzQzLc!4ruJCMjr==54ybaHKn}Z=WQBPujKHA5Tnf_T}N?9xOo{$ znpE6Sr#`Nu?sRz7!FLQ6`*I~9KHPpDW6I#%%y24wgJCQTNa+;33I3z(%|)aNXGihl z(MQnHQa#`tbKUJu!S2}H0@T4QM53ka=&_42ODDY=AQ(Y?IrX+R{dLXqnu>hfTGtxY z18u#$Y!s97T0c05;NIXa^m$J$@jZ82tvIGA+>HbeLwn%*_&4xqs zGGYJB{?5^4x=<>q(x5KExM)z~Uke_}1PHV8Anvz67Hf!SENWtNp@Y5ghwMMHTWxX? zGG<><3@=mE@QuygP$Qs&oy(E5@6O0QTzc^R%anwL1qzZ}d(fIfZL1u{>K~#|gY20? zsG|_AHZNWkm8n7h1>zsxZ%tVDpf*N75C-7Sv4DHv+p$w<6aP!chbm=`ex4vX<95y- zEDY#5A)(e`!g{3{yIM0xnxbtV#EM+3>i%CJ4X7md;W;K6;=@Ag#v}uExj89ouUHrB zzlc;wtmIQ>ch;=+xdzluh!^Cmy2urw1?eW|r%miz6qC;4Eudh5tf6ms$%|e5d_`$4 z&&Rbb+YignVjYaT%pxTIb`ZB#gJJ(?(*A!Hf5rzQ5!+eoBwZl*|Fn@3lNYTOHVFKG DyUl?1 literal 0 HcmV?d00001 From 680e24f92f6230c309c5a30b2f9ae2aa7def766c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:19:43 +0100 Subject: [PATCH 098/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 47022306c..27dee60ca 100644 --- a/apps.json +++ b/apps.json @@ -5032,7 +5032,7 @@ "shortName" : "Contour Clock", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "screenshots" : [ { url:"screenshot.png" } ] + "screenshots" : [{"url":"screenshot.png"}] "tags": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, From 36898e33fcf03e492210ac0cb488510ff0c17ee0 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:30:48 +0100 Subject: [PATCH 099/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 27dee60ca..59403a294 100644 --- a/apps.json +++ b/apps.json @@ -5032,7 +5032,7 @@ "shortName" : "Contour Clock", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "screenshots" : [{"url":"screenshot.png"}] + "screenshots" : [{"url":"screenshot.png"}], "tags": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, From 212508b34cd684b98e34b1ab87509d627094097a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:39:31 +0100 Subject: [PATCH 100/503] Update apps.json --- apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps.json b/apps.json index 59403a294..c1e7fc7a0 100644 --- a/apps.json +++ b/apps.json @@ -5030,10 +5030,14 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", + "version":"0.01", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", "screenshots" : [{"url":"screenshot.png"}], "tags": "clock", + "allow_emulator":true, + "supports" : ["BANGLEJS2"], + "type": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, {"name":"contourclock.img","url":"app-icon.js","evaluate":true} From 65da3f1233ffb8144e57ee121c15e5a4ae07a844 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:53:38 +0100 Subject: [PATCH 101/503] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index d7c3d5255..3cf7105bd 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) +require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) From 3c343304d88d86cc5acdcf463adffea45ff5c526 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:56:09 +0100 Subject: [PATCH 102/503] Update app.js --- apps/contourclock/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index 9fdbab985..3ce28f94f 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -12,7 +12,7 @@ const digits = [ {width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} ]; -var drawTimeout, savedOptions; +var drawTimeout; function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); @@ -25,7 +25,6 @@ function queueDraw() { function draw() { var x = g.getWidth()/2; var y = g.getHeight()/2-31; - //print(y); g.reset(); var date = new Date(); var timeStr = require("locale").time(date,1); From 95ad90e11b46ef112b3ce1ba6525dca53a9f7822 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 11:15:40 +0100 Subject: [PATCH 103/503] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index 3cf7105bd..01f3ef69f 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) +require("heatshrink").decompress(atob("mEwgJC/ABsH4/wv/H/EMlkMsF4hkYmEEwEwg0gmHCwEh4VAmPi/0j8Vkkcj4MjkU8kckocx4UEmPMoUQgkEEYNGnAFBnEGxFwg0Ek/jzFh8UEkEjkOikUcnFH8MiFIM3wnA8PisEwhnAkECAoMc4EYgk///3//n/Cl/AFYA=")) From fa66b678167007d24aa4e56f4b4051733cbf7ba4 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sat, 18 Dec 2021 21:54:49 +0000 Subject: [PATCH 104/503] Add settings and cleanup --- apps.json | 1 + apps/coretemp/boot.js | 135 ++++++++++++++++++++++++++------------ apps/coretemp/coretemp.js | 3 +- apps/coretemp/settings.js | 40 +++++++++++ 4 files changed, 137 insertions(+), 42 deletions(-) create mode 100644 apps/coretemp/settings.js diff --git a/apps.json b/apps.json index 595603578..9200ade1e 100644 --- a/apps.json +++ b/apps.json @@ -4970,6 +4970,7 @@ "storage": [ {"name":"coretemp.boot.js","url":"boot.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.settings.js","url":"settings.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index a73c67b47..61eefd6c8 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,47 +1,100 @@ (function() { -var state = {gatt : null, primary : null, temp : null, data : null}; -// Would it be better to scan by uuid rather than name? -NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) - // NRF.requestDevice({timeout : 20000, filters : [ {services : - // '1809','2100'} ]}) - .then(function(device) { - return device.gatt.connect(); - }) - .then(function(g) { - state.gatt = g; - return state.gatt - .getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121') - .then(function(service) { - state.primary = service; - return state.primary.getCharacteristic( - '00002101-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(c) { - state.data = c; - state.data.on('characteristicvaluechanged', function(event) { - var dv = event.target.value; - var flags = dv.buffer[0]; - var unit, core = -1, skin = -1; +var device; +var gatt; +var service; +var characteristic; - if (flags & 8) { - unit = "F"; - } else { - unit = "C"; - } +class CoreSensor { + constructor() { + this.unit = ""; + this.core = -1; + this.skin = -1; + this.battery = 0; + } - if (flags & 1) - skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) - core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + updateSensor(event) { + if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { + var dv = event.target.value; + var flags = dv.buffer[0]; - Bangle.emit('CoreTemp', {core : core, skin : skin, unit : unit}); - }); - return c.startNotifications(); - }) - .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); - console.log(e); - }); - }); + if (flags & 8) { + this.unit = "F"; + } else { + this.unit = "C"; + } + + if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', + {core : this.core, skin : this.skin, unit : this.unit}); + } + } + + updateBatteryLevel(event) { + if (event.target.uuid == "0x2a19") + this.battery = event.target.value.getUint8(0); + } +} + +var mySensor = new CoreSensor(); + +function getSensorBatteryLevel(gatt) { + gatt.getPrimaryService("180f") + .then(function(s) { return s.getCharacteristic("2a19"); }) + .then(function(c) { + c.on('characteristicvaluechanged', + (event) => mySensor.updateBatteryLevel(event)); + return c.startNotifications(); + }); +} + +function connection_setup() { + E.showMessage("Scanning for CoreTemp sensor..."); + NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + .then(function(d) { + device = d; + E.showMessage("Found device"); + return device.gatt.connect(); + }) + .then(function(g) { + gatt = g; + return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(s) { + service = s; + return service.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + characteristic = c; + characteristic.on('characteristicvaluechanged', + (event) => mySensor.updateSensor(event)); + return characteristic.startNotifications(); + }) + .then(function() { + console.log("Done!"); +// getSensorBatteryLevel(gatt); + g.reset().clearRect(Bangle.appRect).flip(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); +} + +function connection_end() { + if (gatt != undefined) gatt.disconnect(); +} + +connection_setup(); + +E.on('kill', () => { connection_end(); }); + +// move into setup +NRF.on('disconnect', connection_setup); // restart if disconnected + +// Bangle.loadWidgets(); +// Bangle.drawWidgets(); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 1856057a4..086614ed9 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,4 +1,4 @@ - +// Simply listen for core events and show Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); @@ -23,3 +23,4 @@ Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); + diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js new file mode 100644 index 000000000..2c541f72c --- /dev/null +++ b/apps/coretemp/settings.js @@ -0,0 +1,40 @@ +// This file should contain exactly one function, which shows the app's settings +/** + * @param {function} back Use back() to return to settings menu + */ +(function(back) { + const SETTINGS_FILE = 'coretemp.json' + // initialize with default settings... + let s = { + 'enabled': true, + } + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + const saved = storage.readJSON(SETTINGS_FILE, 1) || {} + for (const key in saved) { + s[key] = saved[key]; + } + // creates a function to safe a specific setting, e.g. save('color')(1) + function save(key) { + return function (value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + } + } + +const menu = { + '' : {'title' : 'CoreTemp sensor'}, + '< Back' : back, + 'Enabled' : { + value : !!settings.enabled, + format : v => v ? "Yes" : "No", + onchange : v => { + settings.enabled = v; + updateSettings(); + } + } +} + + E.showMenu(menu); +}) From 3286d6cb2d4a7144f887a4e77c4eeac95fe12a72 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sat, 18 Dec 2021 22:10:59 +0000 Subject: [PATCH 105/503] Switch to widget --- apps.json | 7 +- apps/coretemp/app-settings.json | 3 + apps/coretemp/widget.js | 132 ++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 apps/coretemp/app-settings.json create mode 100644 apps/coretemp/widget.js diff --git a/apps.json b/apps.json index 9200ade1e..ad54b1d43 100644 --- a/apps.json +++ b/apps.json @@ -4960,7 +4960,7 @@ { "id": "coretemp", "name": "Core Temp Display", - "version": "0.02", + "version": "0.03", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", @@ -4968,11 +4968,12 @@ "readme": "README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.wid.js","url":"widget.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.settings.js","url":"settings.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] + ], + "data": [{"name":"coretemp.json","url":"app-settings.json"}] }, { "id": "showimg", diff --git a/apps/coretemp/app-settings.json b/apps/coretemp/app-settings.json new file mode 100644 index 000000000..05e922f9d --- /dev/null +++ b/apps/coretemp/app-settings.json @@ -0,0 +1,3 @@ +{ + "enabled":false +} diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js new file mode 100644 index 000000000..3eabf85d6 --- /dev/null +++ b/apps/coretemp/widget.js @@ -0,0 +1,132 @@ +// Widget to run sensors +// BT HRM / coretemp / csc +(() => { + var settings = {}; + +var device; +var gatt; +var service; +var characteristic; + +class CoreSensor { + constructor() { + this.unit = ""; + this.core = -1; + this.skin = -1; + this.battery = 0; + } + + updateSensor(event) { + if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { + var dv = event.target.value; + var flags = dv.buffer[0]; + + if (flags & 8) { + this.unit = "F"; + } else { + this.unit = "C"; + } + + if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', + {core : this.core, skin : this.skin, unit : this.unit}); + } + } + + updateBatteryLevel(event) { + if (event.target.uuid == "0x2a19") + this.battery = event.target.value.getUint8(0); + } +} + +var mySensor = new CoreSensor(); + +function getSensorBatteryLevel(gatt) { + gatt.getPrimaryService("180f") + .then(function(s) { return s.getCharacteristic("2a19"); }) + .then(function(c) { + c.on('characteristicvaluechanged', + (event) => mySensor.updateBatteryLevel(event)); + return c.startNotifications(); + }); +} + +function connection_setup() { + E.showMessage("Scanning for CoreTemp sensor..."); + NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + .then(function(d) { + device = d; + E.showMessage("Found device"); + return device.gatt.connect(); + }) + .then(function(g) { + gatt = g; + return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(s) { + service = s; + return service.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + characteristic = c; + characteristic.on('characteristicvaluechanged', + (event) => mySensor.updateSensor(event)); + return characteristic.startNotifications(); + }) + .then(function() { + console.log("Done!"); +// getSensorBatteryLevel(gatt); + g.reset().clearRect(Bangle.appRect).flip(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); +} +function connection_end() { + if (gatt != undefined) gatt.disconnect(); +} + + // draw your widget + function draw() { +// if (!) return; + g.reset(); + g.setFontAlign(0,0); + g.clearRect(this.x,this.y,this.x+23,this.y+23); + g.setColor(settings.enabled?"#00ff00":"#80ff00"); + g.fillCircle(this.x+6,this.y+6,4); + g.fillCircle(this.x+16,this.y+16,4); + g.setColor(-1); // change color back to be nice to other apps + } + +// function onHRM(hrm) { +// WIDGETS["sensors"].draw(); +// } + + // Called by sensor app to enable listeners + function reload() { + settings = require("Storage").readJSON("coretemp.json",1)||{}; +// settings.fileNbr |= 0; + +// Bangle.removeListener('HRM',onHRM); + + if (settings.coreOn) { + WIDGETS["sensors"].width = 24; + connection_setup(); + } else { + WIDGETS["sensors"].width = 0; + connection_end(); + } + + } + // add the widget + WIDGETS["sensors"]={area:"tl",width:24,draw:draw,reload:function() { + reload(); + Bangle.drawWidgets(); // relayout all widgets + }}; + // load settings, set correct widget width + reload(); +})() From 85ee6a1f73675944bc618042f5ca523634a0b006 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sun, 19 Dec 2021 00:10:22 +0100 Subject: [PATCH 106/503] Load step goal from pedometer widget (as fallback) --- apps/circlesclock/app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 57b46bb8d..c409c1e32 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -7,15 +7,19 @@ const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbB const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); -const SETTINGS_FILE = "circlesclock.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { + settings = require("Storage").readJSON("circlesclock.json", 1) || { 'maxHR': 200, 'stepGoal': 10000, 'batteryWarn': 30 }; + // Load step goal from pedometer widget as fallback + if (settings.stepGoal == undefined) { + const d = require('Storage').readJSON("wpedom.json", 1) || {}; + settings.stepGoal = d != undefined && d.settings != undefined ? d.settings.goal : 10000; + } } const colorFg = g.theme.dark ? '#fff' : '#000'; From 9faaca321476bd283ee841ce162f65b37b249a4c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 11:38:27 +0100 Subject: [PATCH 107/503] Performance improvements: Render left side + lines. Also new designed colors. --- apps/lcars/bg_large.png | Bin 11003 -> 0 bytes apps/lcars/bg_left.png | Bin 0 -> 795 bytes apps/lcars/bg_small.png | Bin 8753 -> 0 bytes apps/lcars/lcars.app.js | 121 +++++++++++++++++++++++++++++----------- 4 files changed, 89 insertions(+), 32 deletions(-) delete mode 100644 apps/lcars/bg_large.png create mode 100644 apps/lcars/bg_left.png delete mode 100644 apps/lcars/bg_small.png diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png deleted file mode 100644 index 56590e87891ec7908e31984aebc50db7ce8b3e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11003 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 SvI(%(E+8wZBvCGA;Qt@rL=Hy) diff --git a/apps/lcars/bg_left.png b/apps/lcars/bg_left.png new file mode 100644 index 0000000000000000000000000000000000000000..91c2bb6f7b7f83376ff41b83632819f239358246 GIT binary patch literal 795 zcmV+$1LXXPP)Lu@Z};XF?e>1+Kn$_>ce=9Pi+wv|?prf!_UgoA*PqAR;0Q5z%b*wr#QIW|?7DXB`WO z%tr&|L5E%C#LQ2Gh*GsW#jLp5NE($b9rB=*a#ddue-I}cpM(`96HM6pf*hi&({4!# zMnqIzE`A7dh_+UHE+@9(jS&b)WnUrf;lz`gzuxi#RaLe{Ro#&k>|I5LbwO22-LBT& z%>Wz1-c(obJ#qa0$E^Y@ldu~lk?60fImZnV#jPx=>v@_Mp5#Unu#tv_i~{G~Z(NOI zG5vxo9PUoQUio}kCq3`sdd!7sTDWhhu5Onh=IrWPhzwpU;R25w4SpG{tjt-f_GcQ3>bghM!iN9H z!jV;@SAT8oA$M`hSV}M=qNuKCYg%|ZCD?KX{QiPtC83d&V9R;k*r;0O<}SKjtq-?~ Z{RF94z^`^=I%EI<002ovPDHLkV1n^vZ1eyC literal 0 HcmV?d00001 diff --git a/apps/lcars/bg_small.png b/apps/lcars/bg_small.png deleted file mode 100644 index ea3a756888509f49fdb11944cf1318fadb0d30a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8753 zcmZvAbx>VF^X0=K*u$OR4#C}mTX6T_?(Xic4}w1|!5tp%79hAo@Zj#YeBbV`YPV|t zn4X$5bMNgwHGQgYM=L8zqkba%1ONa~Wo0B(Kjzwxk%`;SDtBIA-QE1V9aUO3;k3|siGfd*DDM@FCPyQ`a% z#JD<^FSxN#uB^Qs&ldtX|Iku)`?DKWi9EaRJbSbt8rfwz5?yW`qGsk1y@MY5d$!mp z-yb806uX!Y-qw9HIv1NDxE#0>o)S9O79{==5ll=G*V_BkFEqmA-WrC3+yYLMjiE~? ze$|sZ>Gt|=vs^9f{OA3srTDK`eeL%!(uYl$16m?ZamXr04!%fSzm+f6F2=)p%-=z= z0y_&F8&2WLW#FHlZu?%l!=KVxDVh@={)(0kGISOxTM>-MHJ6^gT2? z@D6HCd%wnKJp=uRVOXd|vWgRf?bxLxq!SW5c%#Qk&GN57AF0Q%NzypjRzPS2mHQ#-lHpoB34(g`&Wv^|NGQ zC7UNcn9!eVg{RtWQ#?`VcC94S(3dD|DvB~*&@4?w`bR(nlEQC6^9&tJy-B7dlfiUN z!}_sb74|0fktCig-s3FoXLlDXr}K_Afq%I?eJ4IESqpf3#aBq}Rw0);rOa7+{g#d# zmJ|{d^}WqvW|6ANQ_EjIl8xETGE?0I9nP7yva%e^dZ2H1`kqmDXQ>-r{diA3h=ZJU zZ}Ej5cRim*FP2`d@shUJE8E+^EF(bM3&f?R@qjgw6@Mx6_*S%6pFGzJv^T=Tr*8ZF z2H@`Bx?21czx(%7ihba;BZS_5Wdh3_qOTguX2#`NHmdJBg)=r%Z~EisWn#SffhN1b z5o9H<4JxpWpo7?-(e{DgB)EK=!j%pFQq9t$QoF^V%FQpBGl|f7yjY`-{+1?o*!Fzr zp5LInYJl@7p>TOc+KpMVmRHUwTxOLmk-(ghRHNHCsOm0DF{7A7?sj@Em`I!od%+DP z^&>CPeE{pwS?5v?Ls9^^D6to%mw)K4NQnQ_s;K zNw~+*JZv4T1Yi2ZdlC74tGHcc;ad1+Hd$lA&z3lk>0lMMD^5weyXK`NoM*9=tkI{^ zCv+s*KVv%j>ko4l=ozEeR#B6=1uPYc*x`lZlC*uzv!+so%BLvb&ct2RK$+SoEnW@7eyYY zItbeWKj~i|jKB#Y!EACwS*@1xh`KuNswF-#p-*$T!5&ZrmzPYUg4k7}3P*<&EIX{# zY(-P5;2Kw{$t#0YPyLYy$Mc*~Z1(*g+C4SizD_fF;wGT1Ylg{^k6ivqn|n<{Ji~ew zCPR})E2P<5qoA57mTU|nJN_7wKhFy;=*^Ti#uZJSq?km5etDiQZ3+H+6(Xd<&@(d-F_coBb&(|xm3;bY`km~?cj(c zdV`@6f~GozKU>$;jB+fadtCC-A$n7z?toL^O%65Gwne zlxnUV#6E(!MO?J(cg(d*K_GiE+}k1h1Pnb|w2$ z_Aub+ER{(;W)Gh4EBA$^$J8YJrCP*}-PZ^9%SgI;4{1X4?sC%!rIsT1aZ&nRZucok z?5*TARipJ+h66JA*kd3A(JxXg6s(uEz0xBBmGTiK27p%%N;mGaeBD1{P&k}FY3rX) zobAlaCw4gHF*5ht6zrPdWc!3Qzn7h@Zz$uj@!dFpVdYv88_fD-FO*$v^6k&?Po0e zAxb?0fR@h!A2&}{9*hsU@~Yael87@#BFXDb53)Zz%`U^WZ`IeqMr1a8!d6f|s!NfC z8|qp+Q5vt)-5b6q>Q4unQ6>xU;SmX*@5tRKL#H90~^5zwX!^oV%;VV+gT^U8U33`?#_d#N5 z!MG61AR%a)UGFSf>(C5_Y`wEMxdFrxsm>Vtn<}T1?PQnZoDd zG58mL3Pg_}3=8S>vy?iFk!17lNRo&_(e|52PmO>3AfG z*et&N%{r7IH7%OT4B1NFWN_FDMv|kH*B={`-uzKW+P@R=I0y9v%nN+nO62*yDfn`! zbIpSu=(q4P(f>K03sH_ioOMR4mE}LZ|5V50fC@@vqv{{``i5smk^dk67d4f!nA3d zsHcpJ-<+j~SG_9FMLGRnTV=_?0g*1OHaqrBZDu^ETD)Y61c>jxUGwY5?!VmcDqlz$ zLY>^Fm|pE@uOq3yT2XFqkwGa_F#Qp!EEV`P4(BqWXPkB3dv987q(YE<9vxx}3AffH z0!ZF&kd-r=LstSzL!sR^E5X>kTGG=+OvpY1nB35q1)e(hS>j-n`y;^mMv;?d={JUs zqASW`*69J=KC9rcH96L^-&_uyR3>Q2m>M{%gezJ8Wil>SZNM!qu_PNSTWgm)yo5^^ zE&ZGHaRLnkWf&jCQsEmk(vW{+f_v>?A2i+j(1Eg{W#GJ+_lyTIX0aDtxp|@GKEfJ$ z@bT8)7+mW4W-8qJ%F0I^IrCjl2Tg|i#$$RasZ)Jmc;h;~7r2I6z&-9wNeI|Cf zKft^Z(f4w|DZ2Y5(QdVb2v)XFCf~_glO4bXRW0nS_Ap6B8S*Q4K2XW3G z27*VHhV9sQvr8za-RSmjhfBbxTvlrMm3|M)<%oB+*2Rg+>Y`M=r!!7|j*<(jY=BKD zaf1Vd(om+ww(DBGvNR9-MUZ(-(BjQM_yt*SY!nb^U*ADQlh{Bx#wpmrBb9aKbWVFN z<()q#MBQLZG+fusa`8Q9m6I^L#hFg4yrg3~zQ(Jn8Pb4rKR0(DF)P&eCAch>^St7v zbtKaH?eDYeNp^MabXi2knmeA~F$?NmVH6zf034_Kthhy^y}R4JaM9yYVps?{Y6vM; zkpWw`JjC+IfA&?rFl~na^WZY&j8#IZ@17~a=A2M$eHNr$K`6I?NmAvzs9UNYWL=TD z1!n)x3P#~QQ#i_Cq7^yFvOq9h=5snj<5k8^_Oi49?opLNMruQXg+^Z2Gg>w`XyT;~+evg>8X==BjV+K#Lt>k?pN0_B`^)H>1y=Hfs z(b~*#6s$Ef(vc!vQ=IHgotQ`XL{rleoyE~mBlF~+Y&qEy%>rYv?;TYB7*kYm>8U32 zEk+6WsmA}d}T$9^5VJ#kgN^n_OX`(m!`sHP(tpPtZtQ#Y=xfa(~@e#u4xi}Snw%oHP z%XO$}aEO|`=>nuyW&Se2-rUgk?m%<@maRsUyUYd|F)!If2yOl1yr)jKM8n1;@r_bU zgh{vjQOU?BsO@#|epq|SqLZinnSG>EiNky0Upn{u6iK+o*-o~JCs8xA5V=ek55L;| zyl>grrVn;#k-y9RYq146_~&6m9tF559CBvYF(Ia1cm{r?C9>=8d|$yJE<8fzfl*Rv z*>bdMZ!I}mNIa9Gc3K56epUK&TOs+4g|>wz4Dpauvr}2?~m>mo^vDT-JSfpFXvQw5C4U~g^ zq`6pp?pmA}5?&SC^QJJDk-x2Xb;)ZVeeNqG-^+i>CYMCB5se~<)Zm;u! zlr>kLx=9qDtbW|a>Y8Y8(|4yFMEsdN zjKfK$je-Qh6X)j>$<1R8_BFR%4^9C6upt+VLkwp4)oeF^Zl+KBh05fie(1e#dMlA6 zI>3=0xby5+=NQpUn}RHDy@ViZWpK-1l2OUM7T2p~TOJ6EELzp@$khQ;xmOTPNW450 zd0b4l|Jggyu1b>APY;Wm@rf1}6VuKLdMJXoVLo2$v@oi&G-(-sZ2mr+fm}CGPS+cN z^rVMW9_I$3l>D@B@u%&{AJ0ZoP9nQ9*Jp!7O>yG9@)On~*$>&p3iSCQ$90-%P%d@= z(p8&FnUqE`6^eI34ELJA*C%S0iO)fZVs}nzkm9ps7U>Ji*NqXE$~%S~zfOkOt@g2# z0*Qk}?zg43-5ay4U*u(r*95%EnZdtvJTtm$jtaJhCl~*nU-PNWp~7AfSux2uLJ);` z+8b64FMKpLy4>GcS61UluTP$uczuaZQ%4ms@JUxK^CNj9IFy+09a_ij?jhK}g@2r~ z1%Vth1Sb7Wnm@B2vmQn3g?Z&(EXej&A}kz@lO_# z=@%s)G*T-m!in@q+6ETKguBUrn!;3^`s(TmY#-1ec@!pGhDvXxw?1P< zBg1X}2`H-CAW0cuVL=FLnlYtRgrn&JS#-A2cef<_rbM)3V zsHc3C3_ReQ;$s8=r;+0;Xcr`CMNb8Zu>^<3xaLr) zs+7jx!slMxLhVHy-%-%+K6xa-d1M&Iq36bS3pT?B{F(;B26sxL2L!<(feKz9>&5;qJh z1uJ4xBRUFc5--L4`q5qQY27mlAY<`srrLrF^6cUpxJWsL?${Y^x={0$ozZrE{zl9o z&}T@!3difQ%@lkW}=My>rZqXXd(D|~Ojlh9o3kx*5m!{+roBi7Z^OU}v~ z1RZ>by$kCBaaakEh4^?MP_ZuMr0RbW+qNt}Qk75pQaBC~Cm#;4+ zB_+(;+nc|QbfL2G*;<=+qZP)>>nof63MV!$ZV?y^BP=W|^X=Q<;cVH~-rgWU?VVY_ z75MGjx2WjoV7eGyj}!du?QK@u1t!1CK|Fx*?MdIw;p}Z73qAc;J3FS3kPu~cbyxt1 z(;AaSzcpxg*9;!?gtvh%`~WyRJF{|dkg~9#*`N3kS=042X58((Go&+LEd^%#sHxP{ zLO~$>;^N|ht}ar!63h?(y$(wiwpuNRQ26N&ygA~O?jWpy~SN}Uon=c_Q4wI9Ula!x71yI|BgM&NNN+J>TQZ_oycDe5( zvHc+b?;xHL=kwEYgJqrTfg(WE%#2D^RW(lfDsGU7S}!!9qz>0t=`B_I9lfBS0Dz3g zBJn|84IV8614AVXxz7j36x`ek+rlL!B~fv45;{5r6ciM3hIo&IHNM>+gptJ*(VeZg zw=DX%x3>>I&o3=4**<^V?jpJv6M6aAXWg^@Ubzu*k}9I<_W9A;wJNfv2;e} zGuNXzdO%P`1*2w-;RGS*sT2$bFIJe8W+>`1l9TstADf$-m;d?&QDa$iof-ZhMy_OL zH#${VkextKNa*?1mDGC|qqQw7(9BU=8`Oo??YT1H@LEbS8n9(FiM#brtKDn&9l&A$ z2@47WJUl&RuS=KBlJoMmDxJE!yBD^$;(!1C-N}Qy1Iw^Vb7$EyfAH<~c|x%TDI{oN zK@;qM5)yJCcPHPnUU`uG9@^@%_X!#r8c0H7?~%`CyU^3yTe#RvNJLcU_vnI+gY*6I zYHwt0jQx|dpI^r^;C^m|i;HXM99mG_Y;5>*APN8x6;)D7Dq__CBawWBf*I-Qd!sNY zZ)}NOTwRlMa^mjpJVIYN3FAl4l@t|+z=^`2{!ZpjqOjhM`kr@2hJ-)^dXT?#1i>NW z;-8vYyTJ!-Z<{Fm;GVF0j{F=D)zKjsYX6ZbAa?VZ>E_eb78pRl%cZp4Qf)9)Y1eAA zJ<*2{ZEbA@=j0HBfr-R?GbYPU_c0B=_UjOw?iZ5>g+55k>o!% zO+jhR}Q=LR0NUi_WEGt0*2yI|st zxa#M~h=`;2fU`9|1rRF~2?>dntt|{-Zed}2D4yu!4fDt-C}DIlAA!JM_Xr^`&f9Q} zjgMFPIKbK(L%w)UiT+37Dk_i}(m&ZW5z3X+FY3f(WZ=%t&u=|k?mV2epR>9jsaG0x zlLiL|YrYEL8`oz`fqRq4#cwFj*N?sNn03P@Cl#q^Xb6Q&DySXl}-p&t&29sydjA@9Pt*SoMFsU97X5 zB3)Wtb%iYro?Tmuo0(Cq)NT4?Ihm7Ox!$rFK$M)E-0E>k2%`W~R$eaC-Tc*tQM0nv zCQuPPT`&Z|f~gc4-z^(Ru7c5b-4jXS+TSfOOH8qc@q2ns{Ih=BP8A=2g=G3)_-#P z_I%g=T?Kpkan*j!uDbVpo&T<}B$N!1j_CnGPKktbDX*0u&u{~4`718Iel#QVGl~{b zMN%t25m=D+rlJ@K3-u}T`^5!{#h3dPt)PlkI`HWc#vA?wKumjin9^xw1su~2q&>tJAL{w7u2WnxI*29(GBC7J0_XF@0$2OImif<28Z zS1q-}nQ5VBVtDMT)!hn!ID+w=`Kuaui8J%m{}4s zv>EglO_`rn709{wYk9m1ERkYEghfV_wXymMpgL2w{wZ{DZtfPJ9sbFl%Lu-SED5ha zp>N6Y41$(+K@%&4VEEX*V z3mxJ{b@d53p*~cA5I-Rs6jYMDvM*B5vXb^m>{+DWP1`2>H*85krbS`Yjn0{a3GqfL z%2D0=@remu1Fc9b4GpX3cW`LsEo-O$LQ4y{sbbuC6~6>i@t*CRC1zWkqp29(>8Zop z>-TT*h^pz5*)4F)r;f+hd%r+%a9}2MP!k3QXzzelHuSx^(#&hr1M1GzrBAK5H$@@Z zx*bxRxJ9i8|L}O>)GEL)H?uU~%&orBHSwRS&8u08Ql~fYSXgNx>P(<#5)JJHj&P0E zSptO>14d!s%#~5 zd_~#H;Anhf3V0AHi-)y}3Z}*^bb?V^$o7-Z9m6t9&y+&izG)6DfSH5@g|#k>%p@op zisr-o_mTgasQ<425BNVjA0RyFfA8QMe}JT99^QL6vVmp)|mYS-2Z;~d{{BFvJPesukL=1=R~94AjrLlGZmOKNw)C+5B2|w z|G&(bJp(-D+oH7oz9ZB-2QlicQd!Hu0=L<6gyfo0FY;zM{-s!9lZvbnD90Jse3Z=k z`tE2VM&0DHrjwueJf;#pz=;v44v#k-|G$nXCr@JlT(M=h!zMqx0POt`PdAM@VCE zT!jO8e2$DhOpd~i+6>s-IzNfQNlv{izsGMC7$IXHm_4gV^i+sxgd`{;XYG0}w d{ug{DGTvApj)Nu6|M3e2kd;)Fs1`F0`Clx8!}$OJ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 859e999a5..1f6448bb4 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -17,15 +17,29 @@ for (const key in saved_settings) { } let hrmValue = 0; +/* + * Colors to use + */ +let cBlue = "#0094FF"; +let cOrange = "#FF9900"; +let cPurple = "#FF00DC"; +let cWhite = "#FFFFFF"; + /* * Requirements and globals */ const locale = require('locale'); -var backgroundImage = { - width : 176, height : 151, bpp : 3, - transparent : 2, - buffer : require("heatshrink").decompress(atob("AAdx48cATsAg4daIAX3799ATv2wEFDrUAgNHQDyDghaAeQcJKG86D4gRKGgAA4jxKFuBB5iaDF6BB5ZwyD6QAYCC4CD/Qf6Dzg/gQf8H/iD/n//wCD9gP///wQfpBKQf6D4h5BB/yD8jl/IIIABjiD5n4/DAAWAQe8B//8QYfHj//PAaDzHwICCAAP4gYCBQep6DIIYFBRgKD1j/+gB9BQYYKBn/gQen/+BBFQAUH/iDzGoZBHJoOAQeRBDj5BHj6PB0WKlACDJQIAofYZBFBAZBBAGMHPQZB8QYZAEIIcDIOiDI/hB3QZBBFjlx44CDuBBpg4DCIJEfIIPnz15AQeAQeH8gIDBGoJBCnnz54CDZ1UHPQMHIIUAIIKD3II6MBQYQCCQeI1B+BBC/BKCBASGCQeK5B/xBC4BKEn/gAoKDyj//45BFj/xZYSDzgF/IAP+JQrLCQecAgKDBF4cHQYKJDQecAn6EBAAiJEQeZBB/jICAAMcvwMDQevgQwR0CIIiDzgP/BA1/4CD3nAHGhyD3ABqD0ABiD/Qf4ADjiD/gEnQYuQQf6D7gaDFzxB5gFzQYnz4BB5hyDFATfkEoIdagEBQYoCcgEHDrReBhKDhwEBQbYABjiD/AH4A/AH4AGiFx48cATsAg4daIIWSpMkATuQEbkAgJfbQckJQDyDhZxQA1gRKFpBA4gEQQYtwIPMSQYtAIPKADQfqADAQRA5Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AFkcuPHAQdAIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AGUcuPHAQdwIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4AciSDFoCD/QfcCQYtIIPMAQYoC6gEJQYgC6gEBQf7HCQf4ABiiD9")) +var backgroundImage = { + width : 27, height : 176, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) +} + +var logo = { + width : 56, height : 56, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAUEAwsOAwseAwsfAws/AwtzwAGEuIGF8PgAocH8H4AwcP4H+FAnAv4cDveAufAAwXzwFxEYUB4cAmFwAwMDw8AnE4F4UGgEYjBmCM4McjgGEhhxCBQUMC4IYBAwMOg4GBnAfBgwGCmAtBg8DAwxUBuEwIIIGDJIMDwYGCsAGBwIGBsAGBgIGDMoMB4IGIuB6C4YGBuIGJ8YGBmOAgPgsYJBAwMH+AGCneAh84u4GBjeAPAIGCcgM4hk+YQQ5BhwGE8EHninCgPAgYGCgxzBge4AwSPBgLnCVwQGEU4MH/gGCn+An98AwV///+AwUMuP/+AwChngJwIGCh52CjxaCPIIfBAxICBJIIXEAAb+CACA")) } var iconEarth = { @@ -91,10 +105,10 @@ Graphics.prototype.setFontAntonioSmall = function(scale) { } Graphics.prototype.setFontAntonioLarge = function(scale) { - // Actual height 34 (34 - 1) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAADwAAAAAeAAAAADwAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAD+AAAAH/wAAAP/+AAAf/+AAA//8AAB//4AAD//wAAD//gAAAf/AAAAD+AAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAB////gA/////AP////8D/////wfAAAA+DwAAADweAAAAeDwAAADwf////+D/////wP////8Af///+AAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAOAAAAADwAAAAAeAAAAAHgAAAAB/////wf////+D/////wf////+D/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAPwH/4AP+B//AH/wf/4D/+D4AB/9weAAf4ODwAP8BweAP/AOD///gBwP//wAOA//4ABwB/4AAOAAAAAAAAAAAAAAAAAAAAB8AA/gA/gAH/AP8AA/8D/gAH/wfAHAA+DwA4ADweAHgAeDwB8ADwf7/+H+D/////gP/9//8A//H/+AA/AH/AAAAAAAAAAAAAAAAAABwAAAAD+AAAAD/wAAAH/+AAAH/5wAAH/wOAAP/gBwAP/gAOAD/////wf////+D/////wf////+AAAABwAAAAAOAAAAABwAAAAAAAAAAAAAAAAAAeAD//4D/Af//Af8D//4D/wf//Af+DwPAADweB4AAeDwPAADweB///+DwP///weA///8DwD//+AAAA/8AAAAAAAAAAAAAAAAAAAAAA////AA/////AP////8D/////wfgPAB+DwB4ADweAOAAeDwBwADwf+PAA+D/x///wP+H//8A/wf//AAAA//gAAAAAAAAAAAAADgAAAAAeAAAAADwAAAAAeAAAD+DwAAP/weAA//+DwA///weB///8Dx//8AAf//wAAD//gAAAf/AAAAD/AAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAD/wf/wB//v//AP////8D/////weAPwAeDwA8ADwcAHAAeDwB8ADwf////+D/////wP/9//8A//H//AA/AD/AAAAAAAAAAAAAAAAAAAAAD//gfAA///D/AP//8f8D///j/weAA8A+DwADgDweAAcAeDwAHgDwf////+B/////gP////8Af///+AAP//4AAAAAAAAAAAAAAAAAAAAAAD4AfAAAfAD4AAD4AfAAAfAD4AAD4AfAAAAAAAAAAAAAA=="), 46, atob("Cg4QEBAQEBAQEBAQCQ=="), 39+(scale<<8)+(1<<16)); -} + // Actual height 39 (39 - 1) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); +} /* * Draw watch face */ @@ -135,6 +149,25 @@ function printData(key, y){ } } +function drawHoriztonatlBgLine(color, x1, x2, y, h){ + g.setColor(color); + + for(var i=0; i{ // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets - needed by draw Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} // Clear the screen once, at startup and draw clock g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); // After drawing the watch face, we can draw the widgets -Bangle.drawWidgets(); \ No newline at end of file +// Bangle.drawWidgets(); \ No newline at end of file From a6d87a561c1aa9d05f453490d5845b9094ef5309 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:06:20 +0100 Subject: [PATCH 108/503] Minor improvements --- apps/lcars/lcars.app.js | 154 +++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 79 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1f6448bb4..4bf73057b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -43,48 +43,41 @@ var logo = { } var iconEarth = { - text: "EARTH", width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) } var iconSaturn = { - text: "SATURN", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA")) } var iconMoon = { - text: "MOON", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA==")) } var iconMars = { - text: "MARS", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA==")) } var iconSatellite = { - text: "GPS ON", width : 50, height : 50, bpp : 3, transparent : 2, buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) } var iconAlarm = { - text: "TIMER", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) } var iconCharging = { - text: "CHARGE", width : 50, height : 50, bpp : 3, transparent : 5, buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) @@ -100,15 +93,15 @@ var iconNoBattery = { // Font to use: // Graphics.prototype.setFontAntonioSmall = function(scale) { - // Actual height 18 (17 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAf4Mf/sYAMAAAAAAfgAfAAAAAfgAeAAAAAAiAAj8H/4fyEAv8f/gfiAAgAAAAD54H98eOPHn8Hz8AhwAAAP8Af+AYGAYCAf+AP8MAB8AHwA+AD4AfAAcf4A/8AwMAwMA/8Af4AAAAAwGD8f/8f8MY/cfz4PD8AHMAAAfAAeAAAAAAAAP/+f//YADAAAQABYADf//P/+AAAAAANAAPAAfwAfgAPAANAAAAAAEAAEAA/AA/AAEAAEAAAAAAZAAfAAYAAAAIAAIAAIAAIAAAAAAAAAMAAMAAAAAAAAEAB8Af4H+AfwAcAAAAAP/4f/8YAMf/8f/8H/wAAAAAAEAAMAAf/8f/8f/8AAAAAAAAAHgcfh8cH8YPMf8MPwEAAAAAAOB4eB8YYMY4Mf/8Pn4AAAAAgAHwA/wPwwf/8f/8AAwAAgAAAf54f58ZwMZwMY/8Qf4AAAAAAP/4f/8YYMYYMff8HP4AAAQAAYAAYD8Y/8f/AfgAcAAAAAAAAPv4f/8YYMY8Mf/8Pn4AAAAAAP94f98YGMcMMf/8H/wAAAAAABgwBgwAAAAAABgABg/Bg8AAAAEAAOAAbAA7gAxgBwwASAAbAAbAAbAAbAASAAAAAxwA5gAbAAPAAOAAAAPAAfHcYPcf8Af4AHgAAAAAAAB/gH/wOA4Y/MZ/sbAsbBkb/MZ/sOBsH/AAAAAAMAP8f/4fwwf4wH/8AH8AAMAAAf/8f/8YYMYYMf/8P/4ADgAAAP/4f/8YAMYAMfj8Pj4AAAAAAf/8f/8YAMYAMf/8P/4B/AAAAf/8f/8YMMYMMYIMAAAAAAf/8f/8YYAYYAYYAAAAAAAP/4f/8YAMYIMfP8Pv8AAAAAAf/8f/8AMAAMAf/8f/8f/8AAAAAAf/8f/8AAAAAAAD4AB8AAMf/8f/4f/gAAAAAAf/8f/8A+AD/gfj4eA8QAEAAAf/8f/8AAMAAMAAMAAAf/8f/8f8AB/wAB8AP8P/Af/8f/8AAAAAAf/8f/8HwAA+AAPwf/8f/8AAAAAAP/4f/8YAMYAMf/8P/4AAAAAAf/8f/8YGAYGAf8AP8ABAAAAAf/w//4wAYwAc//+f/yAAAAAAf/8f/8YMAYMAf/8f/8DA8CAAPj4fz8Y4MeeMfP8HD4YAAYAAf/8f/8YAAQAAAAAf/4f/8AAMAAMf/8f/4AAAYAAf4AP/4AP8AP8f/4fwAQAAYAAf8AP/8AD8D/8f8Af8AD/8AD8f/8f8AAAAQAEeB8P/4B/AP/4fA8QAEYAAfAAP4AB/8H/8fwAcAAAAMYD8Y/8f/MfwMcAMAAAf/+f//YADYADAAAAAAfAAf8AB/wAH8AAMQACYADf//f//AAAAA"), 32, atob("BAUHCAcTCAQFBQgGBAYFBggICAgICAgICAgEBQYGBggNCAgICAcHCAkECAgGCwkICAgIBwYICAwHBwYGBgY="), 18+(scale<<8)+(1<<16)); + // Actual height 20 (19 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); } Graphics.prototype.setFontAntonioLarge = function(scale) { // Actual height 39 (39 - 1) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); - } + /* * Draw watch face */ @@ -128,21 +121,21 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); g.drawString("BAT:", 30, y); - g.drawString(bat+ "%", 68, y); + g.drawString(bat+ "%", 70, y); } else if(key == "Steps"){ var steps = getSteps(); g.drawString("STEP:", 30, y); - g.drawString(steps, 68, y); + g.drawString(steps, 70, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); g.drawString("TEMP:", 30, y); - g.drawString(temperature + "C", 69, y); + g.drawString(temperature + "C", 70, y); } else if(key == "HRM"){ g.drawString("HRM:", 30, y); - g.drawString(hrmValue, 69, y); + g.drawString(hrmValue, 70, y); } else { g.drawString("NOT FOUND", 30, y); @@ -158,15 +151,41 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ } -Bangle.on('lock', function(isLocked) { +function drawLogo(){ if(Bangle.isLocked()){ - g.setColor(cPurple); + g.setColor(cWhite); } else { g.setColor(cBlue); } g.drawImage(logo, 120, 10); -}); +} +function drawState(){ + g.setColor(cOrange); + var bat = E.getBattery(); + var timeInMinutes = getCurrentTimeInMinutes(); + + var iconImg = + isAlarmEnabled() ? iconAlarm : + Bangle.isCharging() ? iconCharging : + bat < 30 ? iconNoBattery : + Bangle.isGPSOn() ? iconSatellite : + timeInMinutes % 4 == 0 ? iconSaturn : + timeInMinutes % 4 == 1 ? iconMars : + timeInMinutes % 4 == 2 ? iconMoon : + iconEarth; + g.drawImage(iconImg, 120, 120); + + // Alarm within symbol + g.setFontAlign(-1, -1, 0); + g.setFontAntonioSmall(); + g.drawString("STATUS", 123, 97); + if(isAlarmEnabled() > 0){ + g.setFontAlign(0, 0, 0); + g.setColor(cWhite); + g.drawString(getAlarmMinutes(), 120+25, 120+25+1); + } +} function draw(){ @@ -181,28 +200,22 @@ function draw(){ g.drawImage(backgroundImage, 0, 0); drawHoriztonatlBgLine(cBlue, 35, 120, 0, 4); drawHoriztonatlBgLine(cBlue, 130, 176, 0, 4); - drawHoriztonatlBgLine(cPurple, 35, 120, 81, 3); - drawHoriztonatlBgLine(cPurple, 130, 176, 81, 3); - drawHoriztonatlBgLine(cOrange, 35, 120, 87, 3); - drawHoriztonatlBgLine(cOrange, 130, 176, 87, 3); - drawHoriztonatlBgLine(cOrange, 35, 176, 173, 3); + drawHoriztonatlBgLine(cPurple, 35, 110, 81, 3); + drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); + drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); + drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); + drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); // Draw logo - if(Bangle.isLocked()){ - g.setColor(cPurple); - } else { - g.setColor(cBlue); - } - g.drawImage(logo, 120, 10); - + drawLogo(); // Write time - g.setColor(cBlue); + g.setColor(cWhite); g.setFontAlign(-1,-1, 0); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 12); + g.drawString(timeStr, 28, 12); // Write date g.setColor(cPurple); @@ -210,43 +223,22 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 30, 60); - g.setColor("#FFFFFF"); + g.drawString(dayStr, 35, 60); // Draw data - g.setColor(cOrange); - printData(settings.dataRow1, 98); - printData(settings.dataRow2, 121); - printData(settings.dataRow3, 144); + g.setColor(cWhite); + printData(settings.dataRow1, 97); + printData(settings.dataRow2, 122); + printData(settings.dataRow3, 147); - // Draw symbol - g.setColor(cOrange); - var bat = E.getBattery(); - var timeInMinutes = getCurrentTimeInMinutes(); - - var iconImg = - isAlarmEnabled() ? iconAlarm : - Bangle.isCharging() ? iconCharging : - bat < 30 ? iconNoBattery : - Bangle.isGPSOn() ? iconSatellite : - timeInMinutes % 4 == 0 ? iconSaturn : - timeInMinutes % 4 == 1 ? iconMars : - timeInMinutes % 4 == 2 ? iconMoon : - iconEarth; - g.drawImage(iconImg, 115, 115); - - // Alarm within symbol - g.setFontAlign(0,0,0); - g.setFontAntonioSmall(); - g.drawString(iconImg.text, 115+25, 105); - if(isAlarmEnabled() > 0){ - g.drawString(getAlarmMinutes(), 115+25, 115+25); - } + // Draw state + drawState(); // Queue draw in one minute queueDraw(); } + /* * Step counter via widget */ @@ -265,12 +257,6 @@ function stepsWidget() { return undefined; } -/* - * HRM Listener - */ -Bangle.on('HRM', function (hrm) { - hrmValue = hrm.bpm; -}); /* * Handle alarm @@ -314,8 +300,29 @@ function handleAlarm(){ /* - * Swipe to set an alarm + * Listeners */ +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.on('lock', function(isLocked) { + drawLogo(); +}); + +Bangle.on('charging',function(charging) { + drawState(); +}); + +Bangle.on('HRM', function (hrm) { + hrmValue = hrm.bpm; +}); + Bangle.on('swipe',function(dir) { // Increase alarm if(dir == -1){ @@ -342,22 +349,11 @@ Bangle.on('swipe',function(dir) { Storage.writeJSON(SETTINGS_FILE, settings); }); - /* - * Stop updates when LCD is off, restart when on + * Lets start widgets, listen for btn etc. */ -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - // Show launcher when middle button pressed Bangle.setUI("clock"); - Bangle.loadWidgets(); /* * we are not drawing the widgets as we are taking over the whole screen From a2afacfca0fd070b4c06f47458e1414fc094e1ba Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:22:36 +0100 Subject: [PATCH 109/503] Minor performance improvements (no logo) --- apps/lcars/lcars.app.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 4bf73057b..025220798 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -36,12 +36,6 @@ var backgroundImage = { buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) } -var logo = { - width : 56, height : 56, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAUEAwsOAwseAwsfAws/AwtzwAGEuIGF8PgAocH8H4AwcP4H+FAnAv4cDveAufAAwXzwFxEYUB4cAmFwAwMDw8AnE4F4UGgEYjBmCM4McjgGEhhxCBQUMC4IYBAwMOg4GBnAfBgwGCmAtBg8DAwxUBuEwIIIGDJIMDwYGCsAGBwIGBsAGBgIGDMoMB4IGIuB6C4YGBuIGJ8YGBmOAgPgsYJBAwMH+AGCneAh84u4GBjeAPAIGCcgM4hk+YQQ5BhwGE8EHninCgPAgYGCgxzBge4AwSPBgLnCVwQGEU4MH/gGCn+An98AwV///+AwUMuP/+AwChngJwIGCh52CjxaCPIIfBAxICBJIIXEAAb+CACA")) -} - var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -151,17 +145,18 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ } -function drawLogo(){ +function drawLock(){ + g.setFontAntonioSmall(); + g.setColor(cWhite); if(Bangle.isLocked()){ - g.setColor(cWhite); - } else { - g.setColor(cBlue); + g.setColor(cOrange); } - g.drawImage(logo, 120, 10); + g.drawString("LCARS", 130, 15); + g.drawString("BJS-2", 130, 35); } function drawState(){ - g.setColor(cOrange); + g.setColor(cWhite); var bat = E.getBattery(); var timeInMinutes = getCurrentTimeInMinutes(); @@ -207,7 +202,7 @@ function draw(){ drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); // Draw logo - drawLogo(); + drawLock(); // Write time g.setColor(cWhite); @@ -218,7 +213,7 @@ function draw(){ g.drawString(timeStr, 28, 12); // Write date - g.setColor(cPurple); + g.setColor(cWhite); g.setFontAntonioSmall(); var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); @@ -312,7 +307,7 @@ Bangle.on('lcdPower',on=>{ }); Bangle.on('lock', function(isLocked) { - drawLogo(); + drawLock(); }); Bangle.on('charging',function(charging) { From 3dd4351567f14f5ed787b77ed5795c9d5965dde9 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:54:13 +0100 Subject: [PATCH 110/503] Minor changes --- apps/lcars/lcars.app.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 025220798..84d12953e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -114,25 +114,25 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); - g.drawString("BAT:", 30, y); + g.drawString("BAT:", 28, y); g.drawString(bat+ "%", 70, y); } else if(key == "Steps"){ var steps = getSteps(); - g.drawString("STEP:", 30, y); + g.drawString("STEP:", 28, y); g.drawString(steps, 70, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); - g.drawString("TEMP:", 30, y); + g.drawString("TMP:", 28, y); g.drawString(temperature + "C", 70, y); } else if(key == "HRM"){ - g.drawString("HRM:", 30, y); + g.drawString("HRM:", 28, y); g.drawString(hrmValue, 70, y); } else { - g.drawString("NOT FOUND", 30, y); + g.drawString("NOT FOUND", 28, y); } } @@ -147,12 +147,13 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ g.setFontAntonioSmall(); - g.setColor(cWhite); - if(Bangle.isLocked()){ - g.setColor(cOrange); - } + g.setColor(cOrange); + g.clearRect(120, 10, g.getWidth(), 80); g.drawString("LCARS", 130, 15); - g.drawString("BJS-2", 130, 35); + g.drawString("B-JS2", 130, 35); + if(Bangle.isLocked()){ + g.drawString("LOCK", 130, 55); + } } function drawState(){ @@ -206,11 +207,10 @@ function draw(){ // Write time g.setColor(cWhite); - g.setFontAlign(-1,-1, 0); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 28, 12); + g.drawString(timeStr, 25, 12); // Write date g.setColor(cWhite); @@ -218,7 +218,7 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 35, 60); + g.drawString(dayStr, 28, 60); // Draw data g.setColor(cWhite); From 1b92b2bbc4f7bf9cdb2a51e9f99e47d40626ab37 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 13:01:58 +0100 Subject: [PATCH 111/503] New version --- apps.json | 2 +- apps/lcars/ChangeLog | 3 ++- apps/lcars/README.md | 7 ++++--- apps/lcars/lcars.app.js | 8 ++++---- apps/lcars/lcars.png | Bin 1823 -> 1840 bytes apps/lcars/screenshot.png | Bin 2921 -> 5139 bytes 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..028127859 100644 --- a/apps.json +++ b/apps.json @@ -4487,7 +4487,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.07", + "version":"0.08", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index c5f8187b7..f30ae4707 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -4,4 +4,5 @@ 0.04: Inluded LCARS Logo. 0.05: Additional icons for (1) charging and (2) bat < 30%. 0.06: Fix - Alarm disabled, if clock was closed. -0.07: Added settings to adjust data that is shown for each row. \ No newline at end of file +0.07: Added settings to adjust data that is shown for each row. +0.08: Smaller background for faster rendering. Full screen mode. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 15009e838..31cb81341 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,14 +1,15 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary to install +Note: To display the steps, its necessary (but still optional) to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). ## Features * LCARS Style watch face - * Shows satate (charging, out of battery etc.) - * SHows data that can be configured (steps, HRM, temperature etc.) + * Shows different states (charging, out of battery, GPS on etc.) + * Shows customizable data (steps, HRM, battery, temperature etc.) * Swipe left/right to activate an alarm + * Full-screen mode ## Icons

diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 84d12953e..8ac1dfe14 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -170,7 +170,7 @@ function drawState(){ timeInMinutes % 4 == 1 ? iconMars : timeInMinutes % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 120, 120); + g.drawImage(iconImg, 120, 118); // Alarm within symbol g.setFontAlign(-1, -1, 0); @@ -179,7 +179,7 @@ function drawState(){ if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 120+25, 120+25+1); + g.drawString(getAlarmMinutes(), 120+25, 118+25+1); } } @@ -200,7 +200,7 @@ function draw(){ drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); - drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); + drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo drawLock(); @@ -218,7 +218,7 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 60); + g.drawString(dayStr, 28, 58); // Draw data g.setColor(cWhite); diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png index 167352ef4bd6db8c6de6bc845396944af7bcc040..9264f93f21be2ea0c39faabab767f88da6d4ad43 100644 GIT binary patch delta 1809 zcmV+s2k!Wv4zLc8G=JwwL_t(&fz6p~P!v}d$A8l^vk(+Z1hmT4RktMSSVk#jVI}c{ zNUHW>_#jn2Qc)ZbU0mG3#qiLq#R_PG5s0QrkO-~`WJ@#;E%QO*qeKiME4mViPzx)T zf@FP-ykwZ!4`y1L>6vMUp4$Cab$@{J%RXZ3ADGj%l0)lH?uY6V^!m+UP78=0hV~4D6+kL`7&jt7gdR?S_w^k z{})bcUk=l!Pp7r5YSeL6nSs51AC5>oKwDcIdv+fib!=5;U~=xyxp(j0h{sKuG>MMR zOQVYI(F}apzmKRdmN6!6Ec{X9k$8a4&Q3xX#FCL-;(yV27{LsDI{q_COG`O-?wrF* zN-Y=+2IAx6+4|=g#bewiaK!&_?Ao=9mX?-L3sj1LfB=$`lE}_k@7C630*lKdsi~=P zI#>_{ugwO)lqpjvC@5e>>;mT+gpZ7j#8w1NTYn%UFq5XHCZ0WerjmSE zv}h51AN7-wk-?ZTVQq~KdAZG2gyf2jj&`se z&E@a!FY&)(#R>I?c>VJ?uvjc2xnaWw@+rF7!N2>^tlYkhEVFsq)fb{XKW z9a%2>M+;Z8yL|a_@&5Mh+W-iyt*s)taDU-Kw*f9(xZt@u1?cYXcG@>@-aH3R=;`SZ z8~*DIY7>)#G%-(MXa9S)peFc`!} zU0t0^$8sygNa5$_$IzH^sIRY=3b3r6P?=j_xH>4L*EnO;o$%Xxx3>fFNr;S_BeHX^XAQw>IPu$ z+_^kIFhJqlk3_C$VKEC9IR8u@{vdz%)o&Rb92DDY*Se3|>*5lUv*L2^oZig*ouIZrx%-U4H^8DJhcE zzO=M7iJitqi`aXltQw=yDA^|J^?EjM-i%(aCoeD0t)OYsrqP!9Z?|^C;gkF`oKzkeUI+02tCPq138=yW=CIvs(5flQn@k;#)MJN-cp#V=<> z)7sjK4cDuh&SmdU7=Qj5yK?192k`(YTi;URP7!i)a#*v*@i=EV6qV4UM~}q&(9lpm z|GV>}KDDrV&98`xisE=>gG)O_Ghkopf`Wqh$F)o@f!^L;GBY#X8~zWVXchW@#(x2Ym$Z{xh~>!u015yANkvXXu0mjfanhH5 delta 1791 zcmVXOMeaKpD>tb0K0#?jIy#a zTr1jOuownQAmwQdN=s+nd__eCp7k9wNF0MCP~~iaq@*MYmzVrbaXKGwYIk6Y1a`><8huqR#ukA{?yb|PUCT!z(;99OiycG zm6b{*e!a1tvwxVJB~Yk(j{5p~R<;ixKEzvg*__1XEP-?9&go=-^5jWQ;&PHe-e{-V zA6Fe@G8q(;XBQlslLRhYxS-cKkw~=Q*gSm(T~TzQq@)Co9zDXy$cWy-dwYA4ohN{= zuP@%VKcklqBesXRGAkt{5()0yxkKBexB{Qg$KJhrVShZ$ey`A)!0#60NK8ybTU*D5|wSx(QFxb}s04FCWh(scE%C@W5z(igh@5b^Y zUonbbxpF0hLLnYJcmQ*AbI!yH1Ok|vno_vV&Q1gb1fZ@lMC~|Q0`YZs5D^i9v9U1< zzhT1$On+YkniKy)v|9|Co0~B_Jj{`NVBNZP7|R_;baXTg*umRL8+iBbT@GZ=K`xggb0~vs7k>ucfLJW1Ow+o$Iuzg9LK#OU@aEPY z85xP|UlcM1%N)wUqOrm^0Dyar^ddMm{$;7skfMWc$>qx#g7rfb#NklJM~GK*p9#je)qH zK7X@NDwRkdOr!DJ#{F^V&>^xdm&?)fJQ@H%oT#N{9UmXBHPEY9uNEj(J#OB-$;hXy z7g45CQBe^9fSAA5J2*HX$asgw00~Xp9D~(C)7SO$^CO>IT3P@A#FHmaNOJAkwORw* zyLV52bu6IiaJYK)Y8pq3j*gOz#fukf4S(?X@nijz>42k^k&L{ptu2istgWrdMsIJg zR_BJC|Fckc{_5%Jp>YJC&nFvIRaF`tGp!K1!ra^(^J6lhy1JT?zkmNe`OM?ZTxEz& zn>LZ8LZLvC><8MwSxBW)U9?hQVq${BhYw>UdlZe||Be0o_p7xXA0KDr=kF6hNOZD?rFRW|@&)v8sPxH5?!H(n&U^ba$zW)1ypGmAH0HaZwRn4bdnkSx!vWiaT5Y4= ziH4`ACyj4vYQnxhLJ<)WL8oi?v;pXOs zR-t~E|Ks&>lv5@}q>&NA!^7dSj9!1DT`9Ys20)lF0uK)lodmeLy6P?d#9znN-tcT} zY><{IWLHiei_+we8*y2%DS9uF#&O7GH(r>7@&1y*XbVO1Ml^R7fM0ZOHk zwRn4bdxVCDLUeu_mX?+PfcExwt>g5njRJtNu`xDp-i*4sIt&a9=zl!k)YKFLfdJm# z-dOIGLg|Z&ib7mm9Qyh+%$?U@m4LN<4vkAlNPvZD47P2Z<5WZny1Tm}m&@_;e4IXg8hAT*(#tutm~5QAc=3XK76=4*-;>*-78ClO?SPMu51f|Y&}hf% z3(PEaGe27Ju0I#9jwSp)DMP1Bvkj{+Ff=p-f*=qV)z5(}Zow)6g+hUt82X(5KY-N~ h`q-yLyU~Aye*r)QY$kz4$b$d?002ovPDHLkV1n#zTzmik diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index d74635f64c385138e0b08b685db984ef3387f0a9..768c4a172e33f1cc478bc14a13400688af7bbbb2 100644 GIT binary patch literal 5139 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 BpU(gQ literal 2921 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 Date: Sun, 19 Dec 2021 13:10:49 +0100 Subject: [PATCH 112/503] Create app.js --- apps/andark/app.js | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 apps/andark/app.js diff --git a/apps/andark/app.js b/apps/andark/app.js new file mode 100644 index 000000000..92d2bb7e3 --- /dev/null +++ b/apps/andark/app.js @@ -0,0 +1,110 @@ +const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; +let zahlpos=[]; + +function zeiger(len,dia,tim){ + const x =c.x+ Math.cos(tim)*len/2, + y =c.y + Math.sin(tim)*len/2, + d={"d":3,"x":dia/2*Math.cos(tim+Math.PI/2),"y":dia/2*Math.sin(tim+Math.PI/2)}, + pol=[c.x-d.x,c.y-d.y,c.x+d.x,c.y+d.y,x+d.x,y+d.y,x-d.x,y-d.y]; + return pol; + +} + +function draw(){ + const d=new Date(); + let m=d.getMinutes(), h=d.getHours(), s=d.getSeconds(); + //draw black rectangle in the middle to clear screen from scale and hands + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(1,1,1); + + if(h>12){ + h=h-12; + } + //calculates the position of the minute, second and hour hand + h=2*Math.PI/12*(h+m/60)-Math.PI/2; + //more accurate + //m=2*Math.PI/60*(m+s/60)-Math.PI/2; + m=2*Math.PI/60*(m)-Math.PI/2; + + s=2*Math.PI/60*s-Math.PI/2; + g.setFontAlign(0,0); + g.setFont("Vector",10); + let dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, c.x, c.y+20, true); + // g.drawString(d.getDate(),1.4*c.x,c.y,true); + g.drawString(Math.round(E.getBattery()/5)*5+"%",c.x,c.y+40,true); + drawlet(); + g.setColor(1,0,0); + const hz = zeiger(100,5,h); + g.fillPoly(hz,true); + g.setColor(1,1,1); + const minz = zeiger(150,5,m); + g.fillPoly(minz,true); + const sekz = zeiger(150,2,s); + g.fillPoly(sekz,true); + g.fillCircle(c.x,c.y,4); + + +} +//draws the scale once the app is startet +function drawScale(){ + for(let i=-14;i<47;i++){ + const win=i*2*Math.PI/60; + let d=2; + if(i%5==0){d=5;} + g.fillPoly(zeiger(300,d,win),true); + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(1,1,1); + } +} + +//draws the numbers on the screen + +function drawlet(){ + g.setFont("Vector",20); + for(let i = 0;i<12;i++){ + g.drawString(zahlpos[i][0],zahlpos[i][1],zahlpos[i][2]); + } +} +//calcultes the Position of the numbers when app starts and saves them in an array +function setlet(){ + let sk=1; + for(let i=-10;i<50;i+=5){ + let win=i*2*Math.PI/60; + let xsk =c.x+2+Math.cos(win)*(c.x-10), + ysk =c.y+2+Math.sin(win)*(c.x-10); + if(sk==3){xsk-=10;} + if(sk==6){ysk-=10;} + if(sk==9){xsk+=10;} + if(sk==12){ysk+=10;} + if(sk==10){xsk+=3;} + zahlpos.push([sk,xsk,ysk]); + sk+=1; + } +} +setlet(); +// Clear the screen once, at startup +g.setBgColor(0,0,0); +g.clear(); +drawScale(); +draw(); +let secondInteraval= setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on + +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + }else{ + } +}); + +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +//Bangle.loadWidgets(); +//Bangle.drawWidgets(); From 27f68461c97a4b44540fd6835aaabe42b404f609 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:14:04 +0100 Subject: [PATCH 113/503] Add files via upload --- apps/andark/app_icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/andark/app_icon.js diff --git a/apps/andark/app_icon.js b/apps/andark/app_icon.js new file mode 100644 index 000000000..b213fe5c8 --- /dev/null +++ b/apps/andark/app_icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIEBoUAiAKCgUCBQUEColEAYUQhAmKCwgeCAAcCgEDjwEBkEAg8TBocNgYFDh8GAYMDxkPjEA8EAwkHJgIcBAoPfAoYWCBYYFIgfvAoX4FYRJEAp9gAomYNAOAArPwAogAC4AFiRoIFJLgIFJuADCg//Q4U//4FDj4FEAAV4Aoi0CSxBsCA==")) \ No newline at end of file From ae1a0008c948dca1443cea5a91b8cf477f57fb68 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:15:14 +0100 Subject: [PATCH 114/503] Update app.js --- apps/andark/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/andark/app.js b/apps/andark/app.js index 92d2bb7e3..cf248d462 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -35,10 +35,10 @@ function draw(){ // g.drawString(d.getDate(),1.4*c.x,c.y,true); g.drawString(Math.round(E.getBattery()/5)*5+"%",c.x,c.y+40,true); drawlet(); - g.setColor(1,0,0); + //g.setColor(1,0,0); const hz = zeiger(100,5,h); g.fillPoly(hz,true); - g.setColor(1,1,1); + // g.setColor(1,1,1); const minz = zeiger(150,5,m); g.fillPoly(minz,true); const sekz = zeiger(150,2,s); From 47ea22a5fdc6985f7f79b86bc203b1a070092132 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:19:19 +0100 Subject: [PATCH 115/503] Create README.md --- apps/andark/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/andark/README.md diff --git a/apps/andark/README.md b/apps/andark/README.md new file mode 100644 index 000000000..00c80ea54 --- /dev/null +++ b/apps/andark/README.md @@ -0,0 +1,11 @@ +# Analog Clock + +## Features + +* second hand +* date +* battery percantage + +no widgets + +![image](image url "/andark_screen.png") From 0de8d137b3dda1a4cd9320714399e62b2da0746e Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:19:30 +0100 Subject: [PATCH 116/503] Add files via upload --- apps/andark/andark_screen.png | Bin 0 -> 3660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/andark/andark_screen.png diff --git a/apps/andark/andark_screen.png b/apps/andark/andark_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac54c1cd160a6f314f9d7b2bae433fdd36672b0 GIT binary patch literal 3660 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 e%?Zc0r|v)X{}o=3H&nR*0000 Date: Sun, 19 Dec 2021 13:22:17 +0100 Subject: [PATCH 117/503] Update README.md --- apps/andark/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/andark/README.md b/apps/andark/README.md index 00c80ea54..ff46c9bde 100644 --- a/apps/andark/README.md +++ b/apps/andark/README.md @@ -8,4 +8,4 @@ no widgets -![image](image url "/andark_screen.png") +![logo](https://github.com/HeiLaut/BangleApps/edit/master/apps/andark/andark_screen.png) From e29c3efb004eace481c82acbb80bb8aad19452fc Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:22:56 +0100 Subject: [PATCH 118/503] Update README.md --- apps/andark/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/andark/README.md b/apps/andark/README.md index ff46c9bde..3770c1017 100644 --- a/apps/andark/README.md +++ b/apps/andark/README.md @@ -5,7 +5,6 @@ * second hand * date * battery percantage +* no widgets -no widgets - -![logo](https://github.com/HeiLaut/BangleApps/edit/master/apps/andark/andark_screen.png) +![logo](andark_screen.png) From 80c420bd7682b814be94fee11b45cd7d2d98b674 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:25:31 +0100 Subject: [PATCH 119/503] Create add_to_apps.json --- apps/andark/add_to_apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/andark/add_to_apps.json diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json new file mode 100644 index 000000000..71b1fb747 --- /dev/null +++ b/apps/andark/add_to_apps.json @@ -0,0 +1,13 @@ +{ "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] +} From e990575bc1171c9c7d287f883711f68173614c80 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:26:18 +0100 Subject: [PATCH 120/503] Update apps.json --- apps.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..473f80142 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,18 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - } + }, + { "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] +} ] From 1f525aed368e7a44e420eafd0c0caeaf6a2844f7 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:32:29 +0100 Subject: [PATCH 121/503] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 473f80142..03991e87e 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,8 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "tags": "", + "type": "clock", + "tags": "cloc", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From d063566213d39b25d17eb3cfe09716b6ef88514d Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:33:40 +0100 Subject: [PATCH 122/503] Add files via upload --- apps/andark/andark_icon.png | Bin 0 -> 4002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/andark/andark_icon.png diff --git a/apps/andark/andark_icon.png b/apps/andark/andark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cded02071d3610f442f0ce327f01943a2c915753 GIT binary patch literal 4002 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 Date: Sun, 19 Dec 2021 13:34:32 +0100 Subject: [PATCH 123/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 03991e87e..a80bb9791 100644 --- a/apps.json +++ b/apps.json @@ -5068,6 +5068,7 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", + "icon" "andark_icon.png", "type": "clock", "tags": "cloc", "supports" : ["BANGLEJS2"], From dd423ac511a858ce414bfb300f0b0c6850478ad0 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:36:18 +0100 Subject: [PATCH 124/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a80bb9791..d0cf99977 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "icon" "andark_icon.png", + "icon": "andark_icon.png", "type": "clock", "tags": "cloc", "supports" : ["BANGLEJS2"], From 605674b0357859a441a62b69c0b8c8fca0f23a61 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:36:45 +0100 Subject: [PATCH 125/503] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index d0cf99977..75f54f912 100644 --- a/apps.json +++ b/apps.json @@ -5068,9 +5068,8 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "icon": "andark_icon.png", "type": "clock", - "tags": "cloc", + "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From 93f4064e4c16f6c82a384dddb7999c099057470b Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:38:19 +0100 Subject: [PATCH 126/503] Update apps.json --- apps.json | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/apps.json b/apps.json index 75f54f912..e5e9f8f02 100644 --- a/apps.json +++ b/apps.json @@ -5062,19 +5062,5 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - }, - { "id": "andark", - "name": "Analog Dark", - "shortName":"AnDark", - "version":"0.01", - "description": "analog clock face without disturbing widgets", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"anrark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} - ] -} + } ] From 44f12b7e1d0a0bc3ee200a7da243d51d8cc2b4ac Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:42:50 +0100 Subject: [PATCH 128/503] Update add_to_apps.json --- apps/andark/add_to_apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json index 71b1fb747..57613f9d2 100644 --- a/apps/andark/add_to_apps.json +++ b/apps/andark/add_to_apps.json @@ -3,7 +3,9 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "tags": "", + "icon": "andark_icon.png", + "type": "clock", + "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From 67f362d2a56a91cfc0d7e50bf40a6c90da2dfd54 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:43:30 +0100 Subject: [PATCH 129/503] Update apps.json --- apps.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..842e559b5 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,20 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "icon": "andark_icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] } ] From 028e9d0f6915acd78f9b388936f96373880f9080 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:45:54 +0100 Subject: [PATCH 130/503] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 842e559b5..7374b63e9 100644 --- a/apps.json +++ b/apps.json @@ -5069,9 +5069,8 @@ "version":"0.01", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", - "type": "clock", "tags": "clock", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"anrark.app.js","url":"app.js"}, From f24dbc5c02365977566ed93f01254831b4b32bd5 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:52:31 +0100 Subject: [PATCH 131/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7374b63e9..40b4ce0f9 100644 --- a/apps.json +++ b/apps.json @@ -5073,7 +5073,7 @@ "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.app.js","url":"app.js"}, {"name":"andark.img","url":"app_icon.js ","evaluate":true} ] } From 3547fee48b88433c708336467dfe7fed0f8a26b3 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:57:34 +0100 Subject: [PATCH 132/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 40b4ce0f9..1ae374fd7 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.01", + "version":"0.02", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "tags": "clock", From 4e347b591237587566539c106dae286d11d055a5 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:58:42 +0100 Subject: [PATCH 133/503] Create ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/andark/ChangeLog diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog new file mode 100644 index 000000000..872a4b407 --- /dev/null +++ b/apps/andark/ChangeLog @@ -0,0 +1 @@ +0.02: Rename app From 6f07a83bdd5caa25b2e71a11d67838cc2d764bd3 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:01:28 +0100 Subject: [PATCH 134/503] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 872a4b407..5aecb0ff9 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1 +1,2 @@ +0.01: Release 0.02: Rename app From 58f663aed9b8e221586bbc46e9f6c35154c2b95a Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:03:14 +0100 Subject: [PATCH 135/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 1ae374fd7..28b3c2b1f 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "version":"0.02", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", + "type": "clock", "tags": "clock", "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", From 485e4a9aae2b0c6ab443f1d49140881add04fd71 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:06:20 +0100 Subject: [PATCH 136/503] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 5aecb0ff9..91bbd190f 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1,2 +1,3 @@ 0.01: Release 0.02: Rename app +0.03: Add type "clock" From 3111e30040b552da0f2717eaa79a3f3ffe8ad2bc Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:06:41 +0100 Subject: [PATCH 137/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 28b3c2b1f..5675c30d5 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.02", + "version":"0.03", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "type": "clock", From 52de03cad83f6ecf51c30b1c23fcce082f212361 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sun, 19 Dec 2021 17:09:43 +0000 Subject: [PATCH 139/503] Reorganise again. --- apps.json | 3 +- apps/coretemp/boot.js | 23 +++++--- apps/coretemp/coretemp.js | 2 +- apps/coretemp/settings.js | 9 ++- apps/coretemp/widget.js | 113 +++++--------------------------------- 5 files changed, 40 insertions(+), 110 deletions(-) diff --git a/apps.json b/apps.json index ad54b1d43..26c17a503 100644 --- a/apps.json +++ b/apps.json @@ -4971,7 +4971,8 @@ {"name":"coretemp.wid.js","url":"widget.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.settings.js","url":"settings.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, + {"name":"coretemp.boot.js","url":"boot.js"} ], "data": [{"name":"coretemp.json","url":"app-settings.json"}] }, diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 61eefd6c8..3ae9b41ac 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,5 +1,8 @@ +//If enabled run in the background continuously. + (function() { +var settings = {}; var device; var gatt; var service; @@ -51,11 +54,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - E.showMessage("Scanning for CoreTemp sensor..."); + console.log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - E.showMessage("Found device"); + console.log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -76,10 +79,10 @@ function connection_setup() { .then(function() { console.log("Done!"); // getSensorBatteryLevel(gatt); - g.reset().clearRect(Bangle.appRect).flip(); +// g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); + console.log(e.toString(), "ERROR"); console.log(e); }); } @@ -88,13 +91,17 @@ function connection_end() { if (gatt != undefined) gatt.disconnect(); } -connection_setup(); +settings = require("Storage").readJSON("coretemp.json",1)||{}; +console.log("Settings:"); +console.log(settings); + +if (settings.enabled) { + connection_setup(); + NRF.on('disconnect', connection_setup); +} E.on('kill', () => { connection_end(); }); -// move into setup -NRF.on('disconnect', connection_setup); // restart if disconnected - // Bangle.loadWidgets(); // Bangle.drawWidgets(); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 086614ed9..1ad380855 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,4 +1,4 @@ -// Simply listen for core events and show +// Simply listen for core events and show data Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 2c541f72c..5cd98ae09 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -22,7 +22,14 @@ storage.write(SETTINGS_FILE, s); } } - + + function updateSettings() { + require("Storage").write("coretemp.json", settings); + if (WIDGETS["sensors"]) + WIDGETS["sensors"].reload(); + return; +} + const menu = { '' : {'title' : 'CoreTemp sensor'}, '< Back' : back, diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 3eabf85d6..4fe76ea38 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,124 +1,38 @@ -// Widget to run sensors -// BT HRM / coretemp / csc +// Widget to show sensor status (() => { var settings = {}; - -var device; -var gatt; -var service; -var characteristic; - -class CoreSensor { - constructor() { - this.unit = ""; - this.core = -1; - this.skin = -1; - this.battery = 0; - } - - updateSensor(event) { - if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { - var dv = event.target.value; - var flags = dv.buffer[0]; - - if (flags & 8) { - this.unit = "F"; - } else { - this.unit = "C"; - } - - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; - - Bangle.emit('CoreTemp', - {core : this.core, skin : this.skin, unit : this.unit}); - } - } - - updateBatteryLevel(event) { - if (event.target.uuid == "0x2a19") - this.battery = event.target.value.getUint8(0); - } -} - -var mySensor = new CoreSensor(); - -function getSensorBatteryLevel(gatt) { - gatt.getPrimaryService("180f") - .then(function(s) { return s.getCharacteristic("2a19"); }) - .then(function(c) { - c.on('characteristicvaluechanged', - (event) => mySensor.updateBatteryLevel(event)); - return c.startNotifications(); - }); -} - -function connection_setup() { - E.showMessage("Scanning for CoreTemp sensor..."); - NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) - .then(function(d) { - device = d; - E.showMessage("Found device"); - return device.gatt.connect(); - }) - .then(function(g) { - gatt = g; - return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(s) { - service = s; - return service.getCharacteristic( - '00002101-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(c) { - characteristic = c; - characteristic.on('characteristicvaluechanged', - (event) => mySensor.updateSensor(event)); - return characteristic.startNotifications(); - }) - .then(function() { - console.log("Done!"); -// getSensorBatteryLevel(gatt); - g.reset().clearRect(Bangle.appRect).flip(); - }) - .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); - console.log(e); - }); -} -function connection_end() { - if (gatt != undefined) gatt.disconnect(); -} + var count=0; // draw your widget function draw() { -// if (!) return; + if (!settings.enabled) return; g.reset(); g.setFontAlign(0,0); g.clearRect(this.x,this.y,this.x+23,this.y+23); - g.setColor(settings.enabled?"#00ff00":"#80ff00"); + g.setColor((count&1)?"#00ff00":"#80ff00"); g.fillCircle(this.x+6,this.y+6,4); g.fillCircle(this.x+16,this.y+16,4); g.setColor(-1); // change color back to be nice to other apps } -// function onHRM(hrm) { -// WIDGETS["sensors"].draw(); -// } +// Set a listener to 'twinkle' + function onTemp(temp) { + count=count+1; + WIDGETS["sensors"].draw(); + } - // Called by sensor app to enable listeners + // Called by sensor app to update status function reload() { settings = require("Storage").readJSON("coretemp.json",1)||{}; // settings.fileNbr |= 0; -// Bangle.removeListener('HRM',onHRM); + Bangle.removeListener('CoreTemp',onTemp); - if (settings.coreOn) { + if (settings.enabled) { WIDGETS["sensors"].width = 24; - connection_setup(); + Bangle.on('CoreTemp', onTemp); } else { WIDGETS["sensors"].width = 0; - connection_end(); } } @@ -129,4 +43,5 @@ function connection_end() { }}; // load settings, set correct widget width reload(); + })() From f0cbe07d1dceab32de7b7be8e5174ccd6e92cfb3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:52:05 +0100 Subject: [PATCH 140/503] Two screens --- apps/lcars/bg_right.png | Bin 0 -> 791 bytes apps/lcars/lcars.app.js | 185 ++++++++++++++++++++++++++++++------ apps/lcars/screenshot.png | Bin 5139 -> 4813 bytes apps/lcars/screenshot_2.png | Bin 0 -> 2671 bytes 4 files changed, 155 insertions(+), 30 deletions(-) create mode 100644 apps/lcars/bg_right.png create mode 100644 apps/lcars/screenshot_2.png diff --git a/apps/lcars/bg_right.png b/apps/lcars/bg_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6e23a5d6ebc0687268a27c368507b63ed435d2b1 GIT binary patch literal 791 zcmV+y1L*vTP)u=77?@_KC=}5|wjz5wZD`KUTKmqT@jSO- z-kr~UXW!lZ&hG38gr$UnEH1q+^tPY>YBwfF1q1-z;&TavrJU^?Epi-7rrce>jIfk% z@4qZ$}v#kR_%l%g*pk2wJWfKa{RR1o0sbG8+742wST<^BmN#~wcL6$zAz#zwJe zwO;f;mWML|KF(pKyFDn@PMq5hF&77_q&I<)#~8 z8Z8%)laqEF^M597uOAPETpL0t`Ei^l7Q~1VBSwrEvE5)XO;h$~j@VT2X39=C9tycC zDtpIOVTCIz&nzpOZff#WRQ9f`f{f|bsuR)ZcSkQi0RYp~>ioJs0qo+$B9j<1cYHN^ z-}~gUW0+}bo*KPx+pTq!PyOksV3`O)_;r29J$#f@X2b%wez;su&vbPqfc})@egR7% V)8R{}8ms^S002ovPDHLkV1jhMZOi}w literal 0 HcmV?d00001 diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8ac1dfe14..96fe186c2 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -16,6 +16,9 @@ for (const key in saved_settings) { settings[key] = saved_settings[key] } let hrmValue = 0; +var stepsData = new Array(24).fill(0); +var hrmData = new Array(24).fill(0); + /* * Colors to use @@ -25,17 +28,29 @@ let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +/* + * Position in lcars + */ +let lcarsViewPos = 0; +let drag; + /* * Requirements and globals */ const locale = require('locale'); -var backgroundImage = { +var bgLeft = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) } +var bgRight = { + width : 27, height : 176, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) +} + var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -86,7 +101,7 @@ var iconNoBattery = { // Font to use: // -Graphics.prototype.setFontAntonioSmall = function(scale) { +Graphics.prototype.setFontAntonioMedium = function(scale) { // Actual height 20 (19 - 0) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); } @@ -146,9 +161,9 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.setColor(cOrange); - g.clearRect(120, 10, g.getWidth(), 80); + g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 130, 15); g.drawString("B-JS2", 130, 35); if(Bangle.isLocked()){ @@ -174,7 +189,7 @@ function drawState(){ // Alarm within symbol g.setFontAlign(-1, -1, 0); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.drawString("STATUS", 123, 97); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); @@ -183,23 +198,16 @@ function drawState(){ } } -function draw(){ - - // First handle alarm to show this correctly afterwards - handleAlarm(); - - // Next draw the watch face - g.reset(); - g.clearRect(0, 0, g.getWidth(), g.getHeight()); +function drawPosition0(){ // Draw background image - g.drawImage(backgroundImage, 0, 0); - drawHoriztonatlBgLine(cBlue, 35, 120, 0, 4); + g.drawImage(bgLeft, 0, 0); + drawHoriztonatlBgLine(cBlue, 25, 120, 0, 4); drawHoriztonatlBgLine(cBlue, 130, 176, 0, 4); - drawHoriztonatlBgLine(cPurple, 35, 110, 81, 3); - drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); - drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); - drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); + drawHoriztonatlBgLine(cPurple, 20, 70, 80, 4); + drawHoriztonatlBgLine(cPurple, 80, 176, 80, 4); + drawHoriztonatlBgLine(cOrange, 35, 110, 87, 4); + drawHoriztonatlBgLine(cOrange, 120, 176, 87, 4); drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo @@ -214,7 +222,7 @@ function draw(){ // Write date g.setColor(cWhite); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); @@ -228,6 +236,65 @@ function draw(){ // Draw state drawState(); +} + +function drawPosition1(){ + // Draw background image + g.drawImage(bgRight, 149, 0); + drawHoriztonatlBgLine(cBlue, 0, 140, 0, 4); + drawHoriztonatlBgLine(cPurple, 0, 80, 80, 4); + drawHoriztonatlBgLine(cPurple, 90, 150, 80, 4); + drawHoriztonatlBgLine(cOrange, 0, 50, 87, 4); + drawHoriztonatlBgLine(cOrange, 60, 140, 87, 4); + drawHoriztonatlBgLine(cOrange, 0, 150, 171, 5); + + // Draw steps bars + g.setColor(cWhite); + + // HRM + require("graph").drawBar(g, hrmData, { + axes : true, + gridx : 4, + gridy : 50, + width : 140, + height : 50, + x: 5, + y: 25 + }); + + // Steps + require("graph").drawBar(g, stepsData, { + axes : true, + gridx : 4, + gridy : 2500, + width : 140, + height : 50, + x: 5, + y: 115 + }); + + g.setFontAntonioMedium(); + g.drawString("HRM", 123, 7); + g.drawString("STEPS", 116, 94); +} + +function draw(){ + // First handle alarm to show this correctly afterwards + handleAlarm(); + + // Handle steps for graph data + handleSteps(); + + // Next draw the watch face + g.reset(); + g.clearRect(0, 0, g.getWidth(), g.getHeight()); + + // Draw current lcars position + if(lcarsViewPos == 0){ + drawPosition0(); + } else if (lcarsViewPos == 1) { + drawPosition1(); + } // Queue draw in one minute queueDraw(); @@ -240,7 +307,7 @@ function draw(){ function getSteps() { if (stepsWidget() !== undefined) return stepsWidget().getSteps(); - return "???"; + return 0; } function stepsWidget() { @@ -252,6 +319,15 @@ function stepsWidget() { return undefined; } +function handleSteps(){ + var current_h = (new Date()).getHours(); + if(current_h == 0){ + stepsData[current_h] = getSteps(); + } else { + stepsData[current_h] = getSteps() - stepsData[current_h-1]; + } +} + /* * Handle alarm @@ -315,19 +391,68 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { + var current_h = (new Date()).getHours(); + hrmValue = hrm.bpm; + hrmData[current_h] = (hrmData[current_h] + hrmValue) / 2 }); -Bangle.on('swipe',function(dir) { - // Increase alarm - if(dir == -1){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } + +function increaseAlarm(){ + if(isAlarmEnabled()){ + settings.alarm += 5; + } else { + settings.alarm = getCurrentTimeInMinutes() + 5; } + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +function decreaseAlarm(){ + if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ + settings.alarm -= 5; + } else { + settings.alarm = -1; + } + + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +// Thanks to the app "gbmusic" for this code to detect swipes in all 4 directions. +Bangle.on("drag", e => { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + + // Horizontal swipe + if (Math.abs(dx)>Math.abs(dy)+10) { + if(dx > 0){ + lcarsViewPos = 0; + } else { + lcarsViewPos = 1; + } + + // Vertical swipe + } else if (Math.abs(dy)>Math.abs(dx)+10) { + if(dy > 0){ + decreaseAlarm(); + } else { + increaseAlarm(); + } + } + + draw(); + } +}); + + +/*Bangle.on('swipe',function(dir) { + + // Decrease alarm if(dir == +1){ if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ @@ -342,7 +467,7 @@ Bangle.on('swipe',function(dir) { // Update alarm state Storage.writeJSON(SETTINGS_FILE, settings); -}); +});*/ /* * Lets start widgets, listen for btn etc. diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 768c4a172e33f1cc478bc14a13400688af7bbbb2..98bf50546ab06532dbee2dcb58524a138c9ed9f2 100644 GIT binary patch delta 4809 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
Dt*ApQ z5T6g=3&nv8NHilL0QNZ4N~?j$ViBoqbo#v-fF*5@>RswzWX)qsh=CfII#^raaLge6 z%>t$8c{G5L@+7->+HDOUtqycxdf8T!AkwUR>C`J@JQ=t-Q5;Q0C$@(3m9pE1n@}fXWiWvNC0=6 zFbf!IfdueK>u25F78tS<*WKzYAT98=z>u>LY5lZ7lm&({uoOSlc4W9`(gh>MKu9ng zF{X961UdA>wP}Vp^0SRkJGTCd*ta#!5C-;w^x3&$K-y6Yz$I_1fqzQARsgs5wYR-T z<=<~1lR#bW=zctX_PR14ibS|R4Pjtps}kL3rvS6wbZ&KQFMzpo9*7-U+Z&Oum2s_n z5pCONvn!nkMo%^MybarGygLF|vz2roB+Wy?+-iR*-?9w+>~IvrSvpmFuC*bmebJyW zWkRPWj+7NcHL&OXFn9y5n?zFwW z0Q>#@i>)11et#P6K-+mK2EHnQC22y#Yuw_J11gnI*4x;qGh5SDSbSmXWX4Sf2CwOF zW#AqFOYA!v1Aj#wYUTtOxbEu@^Md)M!FekNZe=KmF)hhK9XH}89<9&f=K))H+9-3E z-z`R`ns^{49JNOLBDBds}USv?HAAIz!1Teg>f z;>?uM4Q-5=GXacP>4s^3K+R11n_0Ls4kZvl-hb%WBQD?>3dHOQV8lu{Nz=l_KMYK5 z#cVrEXCGS5L<|8ix?^RvagG)`-6a?CmgYEZTI!Mf9=E zWqpou*MGc1HE8#lTd%)zaoj0G?6y z4szz8&F3v-UrXwHCTRH{+3+>vJqCU!?te%CBfz$%`&9ufYF+Ex?$?W)W%=~}w=gbc z;vzvDw_AFK#ZnqrTHH})Y-M20uxObc=bVvNym?32WN2;|38~RjZWf_jP6M+IV!pde z({apQ(s0_ib!z7pERvCD1TbadVnaC^QC%wqYTnu}Xq3Y3GzwPEn0L~^5}4}g9|j!V)CfHPOWUv%16vFY zJK&x0?f|y5YwL5bAGGw#GO%<2$74KhBZEdt=xTk&MI2(2FD53MmLA~wl7A7MQ3k7R zLm1d<)Rmrdp}8xy@65JbfpLE&#N(;F-y0*H|MuLpeWoL_u5~Ps47`pnZ`qR}8u*r$ z&Q2d@uvjw?a?ry0rqok3E~O8mredYm>CJ; zC`Qk6VrIrw?f7#qM1nX@PC~5;nk)5-z1So{oFKjuNVNcidNWT{bYd1`WIN}REAZ7) j3Fi5n8xb14`k?*~5mv6K=tf)E00000NkvXXu0mjfVF)RR delta 5138 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 Date: Sun, 19 Dec 2021 19:54:40 +0100 Subject: [PATCH 141/503] Minor fixes --- apps/lcars/lcars.app.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 96fe186c2..7afa05b7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -161,6 +161,10 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ + if(lcarsViewPos != 0){ + return; + } + g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); @@ -172,6 +176,10 @@ function drawLock(){ } function drawState(){ + if(lcarsViewPos != 0){ + return; + } + g.setColor(cWhite); var bat = E.getBattery(); var timeInMinutes = getCurrentTimeInMinutes(); @@ -438,6 +446,10 @@ Bangle.on("drag", e => { // Vertical swipe } else if (Math.abs(dy)>Math.abs(dx)+10) { + if(lcarsViewPos != 0){ + return; + } + if(dy > 0){ decreaseAlarm(); } else { From 75948ee04ade00344c7fe5a743ae5a559102ed14 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:56:34 +0100 Subject: [PATCH 142/503] Updated readme --- apps/lcars/README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 31cb81341..d84ada29b 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -8,8 +8,18 @@ the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). * LCARS Style watch face * Shows different states (charging, out of battery, GPS on etc.) * Shows customizable data (steps, HRM, battery, temperature etc.) - * Swipe left/right to activate an alarm - * Full-screen mode + * Change between multiple screens via swipe left/right. + * Display 24h graphs for steps + hrm. + * Swipe up/down to activate an alarm. + * Full-screen mode. + +## Screenshot of multiple screens +Access via swipe left/ right + +![](screenshot.png) +![](screenshot_2.png) + + ## Icons
Icons made by Smashicons, Freepik from www.flaticon.com
From bb05677ded21def2936304b601a95358dd3bf95b Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:57:55 +0100 Subject: [PATCH 143/503] Updated changelog --- apps/lcars/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index f30ae4707..c171ec3d4 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -5,4 +5,4 @@ 0.05: Additional icons for (1) charging and (2) bat < 30%. 0.06: Fix - Alarm disabled, if clock was closed. 0.07: Added settings to adjust data that is shown for each row. -0.08: Smaller background for faster rendering. Full screen mode. \ No newline at end of file +0.08: Support for multiple screens. 24h graph for steps + HRM. Fullscreen Mode. \ No newline at end of file From c2f3a4614501a3521fa9d954642092a275c0a58f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:00:52 +0100 Subject: [PATCH 144/503] Minor change for HRM --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7afa05b7f..6fa42f0c3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -263,7 +263,7 @@ function drawPosition1(){ require("graph").drawBar(g, hrmData, { axes : true, gridx : 4, - gridy : 50, + gridy : 100, width : 140, height : 50, x: 5, From e1b8d8c6693825e7d8fe24df1fbe2d809ea0a0dd Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:07:28 +0100 Subject: [PATCH 145/503] Set data to zero at 00:00 --- apps/lcars/lcars.app.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 6fa42f0c3..123a8448e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -293,6 +293,13 @@ function draw(){ // Handle steps for graph data handleSteps(); + // Clear data + var current = new Date(); + if(current.getHours() == 0 && current.getMinutes() == 0){ + stepsData = new Array(24).fill(0); + hrmData = new Array(24).fill(0); + } + // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); From 6203407e1392e3e7b74e10200c4ea07eba59825b Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:09:49 +0100 Subject: [PATCH 146/503] Removed comments. --- apps/lcars/lcars.app.js | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 123a8448e..7815ff025 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -469,25 +469,6 @@ Bangle.on("drag", e => { }); -/*Bangle.on('swipe',function(dir) { - - - // Decrease alarm - if(dir == +1){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - } - - // Update UI - draw(); - - // Update alarm state - Storage.writeJSON(SETTINGS_FILE, settings); -});*/ - /* * Lets start widgets, listen for btn etc. */ From d34cdfbe136429d45e16f0ffbd3fce077b7a2994 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:56:52 +0100 Subject: [PATCH 147/503] Compute HRM hour average --- apps/lcars/lcars.app.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7815ff025..8e6da3f88 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -15,10 +15,12 @@ let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { settings[key] = saved_settings[key] } -let hrmValue = 0; + var stepsData = new Array(24).fill(0); var hrmData = new Array(24).fill(0); - +let hrmValue = 0; +var hrmValueAvg = 0; +var hrmValueCount = 0; /* * Colors to use @@ -406,10 +408,17 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { - var current_h = (new Date()).getHours(); + var current = new Date(); hrmValue = hrm.bpm; - hrmData[current_h] = (hrmData[current_h] + hrmValue) / 2 + hrmValueAvg += hrmValue; + hrmValueCount += 1; + hrmData[current_h.getHours()] = hrmValueAvg / hrmValueCount; + + if(current.getMinutes() == 0){ + hrmValueAvg = 0; + hrmValueCount = 0; + } }); From 2bc8c672e01645a6834cdd5e0e39e230723bb94f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 21:09:26 +0100 Subject: [PATCH 148/503] Dynamically select y range of graphs --- apps/lcars/lcars.app.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8e6da3f88..ae2927ae8 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -262,10 +262,13 @@ function drawPosition1(){ g.setColor(cWhite); // HRM + var maxHrm = Math.max.apply(Math, hrmData); + var gridy = (parseInt(maxHrm / 50)-1) * 50; + gridy = gridy <= 0 ? 50 : gridy; require("graph").drawBar(g, hrmData, { axes : true, gridx : 4, - gridy : 100, + gridy : gridy, width : 140, height : 50, x: 5, @@ -273,10 +276,13 @@ function drawPosition1(){ }); // Steps + var maxSteps = Math.max.apply(Math, stepsData); + var gridy = (parseInt(maxSteps / 1000)-1) * 1000; + gridy = gridy <= 0 ? 1000 : gridy; require("graph").drawBar(g, stepsData, { axes : true, gridx : 4, - gridy : 2500, + gridy : gridy, width : 140, height : 50, x: 5, @@ -284,8 +290,8 @@ function drawPosition1(){ }); g.setFontAntonioMedium(); - g.drawString("HRM", 123, 7); - g.drawString("STEPS", 116, 94); + g.drawString("HRM", 122, 9); + g.drawString("STEPS", 114, 96); } function draw(){ @@ -413,7 +419,7 @@ Bangle.on('HRM', function (hrm) { hrmValue = hrm.bpm; hrmValueAvg += hrmValue; hrmValueCount += 1; - hrmData[current_h.getHours()] = hrmValueAvg / hrmValueCount; + hrmData[current.getHours()] = hrmValueAvg / hrmValueCount; if(current.getMinutes() == 0){ hrmValueAvg = 0; From 4cc822cafb9be795a8f5484c581045e43a17a039 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 20:59:30 +0000 Subject: [PATCH 149/503] ptlaunch: Improve pattern detection code readability by PaddeK --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 +- apps/ptlaunch/README.md | 7 ++ apps/ptlaunch/app.js | 216 ++++++++-------------------------------- apps/ptlaunch/boot.js | 183 +++++++++------------------------- 5 files changed, 99 insertions(+), 312 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..125d8609e 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.11", + "version": "0.12", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index 23031cff3..8cfa77113 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -2,4 +2,5 @@ 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. 0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. -0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js \ No newline at end of file +0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js +0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 7cc39e3d6..c16110f94 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -58,3 +58,10 @@ Make sure the watch is unlocked before you start drawing. If this bothers you, y 3) I have done all that and still nothing happens! Please note that drawing on the clock screen will not visually show the pattern you drew. It will start the app as soon as the pattern was recognized - this might take 1 or 2 seconds! If still nothing happens, that might be a bug, sorry! + + +## Authors + +Initial creation: [crazysaem](https://github.com/crazysaem) + +Improve pattern detection code readability: [PaddeK](http://forum.espruino.com/profiles/117930/) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 062cc3c62..5a2fcf228 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -114,7 +114,6 @@ var showMainMenu = () => { E.showMenu(mainmenu); }; -var positions = []; var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); @@ -137,148 +136,53 @@ var recognizeAndDrawPattern = () => { setWatch(() => finishHandler(), BTN); setTimeout(() => Bangle.on("tap", finishHandler), 250); - positions = []; + var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { - log(position); positions.push(position); - - debounce().then(() => { - if (isFinished) { - return; - } - - // This might actually be a 'tap' event. - // Use this check in addition to the actual tap handler to make it more reliable - if (pattern.length > 0 && positions.length === 2) { - if ( - positions[0].x === positions[1].x && - positions[0].y === positions[1].y - ) { - finishHandler(); - positions = []; - return; - } - } - - E.showMessage("Calculating..."); - var t0 = Date.now(); - - log(positions.length); - - var circlesClone = cloneCirclesArray(); - pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circlesClone[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(0, 1); - } - } - - circle = circlesClone[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(1, 1); - } - } - - circle = circlesClone[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(2, 1); - } - } - - circle = circlesClone[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(3, 1); - } - } - - circle = circlesClone[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(4, 1); - } - } - - circle = circlesClone[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(5, 1); - } - } - - circle = circlesClone[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(6, 1); - } - } - circle = circlesClone[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(7, 1); - } - } - - circle = circlesClone[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(8, 1); - } - } - } - var tx = Date.now(); - log(tx - t0); - positions = []; - var t1 = Date.now(); - log(t1 - t0); - - log("pattern:"); - log(pattern); - - log("redrawing"); + if (position.b === 0 || positions.length >= 200) { + pattern = getPattern(positions).split(""); g.clear(); drawCirclesWithPattern(pattern); - }); + positions = []; + } }; - Bangle.on("drag", dragHandler); }); }; @@ -461,18 +365,6 @@ var getStoredPatternsArray = () => { var CIRCLE_RADIUS = 25; var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; -var CIRCLES = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, -]; - var drawCircle = (circle, drawBuffer, scale) => { if (!drawBuffer) { drawBuffer = g; @@ -563,16 +455,6 @@ var drawCirclesWithPattern = (pattern, options) => { g.drawImage(image, offset.x, offset.y); }; -var cloneCirclesArray = () => { - var circlesClone = Array(CIRCLES.length); - - for (var i = 0; i < CIRCLES.length; i++) { - circlesClone[i] = CIRCLES[i]; - } - - return circlesClone; -}; - ////// // misc lib functions ////// @@ -583,20 +465,6 @@ var log = (message) => { } }; -var debounceTimeoutId; -var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); - } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); -}; - ////// // run main function ////// diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index 6fbd3ca41..19a8f16cb 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -5,131 +5,54 @@ console.log(JSON.stringify(message)); } }; - + var storedPatterns; + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = Math.pow(CIRCLE_RADIUS, 2); var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { positions.push(position); - - debounce().then(() => { - log(positions.length); - - var CIRCLE_RADIUS = 25; - var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - - var circles = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, - ]; - var pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circles[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(0, 1); - } - } - - circle = circles[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(1, 1); - } - } - - circle = circles[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(2, 1); - } - } - - circle = circles[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(3, 1); - } - } - - circle = circles[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(4, 1); - } - } - - circle = circles[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(5, 1); - } - } - - circle = circles[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(6, 1); - } - } - circle = circles[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(7, 1); - } - } - - circle = circles[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(8, 1); - } - } - } - positions = []; - - pattern = pattern.join(""); - + if (position.b === 0 || positions.length >= 200) { + var pattern = getPattern(positions); + log(pattern); + if (pattern) { if (storedPatterns[pattern]) { var app = storedPatterns[pattern].app; @@ -139,27 +62,15 @@ Bangle.setLCDPower(true); } } - + Bangle.removeListener("drag", dragHandler); load(app.src); } } } - }); - }; - - var debounceTimeoutId; - var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); + + positions = []; } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); }; var sui = Bangle.setUI; From 3dde7126adf0c09fed5c87d4f8604618603802f3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:11:38 +0000 Subject: [PATCH 150/503] ptlaunch: Improve pattern rendering by HughB --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 ++- apps/ptlaunch/README.md | 34 ++++++++++++++++++---------------- apps/ptlaunch/app.js | 22 +++++++++++++++++++--- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/apps.json b/apps.json index 125d8609e..ddf4e2026 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.12", + "version": "0.13", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index 8cfa77113..68b7d3e1c 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -3,4 +3,5 @@ 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. 0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. 0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js -0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ \ No newline at end of file +0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ +0.13: Improve pattern rendering by HughB http://forum.espruino.com/profiles/167235/ \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index c16110f94..5ef1e82dd 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -29,39 +29,41 @@ Then launch the linked apps directly from the clock screen by simply drawing the ## Detailed Steps From the main menu you can: + - Add a new pattern and link it to an app (first entry) - - To create a new pattern first select "Add Pattern" - - Now draw any pattern you like, this will later launch the linked app from the clock screen - - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern - - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. - - If you are happy with the pattern tap on screen or press the button to continue - - Now select the app you want to launch with the pattern. - - Note, you can bind multiple patterns to the same app. + - To create a new pattern first select "Add Pattern" + - Now draw any pattern you like, this will later launch the linked app from the clock screen + - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern + - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. + - If you are happy with the pattern tap on screen or press the button to continue + - Now select the app you want to launch with the pattern. + - Note, you can bind multiple patterns to the same app. - Manage created patterns (second entry) - - To manage your patterns first select "Manage Patterns" - - You will now see a scrollabe list of patterns + linked apps - - If you want to deletion a pattern (and unlink the app) simply tap on it, and confirm the deletion + - To manage your patterns first select "Manage Patterns" + - You will now see a scrollabe list of patterns + linked apps + - If you want to deletion a pattern (and unlink the app) simply tap on it, and confirm the deletion - Disable the lock screen on the clock screen from the settings (third entry) - - To launch the app from the pattern on the clock screen the watch must be unlocked. - - If this annoys you, you can disable the lock on the clock screen from the setting here + - To launch the app from the pattern on the clock screen the watch must be unlocked. + - If this annoys you, you can disable the lock on the clock screen from the setting here ## FAQ -1) Nothing happens when I draw on the clock screen! +1. Nothing happens when I draw on the clock screen! Please double-check if you actually have a pattern linked to an app. -2) I have a pattern linked to an app and still nothing happens when I draw on the clock screen! +2. I have a pattern linked to an app and still nothing happens when I draw on the clock screen! Make sure the watch is unlocked before you start drawing. If this bothers you, you can permanently disable the watch-lock from within the Pattern Launcher app (via the Settings). -3) I have done all that and still nothing happens! +3. I have done all that and still nothing happens! Please note that drawing on the clock screen will not visually show the pattern you drew. It will start the app as soon as the pattern was recognized - this might take 1 or 2 seconds! If still nothing happens, that might be a bug, sorry! - ## Authors Initial creation: [crazysaem](https://github.com/crazysaem) Improve pattern detection code readability: [PaddeK](http://forum.espruino.com/profiles/117930/) + +Improve pattern rendering: [HughB](http://forum.espruino.com/profiles/167235/) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 5a2fcf228..88739ddb7 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -365,6 +365,18 @@ var getStoredPatternsArray = () => { var CIRCLE_RADIUS = 25; var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; +var CIRCLES = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, +]; + var drawCircle = (circle, drawBuffer, scale) => { if (!drawBuffer) { drawBuffer = g; @@ -380,7 +392,8 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); - drawBuffer.drawCircle(x, y, r); + drawBuffer.setColor(0); + drawBuffer.fillCircle(x, y, r); }; var cachedCirclesDrawings = {}; @@ -425,8 +438,11 @@ var drawCirclesWithPattern = (pattern, options) => { { msb: true } ); - CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); + drawBuffer.setColor(1); + drawBuffer.fillRect(0, 0, drawBuffer.getWidth(), drawBuffer.getHeight()); + CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); + drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { @@ -437,12 +453,12 @@ var drawCirclesWithPattern = (pattern, options) => { circle.y * scale ); }); - image = { width: drawBuffer.getWidth(), height: drawBuffer.getHeight(), bpp: 1, buffer: drawBuffer.buffer, + palette: new Uint16Array([g.theme.fg, g.theme.bg], 0, 1), }; if (enableCaching) { From 2c2f07c6bec06e45fc73870d819634e88aee7645 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:14:14 +0000 Subject: [PATCH 151/503] ptlaunch: remove tap to confirm pattern since its pretty unreliable. always use button instead --- apps/ptlaunch/README.md | 2 +- apps/ptlaunch/app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 5ef1e82dd..cf75315a9 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -35,7 +35,7 @@ From the main menu you can: - Now draw any pattern you like, this will later launch the linked app from the clock screen - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. - - If you are happy with the pattern tap on screen or press the button to continue + - If you are happy with the pattern press the button to continue - Now select the app you want to launch with the pattern. - Note, you can bind multiple patterns to the same app. - Manage created patterns (second entry) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 88739ddb7..5db3a335b 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -134,7 +134,7 @@ var recognizeAndDrawPattern = () => { resolve(pattern.join("")); }; setWatch(() => finishHandler(), BTN); - setTimeout(() => Bangle.on("tap", finishHandler), 250); + // setTimeout(() => Bangle.on("tap", finishHandler), 250); var positions = []; var getPattern = (positions) => { From f6a5bc563ec884cf54f7677a7b8d0480ad39aacb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:22:28 +0100 Subject: [PATCH 152/503] Use health library to display data. --- apps/lcars/lcars.app.js | 55 +++++++++++++++++++----------------- apps/lcars/screenshot_2.png | Bin 2671 -> 2802 bytes 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index ae2927ae8..53849e840 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -17,10 +17,7 @@ for (const key in saved_settings) { } var stepsData = new Array(24).fill(0); -var hrmData = new Array(24).fill(0); let hrmValue = 0; -var hrmValueAvg = 0; -var hrmValueCount = 0; /* * Colors to use @@ -260,29 +257,43 @@ function drawPosition1(){ // Draw steps bars g.setColor(cWhite); + let health; - // HRM - var maxHrm = Math.max.apply(Math, hrmData); - var gridy = (parseInt(maxHrm / 50)-1) * 50; - gridy = gridy <= 0 ? 50 : gridy; - require("graph").drawBar(g, hrmData, { + try { + health = require("health"); + } catch(ex) { + g.setFontAntonioMedium(); + g.drawString("MODULE HEALTH", 20, 110); + g.drawString("REQUIRED.", 20, 130); + g.drawString("MODULE HEALTH", 20, 20); + g.drawString("REQUIRED.", 20, 40); + return; + } + + // Plot HRM graph + var data = new Uint16Array(31); + var cnt = new Uint8Array(31); + health.readDailySummaries(new Date(), h=>{ + data[h.day]+=h.bpm; + if (h.bpm) cnt[h.day]++; + }); + require("graph").drawBar(g, data, { axes : true, gridx : 4, - gridy : gridy, + gridy : 100, width : 140, height : 50, x: 5, y: 25 }); - // Steps - var maxSteps = Math.max.apply(Math, stepsData); - var gridy = (parseInt(maxSteps / 1000)-1) * 1000; - gridy = gridy <= 0 ? 1000 : gridy; - require("graph").drawBar(g, stepsData, { + // Plot step graph + var data = new Uint16Array(31); + health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + require("graph").drawBar(g, data, { axes : true, gridx : 4, - gridy : gridy, + gridy : 5, width : 140, height : 50, x: 5, @@ -290,8 +301,10 @@ function drawPosition1(){ }); g.setFontAntonioMedium(); + g.setColor(cWhite); g.drawString("HRM", 122, 9); - g.drawString("STEPS", 114, 96); + g.drawString("STEPS [K]", 90, 96); + } function draw(){ @@ -414,17 +427,7 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { - var current = new Date(); - hrmValue = hrm.bpm; - hrmValueAvg += hrmValue; - hrmValueCount += 1; - hrmData[current.getHours()] = hrmValueAvg / hrmValueCount; - - if(current.getMinutes() == 0){ - hrmValueAvg = 0; - hrmValueCount = 0; - } }); diff --git a/apps/lcars/screenshot_2.png b/apps/lcars/screenshot_2.png index 8960ff8dffd4a45f0028e54fdd35db85149044ac..4501e52fa0a0fc2bebfff6f916eb8bcd9a89489a 100644 GIT binary patch literal 2802 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 delta 2649 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 Date: Sun, 19 Dec 2021 22:25:55 +0100 Subject: [PATCH 153/503] Updated readme --- apps/lcars/README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index d84ada29b..8c31d04e4 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,26 +1,30 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary (but still optional) to install +Note: To display the steps, its necessary to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). +To display the month graphs on screen 2, the health app is required. +Nevertheless, lcars can also be used, with limited functionality, without +installing those apps. + ## Features * LCARS Style watch face * Shows different states (charging, out of battery, GPS on etc.) * Shows customizable data (steps, HRM, battery, temperature etc.) * Change between multiple screens via swipe left/right. - * Display 24h graphs for steps + hrm. + * Display month graphs for steps + hrm on screen 2. * Swipe up/down to activate an alarm. * Full-screen mode. -## Screenshot of multiple screens -Access via swipe left/ right + +## Multiple screens support +Access different screens via swipe left/ right ![](screenshot.png) ![](screenshot_2.png) - ## Icons
Icons made by Smashicons, Freepik from www.flaticon.com
From 91a3b5feef9bcbfd965dc6ff3f8e2ab64ea620c1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:30:40 +0100 Subject: [PATCH 154/503] Updated readme. --- apps/lcars/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 8c31d04e4..7c56f5481 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -9,13 +9,15 @@ installing those apps. ## Features - * LCARS Style watch face - * Shows different states (charging, out of battery, GPS on etc.) - * Shows customizable data (steps, HRM, battery, temperature etc.) - * Change between multiple screens via swipe left/right. - * Display month graphs for steps + hrm on screen 2. - * Swipe up/down to activate an alarm. - * Full-screen mode. + * LCARS Style watch face. + * Full screen mode - widgets are still loaded. + * Supports multiple screens with different data. + * [Screen 1] Date + Time + Lock status. + * [Screen 1] Shows randomly images of real planets. + * [Screen 1] Shows different states such as (charging, out of battery, GPS on etc.) + * [Screen 1] Swipe up/down to activate an alarm. + * [Screen 1] Shows 3 customizable datapoints on the first screen. + * [Screen 2] Display month graphs for steps + hrm on the second screen. ## Multiple screens support From 6252dc89828d2fec9f73e4733270dd1ee57b75d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:42:47 +0100 Subject: [PATCH 155/503] Use health app also for steps overview. --- apps/lcars/README.md | 7 ++----- apps/lcars/lcars.app.js | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 7c56f5481..b7a692c96 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,11 +1,8 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary to install -the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). -To display the month graphs on screen 2, the health app is required. -Nevertheless, lcars can also be used, with limited functionality, without -installing those apps. +Note: To display the steps, the health app is required. +If this app is not installed, the data will not be shown. ## Features diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 53849e840..8d86c09d1 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -271,14 +271,15 @@ function drawPosition1(){ } // Plot HRM graph - var data = new Uint16Array(31); - var cnt = new Uint8Array(31); + var data = new Uint16Array(32); + var cnt = new Uint8Array(32); health.readDailySummaries(new Date(), h=>{ data[h.day]+=h.bpm; if (h.bpm) cnt[h.day]++; }); require("graph").drawBar(g, data, { axes : true, + minx: 1, gridx : 4, gridy : 100, width : 140, @@ -288,10 +289,11 @@ function drawPosition1(){ }); // Plot step graph - var data = new Uint16Array(31); + var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); require("graph").drawBar(g, data, { axes : true, + minx: 1, gridx : 4, gridy : 5, width : 140, @@ -341,9 +343,15 @@ function draw(){ * Step counter via widget */ function getSteps() { - if (stepsWidget() !== undefined) - return stepsWidget().getSteps(); - return 0; + var steps = 0 + try { + health = require("health"); + } catch(ex) { + return steps; + } + + health.readDay(new Date(), h=>steps+=h.steps); + return steps; } function stepsWidget() { From 23ac5310088c966892bf1b316dcd6bd9440c1a6c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:49:18 +0100 Subject: [PATCH 156/503] Removed unused code. --- apps/lcars/lcars.app.js | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8d86c09d1..d63b2c743 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -16,9 +16,6 @@ for (const key in saved_settings) { settings[key] = saved_settings[key] } -var stepsData = new Array(24).fill(0); -let hrmValue = 0; - /* * Colors to use */ @@ -28,10 +25,11 @@ let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; /* - * Position in lcars + * Global lcars variables */ let lcarsViewPos = 0; let drag; +let hrmValue = 0; /* * Requirements and globals @@ -313,9 +311,6 @@ function draw(){ // First handle alarm to show this correctly afterwards handleAlarm(); - // Handle steps for graph data - handleSteps(); - // Clear data var current = new Date(); if(current.getHours() == 0 && current.getMinutes() == 0){ @@ -354,24 +349,6 @@ function getSteps() { return steps; } -function stepsWidget() { - if (WIDGETS.activepedom !== undefined) { - return WIDGETS.activepedom; - } else if (WIDGETS.wpedom !== undefined) { - return WIDGETS.wpedom; - } - return undefined; -} - -function handleSteps(){ - var current_h = (new Date()).getHours(); - if(current_h == 0){ - stepsData[current_h] = getSteps(); - } else { - stepsData[current_h] = getSteps() - stepsData[current_h-1]; - } -} - /* * Handle alarm From e8909dd57efa3a99ad2114c8582130cee3d02d88 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:52:05 +0100 Subject: [PATCH 157/503] Minor design improvements. --- apps/lcars/lcars.app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d63b2c743..9068868f0 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -165,10 +165,10 @@ function drawLock(){ g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); - g.drawString("LCARS", 130, 15); - g.drawString("B-JS2", 130, 35); + g.drawString("LCARS", 130, 12); + g.drawString("B-JS2", 130, 32); if(Bangle.isLocked()){ - g.drawString("LOCK", 130, 55); + g.drawString("LOCK", 130, 52); } } @@ -223,7 +223,7 @@ function drawPosition0(){ var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 12); + g.drawString(timeStr, 25, 10); // Write date g.setColor(cWhite); @@ -231,7 +231,7 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 58); + g.drawString(dayStr, 28, 56); // Draw data g.setColor(cWhite); From 89928990470562b85be5dbdd65be45cbd09e4b28 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:29:32 -0800 Subject: [PATCH 158/503] Create app.js --- apps/promenu/app.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/app.js diff --git a/apps/promenu/app.js b/apps/promenu/app.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/app.js @@ -0,0 +1 @@ + From 63bfaf308d63f3f274ab1196c5628303ef06ce08 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:39:40 -0800 Subject: [PATCH 159/503] Create boot.js --- apps/promenu/boot.js | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 apps/promenu/boot.js diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js new file mode 100644 index 000000000..20c5af8f5 --- /dev/null +++ b/apps/promenu/boot.js @@ -0,0 +1,165 @@ +E.showMenu = function(items) { + function RectRnd(x1,y1,x2,y2,r) { + pp = []; + pp.push.apply(pp,g.quadraticBezier([x2-r,y1, x2,y1,x2,y1+r])); + pp.push.apply(pp,g.quadraticBezier([x2,y2-r,x2,y2,x2-r,y2])); + pp.push.apply(pp,g.quadraticBezier([x1+r,y2,x1,y2,x1,y2-r])); + pp.push.apply(pp,g.quadraticBezier([x1,y1+r,x1,y1,x1+r,y1])); + return pp; + } + function fillRectRnd(x1,y1,x2,y2,r,c) { + g.setColor(c); + g.fillPoly(RectRnd(x1,y1,x2,y2,r),1); + g.setColor(255,255,255); + } + function drawRectRnd(x1,y1,x2,y2,r,c) { + g.setColor(c); + g.drawPoly(RectRnd(x1,y1,x2,y2,r),1); + g.setColor(255,255,255); + } + g.reset().clearRect(Bangle.appRect); // clear if no menu supplied + Bangle.setLCDPower(1); // ensure screen is on + if (!items) { + Bangle.setUI(); + return; + } + var menuItems = Object.keys(items); + var options = items[""]; + if (options) menuItems.splice(menuItems.indexOf(""),1); + if (!(options instanceof Object)) options = {}; + options.fontHeight = options.fontHeight||27; + if (options.selected === undefined) + options.selected = 0; + if (!options.fontHeight) + options.fontHeight = 6; + var ar = Bangle.appRect; + var x = ar.x; + var x2 = ar.x2-11; // padding at side for up/down + var y = ar.y; + var y2 = ar.y2 - 20; // padding at end for arrow + if (options.title) + y += options.fontHeight+2; + var loc = require("locale"); + var l = { + lastIdx : 0, + draw : function(rowmin,rowmax) { + var rows = 0|Math.min((y2-y) / options.fontHeight,menuItems.length); + var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); + if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled + l.lastIdx = idx; + var iy = y; + g.reset().setFont('6x8',2).setFontAlign(0,-1,0); + if (options.predraw) options.predraw(g); + if (rowmin===undefined && options.title) { + g.drawString(options.title,(x+x2)/2,y-options.fontHeight); + g.drawLine(x,y-7,x2,y-7); + } + if (rowmin!==undefined) { + if (idxrowmax) { + rows = 1+rowmax-rowmin; + } + } + while (rows--) { + var name = menuItems[idx]; + var item = items[name]; + var hl = (idx==options.selected && !l.selectEdit); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); + g.setColor(hl ? g.theme.fgH : g.theme.fg); + g.setFontAlign(-1,-1); + if(loc.translate(name).length >= 15){ + g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); + }else{ + g.drawString(loc.translate(name),x+8,iy+4); + } + if ("object" == typeof item) { + var xo = x2; + var v = item.value; + if (item.format) v=item.format(v); + v = loc.translate(""+v); + if (l.selectEdit && idx==options.selected) { + xo -= 24 + 1; + g.setColor(g.theme.fgH).drawImage("\x0c\x05\x81\x00 \x07\x00\xF9\xF0\x0E\x00@",xo,iy+(options.fontHeight-10)/2,{scale:2}); + } + g.setFontAlign(1,-1); + g.drawString(v,xo-6,iy+4); + } + g.setColor(g.theme.fg); + iy += options.fontHeight; + idx++; + } + g.setFontAlign(-1,-1); + var more = idxitem.max) item.value = item.wrap ? item.min : item.max; + if (item.onchange) item.onchange(item.value); + l.draw(options.selected,options.selected); + } else { + var lastSelected=options.selected; + options.selected = (dir+options.selected+menuItems.length)%menuItems.length; + l.draw(Math.min(lastSelected,options.selected), Math.max(lastSelected,options.selected)); + } + } + }; + l.draw(); + Bangle.setUI("updown",dir => { + if (dir) l.move(dir); + else l.select(); + }); + return l; +}; From 476a975171731935a3f65b8d80f71048ae6ea126 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:46:12 -0800 Subject: [PATCH 160/503] Update apps.json --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..efb76c360 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,18 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "promenu", + "name": "Pro Menu", + "version": "0.01", + "description": "Replace Bangle.js 1's built in show message.", + "icon": "app.png", + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"promenu.boot.js","url":"boot.js"} + ] } ] From ab9bcf9f66f24d54e42592d9dec24063354af72c Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:48:22 -0800 Subject: [PATCH 161/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index efb76c360..66748d2c3 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in show message.", - "icon": "app.png", + "icon": "promenuIcon.png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], From 2527cb947663195dc8b003f85256c139f4e0827c Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:49:39 -0800 Subject: [PATCH 162/503] Create promenuIcon.png --- apps/promenu/promenuIcon.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/promenuIcon.png diff --git a/apps/promenu/promenuIcon.png b/apps/promenu/promenuIcon.png new file mode 100644 index 000000000..5c2dc6adc --- /dev/null +++ b/apps/promenu/promenuIcon.png @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwyBC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AFE+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AAM+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AAM+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ADIA==")) From 621866352b7652e21b6bb5d9fde2a4e7abdd4805 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:50:21 -0800 Subject: [PATCH 163/503] Create README.md --- apps/promenu/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/README.md diff --git a/apps/promenu/README.md b/apps/promenu/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/README.md @@ -0,0 +1 @@ + From 38f6797994bde65d17d6c6070f3b1c28151138a3 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:50:35 -0800 Subject: [PATCH 164/503] Create ChangeLog --- apps/promenu/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/ChangeLog diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/ChangeLog @@ -0,0 +1 @@ + From d60e7c181620e9486457500ebaf7eedf66ed2f61 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:48:16 -0500 Subject: [PATCH 165/503] Create app.js --- apps/slimehunt/app.js | 341 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 apps/slimehunt/app.js diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js new file mode 100644 index 000000000..255399072 --- /dev/null +++ b/apps/slimehunt/app.js @@ -0,0 +1,341 @@ +//Create constants +const GREEN_SLIME = 1; //Normal slime, is always neutral. +const PINK_SLIME = 2; //Can get angry +const GRAY_SLIME = 3; //Can be neutral, angry or erratic +const YELLOW_SLIME = 4; //Is always erratic +const PURPLE_SLIME = 5; //Is always angry + +//Initialize variables +var playerHP = 20; +var slimeHP = 3; +var slimeType = GREEN_SLIME; +var turn = 0; +var screenWidth = g.getWidth(); +var screenHeight = g.getHeight(); +var slimeState = 0; +var showBattleResult = false; +var dmgDealt = 0; +var playerDefence = 0; + +var refreshInterval; +var waitTime = 0; + +var highscore = 0; +var score = 0; + +var themeNote = 0; + +//Load files +var file = require("Storage").open("highscore.txt","r"); +highscore = file.readLine(); +if (highscore == undefined) highscore = 0; + +var greenSlime = require("Storage").read("slime.img"); +var pinkSlime = require("Storage").read("slimered.img"); +var graySlime = require("Storage").read("slimegray.img"); +var yellowSlime = require("Storage").read("slimeyellow.img"); +var purpleSlime = require("Storage").read("slimepurple.img"); + +//UI Stuff +function drawOpeningUI() { + g.clear(); + g.setFont("Vector",screenWidth/15); + g.setFontAlign(0,0); // center font + g.drawString("SLIME HUNT",screenWidth/2,screenHeight*0.1); + g.drawString("-SCORE TO BEAT-",screenWidth/2,screenHeight*0.3); + g.drawString("<><><> "+highscore+" <><><>",screenWidth/2,screenHeight*0.45); + g.setFont("Vector",screenWidth/20); + g.drawString("A Slime approches...",screenWidth/2,screenHeight*0.6); + wait(8,waitForBattle); +} + +function drawSlime() { + switch(slimeType) { + case GREEN_SLIME: + g.drawImage(greenSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case PINK_SLIME: + g.drawImage(pinkSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case GRAY_SLIME: + g.drawImage(graySlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case YELLOW_SLIME: + g.drawImage(yellowSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case PURPLE_SLIME: + g.drawImage(purpleSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + } +} + +function drawBattleUI() { + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("SLIME HP: " + slimeHP,screenWidth/2,screenHeight*0.1); + g.setFont("Vector",screenWidth/20); + if (!showBattleResult) { + switch(slimeState) { + case 0: + g.drawString("The slime seems neutral...",screenWidth/2,screenHeight*0.25); + break; + case 1: + g.drawString("The slime seems angry...",screenWidth/2,screenHeight*0.25); + break; + case 2: + g.drawString("The slime seems eratic...",screenWidth/2,screenHeight*0.25); + break; + } + }else{ + var brString = (turn == 0 ? "The Slime loses " : "You lose "); + g.drawString(brString + dmgDealt + "HP!",screenWidth/2,screenHeight*0.25); + } + drawSlime(); + g.drawLine(0,screenHeight*0.72,screenWidth,screenHeight*0.72); + if (turn == 0) { + g.setFont("Vector",screenWidth/15); + g.drawString("Your HP is " + playerHP + ".",screenWidth/2,screenHeight*0.8); + g.setFont("Vector",screenWidth/20); + g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN",screenWidth/2,screenHeight*0.9); + } +} + +function win() { + wait(5,winTheme); + calcScore(slimeType); + showBattleResult = false; + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("YOU WON!",screenWidth/2,screenHeight/2); + g.setFont("Vector",screenWidth/20); + g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); + g.drawString("Press (B3) to find another slime!",screenWidth/2,screenHeight*0.9); + turn = 0; + setWatch(run,BTN3); +} + +function lose() { + wait(5,loseTheme); + playerHP = 20; + showBattleResult = false; + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("You lose...",screenWidth/2,screenHeight/2); + g.setFont("Vector",screenWidth/20); + g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); + g.drawString("Press (B3) to try again...",screenWidth/2,screenHeight*0.9); + score = 0; + turn = 0; + setWatch(run,BTN3); +} + +//Battle Stuff +function nextTurn() { + turn = (turn == 0 ? 1 : 0); +} + +function slimeFight() { + Bangle.beep(100, 500); + switch(slimeState) { + case 0: + dmgDealt = Math.floor(Math.random() * 2); + break; + case 1: + dmgDealt = Math.floor(Math.random() * 3) + 3; + break; + case 2: + dmgDealt = Math.floor(Math.random() * 6); + break; + } + dmgDealt = Math.max(0,dmgDealt - playerDefence); + playerHP -= dmgDealt; + slimeAI(); +} + +function fight() { + if (turn == 0 && waitTime <= 0) { + Bangle.beep(100, 1000); + dmgDealt = 1; + playerDefence = 0; + slimeHP -= dmgDealt; + showBattleResult = true; + drawBattleUI(); + wait(5,waitForTurn); + } +} + +function defend() { + if (turn == 0 && waitTime <= 0) { + dmgDealt = 0; + playerDefence = 3; + showBattleResult = true; + drawBattleUI(); + wait(5,waitForTurn); + } +} + +function run() { + if (turn == 0 && waitTime <= 0) { + showBattleResult = false; + Bangle.beep(200, 4000); + wait(3,waitForBattle); + } +} + + +function newBattle() { + showBattleResult = false; + slimeType = Math.floor(Math.random() * 5) + 1; + switch(slimeType) { + case GREEN_SLIME: + slimeHP = 3; + break; + case PINK_SLIME: + slimeHP = 3; + break; + case GRAY_SLIME: + slimeHP = 5; + break; + case YELLOW_SLIME: + slimeHP = 5; + break; + case PURPLE_SLIME: + slimeHP = 5; + break; + } + turn = 0; + battle(); + slimeAI(); + drawBattleUI(); +} + +function battle() { + setWatch(fight,BTN1); + setWatch(defend,BTN2); + setWatch(run,BTN3); +} + +function slimeAI() { + switch(slimeType) { + case GREEN_SLIME: + slimeState = 0; + break; + case PINK_SLIME: + slimeState = Math.floor(Math.random() * 2); + break; + case GRAY_SLIME: + slimeState = Math.floor(Math.random() * 3); + break; + case YELLOW_SLIME: + slimeState = 2; + break; + case PURPLE_SLIME: + slimeState = 1; + break; + } +} + + +//Timed transitions +function wait(duration,waitFunc) { + waitTime = duration; + if (!refreshInterval) + refreshInterval = setInterval(waitFunc, 500); +} + +function waitForTurn() { + waitTime--; + if (waitTime <= 0) { + clearInterval(refreshInterval); + refreshInterval = undefined; + nextTurn(); + if (playerHP > 0 && slimeHP > 0) { + if (turn == 1) { + slimeFight(); + wait(5,waitForTurn); + }else{ + showBattleResult = false; + battle(); + } + drawBattleUI(); + }else{ + if (playerHP <= 0) { + lose(); + } + if (slimeHP <= 0) { + win(); + } + } + } + Bangle.setLCDPower(1); +} + +function waitForBattle() { + waitTime--; + Bangle.beep(100, 1000); + if (waitTime <= 0) { + clearInterval(refreshInterval); + refreshInterval = undefined; + showBattleResult = false; + newBattle(); + } + Bangle.setLCDPower(1); +} + +function winTheme() { + waitTime--; + Bangle.beep(200, 100*themeNote); + themeNote++; + if (waitTime <= 0) { + themeNote = 0; + clearInterval(refreshInterval); + refreshInterval = undefined; + } + Bangle.setLCDPower(1); +} + +function loseTheme() { + waitTime--; + Bangle.beep(200, 600-(100*themeNote)); + themeNote++; + if (waitTime <= 0) { + themeNote = 0; + clearInterval(refreshInterval); + refreshInterval = undefined; + } + Bangle.setLCDPower(1); +} + +//Calculations +function calcScore(slimeType) { + switch(slimeType) { + case GREEN_SLIME: + score += 1; + break; + case PINK_SLIME: + score += 2; + break; + case GRAY_SLIME: + score += 2; + break; + case YELLOW_SLIME: + score += 5; + break; + case PURPLE_SLIME: + score += 10; + break; + } + if (score > highscore) { + file.erase(); + file = require("Storage").open("highscore.txt","w"); + file.write(score); + } +} + +//------------------------------------GAME STARTS HERE ----------------------------------------------- + +//Load opening UI +drawOpeningUI(); From 13a28d2a5fbcb782da42ac01f4630e35b897d3c0 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:51:16 -0800 Subject: [PATCH 166/503] Update ChangeLog --- apps/promenu/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog index 8b1378917..5560f00bc 100644 --- a/apps/promenu/ChangeLog +++ b/apps/promenu/ChangeLog @@ -1 +1 @@ - +0.01: New App! From 42f943e03bd701500b1c6337cbf72ad383275322 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:52:02 -0800 Subject: [PATCH 167/503] Rename promenuIcon.png to promenuIcon.js --- apps/promenu/{promenuIcon.png => promenuIcon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/promenu/{promenuIcon.png => promenuIcon.js} (100%) diff --git a/apps/promenu/promenuIcon.png b/apps/promenu/promenuIcon.js similarity index 100% rename from apps/promenu/promenuIcon.png rename to apps/promenu/promenuIcon.js From 3e8f7101923396725aebe74d108a2d8dd02192d6 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:52:18 -0800 Subject: [PATCH 168/503] Add files via upload --- apps/promenu/icons8-menu-48 (1).png | Bin 0 -> 251 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/promenu/icons8-menu-48 (1).png diff --git a/apps/promenu/icons8-menu-48 (1).png b/apps/promenu/icons8-menu-48 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..c6138b765bad3521b688dd3f11e606ef8ceeedb3 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}|}o-U3d z8I5nRIdUB`5NUZ>Y3UwY&5{4WantL@DxvicY~P&QdV5b^RK^hv){Xu@>@|FynS?b` zR2Ufk%~)&icm4RyH9UHy^UbOXr#|}hQ`7(b_s8G6p{`fYMf_IP%8RYv x`25A08uAx$Uu@kLmsPTG@8Qd>3=AA8OeGeAk$j1@-9Wc9c)I$ztaD0e0sz6fXyX6? literal 0 HcmV?d00001 From 997f1aba741cba00b6131fe680785c4629ab03b6 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:52:45 -0500 Subject: [PATCH 169/503] Create app-icon.js --- apps/slimehunt/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slimehunt/app-icon.js diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js new file mode 100644 index 000000000..b575aa4d6 --- /dev/null +++ b/apps/slimehunt/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From dabc8225737843294235dab681a8598e5aa1fcba Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:56:14 -0500 Subject: [PATCH 170/503] Update apps.json --- apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps.json b/apps.json index fd2e14e60..7c9e1b524 100644 --- a/apps.json +++ b/apps.json @@ -4857,5 +4857,17 @@ {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "slimehunt", + "name": "Slime Hunt", + "shortName":"SlimeHunt", + "icon": "app.png", + "version":"0.01", + "description": "Fight against slimes in turn based combat, try to get the highscore!", + "tags": "RPG", + "storage": [ + {"name":"slimehunt.app.js","url":"app.js"}, + {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} + ] } ] From 0cca21ab61bec6ab3a2afd9a4f1fcc20367abfe7 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:58:27 -0800 Subject: [PATCH 171/503] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 66748d2c3..c61376b6c 100644 --- a/apps.json +++ b/apps.json @@ -5068,12 +5068,13 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in show message.", - "icon": "promenuIcon.png", + "icon": "icons8-menu-48 (1).png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], "storage": [ {"name":"promenu.boot.js","url":"boot.js"} + {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} ] } ] From 98b2721893fa28464da653269d4e4dcd937d7b16 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:01:27 -0500 Subject: [PATCH 172/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..793681814 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")); From a04f169d094afbfae5236b915d66870eabdb4352 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:04:20 -0500 Subject: [PATCH 173/503] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7c9e1b524..a8fbe2bfe 100644 --- a/apps.json +++ b/apps.json @@ -4864,7 +4864,8 @@ "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "RPG", + "tags": "rpg", + "supports" : ["BANGLEJS"], "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} From 869aa0f6dcee45f62926df029be3ec82c8cb6bd7 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:07:08 -0500 Subject: [PATCH 174/503] Update apps.json --- apps.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps.json b/apps.json index a8fbe2bfe..8a2513f33 100644 --- a/apps.json +++ b/apps.json @@ -4857,18 +4857,18 @@ {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} ] -}, -{ "id": "slimehunt", - "name": "Slime Hunt", - "shortName":"SlimeHunt", - "icon": "app.png", - "version":"0.01", - "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "rpg", - "supports" : ["BANGLEJS"], - "storage": [ - {"name":"slimehunt.app.js","url":"app.js"}, - {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} - ] -} + }, + { "id": "slimehunt", + "name": "Slime Hunt", + "shortName":"SlimeHunt", + "icon": "app.png", + "version":"0.01", + "description": "Fight against slimes in turn based combat, try to get the highscore!", + "tags": "rpg", + "supports" : ["BANGLEJS"], + "storage": [ + {"name":"slimehunt.app.js","url":"app.js"}, + {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} + ] + } ] From 5961b04095e37f3582076ebc551ff304d1659236 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:08:19 -0800 Subject: [PATCH 175/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c61376b6c..dc635540f 100644 --- a/apps.json +++ b/apps.json @@ -5073,7 +5073,7 @@ "tags": "system", "supports": ["BANGLEJS"], "storage": [ - {"name":"promenu.boot.js","url":"boot.js"} + {"name":"promenu.boot.js","url":"boot.js"}, {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} ] } From 1d2433c3ae460b6178c9842c918a3268407d8de3 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:08:52 -0500 Subject: [PATCH 176/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a2513f33..44f1ca11e 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", - "icon": "app.png", + "icon": "slime.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg", From 5e30c0f51c9efc65cc585a96f9c8e54776b826c0 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:09:37 -0500 Subject: [PATCH 177/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 793681814..b575aa4d6 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")); +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From 2422474bab030c9af18c9aa0f8f95b124a7a2051 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:12:25 -0500 Subject: [PATCH 178/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..d38a9ad55 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA"))); From 55e9695b9dc1eff3a33f372c52da73735a5a9a34 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:13:53 -0500 Subject: [PATCH 179/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index d38a9ad55..1e2339e38 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA"))); +var img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From d3997747da3e1b703dc61fc7f0002b4f8adbbc2e Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:16:56 -0500 Subject: [PATCH 180/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 1e2339e38..b575aa4d6 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From da5c6f5b001678d8b6398362888567faecb1e11b Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:18:32 -0500 Subject: [PATCH 181/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 44f1ca11e..8a2513f33 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", - "icon": "slime.png", + "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg", From 13d92ff26213e9786dd1c8d82e710edf9cf87e0d Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:19:33 -0500 Subject: [PATCH 183/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..d312bc76d 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +E.toArrayBuffer(atob("MDCI/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v4AAAAAAAAAAAAAAAAAAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AABhjIyMjIyMjIyMjIyMjIzXAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/gAAYYyMjIyMjIyMjIyMjIyMjIyMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyM1wD+/v7+/v7+/v7+/v7+/v7+/v7+/v4AjIyMjIyMjIyMjIyMjIyMjIyMjNfXjIyMjNcA/v7+/v7+/v7+/v7+/v7+/v7+/gBhjIyMjIyMjIyMjIyMjIyMjIyMjIzX14yMjIwA/v7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyM19eMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjNeMjIyMAP7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQD+/v7+/v7+/v7+/v7+/v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/g==")) From dd15188a59c7d7958606da5d13d738f71732dfca Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:20:52 -0500 Subject: [PATCH 184/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index d312bc76d..76b2a598f 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("MDCI/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v4AAAAAAAAAAAAAAAAAAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AABhjIyMjIyMjIyMjIyMjIzXAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/gAAYYyMjIyMjIyMjIyMjIyMjIyMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyM1wD+/v7+/v7+/v7+/v7+/v7+/v7+/v4AjIyMjIyMjIyMjIyMjIyMjIyMjNfXjIyMjNcA/v7+/v7+/v7+/v7+/v7+/v7+/gBhjIyMjIyMjIyMjIyMjIyMjIyMjIzX14yMjIwA/v7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyM19eMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjNeMjIyMAP7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQD+/v7+/v7+/v7+/v7+/v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/g==")) +E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From a2291e928efb0be0884e82f0a89b0e879721ac95 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:22:20 -0500 Subject: [PATCH 185/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 76b2a598f..68d1abd03 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A/AH4AGgAAGCx8iAAsvgEBCyYAC+AWKiAWJGIIwKgQVI/4wLFxUv+UikBGUGAJIJLxgCBC5BeJAAhIIC/4XfiEAABjwKAH4A/AH4A/AH4A/AFI")) From 31563c13c8dcfe6c484a7f9557f0a1345c5efbab Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:24:56 -0500 Subject: [PATCH 186/503] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 68d1abd03..36486cb8a 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A/AH4AGgAAGCx8iAAsvgEBCyYAC+AWKiAWJGIIwKgQVI/4wLFxUv+UikBGUGAJIJLxgCBC5BeJAAhIIC/4XfiEAABjwKAH4A/AH4A/AH4A/AFI")) +require("heatshrink").decompress(atob("mEwxH+If4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH9bxgAM1gtsGTwtTGDVhFSPX64wZLqgwFF6iMVGAhgUF6owBMCzsWAAthL1AAGF/4vxrdhADVbeCQA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AFA")) From b8773d064635110095527ecdb9365eef04d54eab Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:27:05 -0500 Subject: [PATCH 187/503] Add files via upload --- apps/slimehunt/app.png | Bin 0 -> 217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slimehunt/app.png diff --git a/apps/slimehunt/app.png b/apps/slimehunt/app.png new file mode 100644 index 0000000000000000000000000000000000000000..208e68f463b57658c478b548886bdb8315d8d702 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)I7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=y0_nJQHf`U-Zr;3EbjkDo|Nr@C-PfMKzXvG6S>O>_%)r2R2!t6$ zHM|;tg1(+Ejv*GOlO Date: Mon, 20 Dec 2021 19:30:45 -0500 Subject: [PATCH 188/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a2513f33..4ffda8624 100644 --- a/apps.json +++ b/apps.json @@ -4864,7 +4864,7 @@ "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "rpg", + "tags": "rpg,slime", "supports" : ["BANGLEJS"], "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, From 75e5e9490d4852c4c5e0fb6d9fd9a9a8b85e629d Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:35:34 -0800 Subject: [PATCH 189/503] no need for app.js so I deleted it --- apps/promenu/app.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/promenu/app.js diff --git a/apps/promenu/app.js b/apps/promenu/app.js deleted file mode 100644 index 8b1378917..000000000 --- a/apps/promenu/app.js +++ /dev/null @@ -1 +0,0 @@ - From d7582e5972973a0917a5387dc12046aabb8d9094 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:36:07 -0800 Subject: [PATCH 190/503] Update boot.js update that solves text overlaying text --- apps/promenu/boot.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 20c5af8f5..26042d620 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -1,3 +1,6 @@ +Bangle.loadWidgets(); +Bangle.drawWidgets(); + E.showMenu = function(items) { function RectRnd(x1,y1,x2,y2,r) { pp = []; @@ -72,6 +75,8 @@ E.showMenu = function(items) { g.setFontAlign(-1,-1); if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); + }else if(loc.translate(name).length >= 10 && "object" == typeof item){ + g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); }else{ g.drawString(loc.translate(name),x+8,iy+4); } From 2279358f950242eb29c4e0dccc4b541a98e2e22e Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:40:06 -0800 Subject: [PATCH 191/503] Update boot.js fix overlapping text bug --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 26042d620..cbaa91815 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -75,7 +75,7 @@ E.showMenu = function(items) { g.setFontAlign(-1,-1); if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); - }else if(loc.translate(name).length >= 10 && "object" == typeof item){ + }else if(loc.translate(name).length >= 15 && "object" == typeof item){ g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); }else{ g.drawString(loc.translate(name),x+8,iy+4); From f796bbfe5c1c90840092772df0d04fffd0f1986a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:24:28 +0100 Subject: [PATCH 192/503] Update apps.json --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index 7c226818f..2a47d5d80 100644 --- a/apps.json +++ b/apps.json @@ -5061,6 +5061,8 @@ "storage": [ {"name":"contourclock.app.js","url":"app.js"}, {"name":"contourclock.img","url":"app-icon.js","evaluate":true} + ] + }, { "id": "ltherm", "name": "Localized Thermometer", From 9cc8afa833a615ee1a6edef2895faafda345f866 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:15:02 -0500 Subject: [PATCH 193/503] Create README.md --- apps/slimehunt/README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/slimehunt/README.md diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md new file mode 100644 index 000000000..d64b44300 --- /dev/null +++ b/apps/slimehunt/README.md @@ -0,0 +1,40 @@ +<><><><>-SLIME HUNT-<><><><> + +Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. + +During each fight the player has 3 options, + +BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. + +BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime attack. + +BTN3) RUN - Find a new slime to fight against. (This could change in the future!) + + + +There are currently 5 types of slime each with unique behavior. + +<><>-BEHAVIORS-<><> + +NEUTRAL - Slime deals 0-1 damage on it's next attack. + +ANGRY - Slime deals 3-5 damage on it's next attack. + +ERACTIC - Slime deals 0-5 damage on it's next attack. + + +<><>-SLIMES-<><> + +1. GREEN SLIME - Is always neutral. + +2. RED SLIME - Can be either neutral or angry. + +3. GRAY SLIME - Can be neutral, angry or eratic. + +4. YELLOW SLIME - Is always eratic. + +5. PURPLE SLIME - Is always angry. + + + +Created by Colton LaChance! From e1a0539bcf5b2b06be082b3c017c5aaea97fc0f5 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:15:46 -0500 Subject: [PATCH 194/503] Update README.md --- apps/slimehunt/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index d64b44300..830e55d1b 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -2,6 +2,8 @@ Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. +The main goal is to beat your personal highscore! + During each fight the player has 3 options, BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. From c33ce67b567e58b4a90f983fb7dfda699ac967b1 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:16:00 -0500 Subject: [PATCH 195/503] Update README.md --- apps/slimehunt/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 830e55d1b..5bd404e55 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -4,6 +4,7 @@ Slime Hunt is a RPG turn-based style combat game where you fight slimes until yo The main goal is to beat your personal highscore! + During each fight the player has 3 options, BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. From 0bda621938454e5544ec296fc9a3b8ba6b39cf45 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:17:20 -0500 Subject: [PATCH 196/503] Update README.md --- apps/slimehunt/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 5bd404e55..4cd6bc1ab 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -1,9 +1,10 @@ -<><><><>-SLIME HUNT-<><><><> +=========================<><><><>-SLIME HUNT-<><><><>======================== Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. The main goal is to beat your personal highscore! +=========================================================================== During each fight the player has 3 options, @@ -13,11 +14,11 @@ BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime BTN3) RUN - Find a new slime to fight against. (This could change in the future!) - +=========================================================================== There are currently 5 types of slime each with unique behavior. -<><>-BEHAVIORS-<><> +============================<><>-BEHAVIORS-<><>============================ NEUTRAL - Slime deals 0-1 damage on it's next attack. @@ -26,7 +27,7 @@ ANGRY - Slime deals 3-5 damage on it's next attack. ERACTIC - Slime deals 0-5 damage on it's next attack. -<><>-SLIMES-<><> +============================<><>-SLIMES-<><>============================ 1. GREEN SLIME - Is always neutral. @@ -38,6 +39,6 @@ ERACTIC - Slime deals 0-5 damage on it's next attack. 5. PURPLE SLIME - Is always angry. - +=========================================================================== Created by Colton LaChance! From 4b011befa1622b07ce307763850a2b5a150d09ca Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:18:39 -0500 Subject: [PATCH 197/503] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 4ffda8624..ed2b9a903 100644 --- a/apps.json +++ b/apps.json @@ -4865,7 +4865,8 @@ "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg,slime", - "supports" : ["BANGLEJS"], + "supports" : ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} From 48da0cbacfff51febdc72c952bb21b45ca644764 Mon Sep 17 00:00:00 2001 From: Craig Millett Date: Tue, 21 Dec 2021 12:11:30 -0700 Subject: [PATCH 198/503] Update calendar.js If week is set to start on Sunday, make Saturday (last row) and Sunday (first row) have weekend colors. --- apps/calendar/calendar.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 01977570a..00e7d54cc 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -110,10 +110,19 @@ function drawCalendar(date) { g.clearRect(0, 0, maxX, maxY); g.setBgColor(bgColorMonth); g.clearRect(0, 0, maxX, headerH); - g.setBgColor(bgColorDow); - g.clearRect(0, headerH, maxX, headerH + rowH); - g.setBgColor(bgColorWeekend); - g.clearRect(colW * 5, headerH + rowH, maxX, maxY); + if (settings.startOnSun){ + g.setBgColor(bgColorWeekend); + g.clearRect(0, headerH + rowH, colW, maxY); + g.setBgColor(bgColorDow); + g.clearRect(0, headerH, maxX, headerH + rowH); + g.setBgColor(bgColorWeekend); + g.clearRect(colW * 6, headerH + rowH, maxX, maxY); + } else { + g.setBgColor(bgColorDow); + g.clearRect(0, headerH, maxX, headerH + rowH); + g.setBgColor(bgColorWeekend); + g.clearRect(colW * 5, headerH + rowH, maxX, maxY); + } for (let y = headerH; y < maxY; y += rowH) { g.drawLine(0, y, maxX, y); } From 7119eda34566b87ac40d64dab8e7b2036ef0cfd1 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:09:36 -0500 Subject: [PATCH 199/503] Update app.js --- apps/slimehunt/app.js | 344 +++++++++++++++++++++++++++++------------- 1 file changed, 240 insertions(+), 104 deletions(-) diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js index 255399072..106b567c1 100644 --- a/apps/slimehunt/app.js +++ b/apps/slimehunt/app.js @@ -1,11 +1,26 @@ -//Create constants -const GREEN_SLIME = 1; //Normal slime, is always neutral. -const PINK_SLIME = 2; //Can get angry -const GRAY_SLIME = 3; //Can be neutral, angry or erratic -const YELLOW_SLIME = 4; //Is always erratic -const PURPLE_SLIME = 5; //Is always angry +//Create constants------------------------------------------------------------------ -//Initialize variables +//Slimes +const GREEN_SLIME = 1; //Normal slime, is always neutral. | 0% Item chance +const PINK_SLIME = 2; //Can get angry. | 10% Item chance +const GRAY_SLIME = 3; //Can be neutral, angry or erratic. | 20% Item chance +const YELLOW_SLIME = 4; //Is always erratic. | 50% Item chance +const PURPLE_SLIME = 5; //Is always angry. | 100% Item chance + +//Items +const ITEM_ATK_UP = 1; //Raises damage dealt by +1 for next battle +const ITEM_DEF_UP = 2; //Reduces all damage by +1 for next battle +const ITEM_HP_UP = 3; //Increases HP by 3 +const ITEM_BLOCK_UP = 4; //Raises defence when defending by from 3 to 5 for next battle +const ITEM_CRIT_UP = 5; //Gives attack a 20% chance to instantly KO slime for next battle + +//Base stats +const BASE_ATK = 1; +const BASE_DEF = 0; +const BASE_BLOCK = 3; +const BASE_CRIT = 0; + +//Initialize variables------------------------------------------------------------------ var playerHP = 20; var slimeHP = 3; var slimeType = GREEN_SLIME; @@ -16,6 +31,19 @@ var slimeState = 0; var showBattleResult = false; var dmgDealt = 0; var playerDefence = 0; +var playerItem = 0; +var critChance = 0; + +//Stats (Modifiers) +var statAtk = 1; +var statDef = 0; +var statBlock = 3; +var statCrit = 0; + +//Item vars +var itemName = ""; +var itemDesc = ""; +var itemChance = 0; var refreshInterval; var waitTime = 0; @@ -25,8 +53,8 @@ var score = 0; var themeNote = 0; -//Load files -var file = require("Storage").open("highscore.txt","r"); +//Load files------------------------------------------------------------------ +var file = require("Storage").open("highscore.txt", "r"); highscore = file.readLine(); if (highscore == undefined) highscore = 0; @@ -36,121 +64,150 @@ var graySlime = require("Storage").read("slimegray.img"); var yellowSlime = require("Storage").read("slimeyellow.img"); var purpleSlime = require("Storage").read("slimepurple.img"); -//UI Stuff +//UI Stuff------------------------------------------------------------------ function drawOpeningUI() { g.clear(); - g.setFont("Vector",screenWidth/15); - g.setFontAlign(0,0); // center font - g.drawString("SLIME HUNT",screenWidth/2,screenHeight*0.1); - g.drawString("-SCORE TO BEAT-",screenWidth/2,screenHeight*0.3); - g.drawString("<><><> "+highscore+" <><><>",screenWidth/2,screenHeight*0.45); - g.setFont("Vector",screenWidth/20); - g.drawString("A Slime approches...",screenWidth/2,screenHeight*0.6); - wait(8,waitForBattle); + g.setFont("Vector", screenWidth / 15); + g.setFontAlign(0, 0); // center font + g.drawString("SLIME HUNT", screenWidth / 2, screenHeight * 0.1); + g.drawString("-SCORE TO BEAT-", screenWidth / 2, screenHeight * 0.3); + g.drawString("<><><> " + highscore + " <><><>", screenWidth / 2, screenHeight * 0.45); + g.setFont("Vector", screenWidth / 20); + g.drawString("A Slime approches...", screenWidth / 2, screenHeight * 0.6); + wait(8, waitForBattle); } function drawSlime() { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: - g.drawImage(greenSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(greenSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case PINK_SLIME: - g.drawImage(pinkSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(pinkSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case GRAY_SLIME: - g.drawImage(graySlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(graySlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case YELLOW_SLIME: - g.drawImage(yellowSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(yellowSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case PURPLE_SLIME: - g.drawImage(purpleSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(purpleSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; } } function drawBattleUI() { g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("SLIME HP: " + slimeHP,screenWidth/2,screenHeight*0.1); - g.setFont("Vector",screenWidth/20); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("SLIME HP: " + slimeHP, screenWidth / 2, screenHeight * 0.1); + g.setFont("Vector", screenWidth / 20); if (!showBattleResult) { - switch(slimeState) { + switch (slimeState) { case 0: - g.drawString("The slime seems neutral...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems neutral...", screenWidth / 2, screenHeight * 0.25); + break; case 1: - g.drawString("The slime seems angry...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems angry...", screenWidth / 2, screenHeight * 0.25); + break; case 2: - g.drawString("The slime seems eratic...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems eratic...", screenWidth / 2, screenHeight * 0.25); + break; } - }else{ + } else { var brString = (turn == 0 ? "The Slime loses " : "You lose "); - g.drawString(brString + dmgDealt + "HP!",screenWidth/2,screenHeight*0.25); + g.drawString(brString + dmgDealt + "HP!", screenWidth / 2, screenHeight * 0.25); } drawSlime(); - g.drawLine(0,screenHeight*0.72,screenWidth,screenHeight*0.72); + g.drawLine(0, screenHeight * 0.72, screenWidth, screenHeight * 0.72); if (turn == 0) { - g.setFont("Vector",screenWidth/15); - g.drawString("Your HP is " + playerHP + ".",screenWidth/2,screenHeight*0.8); - g.setFont("Vector",screenWidth/20); - g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 15); + g.drawString("Your HP is " + playerHP + ".", screenWidth / 2, screenHeight * 0.8); + g.setFont("Vector", screenWidth / 20); + g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN", screenWidth / 2, screenHeight * 0.9); } } +//Win / lose functions------------------------------------------------------------------ function win() { - wait(5,winTheme); + wait(5, winTheme); calcScore(slimeType); showBattleResult = false; g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("YOU WON!",screenWidth/2,screenHeight/2); - g.setFont("Vector",screenWidth/20); - g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); - g.drawString("Press (B3) to find another slime!",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("YOU WON!", screenWidth / 2, screenHeight * 0.1); + g.drawLine(0, screenHeight * 0.2, screenWidth, screenHeight * 0.2); + g.setFont("Vector", screenWidth / 12); + g.drawString((playerItem == 0 ? "No Item." : "GOT ITEM!"), screenWidth / 2, screenHeight * 0.27); + g.setFont("Vector", screenWidth / 15); + g.drawString((playerItem == 0 ? "" : "<><> " + itemName + " <><>"), screenWidth / 2, screenHeight * 0.40); + g.setFont("Vector", screenWidth / 20); + g.drawString((playerItem == 0 ? "" : itemDesc), screenWidth / 2, screenHeight * 0.52); + g.drawLine(0, screenHeight * 0.6, screenWidth, screenHeight * 0.6); + g.drawString("Your score is << " + score + " >>", screenWidth / 2, screenHeight * 0.75); + g.drawString("Press (B3) to find another slime!", screenWidth / 2, screenHeight * 0.9); turn = 0; - setWatch(run,BTN3); + setWatch(run, BTN3); } function lose() { - wait(5,loseTheme); + wait(5, loseTheme); playerHP = 20; showBattleResult = false; g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("You lose...",screenWidth/2,screenHeight/2); - g.setFont("Vector",screenWidth/20); - g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); - g.drawString("Press (B3) to try again...",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("You lose...", screenWidth / 2, screenHeight * 0.1); + g.drawLine(0, screenHeight * 0.2, screenWidth, screenHeight * 0.2); + g.setFont("Vector", screenWidth / 12); + g.drawString((score > highscore ? "-NEW HIGHSCORE-" : "-SCORE TO BEAT-"), screenWidth / 2, screenHeight * 0.27); + g.setFont("Vector", screenWidth / 15); + g.drawString((score > highscore ? "<><> " + score + " <><>" : "<><> " + highscore + " <><>"), screenWidth / 2, screenHeight * 0.43); + g.drawLine(0, screenHeight * 0.6, screenWidth, screenHeight * 0.6); + g.setFont("Vector", screenWidth / 20); + g.drawString("Your score is << " + score + " >>", screenWidth / 2, screenHeight * 0.75); + g.drawString("Press (B3) to try again...", screenWidth / 2, screenHeight * 0.9); score = 0; turn = 0; - setWatch(run,BTN3); + setWatch(run, BTN3); } -//Battle Stuff +//Battle Stuff------------------------------------------------------------------ function nextTurn() { turn = (turn == 0 ? 1 : 0); } function slimeFight() { Bangle.beep(100, 500); - switch(slimeState) { + switch (slimeState) { case 0: dmgDealt = Math.floor(Math.random() * 2); - break; + break; case 1: dmgDealt = Math.floor(Math.random() * 3) + 3; - break; + break; case 2: dmgDealt = Math.floor(Math.random() * 6); - break; + break; } - dmgDealt = Math.max(0,dmgDealt - playerDefence); + dmgDealt = Math.max(0, dmgDealt - playerDefence); playerHP -= dmgDealt; slimeAI(); } @@ -158,22 +215,33 @@ function slimeFight() { function fight() { if (turn == 0 && waitTime <= 0) { Bangle.beep(100, 1000); - dmgDealt = 1; - playerDefence = 0; - slimeHP -= dmgDealt; + dmgDealt = statAtk; + playerDefence = statDef; + if (statCrit == 0) { + slimeHP -= dmgDealt; + }else{ + critChance = Math.floor(Math.random() * 100); + if (critChance >= 100-critStat) { + slimeHP = 0; + dmgDealt = 99; + }else{ + slimeHP -= dmgDealt; + } + critChance = 0; + } showBattleResult = true; drawBattleUI(); - wait(5,waitForTurn); + wait(5, waitForTurn); } } function defend() { if (turn == 0 && waitTime <= 0) { dmgDealt = 0; - playerDefence = 3; + playerDefence = statBlock + statDef; showBattleResult = true; drawBattleUI(); - wait(5,waitForTurn); + wait(5, waitForTurn); } } @@ -181,7 +249,7 @@ function run() { if (turn == 0 && waitTime <= 0) { showBattleResult = false; Bangle.beep(200, 4000); - wait(3,waitForBattle); + wait(3, waitForBattle); } } @@ -189,22 +257,23 @@ function run() { function newBattle() { showBattleResult = false; slimeType = Math.floor(Math.random() * 5) + 1; - switch(slimeType) { + useItem(); //Use item at start of new battle + switch (slimeType) { case GREEN_SLIME: slimeHP = 3; - break; + break; case PINK_SLIME: slimeHP = 3; - break; + break; case GRAY_SLIME: slimeHP = 5; - break; + break; case YELLOW_SLIME: slimeHP = 5; - break; + break; case PURPLE_SLIME: slimeHP = 5; - break; + break; } turn = 0; battle(); @@ -213,37 +282,87 @@ function newBattle() { } function battle() { - setWatch(fight,BTN1); - setWatch(defend,BTN2); - setWatch(run,BTN3); + setWatch(fight, BTN1); + setWatch(defend, BTN2); + setWatch(run, BTN3); } function slimeAI() { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: slimeState = 0; - break; + break; case PINK_SLIME: slimeState = Math.floor(Math.random() * 2); - break; + break; case GRAY_SLIME: slimeState = Math.floor(Math.random() * 3); - break; + break; case YELLOW_SLIME: slimeState = 2; - break; + break; case PURPLE_SLIME: slimeState = 1; break; } } +//Items------------------------------------------------------------------ +function getItem() { + playerItem = Math.floor(Math.random() * 5) + 1; + switch (playerItem) { + case ITEM_ATK_UP: + itemName = "Attack Up"; + itemDesc = "+1 damage next battle."; + break; + case ITEM_DEF_UP: + itemName = "Defence Up"; + itemDesc = "+1 defence next battle."; + break; + case ITEM_HP_UP: + itemName = "HP Up"; + itemDesc = "+3 HP."; + break; + case ITEM_BLOCK_UP: + itemName = "Block Up"; + itemDesc = "+2 block on DEFEND next battle."; + break; + case ITEM_CRIT_UP: + itemName = "Critical Up"; + itemDesc = "20% chance to crit next battle."; + break; + } +} +function useItem() { + statAtk = BASE_ATK; + statDef = BASE_DEF; + statBlock = BASE_BLOCK; + statCrit = BASE_CRIT; + switch (playerItem) { + case ITEM_ATK_UP: + statAtk = 2; + break; + case ITEM_DEF_UP: + statDef = 1; + break; + case ITEM_HP_UP: + playerHP += 3; + break; + case ITEM_BLOCK_UP: + statBlock = 5; + break; + case ITEM_CRIT_UP: + statCrit = 20; + break; + } + playerItem = 0; +} -//Timed transitions -function wait(duration,waitFunc) { - waitTime = duration; - if (!refreshInterval) - refreshInterval = setInterval(waitFunc, 500); +//Timed transitions------------------------------------------------------------------ +function wait(duration, waitFunc) { + waitTime = duration; + if (!refreshInterval) + refreshInterval = setInterval(waitFunc, 500); } function waitForTurn() { @@ -255,13 +374,13 @@ function waitForTurn() { if (playerHP > 0 && slimeHP > 0) { if (turn == 1) { slimeFight(); - wait(5,waitForTurn); - }else{ + wait(5, waitForTurn); + } else { showBattleResult = false; battle(); } drawBattleUI(); - }else{ + } else { if (playerHP <= 0) { lose(); } @@ -287,54 +406,71 @@ function waitForBattle() { function winTheme() { waitTime--; - Bangle.beep(200, 100*themeNote); + Bangle.beep(200, 100 * themeNote); themeNote++; if (waitTime <= 0) { themeNote = 0; clearInterval(refreshInterval); refreshInterval = undefined; + setWatch(run, BTN3); } Bangle.setLCDPower(1); } function loseTheme() { waitTime--; - Bangle.beep(200, 600-(100*themeNote)); + Bangle.beep(200, 600 - (100 * themeNote)); themeNote++; if (waitTime <= 0) { themeNote = 0; clearInterval(refreshInterval); refreshInterval = undefined; + setWatch(run, BTN3); } Bangle.setLCDPower(1); } -//Calculations +//Calculations------------------------------------------------------------------ function calcScore(slimeType) { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: score += 1; + //No items break; case PINK_SLIME: score += 2; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 10) { //100 - ITEM CHANCE % + getItem(); + } break; case GRAY_SLIME: - score += 2; + score += 3; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 25) { //100 - ITEM CHANCE % + getItem(); + } break; case YELLOW_SLIME: score += 5; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 50) { //100 - ITEM CHANCE % + getItem(); + } break; case PURPLE_SLIME: score += 10; + getItem(); break; } if (score > highscore) { file.erase(); - file = require("Storage").open("highscore.txt","w"); + file = require("Storage").open("highscore.txt", "w"); file.write(score); } } + //------------------------------------GAME STARTS HERE ----------------------------------------------- //Load opening UI From 48105f82432143e84bcdfb957e2a3f546ed2ea74 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:14:31 -0500 Subject: [PATCH 200/503] Update README.md --- apps/slimehunt/README.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 4cd6bc1ab..201c32ab3 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -26,18 +26,36 @@ ANGRY - Slime deals 3-5 damage on it's next attack. ERACTIC - Slime deals 0-5 damage on it's next attack. +============================<><>-ITEMS-<><>============================ + +Attack Up ++1 damage next battle. + +Defence Up ++1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. + +HP Up ++3 HP. + +Block Up ++2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. + +Critical Up +20% chance to crit next battle on each attack, instantly defeating the Slime. + +*****Using the RUN command causes you to lose your item!***** ============================<><>-SLIMES-<><>============================ -1. GREEN SLIME - Is always neutral. +1. GREEN SLIME - Is always neutral. | 0% chance of item. -2. RED SLIME - Can be either neutral or angry. +2. RED SLIME - Can be either neutral or angry. | 10% chance of item. -3. GRAY SLIME - Can be neutral, angry or eratic. +3. GRAY SLIME - Can be neutral, angry or eratic. | 20% chance of item. -4. YELLOW SLIME - Is always eratic. +4. YELLOW SLIME - Is always eratic. | 50% chance of item. -5. PURPLE SLIME - Is always angry. +5. PURPLE SLIME - Is always angry. | 100% chance of item. =========================================================================== From 9e131d2e7fa1db989e65e4cb29e74cba4cbeb01a Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:15:13 -0500 Subject: [PATCH 201/503] Update README.md --- apps/slimehunt/README.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 201c32ab3..c22525403 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -28,20 +28,15 @@ ERACTIC - Slime deals 0-5 damage on it's next attack. ============================<><>-ITEMS-<><>============================ -Attack Up -+1 damage next battle. +Attack Up - +1 damage next battle. -Defence Up -+1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. +Defence Up - +1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. -HP Up -+3 HP. +HP Up - +3 HP. -Block Up -+2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. +Block Up - +2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. -Critical Up -20% chance to crit next battle on each attack, instantly defeating the Slime. +Critical Up - 20% chance to crit next battle on each attack, instantly defeating the Slime. *****Using the RUN command causes you to lose your item!***** From bd5bb54b6f6aedc77c16d698030073d62e3fe79d Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:17:45 -0500 Subject: [PATCH 202/503] Create ChangeLog --- apps/slimehunt/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slimehunt/ChangeLog diff --git a/apps/slimehunt/ChangeLog b/apps/slimehunt/ChangeLog new file mode 100644 index 000000000..067add5a5 --- /dev/null +++ b/apps/slimehunt/ChangeLog @@ -0,0 +1 @@ +0.01: Public version is a go! From 7aedbaf07e430897e34fb09f309a2db475d39ad9 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:23:40 -0500 Subject: [PATCH 203/503] Update README.md --- apps/slimehunt/README.md | 68 ++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index c22525403..84d8f2b16 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -1,57 +1,77 @@ -=========================<><><><>-SLIME HUNT-<><><><>======================== +<><><><>-SLIME HUNT-<><><><> -Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. +Slime Hunt is a RPG turn-based style combat game +where you fight slimes until your HP runs out. The main goal is to beat your personal highscore! -=========================================================================== +============================ During each fight the player has 3 options, -BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. +BTN1) FIGHT +- Attacks the slime, dealing 1 hp worth of damage. -BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime attack. +BTN2) DEFEND +- Defends against the slime, blocking 3 damage from the next slime attack. -BTN3) RUN - Find a new slime to fight against. (This could change in the future!) +BTN3) RUN +- Find a new slime to fight against. (This could change in the future!) -=========================================================================== +============================ There are currently 5 types of slime each with unique behavior. -============================<><>-BEHAVIORS-<><>============================ +<><>-BEHAVIORS-<><> -NEUTRAL - Slime deals 0-1 damage on it's next attack. +1. NEUTRAL +- Slime deals 0-1 damage on it's next attack. -ANGRY - Slime deals 3-5 damage on it's next attack. +2. ANGRY +- Slime deals 3-5 damage on it's next attack. -ERACTIC - Slime deals 0-5 damage on it's next attack. +3. ERACTIC +- Slime deals 0-5 damage on it's next attack. -============================<><>-ITEMS-<><>============================ +<><>-ITEMS-<><> -Attack Up - +1 damage next battle. +1. Attack Up +- +1 damage next battle. -Defence Up - +1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. +2. Defence Up +- +1 defence next battle, stacks with block. +Setting defence to 4 when using DEFEND, and 1 otherwise. -HP Up - +3 HP. +3. HP Up +- +3 HP. -Block Up - +2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. +4. Block Up +- +2 block on DEFEND next battle, +setting Defence to 5 when using DEFEND command. -Critical Up - 20% chance to crit next battle on each attack, instantly defeating the Slime. +5. Critical Up +- 20% chance to crit next battle on each attack, +instantly defeating the Slime. *****Using the RUN command causes you to lose your item!***** -============================<><>-SLIMES-<><>============================ +<><>-SLIMES-<><> -1. GREEN SLIME - Is always neutral. | 0% chance of item. +1. GREEN SLIME +- Is always neutral. | 0% chance of item. -2. RED SLIME - Can be either neutral or angry. | 10% chance of item. +2. RED SLIME +- Can be either neutral or angry. | 10% chance of item. -3. GRAY SLIME - Can be neutral, angry or eratic. | 20% chance of item. +3. GRAY SLIME +- Can be neutral, angry or eratic. | 20% chance of item. -4. YELLOW SLIME - Is always eratic. | 50% chance of item. +4. YELLOW SLIME +- Is always eratic. | 50% chance of item. -5. PURPLE SLIME - Is always angry. | 100% chance of item. +5. PURPLE SLIME +- Is always angry. | 100% chance of item. -=========================================================================== +============================ Created by Colton LaChance! From 6b58c98be081547324292179e421931195a8cb01 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:51:43 -0500 Subject: [PATCH 204/503] Update apps.json --- apps.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/apps.json b/apps.json index 85d861a4d..b7102b45f 100644 --- a/apps.json +++ b/apps.json @@ -4875,22 +4875,6 @@ ], "data": [{"name":"ptlaunch.patterns.json"}] }, - { "id": "clicompleteclk", - "name": "CLI complete clock", - "shortName":"CLI cmplt clock", - "version":"0.02", - "description": "Command line styled clock with lots of information", - "icon": "app.png", - "allow_emulator": true, - "type": "clock", - "tags": "clock,cli,command,bash,shell,weather,hrt", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"clicompleteclk.app.js","url":"app.js"}, - {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} - ] - }, { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", From 8897c9aecc8d006a09f85915c970314d6cffc5ff Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:13:54 -0500 Subject: [PATCH 205/503] Update app.js --- apps/slimehunt/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js index 106b567c1..547ea7356 100644 --- a/apps/slimehunt/app.js +++ b/apps/slimehunt/app.js @@ -221,7 +221,7 @@ function fight() { slimeHP -= dmgDealt; }else{ critChance = Math.floor(Math.random() * 100); - if (critChance >= 100-critStat) { + if (critChance >= 100-statCrit) { slimeHP = 0; dmgDealt = 99; }else{ From c8041295cdc29f441b2f59e6495be5e309547583 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:15:16 -0500 Subject: [PATCH 206/503] Update ChangeLog --- apps/slimehunt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/slimehunt/ChangeLog b/apps/slimehunt/ChangeLog index 067add5a5..eb0cc5918 100644 --- a/apps/slimehunt/ChangeLog +++ b/apps/slimehunt/ChangeLog @@ -1 +1,2 @@ 0.01: Public version is a go! +0.02: Fixed bug where Critial Up wasn't letting player attack. From 5a2ca8219728f525fe0e3e6dd0f788bbd14f4d42 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:32:32 -0500 Subject: [PATCH 207/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b7102b45f..bc4b94522 100644 --- a/apps.json +++ b/apps.json @@ -4879,7 +4879,7 @@ "name": "Slime Hunt", "shortName":"SlimeHunt", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg,slime", "supports" : ["BANGLEJS"], From 9a58a14681f8c112266dde5726097cacbefe6db4 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 21 Dec 2021 21:46:30 +0000 Subject: [PATCH 208/503] swp2clk: Create Initial app with whitelist feature --- apps.json | 17 +++++ apps/swp2clk/ChangeLog | 1 + apps/swp2clk/README.md | 12 ++++ apps/swp2clk/app-icon.js | 1 + apps/swp2clk/app.pdn | Bin 0 -> 7005 bytes apps/swp2clk/app.png | Bin 0 -> 1569 bytes apps/swp2clk/boot.js | 92 +++++++++++++++++++++++++++ apps/swp2clk/settings.js | 133 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 256 insertions(+) create mode 100644 apps/swp2clk/ChangeLog create mode 100644 apps/swp2clk/README.md create mode 100644 apps/swp2clk/app-icon.js create mode 100644 apps/swp2clk/app.pdn create mode 100644 apps/swp2clk/app.png create mode 100644 apps/swp2clk/boot.js create mode 100644 apps/swp2clk/settings.js diff --git a/apps.json b/apps.json index e5e9f8f02..0a537d676 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "swp2clk", + "name": "Swipe back to the Clock", + "shortName": "Swipe to Clock", + "version": "0.01", + "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "swp2clk.boot.js", "url": "boot.js" }, + {"name":"swp2clk.settings.js","url":"settings.js"}, + { "name": "swp2clk.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"swp2clk.data.json"}] } ] diff --git a/apps/swp2clk/ChangeLog b/apps/swp2clk/ChangeLog new file mode 100644 index 000000000..ea6473980 --- /dev/null +++ b/apps/swp2clk/ChangeLog @@ -0,0 +1 @@ +0.01: Initial creation of "Swipe back to the Clock" App. Let's you swipe from left to right on any app to return back to the clock face. diff --git a/apps/swp2clk/README.md b/apps/swp2clk/README.md new file mode 100644 index 000000000..f6d0dd2b4 --- /dev/null +++ b/apps/swp2clk/README.md @@ -0,0 +1,12 @@ +# Swipe back to the Clock + +Let's you swipe from left to right on any app to return back to the clock face. + +## Configurable Modes: + +The swipe modes can be configured in the settings app, under "Swipe to Clock". + +- Always Off: Deactivated for all apps (Default) +- White List: Only activate for chosen apps, otherwise deactivated for all apps. +- Black List: Only disabled for chosen apps, otherwise activated for all apps. +- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) \ No newline at end of file diff --git a/apps/swp2clk/app-icon.js b/apps/swp2clk/app-icon.js new file mode 100644 index 000000000..e59cd6244 --- /dev/null +++ b/apps/swp2clk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4A2+cyiJABiMjn4WPiAVCDIUBDBsyiEBiUzAwMzkIHBl4tMBw/yBIIxKkIME+YEEiESIpMBkYGD+MfKQoMEEQcgiYHE+EPAwkxgRJG+RSGC4xJBNYwuGC44wCD4sRG4wXHCAweGC5JABQAhGHC5IpFiDIHC5HzgIEHC5oqE+JeHC5RgDmBkEC5vxgYXZkDdGC5fyLYSOIC5SLDC5MgQJAXDUxHygEAKREQC5XxC4KCIC8xHLO4/ziERiSPTmI4IC4rXGFwMTC5LXDmBsFFwLHINQUDC44uH+fc54XG+LlE+QuFnvM5gXDkArCMYYFCkYsECwIAHSBIsDC5cgLIoVMC4ZgFC6PziJIFLpYXDJA53PUY6nHZQMvEwwwIa4kxgQmHmUBXoYMHiAMJkJJJIoMSEZIMBgJTG+QJBERAOFiUzAwMzkIgIGJEAgERiIDBFpgYEmQVCiMjCx4AoA=")) \ No newline at end of file diff --git a/apps/swp2clk/app.pdn b/apps/swp2clk/app.pdn new file mode 100644 index 0000000000000000000000000000000000000000..60baf6cab3ff2c1a4c0ed0f096d691b636627b77 GIT binary patch literal 7005 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 LKL52a!)x_F<_%{L literal 0 HcmV?d00001 diff --git a/apps/swp2clk/app.png b/apps/swp2clk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..b964520e684ed24dbe4052cce745c2eea43921ff GIT binary patch literal 1569 zcmV++2HyFJP)Px#1ZP1_K>z@;j|==^1poj77Enx7MgRZ*{{H^@`ug?t_3`oX?(XjF?Ck67>-hNi z*Voslr>Agma7RZ+CMG5k5fKIk1}7&cadB~|sHoW3*!1-D-rnA$qoY$(QxXyq2?+@k z6B8R78zCVfC@3gYR8*v-q}|=!n3$M3IXMmv4j331FE1}!TU(Klk-53K+S=Oi@bLTl z`;d^3T3T8JEo?l3JMB5JUnY_Ye7Ll`T6;_wzfh-LbbKEQBhIc+}un|Odud2RaI5s;NUJU zE)*0LTwGjPSy`&8s*aA1a&mIJySuo!xJgM#BqSsvA|l({+XV#$B_$;Q001;JGy(zw z2L}f@I5;yiGrGFE3=9lEKR?sc(@IK84Gj%OMn=%k&=3$1)z#Ji*Vn77tN;7^|GT^Y zaB%-1ApZaW-{0SUetsMr9RKt4|EH(_TwMPU5SN#iR#sN6t*w21egEU*|Cg8lL`44x z2>;K||AT}7G&KMB_y25c|F5tAWMuyo6#u`!|0E>;)6@SrICXV(|C^itNJ!)3B2^e;OJZqN1WpOG}TBj~*T#Qc_ay@9&(PoCpXAS65d$gE8=cCr5lsMH#q&}s=> zqgDarTo*tRDXD3?^i6vGrp>x7TQdl9BMmSZGq+JD+H6T@m~@MoHqqOyM#H)i(w3EN zcjV;m$aCfw6y!Ve3U}r>?5-jsi2|emytssNdrG}5azNN!MIJZhDZ>>8@p;Rcib{VK zGI#Gm6~bB_2-bLg$P{2hwc)yYo6ytV98|%8EfNezL!xmxe9nf(Sd#`>kmhDofoS|K zfqfy#7{D8?*k9a=EDo^%Q?<1>)_TS3z{|re9g;yM0*oz-g==tRK*(aIE>+xrvH)xK z2ZJ5L?gCp$MZIYL97zI96A5%06O%GzQI$4SPmnCYy1J=S178Kk>;p~7CnFPpOt%XS zL0avdiSrVW2{3Jm-OsOr*ybpWSH#E#SeBzF-Y>|YbG&hn7zIIZ-$5rgCsnHHP|~?W z6a;L)X+Q-_bsD{c_lQvtV1v|<8WtLz`7rMgqa+wMk8r1jA2~Y8JJu*D9~&DiK!!lb zlFp?EL5+*Dgr}UEn4kxdA%Kt51T3_AhFgk+W0MmTlgE%D(8?Uw!a_j+PH+MjvILMo zJ|)n5a%^%^zISL!vPJtw+f64=WEaXNiWUvG^%U>mVN-Oc&j^_;25l=mxI*3$hn+fm z?)<1yeB$6>YUHk^20LASL3dGd;V+>Qrp9G%nq2bj;$4tw4^=(2rk|O;a&->X=TY)u z#CAtf+{1D0x@S5Ozi?ym<{Si>OO9LowITg>k8pu*-$C(r@7;gEMJEHBfYIglOIP`D z`4MWD!8IF-sOq&x;PLE}tFS?_dk7Z-jGjP5cxE0yefAtRDiMz%%Ys3_=pmbVapfgy zm%&HiHQ`v9^q#(2evLw;@U6i620q5gADX*w-^EvgwRW^OMpq>J!aescYtnNGS$Mzr zd@kP_t7wou_wd|9(Qq)*rI14(K7L|8zi~<@4Doquf`RT#F5x9;zkChUt**#ES#TYA zM { + var settings = readSettings(); + + if (settings.addSwipeHandler) { + var swipeHandler = (dir) => { + log("swipe"); + log(dir); + if (dir === 1) { + load(); + } + }; + Bangle.on("swipe", swipeHandler); + } + + var global_load = global.load; + global.load = (fileName) => { + log("loading filename!"); + log(fileName); + var settings = readSettings(); + + if (fileName) { + // "Off" + if (settings.mode === 0) { + settings.addSwipeHandler = false; + } + + // "White List" + if (settings.mode === 1) { + if (settings.whiteList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = true; + } else { + settings.addSwipeHandler = false; + } + } + + // "Black List" + if (settings.mode === 2) { + if (settings.blackList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = false; + } else { + settings.addSwipeHandler = true; + } + } + + // "Always" + if (settings.mode === 3) { + settings.addSwipeHandler = true; + } + } else { + // Clock will load + settings.addSwipeHandler = false; + } + + writeSettings(settings); + global_load(fileName); + }; + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + // start main function + + main(); +})(); diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js new file mode 100644 index 000000000..8af34fe68 --- /dev/null +++ b/apps/swp2clk/settings.js @@ -0,0 +1,133 @@ +(function (back) { + var DEBUG = true; + var FILE = "swp2clk.data.json"; + + var settings = {}; + + var showMainMenu = () => { + log("Loading main menu"); + + E.showMenu({ + "": { title: "Swipe to Clock" }, + "< Back": () => back(), + Mode: { + value: settings.mode, + min: 0, + max: 3, + format: (value) => ["Off", "White List", "Black List", "Always"][value], + onchange: (value) => { + settings.mode = value; + writeSettings(settings); + }, + }, + "White List": () => showWhiteListMenu(), + "Black List": () => {}, + }); + }; + + var showWhiteListMenu = () => { + var appList = getAppList(); + + var whiteListMenu = { + "": { title: "White List" }, + "< Back": () => showMainMenu(), + "_Add App_": () => { + var addAppMenu = { + "": { title: "Add to WL" }, + "< Back": () => showWhiteListMenu(), + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) < 0) { + addAppMenu[app.name] = () => { + settings.whiteList.push(app.src); + writeSettings(settings); + showWhiteListMenu(); + }; + } + }); + + E.showMenu(addAppMenu); + }, + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) >= 0) { + whiteListMenu[app.name] = () => { + E.showPrompt("Delete from WL?", { + title: "Delete from WL?", + buttons: { Yes: true, No: false }, + }).then(function (flag) { + if (flag) { + settings.whiteList.splice(index, 1); + writeSettings(settings); + } + + showWhiteListMenu(); + }); + }; + } + }); + + log("Loading white list menu"); + E.showMenu(whiteListMenu); + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + var getAppList = () => { + var appList = storage + .list(/\.info$/) + .map((appInfoFileName) => { + var appInfo = storage.readJSON(appInfoFileName, 1); + return ( + appInfo && { + name: appInfo.name, + // type: appInfo.type, + // icon: appInfo.icon, + sortorder: appInfo.sortorder, + src: appInfo.src, + } + ); + }) + .filter((app) => app && !!app.src); + appList.sort((a, b) => { + var n = (0 | a.sortorder) - (0 | b.sortorder); + if (n) return n; // do sortorder first + if (a.name < b.name) return -1; + if (a.name > b.name) return 1; + return 0; + }); + + return appList; + }; + + // start main function + + settings = readSettings(); + showMainMenu(); +}); From a90315ef45c3eadf7ebb95b6359671b2dbba1357 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 21 Dec 2021 22:12:30 +0000 Subject: [PATCH 209/503] swp2clk: Add blacklist feature --- apps/swp2clk/settings.js | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index 8af34fe68..1e29e5a6c 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -21,7 +21,7 @@ }, }, "White List": () => showWhiteListMenu(), - "Black List": () => {}, + "Black List": () => showBlackListMenu(), }); }; @@ -33,7 +33,7 @@ "< Back": () => showMainMenu(), "_Add App_": () => { var addAppMenu = { - "": { title: "Add to WL" }, + "": { title: "Add app to WL" }, "< Back": () => showWhiteListMenu(), }; @@ -73,6 +73,54 @@ E.showMenu(whiteListMenu); }; + var showBlackListMenu = () => { + var appList = getAppList(); + + var blackListMenu = { + "": { title: "Black List" }, + "< Back": () => showMainMenu(), + "_Add App_": () => { + var addAppMenu = { + "": { title: "Add app to BL" }, + "< Back": () => showBlackListMenu(), + }; + + appList.forEach((app) => { + if (settings.blackList.indexOf(app.src) < 0) { + addAppMenu[app.name] = () => { + settings.blackList.push(app.src); + writeSettings(settings); + showBlackListMenu(); + }; + } + }); + + E.showMenu(addAppMenu); + }, + }; + + appList.forEach((app) => { + if (settings.blackList.indexOf(app.src) >= 0) { + blackListMenu[app.name] = () => { + E.showPrompt("Delete from BL?", { + title: "Delete from BL?", + buttons: { Yes: true, No: false }, + }).then(function (flag) { + if (flag) { + settings.blackList.splice(index, 1); + writeSettings(settings); + } + + showBlackListMenu(); + }); + }; + } + }); + + log("Loading black list menu"); + E.showMenu(blackListMenu); + }; + // lib functions var log = (message) => { From 3c510db6a8ee8f65a8b270be7f4feaa383a8693a Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:25:01 +0100 Subject: [PATCH 210/503] Create app.js --- apps/supf/app.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 apps/supf/app.js diff --git a/apps/supf/app.js b/apps/supf/app.js new file mode 100644 index 000000000..6f9d264a0 --- /dev/null +++ b/apps/supf/app.js @@ -0,0 +1,56 @@ +require("Font7x11Numeric7Seg").add(Graphics); + +function draw() { + var d = new Date(); + //d.setHours(22); + //d.setMinutes(22); + //d.setMonth(2); + var size = Math.floor(g.getWidth()/(7*6)); + var x = (g.getWidth()/2) - size*6, + y = (g.getHeight()/2) - size*7 - 0; + var y_dop = 70 - 0; + g.reset().clearRect(0,y,g.getWidth(),y+size*12+8); + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + //g.drawString(d.getHours()+''+("0"+d.getMinutes()).substr(-2)+''+("0"+d.getSeconds()).substr(-2), x+size*28, y); + if (d.getHours() == '0') { + g.drawString('0'+d.getHours(), 58, y); + } + else { + g.drawString(d.getHours(), 58, y); + } + //g.setFontAlign(-1,-1); + g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); + g.drawString(":",64,y_dop); + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + g.drawString(("0"+d.getMinutes()).substr(-2),118,y); + g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); + g.drawString(":",124,y_dop); + // draw seconds + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + g.drawString(("0"+d.getSeconds()).substr(-2),178,y); + // date + g.setFont("6x8",size/2).setFontAlign(0,-1); + var s_date_string = d.getDate()+' '+require('locale').month(new Date()); + g.drawString(require('locale').dow(new Date()),g.getWidth()/2, y + size*16); + g.drawString(s_date_string,g.getWidth()/2, y + size*20); + g.drawString((d.getFullYear()),g.getWidth()/2, y + size*24); + +} +// Only update when display turns on +if (process.env.BOARD!="SMAQ3") // hack for Q3 which is always-on +Bangle.on('lcdPower', function(on) { + if (secondInterval) + clearInterval(secondInterval); + secondInterval = undefined; + if (on) + secondInterval = setInterval(draw, 1000); + draw(); +}); + +g.clear(); +var secondInterval = setInterval(draw, 1000); +draw(); +// Show launcher when button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From 519330adc09f895a155386c1f1cd9025eac036dd Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:33:32 +0100 Subject: [PATCH 211/503] Create app-icon.js --- apps/supf/app-icon.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/supf/app-icon.js diff --git a/apps/supf/app-icon.js b/apps/supf/app-icon.js new file mode 100644 index 000000000..e05e934b2 --- /dev/null +++ b/apps/supf/app-icon.js @@ -0,0 +1,2 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +} From b753c119f180dd0845b7cb9704d96fcf615bc1af Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:39:11 +0100 Subject: [PATCH 212/503] Create supf.info --- apps/supf/supf.info | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/supf.info diff --git a/apps/supf/supf.info b/apps/supf/supf.info new file mode 100644 index 000000000..c8b613049 --- /dev/null +++ b/apps/supf/supf.info @@ -0,0 +1 @@ +{"id":"supf","name":"Simple Clock with seconds and Date in custom language","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From 71200f68216aeb3c31825d6de81042d7ab0a61f4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:39:36 +0100 Subject: [PATCH 213/503] Create readme.md --- apps/supf/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/readme.md diff --git a/apps/supf/readme.md b/apps/supf/readme.md new file mode 100644 index 000000000..0001ad69c --- /dev/null +++ b/apps/supf/readme.md @@ -0,0 +1 @@ +Simple Clock with seconds and Date in custom language From d3e914a9e14b3d3f4fbcf165f057dcb6cac920d4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:46:38 +0100 Subject: [PATCH 214/503] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..0ce8a78cd 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "supf", + "name": "supf Simple Clock with seconds and Date in custom language", + "shortName": "supf Clock", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"supf.app.js","url":"app.js"}, + {"name":"supf.img","url":"app-icon.js","evaluate":true}, + {"name":"supf.info","url":"supf.info","evaluate":true} + ] } ] From 1b5b3016c2394d3599765b9cd1eccdf5588e2391 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:11:42 +0100 Subject: [PATCH 215/503] Update app.js --- apps/supf/app.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/supf/app.js b/apps/supf/app.js index 6f9d264a0..d7a30aed9 100644 --- a/apps/supf/app.js +++ b/apps/supf/app.js @@ -2,26 +2,24 @@ require("Font7x11Numeric7Seg").add(Graphics); function draw() { var d = new Date(); - //d.setHours(22); - //d.setMinutes(22); - //d.setMonth(2); var size = Math.floor(g.getWidth()/(7*6)); var x = (g.getWidth()/2) - size*6, y = (g.getHeight()/2) - size*7 - 0; + // y variable for ':' var y_dop = 70 - 0; - g.reset().clearRect(0,y,g.getWidth(),y+size*12+8); + g.reset().clearRect(0,y,g.getWidth(),y+size*28); + // draw hours in 24h format g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); - //g.drawString(d.getHours()+''+("0"+d.getMinutes()).substr(-2)+''+("0"+d.getSeconds()).substr(-2), x+size*28, y); - if (d.getHours() == '0') { + if (d.getHours().toString.length < 2) { g.drawString('0'+d.getHours(), 58, y); } else { g.drawString(d.getHours(), 58, y); } - //g.setFontAlign(-1,-1); g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); g.drawString(":",64,y_dop); g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + // draw minutes g.drawString(("0"+d.getMinutes()).substr(-2),118,y); g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); g.drawString(":",124,y_dop); @@ -30,9 +28,11 @@ function draw() { g.drawString(("0"+d.getSeconds()).substr(-2),178,y); // date g.setFont("6x8",size/2).setFontAlign(0,-1); - var s_date_string = d.getDate()+' '+require('locale').month(new Date()); + // draw name of day g.drawString(require('locale').dow(new Date()),g.getWidth()/2, y + size*16); - g.drawString(s_date_string,g.getWidth()/2, y + size*20); + // draw date and name of month + g.drawString(d.getDate()+' '+require('locale').month(new Date()),g.getWidth()/2, y + size*20); + // draw year g.drawString((d.getFullYear()),g.getWidth()/2, y + size*24); } From 9719b1277fc71801312358b1d9fda05c1a80e6c6 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:13:20 +0100 Subject: [PATCH 216/503] Update readme.md --- apps/supf/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/supf/readme.md b/apps/supf/readme.md index 0001ad69c..e4008556e 100644 --- a/apps/supf/readme.md +++ b/apps/supf/readme.md @@ -1 +1,2 @@ Simple Clock with seconds and Date in custom language +ATTENTION: requires Languages app From f5bcf45e36ae3fd152a45eace60ada7512b7b70c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:22:36 +0100 Subject: [PATCH 217/503] Update supf.info --- apps/supf/supf.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/supf.info b/apps/supf/supf.info index c8b613049..dc0a49a0d 100644 --- a/apps/supf/supf.info +++ b/apps/supf/supf.info @@ -1 +1 @@ -{"id":"supf","name":"Simple Clock with seconds and Date in custom language","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} +{"id":"supf","name":"Simple Clock with Date","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From da33ef1cbed22cefdbd886af5acb2cdf950d68c5 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:25:29 +0100 Subject: [PATCH 218/503] Add files via upload --- apps/supf/screenshot_supf.png | Bin 0 -> 10477 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/supf/screenshot_supf.png diff --git a/apps/supf/screenshot_supf.png b/apps/supf/screenshot_supf.png new file mode 100644 index 0000000000000000000000000000000000000000..18e391f28287c45e6d12dafbc3da4ce2868c4cd2 GIT binary patch literal 10477 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 literal 0 HcmV?d00001 From bdc066ed79e96c211b9f27b33b82a9479eca5d64 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:26:49 +0100 Subject: [PATCH 219/503] Update readme.md --- apps/supf/readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/supf/readme.md b/apps/supf/readme.md index e4008556e..5b80152c3 100644 --- a/apps/supf/readme.md +++ b/apps/supf/readme.md @@ -1,2 +1,4 @@ -Simple Clock with seconds and Date in custom language +# Simple Clock with seconds and Date in custom language ATTENTION: requires Languages app + +![](screenshot_supf.png) From e4c8f3991385e681ac7c9764ae7b8d273ac785d3 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:27:52 +0100 Subject: [PATCH 220/503] Create ChangeLog --- apps/supf/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/ChangeLog diff --git a/apps/supf/ChangeLog b/apps/supf/ChangeLog new file mode 100644 index 000000000..55ebb3e4b --- /dev/null +++ b/apps/supf/ChangeLog @@ -0,0 +1 @@ +0.01: New App From a5c69fba73310b484aff5d61ac49a30eb996ce9c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:30:21 +0100 Subject: [PATCH 221/503] Add files via upload --- apps/supf/icon.png | Bin 0 -> 7090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/supf/icon.png diff --git a/apps/supf/icon.png b/apps/supf/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca4d6140129667bdc4900b5a580a7ae189cec88 GIT binary patch literal 7090 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 Date: Wed, 22 Dec 2021 01:31:24 +0100 Subject: [PATCH 222/503] Create icon.js --- apps/supf/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js new file mode 100644 index 000000000..2b555d7d0 --- /dev/null +++ b/apps/supf/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA"))} From 1192e0e2a7b7facf32c17324ccb4e8cff4a51c6f Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:31:59 +0100 Subject: [PATCH 223/503] Delete app-icon.js --- apps/supf/app-icon.js | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 apps/supf/app-icon.js diff --git a/apps/supf/app-icon.js b/apps/supf/app-icon.js deleted file mode 100644 index e05e934b2..000000000 --- a/apps/supf/app-icon.js +++ /dev/null @@ -1,2 +0,0 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) -} From 85e3bf2584447c4816ea1beec382dc931e138ec7 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:37:49 +0100 Subject: [PATCH 224/503] Update apps.json --- apps.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 0ce8a78cd..6d51a941d 100644 --- a/apps.json +++ b/apps.json @@ -5063,21 +5063,22 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { + { "id": "supf", - "name": "supf Simple Clock with seconds and Date in custom language", - "shortName": "supf Clock", + "name": "Simple Clock with Date", + "shortName": "supf", "version": "0.01", - "description": "Displays the current temperature in localized units.", - "icon": "thermf.png", + "description": "Simple Clock with seconds and Date in custom language. \nATTENTION: requires Languages app", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_supf.png"}], + "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], "allow_emulator": true, "readme": "README.md", "storage": [ {"name":"supf.app.js","url":"app.js"}, - {"name":"supf.img","url":"app-icon.js","evaluate":true}, - {"name":"supf.info","url":"supf.info","evaluate":true} + {"name":"supf.img","url":"icon.js","evaluate":true}, ] } ] From ad95c35a7e8bdd7e72b7c9d43f3a2ad90ca96843 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:39:36 +0100 Subject: [PATCH 225/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6d51a941d..8d08a8bc2 100644 --- a/apps.json +++ b/apps.json @@ -5078,7 +5078,7 @@ "readme": "README.md", "storage": [ {"name":"supf.app.js","url":"app.js"}, - {"name":"supf.img","url":"icon.js","evaluate":true}, + {"name":"supf.img","url":"icon.js","evaluate":true} ] } ] From 15f622e0d815f04ca6fe72af86800c984454def9 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:45:05 +0100 Subject: [PATCH 226/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8d08a8bc2..c25de913f 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Simple Clock with Date", "shortName": "supf", "version": "0.01", - "description": "Simple Clock with seconds and Date in custom language. \nATTENTION: requires Languages app", + "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", "screenshots": [{"url":"screenshot_supf.png"}], "type": "clock", From 3626918d5a77f5ff579e5ea99fe545ec7d2af4b2 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:51:33 +0100 Subject: [PATCH 227/503] Rename readme.md to README.md --- apps/supf/{readme.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/supf/{readme.md => README.md} (100%) diff --git a/apps/supf/readme.md b/apps/supf/README.md similarity index 100% rename from apps/supf/readme.md rename to apps/supf/README.md From 8ae2de3f255fcb48a5bd2be3e6f9058b2f4b936c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:00:26 +0100 Subject: [PATCH 228/503] Update icon.js --- apps/supf/icon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index 2b555d7d0..e05e934b2 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1,2 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA"))} +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +} From 9c3373f7093a56d90a5e1e031c9bda70cfaa952e Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:02:37 +0100 Subject: [PATCH 229/503] Update icon.js --- apps/supf/icon.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index e05e934b2..60df6e9c7 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1,2 +1 @@ require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) -} From 705a0aa0cae13968097588b4a904bbec0ae25a59 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:10:55 +0100 Subject: [PATCH 230/503] Delete icon.js --- apps/supf/icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js deleted file mode 100644 index 60df6e9c7..000000000 --- a/apps/supf/icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) From c07495cbb6b804f48259d37edc966e1279b83d56 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:13:05 +0100 Subject: [PATCH 231/503] Create icon.js --- apps/supf/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js new file mode 100644 index 000000000..60df6e9c7 --- /dev/null +++ b/apps/supf/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) From c51098a6d0bdbfcade2fd7d373df625e7edc94ab Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:16:09 +0100 Subject: [PATCH 232/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c25de913f..9d54f1d79 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "supf", "name": "Simple Clock with Date", - "shortName": "supf", + "shortName": "supf Clock", "version": "0.01", "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", From 29780f398bf61d9ad4f53a272714785b69853db8 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:19:38 +0100 Subject: [PATCH 233/503] Delete supf.info --- apps/supf/supf.info | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/supf/supf.info diff --git a/apps/supf/supf.info b/apps/supf/supf.info deleted file mode 100644 index dc0a49a0d..000000000 --- a/apps/supf/supf.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"supf","name":"Simple Clock with Date","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From 62fe33b42f5780170e1fc3d6dabe80d1724e4ed4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:19:58 +0100 Subject: [PATCH 234/503] Update icon.js --- apps/supf/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index 60df6e9c7..c06a65409 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +require("heatshrink").decompress(atob("ogA/AH4A/AElAdbgcEDq46FgEEQX5HGACZbBDjQeCDrocbAH4A/AH4A0gX/AAPzgEBAoX/BgIFDiEAn4FCkAdFgYXEDpQXBAocwDow4BHwIIDEAIdCHAIdDAQM/Dp4UBAQodxmYABDrK5DDrY7BmQdaPRAd4d6CPESo4ACDoQACDowXDHwMBDpI+Bn4jEAH4A/AH4A/AB9ADjcEogdbogA+K7oddWyywBDzQcHAH4A/AGAA=")) From 6cb5bd5da9df302d823bc460f0582a2faee2724e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 21 Dec 2021 22:08:05 -0500 Subject: [PATCH 235/503] Initial commit of DirAct app --- apps.json | 17 ++ apps/diract/ChangeLog | 1 + apps/diract/README.md | 28 ++ apps/diract/diract-icon.js | 1 + apps/diract/diract.js | 548 +++++++++++++++++++++++++++++++++++++ apps/diract/diract.png | Bin 0 -> 1784 bytes 6 files changed, 595 insertions(+) create mode 100644 apps/diract/ChangeLog create mode 100644 apps/diract/README.md create mode 100644 apps/diract/diract-icon.js create mode 100644 apps/diract/diract.js create mode 100644 apps/diract/diract.png diff --git a/apps.json b/apps.json index f5be04136..58693208b 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "diract", + "name": "DirAct", + "shortName": "DirAct", + "version": "0.01", + "description": "Proximity interaction detection.", + "icon": "diract.png", + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": false, + "readme": "README.md", + "storage": [ + { "name": "diract.app.js", "url": "diract.js" }, + { "name": "diract.img", "url": "diract-icon.js", "evaluate": true } + ] } ] diff --git a/apps/diract/ChangeLog b/apps/diract/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/diract/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/diract/README.md b/apps/diract/README.md new file mode 100644 index 000000000..efecade3f --- /dev/null +++ b/apps/diract/README.md @@ -0,0 +1,28 @@ +# DirAct + +[DirAct](https://www.reelyactive.com/diract/) implementation for the Bangle.js. + + +## Usage + +Real-time interactions will be recognised by [Pareto Anywhere](https://www.reelyactive.com/pareto/anywhere/) open source middleware and any other program which observes the [DirAct open standard](https://reelyactive.github.io/diract/). + + +## Features + +Currently implements DirAct real-time functionality. + + +## Controls + +None. + + +## Requests + +[Contact reelyActive](https://www.reelyactive.com/contact/) for support/updates. + + +## Creator + +Developed by [jeffyactive](https://github.com/jeffyactive) of [reelyActive](https://www.reelyactive.com). DirAct is jointly developed by reelyActive and Code Blue Consulting. diff --git a/apps/diract/diract-icon.js b/apps/diract/diract-icon.js new file mode 100644 index 000000000..e351d09bf --- /dev/null +++ b/apps/diract/diract-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4AImUQgMjBpIAI+UQFAMBn4XRmJBDiYXRFwQwCC9HzF93/kAXDgSPWj4XRMAZGSDAUhiTWSAH4Ag+URAAUvRBkSAofxgUzmchX4khSw3ygIID+UiFwMiF4bIBGowIBiYvEmUjF4kxEwgABmU/mMCC4cBiUhiAXDkET+cjC4cgj5IE+MAI4MAC4RGCHQIXEgRREF44kCCIIeCDoIIBMAYkDHQJeDEwJBBn/xgYGBn8hC5cS+YoBmEfFoP/IoMxgYXJmETJIISBj/zgBOBDgITCSgYXDBoYUCDQIXBiYXNBIIXBA4IXHI44XEJIJHIC5JHEVwRkBO5qKBbYqPGgMikTXDmKPDEAPyAIJJCX4cAAAQXDIoQtBl6IEGIIXJFoYmCSAQ4BSYIXJRYJWBDQIACkM/eYQXJdYcSC4fzG4J2CC5MwK4I+CAAR4BLwQXJBwowDiQfDC5HzLAIXFGwoXILAQALC5IANC/4X/C+w")) \ No newline at end of file diff --git a/apps/diract/diract.js b/apps/diract/diract.js new file mode 100644 index 000000000..dba41cccb --- /dev/null +++ b/apps/diract/diract.js @@ -0,0 +1,548 @@ +/** + * Copyright reelyActive 2017-2021 + * We believe in an open Internet of Things + * + * DirAct is jointly developed by reelyActive and Code Blue Consulting + */ + +// User-configurable constants +const INSTANCE_ID = [ 0x00, 0x00, 0x00, 0x01 ]; +const NAMESPACE_FILTER_ID = [ 0xc0, 0xde, 0xb1, 0x0e, 0x1d, + 0xd1, 0xe0, 0x1b, 0xed, 0x0c ]; +const EXCITER_INSTANCE_IDS = new Uint32Array([ 0xe8c17e45 ]); +const RESETTER_INSTANCE_IDS = new Uint32Array([ 0x4e5e77e4 ]); +const PROXIMITY_RSSI_THRESHOLD = -65; +const PROXIMITY_LED_RSSI_THRESHOLD = -65; +const PROXIMITY_TABLE_SIZE = 8; +const DIGEST_TABLE_SIZE = 32; +const OBSERVE_PERIOD_MILLISECONDS = 400; +const BROADCAST_PERIOD_MILLISECONDS = 3600; +const BROADCAST_DIGEST_PAGE_MILLISECONDS = 400; +const PROXIMITY_PACKET_INTERVAL_MILLISECONDS = 400; +const DIGEST_PACKET_INTERVAL_MILLISECONDS = 100; +const DIGEST_TIME_CYCLE_THRESHOLD = 86400; +const EXCITER_HOLDOFF_SECONDS = 60; +const BLINK_ON_PROXIMITY = true; +const BLINK_ON_DISTANCING = true; +const BLINK_ON_DIGEST = true; +const BLINK_ON_RESET = true; + + +// Eddystone protocol constants +const EDDYSTONE_UUID = 'feaa'; +const EDDYSTONE_UID_FRAME = 0x00; +const EDDYSTONE_NAMESPACE_OFFSET = 2; +const EDDYSTONE_NAMESPACE_LENGTH = 10; +const EDDYSTONE_INSTANCE_OFFSET = 14; + + +// DirAct constants +const DIRACT_MANUFACTURER_ID = 0x0583; // Code Blue Consulting +const DIRACT_PROXIMITY_FRAME = 0x01; +const DIRACT_DIGEST_FRAME = 0x11; +const DIRACT_DEFAULT_COUNT_LENGTH = 0x07; +const DIRACT_INSTANCE_LENGTH = 4; +const DIRACT_INSTANCE_OFFSET = 2; +const MAX_NUMBER_STRONGEST = 3; +const MAX_BATTERY_VOLTAGE = 3.3; +const MIN_BATTERY_VOLTAGE = 3.0; +const MAX_RSSI_TO_ENCODE = -28; +const MIN_RSSI_TO_ENCODE = -92; +const MAX_ACCELERATION_TO_ENCODE = 2; +const MAX_ACCELERATION_MAGNITUDE = 0x1f; +const INVALID_ACCELERATION_CODE = 0x20; +const SCAN_OPTIONS = { + filters: [ + { manufacturerData: { 0x0583: {} } }, + { services: [ EDDYSTONE_UUID ] } + ] +}; + + +// Other constants +const BITS_PER_BYTE = 8; +const DUMMY_INSTANCE_ID = 0; +const DUMMY_RSSI = MIN_RSSI_TO_ENCODE; + + +// Global variables +let proximityInstances = new Uint32Array(PROXIMITY_TABLE_SIZE); +let proximityRssis = new Int8Array(PROXIMITY_TABLE_SIZE); +let digestInstances = new Uint32Array(DIGEST_TABLE_SIZE); +let digestCounts = new Uint16Array(DIGEST_TABLE_SIZE); +let digestTime = new Uint8Array([ 0, 0, 0 ]); +let numberOfDigestPages = 0; +let sensorData = [ 0x82, 0x08, 0x3f ]; +let cyclicCount = 0; +let lastDigestTime = Math.round(getTime()); +let lastResetTime = Math.round(getTime()); +let isExciterPresent = false; +let isResetterPresent = false; +let isProximityDetected = false; +let menu = { + "": { "title": "-- DirAct --" } +}; + + +/** + * Initiate observer mode, scanning for devices in proximity. + */ +function observe() { + proximityInstances.fill(DUMMY_INSTANCE_ID); // Reset proximity + proximityRssis.fill(DUMMY_RSSI); // table data + isExciterPresent = false; + isResetterPresent = false; + + NRF.setScan(handleDiscoveredDevice, SCAN_OPTIONS); // Start scanning + setTimeout(broadcast, OBSERVE_PERIOD_MILLISECONDS); // ...until period end +} + + +/** + * Compile the scan results and initiate broadcaster mode, advertising either + * proximity or digest packets, in consequence. + */ +function broadcast() { + NRF.setScan(); // Stop scanning + + let sortedProximityIndices = getSortedIndices(proximityRssis); + + updateDigestTable(sortedProximityIndices); + updateSensorData(); + + let currentTime = Math.round(getTime()); + let isExcited = isExciterPresent && + ((currentTime - lastDigestTime) > EXCITER_HOLDOFF_SECONDS); + + if(isResetterPresent) { + if(BLINK_ON_RESET) { + Bangle.setLCDPower(true); + } + lastResetTime = currentTime; + resetDigest(); + broadcastProximity(sortedProximityIndices); + } + else if(isExcited) { + let sortedDigestIndices = getSortedIndices(digestCounts); + compileDigest(); + broadcastDigest(sortedDigestIndices, 0); + } + else { + broadcastProximity(sortedProximityIndices); + } +} + + +/** + * Initiate broadcaster mode advertising proximity packets. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function broadcastProximity(sortedIndices) { + let advertisingOptions = { + interval: PROXIMITY_PACKET_INTERVAL_MILLISECONDS, + showName: false, + manufacturer: DIRACT_MANUFACTURER_ID + }; + + advertisingOptions.manufacturerData = compileProximityData(sortedIndices); + NRF.setAdvertising({}, advertisingOptions); // Start advertising + setTimeout(observe, BROADCAST_PERIOD_MILLISECONDS); // ...until period end +} + + +/** + * Initiate broadcaster mode advertising digest packets. + * @param {TypedArray} sortedIndices The sorted digest table indices. + * @param {Number} pageNumber The page number to broadcast. + */ +function broadcastDigest(sortedIndices, pageNumber) { + let isLastPage = (pageNumber === (numberOfDigestPages - 1)); + let advertisingOptions = { + interval: DIGEST_PACKET_INTERVAL_MILLISECONDS, + showName: false, + manufacturer: DIRACT_MANUFACTURER_ID + }; + + advertisingOptions.manufacturerData = compileDigestData(sortedIndices, + pageNumber); + NRF.setAdvertising({}, advertisingOptions); // Start advertising + + if(isLastPage) { + setTimeout(observe, BROADCAST_DIGEST_PAGE_MILLISECONDS); + if(getTime() > DIGEST_TIME_CYCLE_THRESHOLD) { + lastResetTime = Math.round(getTime()); + resetDigest(); + } + if(BLINK_ON_DIGEST) { + Bangle.setLCDPower(true); + } + } + else { + setTimeout(broadcastDigest, BROADCAST_DIGEST_PAGE_MILLISECONDS, + sortedIndices, ++pageNumber); + } +} + + +/** + * Handle the given device discovered on scan and process further if + * Eddystone-UID or DirAct. + * @param {BluetoothDevice} device The discovered device. + */ +function handleDiscoveredDevice(device) { + let isEddystone = (device.hasOwnProperty('services') && + device.hasOwnProperty('serviceData') && + (device.services[0] === EDDYSTONE_UUID)); + let isManufacturer = (device.hasOwnProperty('manufacturer') && + device.manufacturer === DIRACT_MANUFACTURER_ID); + + if(isEddystone) { + let isEddystoneUID = (device.serviceData[EDDYSTONE_UUID][0] === + EDDYSTONE_UID_FRAME); + if(isEddystoneUID) { + handleEddystoneUidDevice(device.serviceData[EDDYSTONE_UUID], device.rssi); + } + } + else if(isManufacturer) { + let isDirAct = ((device.manufacturerData[0] === DIRACT_PROXIMITY_FRAME) || + (device.manufacturerData[0] === DIRACT_DIGEST_FRAME)); + if(isDirAct) { + handleDirActDevice(device.manufacturerData, device.rssi); + } + } +} + + +/** + * Handle the given Eddystone-UID device, adding to the devices in range if + * it meets the filter criteria. + * @param {Array} serviceData The Eddystone service data. + * @param {Number} rssi The received signal strength. + */ +function handleEddystoneUidDevice(serviceData, rssi) { + for(let cByte = 0; cByte < EDDYSTONE_NAMESPACE_LENGTH; cByte++) { + let namespaceIndex = EDDYSTONE_NAMESPACE_OFFSET + cByte; + if(serviceData[namespaceIndex] !== NAMESPACE_FILTER_ID[cByte]) { + return; + } + } + + let instanceId = 0; + let bitShift = (DIRACT_INSTANCE_LENGTH - 1) * BITS_PER_BYTE; + + for(let cByte = 0; cByte < DIRACT_INSTANCE_LENGTH; cByte++) { + let instanceByte = serviceData[EDDYSTONE_INSTANCE_OFFSET + cByte]; + instanceId += instanceByte << bitShift; + bitShift -= BITS_PER_BYTE; + } + + let unsignedInstanceId = new Uint32Array([instanceId])[0]; + + if(EXCITER_INSTANCE_IDS.indexOf(unsignedInstanceId) >= 0) { + isExciterPresent = true; + } + else if(RESETTER_INSTANCE_IDS.indexOf(unsignedInstanceId) >= 0) { + isResetterPresent = true; + } + else { + updateProximityTable(instanceId, rssi); + } +} + + +/** + * Handle the given DirAct device, adding to the devices in range if + * it meets the filter criteria. + * @param {Array} manufacturerData The DirAct manufacturer data. + * @param {Number} rssi The received signal strength. + */ +function handleDirActDevice(manufacturerData, rssi) { + let instanceId = 0; + let bitShift = (DIRACT_INSTANCE_LENGTH - 1) * BITS_PER_BYTE; + + for(let cByte = DIRACT_INSTANCE_OFFSET; + cByte < DIRACT_INSTANCE_OFFSET + DIRACT_INSTANCE_LENGTH; cByte++) { + let instanceByte = manufacturerData[cByte]; + instanceId += instanceByte << bitShift; + bitShift -= BITS_PER_BYTE; + } + + updateProximityTable(instanceId, rssi); +} + + +/** + * Update the proximity table with the given instance's RSSI. If the instance + * already exists, combine RSSI values in a weighted average. + * @param {String} instanceId The DirAct 4-byte instance id as a 32-bit integer. + * @param {Number} rssi The received signal strength. + */ +function updateProximityTable(instanceId, rssi) { + let instanceIndex = proximityInstances.indexOf(instanceId); + let isNewInstance = (instanceIndex < 0); + + if(isNewInstance) { + let nextIndex = proximityInstances.indexOf(DUMMY_INSTANCE_ID); + if(nextIndex >= 0) { + proximityInstances[nextIndex] = instanceId; + proximityRssis[nextIndex] = rssi; + } + } + else { + proximityRssis[instanceIndex] = (proximityRssis[instanceIndex] + rssi) / 2; + } +} + + +/** + * Update the digest table based on the proximity table and its sorted indices. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function updateDigestTable(sortedIndices) { + for(let cInstance = 0; cInstance < PROXIMITY_TABLE_SIZE; cInstance++) { + let proximityIndex = sortedIndices[cInstance]; + + if(proximityRssis[proximityIndex] >= PROXIMITY_RSSI_THRESHOLD) { + let instanceId = proximityInstances[proximityIndex]; + let instanceIndex = digestInstances.indexOf(instanceId); + let isNewInstance = (instanceIndex < 0); + + if(isNewInstance) { + let nextIndex = digestInstances.indexOf(DUMMY_INSTANCE_ID); + if(nextIndex >= 0) { + digestInstances[nextIndex] = instanceId; + digestCounts[nextIndex] = 1; + } + } + else if(digestCounts[instanceIndex] < 65535) { + digestCounts[instanceIndex]++; + } + } + else { + cInstance = PROXIMITY_TABLE_SIZE; // Break + } + } +} + + +/* + * Compile the digest from the digest table. + */ +function compileDigest() { + let numberOfEntries = digestCounts.findIndex(count => count === 0); + let currentTime = Math.round(getTime()); + let elapsedTime = currentTime - lastResetTime; + if(numberOfEntries < 0) { + numberOfEntries = DIGEST_TABLE_SIZE; + } + digestTime[0] = (elapsedTime >> 16) & 0xff; + digestTime[1] = (elapsedTime >> 8) & 0xff; + digestTime[2] = elapsedTime & 0xff; + numberOfDigestPages = Math.max(1, Math.min(8, Math.ceil(numberOfEntries/3))); + lastDigestTime = currentTime; +} + + +/* + * Clear the digest table. + */ +function resetDigest() { + digestInstances.fill(DUMMY_INSTANCE_ID); + digestCounts.fill(0); +} + + +/** + * Compile the DirAct proximity data. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function compileProximityData(sortedIndices) { + let data = [ + DIRACT_PROXIMITY_FRAME, DIRACT_DEFAULT_COUNT_LENGTH, + INSTANCE_ID[0], INSTANCE_ID[1], INSTANCE_ID[2], INSTANCE_ID[3], + sensorData[0], sensorData[1], sensorData[2] + ]; + let isNewProximityDetected = false; + + for(let cInstance = 0; cInstance < MAX_NUMBER_STRONGEST; cInstance++) { + let index = sortedIndices[cInstance]; + + if(proximityRssis[index] >= PROXIMITY_RSSI_THRESHOLD) { + let instanceId = proximityInstances[index]; + data.push((instanceId >> 24) & 0xff, (instanceId >> 16) & 0xff, + (instanceId >> 8) & 0xff, instanceId & 0xff, + encodeRssi(proximityRssis[index])); + if(proximityRssis[index] >= PROXIMITY_LED_RSSI_THRESHOLD) { + isNewProximityDetected = true; + } + } + else { + cInstance = PROXIMITY_TABLE_SIZE; // Break + } + } + + cyclicCount = (cyclicCount + 1) % 8; + + data[1] = (cyclicCount << 5) + (data.length - 2); + + if(isProximityDetected && !isNewProximityDetected && BLINK_ON_DISTANCING) { + Bangle.setLCDPower(true); + } + else if(isNewProximityDetected && BLINK_ON_PROXIMITY) { + Bangle.setLCDPower(true); + } + isProximityDetected = isNewProximityDetected; + + return data; +} + + +/** + * Compile the DirAct digest data. + * @param {TypedArray} sortedIndices The sorted digest table indices. + * @param {Number} digestPage The page of the digest to compile. + */ +function compileDigestData(sortedIndices, digestPage) { + let isLastPage = (digestPage === (numberOfDigestPages - 1)); + + let digestStatus = digestTime[0] & 0x7f; + if(isLastPage) { + digestStatus |= 0x80; + } + + let data = [ + DIRACT_DIGEST_FRAME, DIRACT_DEFAULT_COUNT_LENGTH, + INSTANCE_ID[0], INSTANCE_ID[1], INSTANCE_ID[2], INSTANCE_ID[3], + digestStatus, digestTime[1], digestTime[2] + ]; + let pageIndex = digestPage * 3; + + for(let cInstance = pageIndex; cInstance < (pageIndex + 3); cInstance++) { + let index = sortedIndices[cInstance]; + + if(digestCounts[index] > 0) { + let instanceId = digestInstances[index]; + let encodedCount = digestCounts[index]; + if(encodedCount > 127) { + encodedCount = 0x80 | (Math.min((encodedCount >> 8), 0x7f) & 0x7f); + } + data.push((instanceId >> 24) & 0xff, (instanceId >> 16) & 0xff, + (instanceId >> 8) & 0xff, instanceId & 0xff, + encodedCount); + } + else { + cInstance = pageIndex + 3; // Break + } + } + + data[1] = (digestPage << 5) + (data.length - 2); + + return data; +} + + +/** + * Encode the given RSSI. + * @param {Number} rssi The given RSSI. + * @return {Number} The encoded RSSI. + */ +function encodeRssi(rssi) { + rssi = Math.round(rssi); + + if(rssi >= MAX_RSSI_TO_ENCODE) { + return 0x3f; + } + if(rssi <= MIN_RSSI_TO_ENCODE) { + return 0x00; + } + return rssi - MIN_RSSI_TO_ENCODE; +} + + +/** + * Encode the battery percentage. + * @return {Number} The battery percentage. + */ +function encodeBatteryPercentage() { + let voltage = NRF.getBattery(); + + if(voltage <= MIN_BATTERY_VOLTAGE) { + return 0x00; + } + if(voltage >= MAX_BATTERY_VOLTAGE) { + return 0x3f; + } + + return Math.round(0x3f * (voltage - MIN_BATTERY_VOLTAGE) / + (MAX_BATTERY_VOLTAGE - MIN_BATTERY_VOLTAGE)); +} + + +/** + * Encode the acceleration. + * @return {Array} The encoded acceleration [ x, y, z ]. + */ +function encodeAcceleration() { + let encodedAcceleration = { x: INVALID_ACCELERATION_CODE, + y: INVALID_ACCELERATION_CODE, + z: INVALID_ACCELERATION_CODE }; + + let acceleration = { x: Bangle.getAccel().x, + y: Bangle.getAccel().y, + z: Bangle.getAccel().z }; + + for(let axis in acceleration) { + let magnitude = acceleration[axis]; + let encodedMagnitude = Math.min(MAX_ACCELERATION_MAGNITUDE, + Math.round(MAX_ACCELERATION_MAGNITUDE * + (Math.abs(magnitude) / + MAX_ACCELERATION_TO_ENCODE))); + if(magnitude < 0) { + encodedMagnitude = 0x3f - encodedMagnitude; + } + encodedAcceleration[axis] = encodedMagnitude; + } + + return encodedAcceleration; +} + + +/** + * Update the sensor data (battery & acceleration) for the advertising packet. + */ +function updateSensorData() { + + // Update the battery measurement each time the cyclic count resets + if(cyclicCount === 0) { + encodedBattery = encodeBatteryPercentage(); + } + + encodedAcceleration = encodeAcceleration(); + + sensorData[0] = ((encodedAcceleration.x << 2) & 0xfc) | + ((encodedAcceleration.y >> 4) & 0x3f); + sensorData[1] = ((encodedAcceleration.y << 4) & 0xf0) | + ((encodedAcceleration.z >> 2) & 0x0f); + sensorData[2] = ((encodedAcceleration.z << 6) & 0xc0) | + (encodedBattery & 0x3f); +} + + +/** + * Determine the sorted order of the indices of the given array. + * @return {Uint8Array} The array of indices sorted in descending order. + */ +function getSortedIndices(unsortedArray) { + let sortedIndices = new Uint8Array(unsortedArray.length); + + sortedIndices.forEach((value, index) => sortedIndices[index] = index); + sortedIndices.sort((a, b) => unsortedArray[b] - unsortedArray[a]); + + return sortedIndices; +} + + +// On start: begin DirAct operation and display the menu +g.clear(); +E.showMenu(menu); +observe(); diff --git a/apps/diract/diract.png b/apps/diract/diract.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c099786f5b6d8398825feb62cee4b890d67e8 GIT binary patch literal 1784 zcmX|Cc{tly7bcb}(Z*iFAe2zFN^M^)ZR|8+`K&{9l?a-OK@&R-siky7M@x!9$6AJ} zqLvVQMJy3Zo7#ubl!msZ=BM+0{o~yG-1|J|ocF%(d!9={A??IP6-4>?_{1ITt=)kA z)Io@VfORS`>^5onzOhaG#JpaNIZ zPUF{4?lT6r5 zr|sJmSjNZoWXMADl027?P!X3gKFz8Z-Y%1hbkC_co$hE zdc)5eU7w5T%~BdoX;4ETNW69IM5WJ^qsepwmast2!61n_6zWNI8(7J#0spSkRn64( z`ISEI`(C>-M!GZDzdf!Mk$S{cj(Y0G?8{$BUwNU12ATBkH?(v)c4H{?7w+YVjp`yKCWW~3lldB>)QNc>E-ItVY>(fsLATo)jHNk)DHJKqhg$9$!RngNylUD)SkDi7 zQ>jk5dOpX6#AGvw6q-(?(>I{?Xu&oNf#9sO>IHgEZ|31w8<9XGGvYQTeR%QW8nfcT z2`?jwiPRY=*rzGF zGWwL14F0gY^OJwwrCSA>E>98^2%4V(1Oe@F8`-Dn6W!y#dv$>lRlDkMZY{l?5$P=M znIV@XTk&@$-BYp7f@6iJ0yVDrh(nDkBR8g7A~(M5a*M0{Y68stqc-P49|2^d0TmwV z`aLnZ0n<@A;f?TX3KMT4G3gMG7ydsUvaLSE2d!n1$zb`UOOt0~cHac@R>ykXP_8*Tv%V=uW0}NNY!`l(< z{n~FSbY*p{41hNMKZDraHxvlz7C>0w_WXhB$%l?kCqApvk5HI-aYJCT0^6Y5Q=3qg z(?rE%B^c+vn-c>2p0pxgPnXm24y0%m36B*MuZorH?QG7E^!Eo(RzE%p-jt9PX^gGA zM1zqVLs(DscN%k#fP_TEkVz2JrzP@%U6%*f2tjz$!ZSEo`5gjnh+P@b`ekt-ceuhf zQz8E?FmtIwAVeFA^l5F;W*^xNIKP$H-wFT04+^M~oS)|t@!^rbG9B!T5v~V@LA$lr zl(2Nn`SdWY*6O)iucY#D--kR#b_4`&<$d7jn+GZmUa3(fZ36R}1;skv8YL|0<3e1W zPu)IpF|n3vUt*~Kql>k}pOBd97|Wk!P=`vWxS1Dq)30}XGNI!W!Q;=AOz9))Xv&>{)$X~J}bX08@|HTdgned#W11mB-9PHsqwBDFvOU6>$W17KfX&1%A z2i5{r*%y{mqdCNeP_~ir=wT@hxMVYdldq5j43DNn^DE(;&TKqqeZC#-@HZ=!c#X`V z{Fh%03HySExk3Al*V%*MMX0<&c;3Fz{h&Rg`{?g+2mH5yla!0gT`hJP@T2iL*dVQ| I&j%*`1M&S_MgRZ+ literal 0 HcmV?d00001 From 0de5a23736eaa4a8152cba314dfbcecf2d817b62 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 22 Dec 2021 08:45:13 +0100 Subject: [PATCH 236/503] Fix: Gadgedbridge freezes screen --- apps/lcars/lcars.app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9068868f0..2104c6f7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -30,6 +30,7 @@ let cWhite = "#FFFFFF"; let lcarsViewPos = 0; let drag; let hrmValue = 0; +var connected = NRF.getSecurityStatus().connected; /* * Requirements and globals @@ -311,13 +312,6 @@ function draw(){ // First handle alarm to show this correctly afterwards handleAlarm(); - // Clear data - var current = new Date(); - if(current.getHours() == 0 && current.getMinutes() == 0){ - stepsData = new Array(24).fill(0); - hrmData = new Array(24).fill(0); - } - // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); @@ -396,7 +390,13 @@ function handleAlarm(){ */ Bangle.on('lcdPower',on=>{ if (on) { - draw(); // draw immediately, queue redraw + // Whenever we connect to Gadgetbridge, reading data from + // health failed. Therefore, we update and read data from + // health iff the connection state did not change. + if(connected == NRF.getSecurityStatus().connected) { + draw(); // draw immediately, queue redraw + } + connected = NRF.getSecurityStatus().connected } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; From 63850e74b3461f67f05e3d1dd6348e494b58141b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Wed, 22 Dec 2021 08:48:07 +0100 Subject: [PATCH 237/503] Added Support for messages --- apps.json | 2 +- apps/hcclock/ChangeLog | 5 ++-- apps/hcclock/README.md | 1 + apps/hcclock/hcclock.app.js | 51 +++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..e3d9a5314 100644 --- a/apps.json +++ b/apps.json @@ -4064,7 +4064,7 @@ { "id": "hcclock", "name": "Hi-Contrast Clock", - "version": "0.02", + "version": "0.03", "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", "icon": "hcclock-icon.png", "type": "clock", diff --git a/apps/hcclock/ChangeLog b/apps/hcclock/ChangeLog index aaa55d01a..f70653d58 100644 --- a/apps/hcclock/ChangeLog +++ b/apps/hcclock/ChangeLog @@ -1,2 +1,3 @@ -0.01: base code -0.02: saved settings when switching color scheme \ No newline at end of file +0.01: Base code +0.02: Saved settings when switching color scheme +0.03: Added Button 3 opening messages (if app is installed) \ No newline at end of file diff --git a/apps/hcclock/README.md b/apps/hcclock/README.md index 328f1fe03..122401dd8 100644 --- a/apps/hcclock/README.md +++ b/apps/hcclock/README.md @@ -5,6 +5,7 @@ A High-contrast, black-on-white or white-on-black clock displaying huge pixel di ## Usage * BTN 1 switches between the two modes : black-on-white or white-on-black +* BTN 3 opens the messages (if installed, and there are new messages) * That's it! ## Issues and Requests diff --git a/apps/hcclock/hcclock.app.js b/apps/hcclock/hcclock.app.js index 4664dd763..623b28f13 100644 --- a/apps/hcclock/hcclock.app.js +++ b/apps/hcclock/hcclock.app.js @@ -129,6 +129,7 @@ function updateTime() g.setFontAlign(0, -1, 0); g.drawString(fmtDate(d,mo,y,hour), 120, 120); } + drawMessages(); } function drawDigits(x, value) @@ -222,6 +223,55 @@ function flipColors() setColorScheme(0); } +////////////////////////////////////////// +// +// MESSAGE HANDLING() +// + +let messages_installed = require("Storage").read("messages.app.js") != undefined; + +function handleMessages() +{ + if(messages_installed && hasMessages() > 0) + { + E.showMessage("Loading Messages..."); + load("messages.app.js"); + } +} + +function hasMessages() +{ + if(!messages_installed) + return false; + + var messages = require("Storage").readJSON("messages.json",1)||[]; + if (messages.some(m=>m.new)) + return true; + else + return false; +} + +let msg = atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA=="); +let had_messages = false; + +function drawMessages() +{ + if(!had_messages && hasMessages()) { + g.setColor(255,255,255); + g.drawImage(msg, 200, 206); + g.setFont("6x8", 2); + g.setFontAlign(0, -1, 0); + g.drawString(">", 224, 210); + had_messages = true; + } + else if (had_messages && !hasMessages()) + { + g.setColor(255,0,0); + g.fillRect(200, 200, 240, 240); + had_messages = false; + } +} + ////////////////////////////////////////// // // MAIN FUNCTION() @@ -238,6 +288,7 @@ setInterval(updateTime, interval); // Handle Button Press setWatch(flipColors, BTN1, true); setWatch(Bangle.showLauncher, BTN2, false); +setWatch(handleMessages, BTN3, true); // Handle redraw on LCD on / fullscreen notifications dismissed Bangle.on('lcdPower', (on) => { if(on) redraw(); }); From 07049c4d880a82a6a5554d4bafe41c8392245357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Wed, 22 Dec 2021 09:01:41 +0100 Subject: [PATCH 238/503] Fixed position of icon --- apps/hcclock/hcclock.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/hcclock/hcclock.app.js b/apps/hcclock/hcclock.app.js index 623b28f13..de5163996 100644 --- a/apps/hcclock/hcclock.app.js +++ b/apps/hcclock/hcclock.app.js @@ -258,16 +258,16 @@ function drawMessages() { if(!had_messages && hasMessages()) { g.setColor(255,255,255); - g.drawImage(msg, 200, 206); + g.drawImage(msg, 184, 212); g.setFont("6x8", 2); g.setFontAlign(0, -1, 0); - g.drawString(">", 224, 210); + g.drawString(">", 224, 216); had_messages = true; } else if (had_messages && !hasMessages()) { - g.setColor(255,0,0); - g.fillRect(200, 200, 240, 240); + g.setColor(0,0,0); + g.fillRect(180, 210, 240, 240); had_messages = false; } } From 1cf197df6faf28c23f666bfe107657c930bc574d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 22 Dec 2021 12:28:01 +0100 Subject: [PATCH 239/503] Sitch between month / 24h --- apps/lcars/lcars.app.js | 113 +++++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 37 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 2104c6f7f..afbca2b8b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -31,6 +31,7 @@ let lcarsViewPos = 0; let drag; let hrmValue = 0; var connected = NRF.getSecurityStatus().connected; +var plotWeek = false; /* * Requirements and globals @@ -270,36 +271,71 @@ function drawPosition1(){ } // Plot HRM graph - var data = new Uint16Array(32); - var cnt = new Uint8Array(32); - health.readDailySummaries(new Date(), h=>{ - data[h.day]+=h.bpm; - if (h.bpm) cnt[h.day]++; - }); - require("graph").drawBar(g, data, { - axes : true, - minx: 1, - gridx : 4, - gridy : 100, - width : 140, - height : 50, - x: 5, - y: 25 - }); + if(plotWeek){ + var data = new Uint16Array(32); + var cnt = new Uint8Array(32); + health.readDailySummaries(new Date(), h=>{ + data[h.day]+=h.bpm; + if (h.bpm) cnt[h.day]++; + }); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 5, + gridy : 100, + width : 140, + height : 50, + x: 5, + y: 25 + }); - // Plot step graph - var data = new Uint16Array(32); - health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); - require("graph").drawBar(g, data, { - axes : true, - minx: 1, - gridx : 4, - gridy : 5, - width : 140, - height : 50, - x: 5, - y: 115 - }); + // Plot step graph + var data = new Uint16Array(32); + health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 5, + gridy : 5, + width : 140, + height : 50, + x: 5, + y: 115 + }); + + // Plot day + } else { + var data = new Uint16Array(24); + var cnt = new Uint8Array(24); + health.readDay(new Date(), h=>{ + data[h.hr]+=h.bpm; + if (h.bpm) cnt[h.hr]++; + }); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 4, + gridy : 100, + width : 140, + height : 50, + x: 5, + y: 25 + }); + + // Plot step graph + var data = new Uint16Array(24); + health.readDay(new Date(), h=>data[h.hr]+=h.steps); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 4, + gridy : 1000, + width : 140, + height : 50, + x: 5, + y: 115 + }); + } g.setFontAntonioMedium(); g.setColor(cWhite); @@ -394,13 +430,14 @@ Bangle.on('lcdPower',on=>{ // health failed. Therefore, we update and read data from // health iff the connection state did not change. if(connected == NRF.getSecurityStatus().connected) { - draw(); // draw immediately, queue redraw + draw(); } - connected = NRF.getSecurityStatus().connected } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; } + + connected = NRF.getSecurityStatus().connected }); Bangle.on('lock', function(isLocked) { @@ -456,14 +493,16 @@ Bangle.on("drag", e => { // Vertical swipe } else if (Math.abs(dy)>Math.abs(dx)+10) { - if(lcarsViewPos != 0){ - return; + if(lcarsViewPos == 0){ + if(dy > 0){ + decreaseAlarm(); + } else { + increaseAlarm(); + } } - if(dy > 0){ - decreaseAlarm(); - } else { - increaseAlarm(); + if(lcarsViewPos == 1){ + plotWeek = dy < 0 } } From 56a42fb0648c88da743fa5e19822d6cc9410d044 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:37:16 +0100 Subject: [PATCH 240/503] note longer needed --- apps/andark/add_to_apps.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 apps/andark/add_to_apps.json diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json deleted file mode 100644 index 57613f9d2..000000000 --- a/apps/andark/add_to_apps.json +++ /dev/null @@ -1,15 +0,0 @@ -{ "id": "andark", - "name": "Analog Dark", - "shortName":"AnDark", - "version":"0.01", - "description": "analog clock face without disturbing widgets", - "icon": "andark_icon.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"anrark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} - ] -} From 1533180617f82e4e0be6c4c52d1e86eff78cd28a Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 15:36:40 +0100 Subject: [PATCH 241/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 9d54f1d79..c15511dd2 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Simple Clock with Date", "shortName": "supf Clock", "version": "0.01", - "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", + "description": "Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", "screenshots": [{"url":"screenshot_supf.png"}], "type": "clock", From 21324ec224791802506a466de8d9438749881491 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 15:39:21 +0100 Subject: [PATCH 242/503] Update README.md --- apps/supf/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/supf/README.md b/apps/supf/README.md index 5b80152c3..258a69d4b 100644 --- a/apps/supf/README.md +++ b/apps/supf/README.md @@ -1,4 +1,4 @@ -# Simple Clock with seconds and Date in custom language -ATTENTION: requires Languages app +# Simple Clock with Date +Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names. ![](screenshot_supf.png) From f0a2767c8c4d1a8b2b41c9900617bed358270700 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:24:51 +0100 Subject: [PATCH 243/503] changed update on lock changed update on lock, so that the display only refreshes after 60 seconds (banglejs2) --- apps/andark/app.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps/andark/app.js b/apps/andark/app.js index cf248d462..2a2c4b29d 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -1,5 +1,6 @@ const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; let zahlpos=[]; +let unlock = true; function zeiger(len,dia,tim){ const x =c.x+ Math.cos(tim)*len/2, @@ -41,9 +42,11 @@ function draw(){ // g.setColor(1,1,1); const minz = zeiger(150,5,m); g.fillPoly(minz,true); + if (unlock){ const sekz = zeiger(150,2,s); g.fillPoly(sekz,true); g.fillCircle(c.x,c.y,4); + } } @@ -90,6 +93,7 @@ g.setBgColor(0,0,0); g.clear(); drawScale(); draw(); + let secondInteraval= setInterval(draw, 1000); // Stop updates when LCD is off, restart when on @@ -102,6 +106,19 @@ Bangle.on('lcdPower',on=>{ }else{ } }); +Bangle.on('lock',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (!on) { + secondInterval = setInterval(draw, 1000); + unlock = true; + draw(); // draw immediately + }else{ + secondInterval = setInterval(draw, 60000); + unlock = false; + draw(); + } + }); // Show launcher when middle button pressed Bangle.setUI("clock"); From 967812c05f4d3ec17b0147bfb705d82d17c4d783 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:33:19 +0900 Subject: [PATCH 244/503] AwairMonitor: the app is now a clock, data is greyed when connection is lost --- apps/awairmonitor/app.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/apps/awairmonitor/app.js b/apps/awairmonitor/app.js index a5a1d1a72..9123a9c2c 100644 --- a/apps/awairmonitor/app.js +++ b/apps/awairmonitor/app.js @@ -30,6 +30,8 @@ var bt_temp_history = new Array(10).fill(0); var internal_last_update = -1; +var display_frozen = false; + function draw() { g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); @@ -47,14 +49,8 @@ function draw() { g.drawString("Humi", 125, 100); g.drawString("Temp", 160, 100); - g.setFont("HaxorNarrow7x17"); - g.drawString(""+bt_current_co2, 18, 110); - g.drawString(""+bt_current_voc, 53, 110); - g.drawString(""+bt_current_pm25, 88, 110); - g.drawString(""+bt_current_humi, 123, 110); - g.drawString(""+bt_current_temp, 158, 110); - if (last_update != bt_last_update) { + display_frozen = false; last_update = bt_last_update; internal_last_update = last_update; if (last_update % 10 == 0) { @@ -65,16 +61,29 @@ function draw() { bt_temp_history.shift(); bt_temp_history.push(bt_current_temp); } } - + if (internal_last_update == -1) { g.drawString("Waiting for connection", 88, 164); - } else if (internal_last_update > last_update + 5) { + } else if ((internal_last_update > last_update + 5) && (internal_last_update < last_update + 60)) { g.drawString("Trying to reconnect since " + (internal_last_update - last_update), 88, 164); + } else if (internal_last_update > last_update + 5) { + display_frozen = true; + g.drawString("Waiting for connection", 88, 164); } + if (display_frozen) { g.setColor("#888"); } + + g.setFont("HaxorNarrow7x17"); + g.drawString(""+bt_current_co2, 18, 110); + g.drawString(""+bt_current_voc, 53, 110); + g.drawString(""+bt_current_pm25, 88, 110); + g.drawString(""+bt_current_humi, 123, 110); + g.drawString(""+bt_current_temp, 158, 110); for (i = 0; i < 10; i++) { - // max height = 32 + if (display_frozen) { g.setColor("#888"); } + + // max height = 32 g.drawLine(10+i*2, 150-(Math.min(Math.max(bt_co2_history[i],400), 1200)-400)/25, 10+i*2, 150); g.drawLine(45+i*2, 150-(Math.min(Math.max(bt_voc_history[i],0), 1440)-0)/45, 45+i*2, 150); g.drawLine(80+i*2, 150-(Math.min(Math.max(bt_pm25_history[i],0), 32)-0)/1, 80+i*2, 150); @@ -91,6 +100,7 @@ function draw() { } // init +Bangle.setUI("clock"); require("FontHaxorNarrow7x17").add(Graphics); g.clear(); Bangle.loadWidgets(); From 28fb84422383a1d36e931a058fa9160b4f1c2af3 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:34:05 +0900 Subject: [PATCH 245/503] Update ChangeLog --- apps/awairmonitor/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/awairmonitor/ChangeLog b/apps/awairmonitor/ChangeLog index 0cc9a42b0..88e9690d8 100644 --- a/apps/awairmonitor/ChangeLog +++ b/apps/awairmonitor/ChangeLog @@ -1 +1,2 @@ 0.01: Beta version for Bangle 2 paired with Chrome (2021/12/11) +0.02: The app is now a clock, the data is greyed after the connection is lost (2021/12/22) From 4f709d0d4b9fa60dac5c56be1ee11aa009056f86 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:35:51 +0900 Subject: [PATCH 246/503] Update apps.json --- apps.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..bf5e8c77f 100644 --- a/apps.json +++ b/apps.json @@ -4931,10 +4931,12 @@ "id":"awairmonitor", "name":"Awair Monitor", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, - "version":"0.01", + "version":"0.02", "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "tool,health", + "type": "clock", + "tags": "clock,tool,health", "readme":"README.md", "supports":["BANGLEJS2"], "storage": [ From ad6ed2496e6b97eb66e376caaee835863c5c2b89 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:49:50 +0100 Subject: [PATCH 247/503] fixed wrong spelling in variable name --- apps/andark/app.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/andark/app.js b/apps/andark/app.js index 2a2c4b29d..efa00ce6f 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -1,6 +1,6 @@ const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; let zahlpos=[]; -let unlock = true; +let unlock = false; function zeiger(len,dia,tim){ const x =c.x+ Math.cos(tim)*len/2, @@ -45,8 +45,9 @@ function draw(){ if (unlock){ const sekz = zeiger(150,2,s); g.fillPoly(sekz,true); - g.fillCircle(c.x,c.y,4); } + g.fillCircle(c.x,c.y,4); + } @@ -94,7 +95,7 @@ g.clear(); drawScale(); draw(); -let secondInteraval= setInterval(draw, 1000); +let secondInterval= setInterval(draw, 1000); // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ @@ -122,6 +123,3 @@ Bangle.on('lock',on=>{ // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); From 4e41b3a2b03a685e89d8f35598e858b9ae355d0a Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:50:53 +0100 Subject: [PATCH 248/503] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 91bbd190f..341868930 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1,3 +1,4 @@ 0.01: Release 0.02: Rename app 0.03: Add type "clock" +0.04: changed update cylce, when locked From b9660042230976ef111dbab228a3847471aa708f Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:56:10 +0100 Subject: [PATCH 249/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5675c30d5..b067b59cb 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.03", + "version":"0.04", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "type": "clock", From 7912a8e0a5312bcbbdd852765c3ffc1e6a10cebe Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 17:02:28 +0100 Subject: [PATCH 250/503] removed banglejs1 support can't test if it's working correkt on banglejs1 --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b067b59cb..9fefe6701 100644 --- a/apps.json +++ b/apps.json @@ -5071,7 +5071,7 @@ "icon": "andark_icon.png", "type": "clock", "tags": "clock", - "supports" : ["BANGLEJS","BANGLEJS2"], + "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"andark.app.js","url":"app.js"}, From 83ced79ec8cf916eba9b56462ae032ddac1de34b Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 20:53:37 +0100 Subject: [PATCH 251/503] Create widget.js --- apps/widviztime/widget.js | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 apps/widviztime/widget.js diff --git a/apps/widviztime/widget.js b/apps/widviztime/widget.js new file mode 100644 index 000000000..5e81af611 --- /dev/null +++ b/apps/widviztime/widget.js @@ -0,0 +1,53 @@ +(() => { + + var saved = null; + + + function hide() { + if (!Bangle.isLCDOn() || saved) return; + saved = []; + for (var wd of WIDGETS) { + saved.push({ + d: wd.draw, + a: wd.area + }); + wd.draw = () => {}; + wd.area = ""; + } + g.setColor(0, 0, 0); + g.fillRect(0, 0, g.getWidth(), 23); + } + + function reveal() { + if (!Bangle.isLCDOn() || !saved) return; + for (var wd of WIDGETS) { + var o = saved.shift(); + wd.draw = o.d; + wd.area = o.a; + } + Bangle.drawWidgets(); + saved = null; + } + + function draw() { + g.setColor(0x07ff); + g.drawImage(atob("GBgBAAAAAAAAAAAAAAAAAH4AAf+AB4HgDgBwHDw4OH4cMOcMYMMGYMMGMOcMOH4cHDw4DgBwB4HgAf+AAH4AAAAAAAAAAAAAAAAA"), this.x, this.y); + } + + WIDGETS.viz = { + area: "tl", + width: 24, + draw: draw + }; + + + + Bangle.on('lock', (locked) => { + if (!locked) { + reveal(); + setTimeout(function() { + hide(); + }, 4000); + } + }); +})(); From 52cc043787e7f74316d8fb4f363b4a6201c7d0fd Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 20:54:05 +0100 Subject: [PATCH 252/503] Create changelog --- apps/widviztime/changelog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/widviztime/changelog diff --git a/apps/widviztime/changelog b/apps/widviztime/changelog new file mode 100644 index 000000000..287061d0c --- /dev/null +++ b/apps/widviztime/changelog @@ -0,0 +1 @@ +0.01: New Widget, forked from widviz From 80c41ae35e485dff19dbea0c2b4d654b8097b885 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:01:33 +0100 Subject: [PATCH 253/503] Add files via upload --- apps/widviztime/eye.png | Bin 0 -> 3364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/widviztime/eye.png diff --git a/apps/widviztime/eye.png b/apps/widviztime/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..9aec8ce8930a6c34f8d664fdeab042554296b814 GIT binary patch literal 3364 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 o2D28nICLwO2_e Date: Wed, 22 Dec 2021 21:06:01 +0100 Subject: [PATCH 254/503] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..ec1eb0568 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "widviztime", + "name": "Widget Autohide Widget", + "shortName": "Viz Time Widget", + "version": "0.01", + "description": "The widgets will be shown for four seconds after the device is unlocked.", + "icon": "eye.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widviztime.wid.js","url":"widget.js"} + ] } ] From 8499a19cbb5ab7b12f936327eb91ff0f910bf270 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:07:51 +0100 Subject: [PATCH 255/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index ec1eb0568..e9eaab42b 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "icon": "eye.png", "type": "widget", "tags": "widget", + "readme":"README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widviztime.wid.js","url":"widget.js"} From 82abd587c2b0a8f07d40416b6f6b0317812200e4 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:10:13 +0100 Subject: [PATCH 256/503] Create README.md --- apps/widviztime/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 apps/widviztime/README.md diff --git a/apps/widviztime/README.md b/apps/widviztime/README.md new file mode 100644 index 000000000..35ea3c057 --- /dev/null +++ b/apps/widviztime/README.md @@ -0,0 +1,7 @@ +# Widget Autohide Widget +This should make widgets completely hidden (except for 4 seconds after the watch is unlocked) + +Additional features that I want to implement: +- [ ] Only show widgets when in app launcher +- [ ] Make timeout adjustable +- [ ] Disable widgets completely From f1b322a21018d844c586dda63487268df649cbd7 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:13:06 +0100 Subject: [PATCH 257/503] Update README.md --- apps/widviztime/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/widviztime/README.md b/apps/widviztime/README.md index 35ea3c057..73e24b658 100644 --- a/apps/widviztime/README.md +++ b/apps/widviztime/README.md @@ -1,7 +1,8 @@ # Widget Autohide Widget -This should make widgets completely hidden (except for 4 seconds after the watch is unlocked) +This widget is forked from the "Widget Visibility Widget" +It should make widgets completely hidden (except for 4 seconds after the watch is unlocked) Additional features that I want to implement: -- [ ] Only show widgets when in app launcher -- [ ] Make timeout adjustable -- [ ] Disable widgets completely +- Only show widgets when in app launcher +- Make timeout adjustable +- Disable widgets completely From c664e45eb054eeaddf9ac29ff89a314951fb5996 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 20:58:26 +0000 Subject: [PATCH 258/503] swp2clk: Remove unused app icon (since we are settings-only). Add comment explaining boot.js code. Add credits and motivation. --- apps.json | 3 +-- apps/swp2clk/README.md | 12 +++++++++++- apps/swp2clk/app-icon.js | 1 - apps/swp2clk/app.pdn | Bin 7005 -> 0 bytes apps/swp2clk/boot.js | 17 +++++++++++++++++ 5 files changed, 29 insertions(+), 4 deletions(-) delete mode 100644 apps/swp2clk/app-icon.js delete mode 100644 apps/swp2clk/app.pdn diff --git a/apps.json b/apps.json index 0a537d676..51b17e7f5 100644 --- a/apps.json +++ b/apps.json @@ -5075,8 +5075,7 @@ "readme": "README.md", "storage": [ { "name": "swp2clk.boot.js", "url": "boot.js" }, - {"name":"swp2clk.settings.js","url":"settings.js"}, - { "name": "swp2clk.img", "url": "app-icon.js", "evaluate": true } + {"name":"swp2clk.settings.js","url":"settings.js"} ], "data": [{"name":"swp2clk.data.json"}] } diff --git a/apps/swp2clk/README.md b/apps/swp2clk/README.md index f6d0dd2b4..877a13ecc 100644 --- a/apps/swp2clk/README.md +++ b/apps/swp2clk/README.md @@ -9,4 +9,14 @@ The swipe modes can be configured in the settings app, under "Swipe to Clock". - Always Off: Deactivated for all apps (Default) - White List: Only activate for chosen apps, otherwise deactivated for all apps. - Black List: Only disabled for chosen apps, otherwise activated for all apps. -- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) \ No newline at end of file +- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) + +## Motivation: + +The goal is to further support touch-only usage of the BangleJS 2 watch. You can use the [Swiper Clock Launch](https://banglejs.com/apps/#swiper%20clock%20launch) or the [Pattern Launcher](https://banglejs.com/apps/#pattern%20launcher) to further enable touch-only support of the watch. + +## Credits: + +Initial creation: [crazysaem](https://github.com/crazysaem) + +Inspired by: [Swiper Clock Launch](https://banglejs.com/apps/#swiper%20clock%20launch) \ No newline at end of file diff --git a/apps/swp2clk/app-icon.js b/apps/swp2clk/app-icon.js deleted file mode 100644 index e59cd6244..000000000 --- a/apps/swp2clk/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwwkE/4A2+cyiJABiMjn4WPiAVCDIUBDBsyiEBiUzAwMzkIHBl4tMBw/yBIIxKkIME+YEEiESIpMBkYGD+MfKQoMEEQcgiYHE+EPAwkxgRJG+RSGC4xJBNYwuGC44wCD4sRG4wXHCAweGC5JABQAhGHC5IpFiDIHC5HzgIEHC5oqE+JeHC5RgDmBkEC5vxgYXZkDdGC5fyLYSOIC5SLDC5MgQJAXDUxHygEAKREQC5XxC4KCIC8xHLO4/ziERiSPTmI4IC4rXGFwMTC5LXDmBsFFwLHINQUDC44uH+fc54XG+LlE+QuFnvM5gXDkArCMYYFCkYsECwIAHSBIsDC5cgLIoVMC4ZgFC6PziJIFLpYXDJA53PUY6nHZQMvEwwwIa4kxgQmHmUBXoYMHiAMJkJJJIoMSEZIMBgJTG+QJBERAOFiUzAwMzkIgIGJEAgERiIDBFpgYEmQVCiMjCx4AoA=")) \ No newline at end of file diff --git a/apps/swp2clk/app.pdn b/apps/swp2clk/app.pdn deleted file mode 100644 index 60baf6cab3ff2c1a4c0ed0f096d691b636627b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7005 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 LKL52a!)x_F<_%{L diff --git a/apps/swp2clk/boot.js b/apps/swp2clk/boot.js index 54486742a..3119ce06b 100644 --- a/apps/swp2clk/boot.js +++ b/apps/swp2clk/boot.js @@ -1,3 +1,20 @@ +/** + * How does this work? + * + * Every *boot.js file is executed everytime any app is loaded, including this one. + * We just need to figure out which app is currently loaded, in case we are in the white list / black list mode, + * to figure out if the swipe handler should be attached or not. + * It does not seem to be the case that this can be done easily, but we can work around it. + * It seems that every app is loaded via the global "load" function, which takes a fileName as it's first parameter to load any app + * or the default clock when the fileName is undefined. + * To be able to use this for us, we wrap the global "load" function, and determine before loading the next app, + * whether the swipe handler should be added or not, since we now know which app will be loaded. + * Note: We cannot add the swipe handler inside the wrapped "load" function, because once the "load" function is complete + * everything is cleaned up. That's why we merely save a flag, whether the swipe handler should be attached or not, + * which is evaluated once this file is executed again, which will be right after the load function completes + * (since every *boot.js file is executed everytime any app is loaded). + */ + (function () { var DEBUG = true; var FILE = "swp2clk.data.json"; From 9890218d25a82ab11407bd39c02e4ccff755ab82 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 21:10:11 +0000 Subject: [PATCH 259/503] swp2clk: Try to fix "ERROR: App swp2clk has no entrypoint" --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 51b17e7f5..5624802c7 100644 --- a/apps.json +++ b/apps.json @@ -5070,6 +5070,7 @@ "version": "0.01", "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", "icon": "app.png", + "type": "boot", "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", From 968e31c858e5752ec6856ed457ae2389da9f94a3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 21:24:21 +0000 Subject: [PATCH 260/503] ptlaunch: Add updated screenshots --- apps/ptlaunch/add_pattern_dark.png | Bin 3185 -> 2682 bytes apps/ptlaunch/add_pattern_light.png | Bin 3202 -> 2700 bytes apps/ptlaunch/manage_patterns_dark.png | Bin 3008 -> 941 bytes apps/ptlaunch/manage_patterns_light.png | Bin 3027 -> 2944 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/ptlaunch/add_pattern_dark.png b/apps/ptlaunch/add_pattern_dark.png index 04dfdecd6816c643f49a7246411886abce547b82..4d5770835e660bb266fe10fabf6ec0a18f55ba9f 100644 GIT binary patch literal 2682 zcmb7GdpHwp8`oZk*(ys8uMo?jY)(yHry^@|3OTe%WUu2$&aq)?$~j&XrO;cN({eW3 z-VIAgVZ)m_COM}ur>KNa-yh%g{qcT(e1AOm?|Sb0`aRe4T=#wbeoyK}d&>i$BOoCm zp##=dD5pKF`MH3id$F1}eRU7^ML1a^g{n9TpM-=!r>s%tF8Hg9g~NH1h7ggDyJmmQ zUOb@i*83jwepe;tF1hyr`S8f~CEDoX-0auQwO3~Ex8tJ~2!isGa5FUV_|_}s=CI?L zR_YEKXzTg%F{j^)^)O(*+{7V7eWx>{sr}1acg;|rTURf>s~TjP=9;* z{lJ(nMdf3Z_5nYRB;G$or$+I5yUWu1RU5={5f0>;a3|%v{S4=rj=@?rz#o(io`x>F zECsEGBU+>ky;BsFDQss({aah#cv$ExL_<0K=eBE0Yi(ED9ohy=Ee*$HZ^9ygKiuVj zL5!%%Si#C@nHc~B>Z=Di%v7O?TtqUv^|2#w;E_OuK-9TPTx%Ao0!}(6?lCKyUw1=m zCN{X51B2dEjgs_m>AE{cxy-*Dl%=$pK!OMNAWnHT0GOExndCY!=}%InP)wDY1QxkL$AH=_bWLnA5xM> zSg~$1on|#j(Z4K$!VuBYQH^X9Z5@;LGwAi)0mH+af!Sof7YUQ1nV5o8s^Z9Lg!?Vw zvZ?$)k_w84d?AH5rqMci-93OS+Em^f0c5Zk5j~j)TI^ZU4plGLeXs);B5nDPJ%Rve znKUy6;iV^G*O0(5oV9r8qS7Gk)up`NWPKP5lnLa%xdR?7s*FOm+^F%G&ja z^LKY&&j*&^e>!dU)K{=} z1yYcBPgJ9@*zaKfNwl?QAx0+Z!Q3wq*yrH3>_7Ch=T1MeExi%c732Eav??`Ho3}!q zB62nj8?CY8DZc#}Nt=#RR33+G+!)CUfjR}f``pj)@!D0X5k`TaMh4W0@!xIc)IY7Y zRNjkp4+-YNxpG~gsA!Usa`qD|l^A5Xm6K`e@>maCOBpj)$=Q(^05dVT<#*<(8^46kT~nxFjlZ^#<&sLuy%VCa}o+ z+Hcu&Um>mbZYHvEI4Zn@FN-?g|Wsx}BFAH0(18B4Iwx_G(0s|_$-@}3M%%gXcJiT)^ zdpn?m&tCLM^rh?wa6KbRuL(Z;NQo3P53C)R=hK*!w zIEK<{83p`t>Q{h3+mf|nO``Cv1h7;2Oayc5@Cae6Gs@)-OWG~fYKbrDS)2Uhe3Bhk zAjmv;@>&+04zHWSq-k&1mK5Q0S#s4#DHDy*JP&IU%4K`Mq+p`zzLD+3`?E}BLAOU@ zq1JL{SC@U*AJRl$eNJ1Gn~w(5bwc`>E%ew(G9}`CT0y>vn~xULZ3380g}_CMIEz|! z`VsZ)Jlo0}t0rw<%DM~bWMphT6I@^o>n87l&i)Ub_&xTazs_YHCfDwIRs%~p0FBtdJs zs{LXbbPFQlh{#xS;r!){l5k9bVl&b5M=8MJKsYQKPJ$=R|JzV=Hy?gu{wJA?D{pmX zP`bAAzlDet9hr6s26lgI_Fg&p=rK`wc`~aYIo2l=#AlUJ97>1jm9WtCosR(-s@(?% zFr&LPuVgmmTFEXxCu5ZSz1cuVctbYuiyU-$L0aO7gQO3oYkqshF==-&O;P%xQXEf3 z?WbGvq(W$qRXfp_fYOGwxe4Xw*l{oF2nz?rKlL}YsSE2vs@gm4kzsdaj{Q@8lnSBC zYt=tmAA7#q%o%zLn(`}pqBN20I>4Rl3okvy%C zed!kK+}@1lD>~rJB3ts|VQnSbZPlHbA36=cea$=Bi6iKJP+7@PY;lTQ**>S9ih1+c z(JQS`%Fy;EiiC=j$TOc*9Lq)ci?if$n3Q`AN=?1Uco<<=W2yF8^^1;tIwoDyR~F1d z`e>j~TcI~NR@r(Hmgz5iF<=E~os1Wm{Wqh@qR}r{W+=RzY9F6WKbp%pOmo47Z0rgJ Yshku0-6o!~_n8#3wy;N4A+ZVn0yXeC*#H0l literal 3185 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 diff --git a/apps/ptlaunch/add_pattern_light.png b/apps/ptlaunch/add_pattern_light.png index 47549b43e718f0929a1b58bb7dd71e3ff71f6b2d..998ec21a0819f504b03389508dcd12356c6146af 100644 GIT binary patch literal 2700 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 l8rwYIwsec%<81VVGd00S^dL_t(&-tC%= zlB+NXg~=Om-v4FS<_Cz4+6vCx-ht`58N2;Tj|7A*rKSB_R)2UqV6(TAPD4LTtN?IB zV7x;d81xLd6B>9EnycRRG+bcFuc68IyKp^txZ~9l6@{zw+xZZO)#Ctrir2bCd2Hi&0+$$?OjCBNQ4zHB($dn>($dn> z{#(OCMn7q-d4HQ%CE(LkNqAnB0G*16t*d@XeK*$qPMRe^Sl+_fA%Y$OZ;aCVfTAG? z__e5)Kfyl>rap{`1yct751x$zO0S72^(oPlxT@ypiW#yJBog{9qc0j4XB?|`pr-Z2=LU~%pc zEOX;QlQ=eK7g}`2I#-DPH7Gk+M#ycs9;*u@YhIcfvVm+i7gH{MOHKrT#=&4RH!Laz{8E@(F$J?%;}Kf> z4FW?%WF8lpGqjhxrG{0BeBHTAb88^f8VdYP_B-W1`#wK(^%0<*a#W zvmqPEX7>JgbTnb}usQ$$ literal 3008 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 aeV|ihqCHlzjQt}A082A8^66P@^#1^?Kzw)r diff --git a/apps/ptlaunch/manage_patterns_light.png b/apps/ptlaunch/manage_patterns_light.png index 5e4b27131e5531a7b3191c7664543c5e542d3607..13470f4506ace6d691b83d5b0d845350c07acfb1 100644 GIT binary patch literal 2944 zcmb_ec{J4R7yr&?8AKRKriH8}BuisWwva9RFy=L~6O{=gX1um)5ZSX2k;oQOX!IK- zGluNmNRcJGY$NiU_x=6#{{MT&}~=P@VmBz}jOk<0u=fHB1K_+E15Tx&?#Q=s7xrKrMIogj)a+h}pT*#7v8V z=wnoOtPdMZX=Bd)yg!uV(-Pnt=t;M^7<}RS^K{AUl=PuLifWb|PqhXy!Yyv)T7IsE zyI2iDpml~L#%Du1Rg7q?7=BRh^B=LGG0LK3Dr)+;xO(@5VozdVUmpen$f`oLY1SiN=Ey%7Y`au<mD=y~Qhhg&#^d4RYaF4Jd^zGd(>kCAH~vfcB!L0J(P1@3MRT6re6_1T$M|70@|D>gEnMJydnv2++eg>|fD*r4lH(@_pE{*OkZv`9O{a4L+AV4@Q^R4Y7cYBj5?^5 z2GCVbAZ=v%kPM+<=^H!0#-WDssV`uSz|?z5=D=$11Y}&A$ZxXIdtI2S>9s>_lZLd^-=w889yCh5Tl8=NH7BNr9$J*jyt5v`q}wbUZNs+IQ01U$KM|;04}SYxxpexZNt?v#QVCLy*8F z>m|W!?1m&F26w>p8JHb@1~(HDT9OdE9s?%}HbJQ7c7`Z2RG1YFjC6*v4q7QcG$|9RasRpAt&Gx#OWBqN+8@J}vATSwOl)VdteS0@R$-Or;)1A2SIS7Tu26j8 zD^Ib$2AR$t7H=F(#P_M{JHG}#7Lr?bBV<2Yqp^YzXM#aP4Hm)`0zKQO5s*+3Ap&X$Ng1>;w=@#<}`YskN*UZwdQxywnE9n+Qy^yi5SM_GyZtDAXl`a zu|ScOvtM(1?8ZY7GUUy)FqI(4Yw0ml7(P7Zm#UneSGx}6j;~~YR6!d;$nwayB&jVN zYZILNEP27h>lxvl{Z%4buP%w6VIG~PvP4rs4{EO8 z3dfK0)M9#tgNuoH3U_=dqAzl)bf9c1MB*y%d3O0QsQYjX@Q753*mXhsW(Ja?b)7+W zQ#eq zo}AWO*qY;k0+Wk4#+b{W@NU&%S{&|Gsatxu^j-W#QanC-qr2H-iKV)o)`fgjR##on zc?S(JY1-U1bG!UJHC=PfK3~edSA)p%Y6R&O3mC5Y*4!B9=YpcDtsC_VeSn=F)I%PL z>j9ihPA3H1LU`Xh=vknj|&X1Z2om4NP76L0WxnJ4`&dQ6GWob!v5Sj!d6%Bg! zFKD{?UGEQz6Id#;NhIz3nVrwMO|^fKwX}c1&q2(ApvjDs(|%!yvX8QFYx1kw*7wi+ zR4-OC;qCRE@OIc&cMZ>mub@(b|AB$Y3#DGFCO|>@>az0-<+Xyeq7KN$ahZo*v$MFfY)Ar<+(?6_kNtbW= z7aCJiCryNAPpaW z`Oq{woKnnFtYu<1^@e`lTy}jy=&`~tb0{bJ8X9NTym0X97vd@(_R?$}rUidWzi_)~ zT{gN7ks6UTcl_Rn{Pa9rOAu2J=9#+9*pPnJq%Se5{kydmjU(Juc$YLz(mCTh^3}{` zQpNJ5e&N{~r8Bygw%AR&)71nY#A`JJ4ZbNEOu2wLIIFsAP%8*^&Ith|$kz_L=)WjqS@zyh z9r){%BCH?3eofd5>FHIu0!dn0GK>A$tVJ-kXe9W&L8qSbci%QJIJ9jx{F@#Oy7q5> zQ&8Q?yg8?ucqF8E#Kls)oVp&5;`EhsP?S~L`bDbVR+drdYm2d!8P0G$8+L{>+#?<= zfc0F+a1CT6OARH-)mjaYyE@w=sK_*E8{#(&fCOQj`o(mopFAIwa`nqAwmpE%85X6$ z^@ulgMM5VT$R;Q=>E%#aQuCEG29QP;6$P%`#6ZOR9 z*BnRh^d4cja7}5046CB!QRsH8&d2OtB4&GKaX3ZH&Ml_>&Bz(5`M_u_Z)Ya#M8*4z zC8zGQAcM|6v)q^_C@20 SYZhBl1J?{K3|{JEqyG!vmv2r0 literal 3027 zcmb`Jc{tSD8^FKwWirOjBqmEt%35lW$Pi-&*|!*L_LynNa)+PGSP~IQu|$nw*b_1#$c%>bkg?Ga5sKqXJt%j$V9%IeA3Qk^X&sw%58bTYEA zGOSP63sqMV%nS2N&&)Dgk{yu}n-`P^>Gs-io_c&I{^Vw6NJeUSiU`EL;tLO`SC08> zxYxODqW&xi{oov$cNT`stV=Qm_RV3w!&YD}% zxIkQEwKNC1+KwDul37lj1goA*yxwU7aKI-*(nz#D?N zN5W!SIJB-r53F{IC-7%vWTHqY5(Q+~jUbppO0K|Y{uaZs-E*BO6%JVrYB!4gLP5hf zUv^#8aBEB3vvUGwtk0yk!(puUZo42C2qZ)MzNrtCH}vbQvQ`xp=sOjT(U8b|u7k&GfXYGQ;28oLW?p%kv@7iiz z=6c#zGjHDB2$=tHyOdw`1T`tK`%*5rq4h;N%Al~!HPxMeQUeKLxOE&0sogsz{OYI` zsbuC=d`Hnsm3yszl zdwrYhyeEZNj~cb>41k7d`s$G!amv{vY?myrA#1t!m@9O-onI;rWTqj+tRs>Afp5lH zZ<%Mt{b-!XM(0+S=|?!_m!DzFoSzuq-q~&9_Ct5P_JKoGsa4^;NzSnG!s*HondR|)+iF*52%C+Spb*cn|S`~wki{a+sdXY zdX1A+jBWcsMbN)J%9$bd8>}U}6IzFE^%?#)m2`!-v1zP~ZzuNgwHpf6Uvi_R)??(? zA9svW=ByAOQhznb@2|*h(Vy7wBu~H!#4kmul+ES1TBZ2pDOANyJz=6~dTrU0Nmjr#&wEl=E~$fA4s5^b1LkE!}tXm1uhOYN%TqlC(-^Koh443C61d!&t(B}>+i zj2BB4U-1iF$6W&J_-eIFn+^iztWm3;*lFQV8*_2UPB7o7+WrceQw^Y3aS*=%g;H78 z{`JXn=!O;{M6Ws!S^X%tP++TOm>pj1SUdKI5`e*v&K#;a#DtVlIL_DI_P^|Uyon?T zyo|jwa^tb{lj_3hIk)mnW=}bVb0iqw@sAp$>>_F>jUbGuxLk5!Fe_f=^_yE0`Bwuf zjMCGk<)1te|?lXZX|FAbqJl&U}Jh;-|2aYs2f= z@$8+hkj#zYLCFZ={ZnUJ_UGxEgm-Ryoug=-XI_3;;>npN35K1WS<6=^7AB@jalKE>uNL`E&_A);dgprfkOQf7?IWWCu!AS-c1HX-jvm9|eGm6X!& zNo~`kw8Jh*u*{atMm^>DiZgRWDbma356D7hA2^PqJx9= zpPAWWrwPZlFL|2=vx-K&cw%^loVKRe6^1K@JsuaryPR;M2R0$m3LNB>2<%HR z4bM{htcQ6#ZOWV33O8nXCRR+`+1CWKZ{x5L6UaF`p1|Ek+@H!Yu|1e(MXax!%zyBM zMZ$g_0=t*1nnl7kH6$*#Kad%)7K7xx^5; zHxQ*>D{6*l6R;X%We!H{gu!Q6h$-SzW=1NZ-m0A2M&yb^5q3rZe&{|)k6Rd99wPSMp+uE2t({1jV9sO7iWBwL^$$twRgN&|?y(p9hP)b%)jmqbpAv}dU0qTJe;zCg*^pVHK#H>yAB#e69j>J>!C_>9Yr;8E)ON#7&R zN9@zVjd>@H5tv{EW2>7R2kQ?hd))FM ucK=Gp7($decD|Hi%xyXDxu5SVW5%~*$4A3zqPMwSI$&;Ujjb{EPW&&J#d#wD From 3615d7fe4c65992acb38c110728d501eab245543 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Wed, 22 Dec 2021 22:57:05 +0100 Subject: [PATCH 261/503] Update gps-info.js 1. (bugfix) Workaround for a crash in toUTCString() if fix.time has the value "undefined", see https://github.com/espruino/BangleApps/issues/1155 2. (improvement) The 4-dot progress indicator is replaced by the number of satellites in view. Tested on Bangle.js 2 with firmware 2v11 --- apps/gpsinfo/gps-info.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index df888651a..cca7e8e0f 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -16,13 +16,17 @@ var lastFix = { time: 0, satellites: 0 }; -var nofix = 0; +var SATinView = 0; function formatTime(now) { - var fd = now.toUTCString().split(" "); - var time = fd[4].substr(0, 5); - var date = [fd[0], fd[1], fd[2]].join(" "); - return time + " - " + date; + if (now == undefined) { + return "no GPS time available"; + } else { + var fd = now.toUTCString().split(" "); + var time = fd[4].substr(0, 5); + var date = [fd[0], fd[1], fd[2]].join(" "); + return time + " - " + date; + } } function getMaidenHead(param1,param2){ var lat=-100.0; @@ -77,9 +81,9 @@ function onGPS(fix) { {type:"txt", font:"6x8", label:"Waiting for GPS" }, {type:"h", c: [ {type:"txt", font:"10%", label:fix.satellites, pad:2, id:"sat" }, - {type:"txt", font:"6x8", pad:3, label:"Satellites" } + {type:"txt", font:"6x8", pad:3, label:"Satellites used" } ]}, - {type:"txt", font:"6x8", label:"", id:"progress" } + {type:"txt", font:"6x8", label:"", fillx:true, id:"progress" } ]},{lazy:true}); } g.clearRect(0,24,g.getWidth(),g.getHeight()); @@ -87,7 +91,6 @@ function onGPS(fix) { } lastFix = fix; if (fix.fix) { - nofix = 0; var locale = require("locale"); var satellites = fix.satellites; var maidenhead = getMaidenHead(fix.lat,fix.lon); @@ -100,12 +103,18 @@ function onGPS(fix) { layout.maidenhead.label = "Maidenhead: "+maidenhead; } else { layout.sat.label = fix.satellites; - nofix = (nofix+1) % 4; - layout.progress.label = ".".repeat(nofix) + " ".repeat(4-nofix); + layout.progress.label = "in view: " + SATinView; } layout.render(); } +function onGPSraw(nmea) { + if (nmea.slice(3,6) == "GSV") { + SATinView = nmea.slice(11,13); + } +} + Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.on('GPS', onGPS); +Bangle.on('GPS-raw', onGPSraw); From a382c6bd4f785a49357712781dcb72c7ce44233b Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:28:51 +0000 Subject: [PATCH 262/503] touchtimer: initial creation --- apps.json | 16 +++++++ apps/touchtimer/ChangeLog | 1 + apps/touchtimer/README.md | 3 ++ apps/touchtimer/app-icon.js | 1 + apps/touchtimer/app.js | 92 ++++++++++++++++++++++++++++++++++++ apps/touchtimer/app.png | Bin 0 -> 1770 bytes 6 files changed, 113 insertions(+) create mode 100644 apps/touchtimer/ChangeLog create mode 100644 apps/touchtimer/README.md create mode 100644 apps/touchtimer/app-icon.js create mode 100644 apps/touchtimer/app.js create mode 100644 apps/touchtimer/app.png diff --git a/apps.json b/apps.json index e5e9f8f02..33dae37c7 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,21 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "touchtimer", + "name": "Touch Timer", + "shortName": "Touch Timer", + "version": "0.01", + "description": "Quickly and easily create a timer touch-only.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "touchtimer.app.js", "url": "app.js" }, + { "name": "touchtimer.boot.js", "url": "boot.js" }, + { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } + ] } ] diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog new file mode 100644 index 000000000..193a476aa --- /dev/null +++ b/apps/touchtimer/ChangeLog @@ -0,0 +1 @@ +0.01: Initial creation of the touch timer app \ No newline at end of file diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md new file mode 100644 index 000000000..99c755639 --- /dev/null +++ b/apps/touchtimer/README.md @@ -0,0 +1,3 @@ +# Touch Timer + +Quickly and easily create a timer touch-only. diff --git a/apps/touchtimer/app-icon.js b/apps/touchtimer/app-icon.js new file mode 100644 index 000000000..d58446bcc --- /dev/null +++ b/apps/touchtimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4A3mUQIAMRkYWQkBaFiQWQgMjn8zGYUDCxkxFA3zD4MfCxXygECMAURiReCDAM/IpUBFIJ2CAAIeB+ZJKBYI8BCwMBiABBDARSBC5EwFwMwEwUwh5FCEIJhJiEfGIIXC+IQBSwQeBNYR1Gn4xB+MDDYITBiEzFoIOCC4vwEAIxBAwQzBAoQtCBgaNEh4iEAwMwRQXxHgRnBLwsvFQJdCFoIGBl55DH4QAEEIK/BC4KjBC4RECiED+RnBXooxCn4uBKwPwgIiB+fxgQQCRwgeBLwRbBkAXBh5yCBwoACEAoVBC4fwJ4I+DC5EjJQQXDBYP/kJWDC4qmBBYYXFfIQXKiQvUL6AXGR5LzBR4YXIBAS/BC4UCeAQOFC4rvDN4LvCFYMgd4IXJmEABgMxC4bWBiADDC45EBZIRHBMYINCBQQXIIgIkB//wgIFDmBKBC5QNB+UDboU/kEzgCRBC5QTBNwUxLoZRDC5J5EmAqBkEAiYMCC5XzFIMRkECAgILDC5YYDAAUBIoQXNDAMhiMRkYJEC5oAKC7qKBACDfCK4IWRPwjqBkczAB0yGAcQGgYAOmByCfAYAP+MBC4QWR//yC4ciACMhC4YATC4T9BACUSLiQAdA=")) \ No newline at end of file diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js new file mode 100644 index 000000000..7ffce959f --- /dev/null +++ b/apps/touchtimer/app.js @@ -0,0 +1,92 @@ +var DEBUG = true; + +var main = () => { + var button0 = new Button({ x1: 0, y1: 35, x2: 58, y1: 70 }, 0); + + button0.draw(); + + button0.onClick((value) => { + log("button with value clicked"); + log(value); + }); +}; + +// lib functions + +var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } +}; + +var touchHandlers = []; + +Bangle.on("touch", (_button, xy) => { + touchHandlers.forEach((touchHandler) => { + touchHandler(xy); + }); +}); + +var BUTTON_BORDER_WITH = 2; + +class Button { + constructor(position, value) { + this.position = position; + this.value = value; + + this.onClickCallbacks = []; + + touchHandlers.push((xy) => { + var x = xy.x; + var y = xy.y; + + if ( + x >= this.position.x1 && + x <= this.position.x2 && + y >= this.position.y1 && + y <= this.position.y2 + ) { + this.onClickCallbacks.forEach((onClickCallback) => + onClickCallback(this.value) + ); + } + }); + } + + draw() { + g.clear(); + + g.setColor(g.theme.fg); + g.fillRect( + this.position.x1, + this.position.y1, + this.position.x2, + this.position.y2 + ); + + g.setColor(g.theme.bg); + g.fillRect( + this.position.x1 + BUTTON_BORDER_WITH, + this.position.y1 + BUTTON_BORDER_WITH, + this.position.x2 - BUTTON_BORDER_WITH, + this.position.y2 - BUTTON_BORDER_WITH + ); + + g.setColor(g.theme.fg); + g.setFontAlign(0, 0); + g.setFont("Vector", 40); + g.drawString( + this.value, + this.position.x2 - this.position.x1, + this.position.y2 - this.position.y1 + ); + } + + onClick(callback) { + this.onClickCallbacks.push(callback); + } +} + +// start main function + +main(); diff --git a/apps/touchtimer/app.png b/apps/touchtimer/app.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccdb17f0cc322440aeb52d649f1c6dededacef4 GIT binary patch literal 1770 zcmVPx#1ZP1_K>z@;j|==^1poj7novwsMgRZ*{{H^*^782D=;`U{`1ts_xw&+7bU!~o z8yg!32L}QI0t^fcBO@bDPELr3h|<#1{r&yo;^Gz-761SME-o&YmzVbT_Ve@ec6N3N z2?+}e3rkB&wY9b1-{0Ka+{((zsi~=VcXu>2Gy?+z9v&X0rKQHk#wjT&nVFgK@$nE4 z5bEmcp`oD&2nZ1o5tx{m`}_O1x3`0XgJNQ0Qc_Y?RaI(gYLStV%gf9B{QT?d>t|V!Nl8grSy?M9D**uk4-XHG zjg8ye+u`Bi)YQ~bQBlRk#iOI6aBy%$L`2}=;2j+uHa0f-`T6?#`ZYB*FE20j^z;e} z3MVHgV`F1zXlUo>=YM~H)6>(=&dv=D4Js-s-rn9}VPUeeva_?Z6B83NGc#pnWv#8P zudlE5_4SO5j2Rgjd3kvzCMM?Q<_-=H1_lO3Mn<@}xM^u=U|?XLo}TXR?zFVDhK7dl z@bJ96yk=%*uCA^svsO%yB<21BVPrBEp-3K^DET4*9!5oKi- zm8lsiWfv>cEV|z>|4ZL<_HxM%jUVds%ihcLIq&V9cld9xjEk_2SLLvbw?$qT6|HG8 zu@ff7*;V7{#78D@1c^zLREIgq*E>k(jS7umt&^o5ltsy+*CnHj2^PfPDx=(% zgZ1UyP@!T&RQg#}4O@Ud%{yPFUb9gaut{nxuEk;pZ&$e?mePF(?hJBs-CeG`v1Kb+ zACCstJ@*FazYp8!NKrw>r0r}(auaJJki7#DLGEnkE_ikTyQA5H$||<1q~d=1_Mnk` zK(AQZxP0$}bj2B657Cv1eQd5ZYJ;@%VMNGw1|9((-A^7sx|hw5$*c6Z>{SP{4|1D| z8blo86FAJ3HSEOPBeFM!Kz0H7%%hfzC)uvD2Aw?W!Bc#?vIJ;lOle4XhTeUsNU;~o z9(B__PK9+E`7EqGd`^mMU3~snNLc>@H_PTqZ#$A5GKXOb_#$4Sqfm;+S#MFonz|lN zlctxs)q^I^HliU;a5Y}x&f{`qugds?g3PiPo<&*IUc>8rLxput@=YYkB7MLqo*ot^ z^9!R!XspCx!%TG|x%X z6#6Pmg!3BvrI_l~-W?R)W4Zp8UZ5W)g1v?dV29;>ZeJ1-R=7A1uv`3$G!taIKiD7B zjq~NhC*5bqht4do_ajr`;vv$z1t>{Wg11!;ra`=Vxj0M&d`y0#*9t%7B~QP|`UO+* z87WUO6|9$epjslRYvz^D>9HCWiH@5{Ub^RzGt~is7)3;XCTxwih$f7By?$G3xgL* zGs&J!gI~dD0`U8J9Vh*1T(0|t)$)Sh@`*U!KFs#(^b M07*qoM6N<$f}*WUg8%>k literal 0 HcmV?d00001 From 06283ba7ca77cfea6f0ec8785171435195aa6ff7 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:30:29 +0000 Subject: [PATCH 263/503] swp2clk: disable debug output --- apps/swp2clk/boot.js | 2 +- apps/swp2clk/settings.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/swp2clk/boot.js b/apps/swp2clk/boot.js index 3119ce06b..bb8e792c4 100644 --- a/apps/swp2clk/boot.js +++ b/apps/swp2clk/boot.js @@ -16,7 +16,7 @@ */ (function () { - var DEBUG = true; + var DEBUG = false; var FILE = "swp2clk.data.json"; var main = () => { diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index 1e29e5a6c..a97b51fab 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -1,5 +1,5 @@ (function (back) { - var DEBUG = true; + var DEBUG = false; var FILE = "swp2clk.data.json"; var settings = {}; From 6eb5858742702d10deaf97645c958b3277a75413 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:39:26 +0000 Subject: [PATCH 264/503] touchtimer: fix app.json --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index 33dae37c7..93c5b7fcf 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,6 @@ "readme": "README.md", "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, - { "name": "touchtimer.boot.js", "url": "boot.js" }, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } ] } From e81b97dc6f5adbbadde30aea4498a969a1421bfd Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 10:08:22 +0100 Subject: [PATCH 265/503] Minor change --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index afbca2b8b..d9587c1ac 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -329,7 +329,7 @@ function drawPosition1(){ axes : true, minx: 1, gridx : 4, - gridy : 1000, + gridy : 2000, width : 140, height : 50, x: 5, From fdcc1f50dbef5a330bab703dc2300cf8c89796b8 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 14:10:21 +0100 Subject: [PATCH 266/503] Show BT status. --- apps/lcars/lcars.app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d9587c1ac..32020a01c 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -168,7 +168,11 @@ function drawLock(){ g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 130, 12); - g.drawString("B-JS2", 130, 32); + if(connected){ + g.drawString("BT-CO", 130, 32); + } else { + g.drawString("BT-NC", 130, 32); + } if(Bangle.isLocked()){ g.drawString("LOCK", 130, 52); } @@ -502,7 +506,7 @@ Bangle.on("drag", e => { } if(lcarsViewPos == 1){ - plotWeek = dy < 0 + plotWeek = dy < 0 ? true : false; } } From 6c7fd262b7cff644fd7a0b811b78f5311abfca16 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 14:17:05 +0100 Subject: [PATCH 267/503] Minor improvement --- apps/lcars/lcars.app.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 32020a01c..5f328389e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -307,6 +307,11 @@ function drawPosition1(){ y: 115 }); + g.setFontAntonioMedium(); + g.setColor(cWhite); + g.drawString("HRM", 122, 9); + g.drawString("STEPS [K]", 90, 96); + // Plot day } else { var data = new Uint16Array(24); @@ -339,13 +344,12 @@ function drawPosition1(){ x: 5, y: 115 }); + + g.setFontAntonioMedium(); + g.setColor(cWhite); + g.drawString("HRM [24]", 90, 9); + g.drawString("STEPS [24]", 82, 96); } - - g.setFontAntonioMedium(); - g.setColor(cWhite); - g.drawString("HRM", 122, 9); - g.drawString("STEPS [K]", 90, 96); - } function draw(){ From f64c91e0b80e03e4b9a433cb3493867cc2ed5008 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Fri, 24 Dec 2021 00:25:07 +0900 Subject: [PATCH 268/503] SpeechTimer: fixed listing screenshot and allowed in emulator --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index bf5e8c77f..f76800494 100644 --- a/apps.json +++ b/apps.json @@ -4697,6 +4697,8 @@ "tags": "tool,timer", "readme":"README.md", "supports":["BANGLEJS2"], + "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "allow_emulator": true, "storage": [ {"name":"a_speech_timer.app.js","url":"app.js"}, {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} From 62b3cf0796df1e168a9b30c651bda5460273e0e5 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Thu, 23 Dec 2021 22:56:08 +0000 Subject: [PATCH 269/503] touchtimer: add all main buttons and create click handlers --- apps/touchtimer/app.js | 212 ++++++++++++++++++++++++++++++++++------- 1 file changed, 180 insertions(+), 32 deletions(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index 7ffce959f..534f4d62c 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,13 +1,114 @@ var DEBUG = true; var main = () => { - var button0 = new Button({ x1: 0, y1: 35, x2: 58, y1: 70 }, 0); + var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); + var button2 = new Button({ x1: 60, y1: 35, x2: 116, y2: 70 }, 2); + var button3 = new Button({ x1: 118, y1: 35, x2: 174, y2: 70 }, 3); - button0.draw(); + var button4 = new Button({ x1: 1, y1: 72, x2: 58, y2: 105 }, 4); + var button5 = new Button({ x1: 60, y1: 72, x2: 116, y2: 105 }, 5); + var button6 = new Button({ x1: 118, y1: 72, x2: 174, y2: 105 }, 6); - button0.onClick((value) => { - log("button with value clicked"); - log(value); + var button7 = new Button({ x1: 1, y1: 107, x2: 58, y2: 140 }, 7); + var button8 = new Button({ x1: 60, y1: 107, x2: 116, y2: 140 }, 8); + var button9 = new Button({ x1: 118, y1: 107, x2: 174, y2: 140 }, 9); + + var buttonStart = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "GO"); + var button0 = new Button({ x1: 60, y1: 142, x2: 116, y2: 174 }, 0); + var buttonDelete = new Button({ x1: 118, y1: 142, x2: 174, y2: 174 }, "<-"); + + var timerNumberButtons = [ + button1, + button2, + button3, + button4, + button5, + button6, + button7, + button8, + button9, + button0, + ]; + + var timerInputButtons = [ + button1, + button2, + button3, + button4, + button5, + button6, + button7, + button8, + button9, + buttonStart, + button0, + buttonDelete, + ]; + + var buttonPauseContinue = new Button( + { x1: 1, y1: 35, x2: 174, y2: 105 }, + "PAUSE" + ); + var buttonStop = new Button({ x1: 1, y1: 107, x2: 174, y2: 174 }, "STOP"); + + var timerRunningButtons = [buttonPauseContinue, buttonStop]; + + var timeStr = ""; + timerNumberButtons.forEach((numberButton) => { + numberButton.setOnClick((value) => { + log("number button clicked"); + log(value); + log(timeStr); + if (value === 0 && timeStr.length === 0) { + return; + } + + if (timeStr.length <= 6) { + timeStr = timeStr + value; + } + log(timeStr); + drawTimer(timeStr); + }); + }); + + buttonDelete.setOnClick(() => { + log("delete button clicked"); + timeStr = timeStr.slice(0, -1); + log(timeStr); + drawTimer(timeStr); + }); + + buttonStart.setOnClick(() => { + g.clear(); + drawTimer(timeStr); + + timerInputButtons.forEach((button) => button.disable()); + + timerRunningButtons.forEach((button) => { + button.enable(); + button.draw(); + }); + }); + + buttonStop.setOnClick(() => { + g.clear(); + timeStr = ""; + drawTimer(timeStr); + + timerRunningButtons.forEach((button) => button.disable()); + + timerInputButtons.forEach((button) => { + button.enable(); + button.draw(); + }); + }); + + // initalize + g.clear(); + drawTimer(timeStr); + timerInputButtons.forEach((button) => { + button.enable(); + button.draw(); }); }; @@ -19,11 +120,35 @@ var log = (message) => { } }; +var drawTimer = (timeStr) => { + timeStr = timeStr.padStart(6, "0"); + var timeStrDisplay = + "" + + timeStr.slice(0, 2) + + "h " + + timeStr.slice(2, 4) + + "m " + + timeStr.slice(4, 6) + + "s"; + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); +}; + var touchHandlers = []; Bangle.on("touch", (_button, xy) => { + log("touch"); + log(xy); + + var x = Math.min(Math.max(xy.x, 1), 174); + var y = Math.min(Math.max(xy.y, 1), 174); + touchHandlers.forEach((touchHandler) => { - touchHandler(xy); + touchHandler(x, y); }); }); @@ -34,28 +159,11 @@ class Button { this.position = position; this.value = value; - this.onClickCallbacks = []; - - touchHandlers.push((xy) => { - var x = xy.x; - var y = xy.y; - - if ( - x >= this.position.x1 && - x <= this.position.x2 && - y >= this.position.y1 && - y <= this.position.y2 - ) { - this.onClickCallbacks.forEach((onClickCallback) => - onClickCallback(this.value) - ); - } - }); + this.touchHandler = undefined; + this.highlightTimeoutId = undefined; } - draw() { - g.clear(); - + draw(highlight) { g.setColor(g.theme.fg); g.fillRect( this.position.x1, @@ -64,7 +172,11 @@ class Button { this.position.y2 ); - g.setColor(g.theme.bg); + if (highlight) { + g.setColor(g.theme.bgH); + } else { + g.setColor(g.theme.bg); + } g.fillRect( this.position.x1 + BUTTON_BORDER_WITH, this.position.y1 + BUTTON_BORDER_WITH, @@ -74,16 +186,52 @@ class Button { g.setColor(g.theme.fg); g.setFontAlign(0, 0); - g.setFont("Vector", 40); + g.setFont("Vector", 35); g.drawString( this.value, - this.position.x2 - this.position.x1, - this.position.y2 - this.position.y1 + this.position.x1 + (this.position.x2 - this.position.x1) / 2 + 2, + this.position.y1 + (this.position.y2 - this.position.y1) / 2 + 2 ); } - onClick(callback) { - this.onClickCallbacks.push(callback); + setOnClick(callback) { + this.touchHandler = (x, y) => { + if ( + x >= this.position.x1 && + x <= this.position.x2 && + y >= this.position.y1 && + y <= this.position.y2 + ) { + this.draw(true); + this.highlightTimeoutId = setTimeout(() => { + this.draw(); + this.highlightTimeoutId = undefined; + }, 100); + setTimeout(() => callback(this.value), 25); + } + }; + } + + disable() { + log("disable button"); + log(this.value); + var touchHandlerIndex = touchHandlers.indexOf(this.touchHandler); + if (touchHandlerIndex > -1) { + log("clearing touch handler"); + touchHandlers.splice(touchHandlerIndex, 1); + } + + if (this.highlightTimeoutId) { + log("clearing higlight timeout"); + clearTimeout(this.highlightTimeoutId); + this.highlightTimeoutId = undefined; + } + } + + enable() { + if (this.touchHandler) { + touchHandlers.push(this.touchHandler); + } } } From 144bb884003e1c249406853e360a485dbf8f3f64 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:03:45 +0000 Subject: [PATCH 270/503] Update settings.js --- apps/setting/settings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 1a9463858..bb54fa7e9 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -500,6 +500,9 @@ function showUtilMenu() { 'Debug Info': { value: E.clip(0|settings.log,0,2), format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], + min: 0, + max: 2, + step: 1, onchange: v => { settings.log = v; updateSettings(); From 3873acd7bb3f81ce665e0b333e0160653574a63b Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:17:11 +0000 Subject: [PATCH 271/503] Update settings.js --- apps/setting/settings.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index bb54fa7e9..1208018ed 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -499,10 +499,9 @@ function showUtilMenu() { '< Back': ()=>showMainMenu(), 'Debug Info': { value: E.clip(0|settings.log,0,2), - format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], min: 0, max: 2, - step: 1, + format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], onchange: v => { settings.log = v; updateSettings(); From 74c2eca062ae13bd5b45ed86a6090356085476c4 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:18:29 +0000 Subject: [PATCH 272/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..299920067 100644 --- a/apps.json +++ b/apps.json @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.38", + "version": "0.39", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", From d6f6b95daf4eddae94a29d9f2d5de4a4f1d9b4b0 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:24:44 +0000 Subject: [PATCH 273/503] Update ChangeLog --- apps/setting/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 143144d51..a2245a02d 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -41,3 +41,4 @@ 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey 0.38: Restructed menus as per forum discussion +0.39: Fix misbehaving debug info option From d76a89b89acdb55aa25059c2522492302854e9e4 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:42:25 +0100 Subject: [PATCH 274/503] Update gps-info.js Sum up number of GPS and Beidou satellites in view. --- apps/gpsinfo/gps-info.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index cca7e8e0f..4c935b61a 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -109,8 +109,13 @@ function onGPS(fix) { } function onGPSraw(nmea) { + var nofBD = 0; + var nofGP = 0; if (nmea.slice(3,6) == "GSV") { - SATinView = nmea.slice(11,13); + // console.log(nmea); + if (nmea.slice(0,7) == "$BDGSV,") nofBD = nmea.slice(11,13); + if (nmea.slice(0,7) == "$GPGSV,") nofGP = nmea.slice(11,13); + SATinView = nofBD + nofGP; } } From 298cd231b78d68650f070c94dca30f37305cc5f7 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:29:53 +0100 Subject: [PATCH 275/503] Create colorwheel.app.js --- apps/colorwheel.app.js | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 apps/colorwheel.app.js diff --git a/apps/colorwheel.app.js b/apps/colorwheel.app.js new file mode 100644 index 000000000..49648558c --- /dev/null +++ b/apps/colorwheel.app.js @@ -0,0 +1,81 @@ +//----------------------------------------------------------------------------// +//-- ColorWheel - draws a "wheel" of good looking colors --// +//----------------------------------------------------------------------------// + + let ColorList = [ + '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', + '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' + ]; + + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + let innerRadius = outerRadius*0.5; + + let sin = Math.sin, cos = Math.cos; + let twoPi = 2*Math.PI, halfPi = Math.PI/2; + + let DeltaPhi = twoPi/72; + let Epsilon = 0.001; + + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + for (let i = 0; i < 12; i++) { + let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; + + let Polygon = []; + for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { + Polygon.push(CenterX + outerRadius * sin(Phi)); + Polygon.push(CenterY - outerRadius * cos(Phi)); + } + + for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { + Polygon.push(CenterX + innerRadius * sin(Phi)); + Polygon.push(CenterY - innerRadius * cos(Phi)); + } + g.setColor(ColorList[i]); + g.fillPoly(Polygon); + } + + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setFont12x20(); + g.setFontAlign(0,0); + g.setColor(0,0,0); + + g.drawString('Tap', CenterX,CenterY-20); + g.drawString('on', CenterX,CenterY); + g.drawString('Color', CenterX,CenterY+20); + + Bangle.on('touch', function (Button,Position) { + Bangle.buzz(); + + let dx = Position.x - CenterX; + let dy = Position.y - CenterY; + + let Radius = Math.sqrt(dx*dx + dy*dy); + + let Color; + switch (true) { + case (Radius > outerRadius): Color = '#000000'; break; + case (Radius < innerRadius): Color = '#FFFFFF'; break; + default: + let Phi = Math.atan2(dy,dx) + halfPi; + if (Phi < 0) { Phi += twoPi; } + if (Phi > twoPi) { Phi -= twoPi; } + + let Index = Math.floor(12*Phi/twoPi); + Color = ColorList[Index]; + } + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setColor(0,0,0); + g.drawString(Color, CenterX,CenterY); + }); + From 78c61a5327bfa903992680ed880eef767289a85d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:31:01 +0100 Subject: [PATCH 276/503] Create app.js --- apps/colorwheel/app.js | 80 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 apps/colorwheel/app.js diff --git a/apps/colorwheel/app.js b/apps/colorwheel/app.js new file mode 100644 index 000000000..bdd7f1f18 --- /dev/null +++ b/apps/colorwheel/app.js @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------------// +//-- ColorWheel - draws a "wheel" of good looking colors --// +//----------------------------------------------------------------------------// + + let ColorList = [ + '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', + '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' + ]; + + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + let innerRadius = outerRadius*0.5; + + let sin = Math.sin, cos = Math.cos; + let twoPi = 2*Math.PI, halfPi = Math.PI/2; + + let DeltaPhi = twoPi/72; + let Epsilon = 0.001; + + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + for (let i = 0; i < 12; i++) { + let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; + + let Polygon = []; + for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { + Polygon.push(CenterX + outerRadius * sin(Phi)); + Polygon.push(CenterY - outerRadius * cos(Phi)); + } + + for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { + Polygon.push(CenterX + innerRadius * sin(Phi)); + Polygon.push(CenterY - innerRadius * cos(Phi)); + } + g.setColor(ColorList[i]); + g.fillPoly(Polygon); + } + + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setFont12x20(); + g.setFontAlign(0,0); + g.setColor(0,0,0); + + g.drawString('Tap', CenterX,CenterY-20); + g.drawString('on', CenterX,CenterY); + g.drawString('Color', CenterX,CenterY+20); + + Bangle.on('touch', function (Button,Position) { + Bangle.buzz(); + + let dx = Position.x - CenterX; + let dy = Position.y - CenterY; + + let Radius = Math.sqrt(dx*dx + dy*dy); + + let Color; + switch (true) { + case (Radius > outerRadius): Color = '#000000'; break; + case (Radius < innerRadius): Color = '#FFFFFF'; break; + default: + let Phi = Math.atan2(dy,dx) + halfPi; + if (Phi < 0) { Phi += twoPi; } + if (Phi > twoPi) { Phi -= twoPi; } + + let Index = Math.floor(12*Phi/twoPi); + Color = ColorList[Index]; + } + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setColor(0,0,0); + g.drawString(Color, CenterX,CenterY); + }); From 859c931a77a26d580d7ff03f04709343ac669b71 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:35:57 +0100 Subject: [PATCH 277/503] Update apps.json --- apps.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..75c311d83 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,20 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id":"colorwheel", + "name":"Color Wheel", + "tags":"tool", + "version":"0.01", + "description":"a tappable wheel of good-looking colors", + "supports":["BANGLEJS2"], + "allow_emulator":true, + "src":"colorwheel.app.js", + "icon":"colorwheel.img", + "storage": [ + {"name":"colorwheel.app.js","url":"app.js"}, + {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} + ] } ] From 42830ad231e1a4d99f6d768e0fb628ca38d6cce9 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:39:09 +0100 Subject: [PATCH 278/503] Create app-icon.js --- apps/colorwheel/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js new file mode 100644 index 000000000..3d7461806 --- /dev/null +++ b/apps/colorwheel/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) From 4521675e1b791b977cd7833c57487d6dc6965a7e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:43:02 +0100 Subject: [PATCH 279/503] Delete colorwheel.app.js --- apps/colorwheel.app.js | 81 ------------------------------------------ 1 file changed, 81 deletions(-) delete mode 100644 apps/colorwheel.app.js diff --git a/apps/colorwheel.app.js b/apps/colorwheel.app.js deleted file mode 100644 index 49648558c..000000000 --- a/apps/colorwheel.app.js +++ /dev/null @@ -1,81 +0,0 @@ -//----------------------------------------------------------------------------// -//-- ColorWheel - draws a "wheel" of good looking colors --// -//----------------------------------------------------------------------------// - - let ColorList = [ - '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', - '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' - ]; - - let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; - let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; - - let outerRadius = Math.min(CenterX,CenterY) * 0.9; - let innerRadius = outerRadius*0.5; - - let sin = Math.sin, cos = Math.cos; - let twoPi = 2*Math.PI, halfPi = Math.PI/2; - - let DeltaPhi = twoPi/72; - let Epsilon = 0.001; - - g.clear(); - - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - for (let i = 0; i < 12; i++) { - let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; - - let Polygon = []; - for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { - Polygon.push(CenterX + outerRadius * sin(Phi)); - Polygon.push(CenterY - outerRadius * cos(Phi)); - } - - for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { - Polygon.push(CenterX + innerRadius * sin(Phi)); - Polygon.push(CenterY - innerRadius * cos(Phi)); - } - g.setColor(ColorList[i]); - g.fillPoly(Polygon); - } - - g.setColor(1,1,1); - g.fillCircle(CenterX,CenterY, innerRadius); - - g.setFont12x20(); - g.setFontAlign(0,0); - g.setColor(0,0,0); - - g.drawString('Tap', CenterX,CenterY-20); - g.drawString('on', CenterX,CenterY); - g.drawString('Color', CenterX,CenterY+20); - - Bangle.on('touch', function (Button,Position) { - Bangle.buzz(); - - let dx = Position.x - CenterX; - let dy = Position.y - CenterY; - - let Radius = Math.sqrt(dx*dx + dy*dy); - - let Color; - switch (true) { - case (Radius > outerRadius): Color = '#000000'; break; - case (Radius < innerRadius): Color = '#FFFFFF'; break; - default: - let Phi = Math.atan2(dy,dx) + halfPi; - if (Phi < 0) { Phi += twoPi; } - if (Phi > twoPi) { Phi -= twoPi; } - - let Index = Math.floor(12*Phi/twoPi); - Color = ColorList[Index]; - } - g.setColor(1,1,1); - g.fillCircle(CenterX,CenterY, innerRadius); - - g.setColor(0,0,0); - g.drawString(Color, CenterX,CenterY); - }); - From 372628cc0e3073e03b0b943560954cb40e38a5f5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:43:31 +0100 Subject: [PATCH 280/503] Update app-icon.js --- apps/colorwheel/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js index 3d7461806..ad868ae52 100644 --- a/apps/colorwheel/app-icon.js +++ b/apps/colorwheel/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 54ce0c4d531fd01aa0a70b06e35f49b44971d8e6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:47:24 +0100 Subject: [PATCH 281/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 75c311d83..605c1c24f 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,7 @@ "icon":"colorwheel.img", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, - {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} + {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} ] } ] From 6160ab24f21bbe0b7a84816f5243ac44ca06859b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:48:07 +0100 Subject: [PATCH 282/503] Delete app-icon.js --- apps/colorwheel/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js deleted file mode 100644 index ad868ae52..000000000 --- a/apps/colorwheel/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 21b8e79980f850d13d07b6da4a71e1bf6d8bb7ec Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:48:31 +0100 Subject: [PATCH 283/503] Create colorwheel-icon.js --- apps/colorwheel/colorwheel-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/colorwheel-icon.js diff --git a/apps/colorwheel/colorwheel-icon.js b/apps/colorwheel/colorwheel-icon.js new file mode 100644 index 000000000..ad868ae52 --- /dev/null +++ b/apps/colorwheel/colorwheel-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From d9cda0e6962b7bcdd7a8f4f1b7e284686555758d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:51:09 +0100 Subject: [PATCH 284/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 605c1c24f..790cb1b13 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id":"colorwheel", "name":"Color Wheel", - "tags":"tool", + "tags":"app,tool", "version":"0.01", "description":"a tappable wheel of good-looking colors", "supports":["BANGLEJS2"], From b2c2da354d704e992049c88ae5abc9257615e702 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:54:13 +0100 Subject: [PATCH 285/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 790cb1b13..a0272a7ef 100644 --- a/apps.json +++ b/apps.json @@ -5072,7 +5072,7 @@ "supports":["BANGLEJS2"], "allow_emulator":true, "src":"colorwheel.app.js", - "icon":"colorwheel.img", + "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} From 438f3a66c2dce1dcf0e7ff9d0081ed993582218a Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:58:11 +0100 Subject: [PATCH 286/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a0272a7ef..9f7028746 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,7 @@ "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, - {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} + {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} ] } ] From e773e7b471da9b69ce58b4bc87223f73ee6753c2 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:58:59 +0100 Subject: [PATCH 287/503] Delete colorwheel-icon.js --- apps/colorwheel/colorwheel-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/colorwheel/colorwheel-icon.js diff --git a/apps/colorwheel/colorwheel-icon.js b/apps/colorwheel/colorwheel-icon.js deleted file mode 100644 index ad868ae52..000000000 --- a/apps/colorwheel/colorwheel-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From d1c8dd7fe33be7b049de07fcb27bb69322a67cb1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:59:14 +0100 Subject: [PATCH 288/503] Create app-icon.js --- apps/colorwheel/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js new file mode 100644 index 000000000..ad868ae52 --- /dev/null +++ b/apps/colorwheel/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 10e67cef0a50de60ff65dfd2da557f93077925a5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:03:45 +0100 Subject: [PATCH 289/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 9f7028746..c76756624 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "tags":"app,tool", "version":"0.01", "description":"a tappable wheel of good-looking colors", + "readme":"README.md", "supports":["BANGLEJS2"], "allow_emulator":true, "src":"colorwheel.app.js", From e854bd28a11e438ff9738f94d86eb2937924b2f0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:04:37 +0100 Subject: [PATCH 290/503] Create README.md --- apps/colorwheel/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/README.md diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md new file mode 100644 index 000000000..e4177eeba --- /dev/null +++ b/apps/colorwheel/README.md @@ -0,0 +1 @@ +# ColorWheel # From ceb189643bdd10d2444e1151de5aa406baae496f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:05:11 +0100 Subject: [PATCH 291/503] Add files via upload --- apps/colorwheel/BangleJS2-ColorWheel-2.png | Bin 0 -> 3165 bytes apps/colorwheel/BangleJS2-ColorWheel-3.png | Bin 0 -> 3095 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorwheel/BangleJS2-ColorWheel-2.png create mode 100644 apps/colorwheel/BangleJS2-ColorWheel-3.png diff --git a/apps/colorwheel/BangleJS2-ColorWheel-2.png b/apps/colorwheel/BangleJS2-ColorWheel-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0d0645bbb458a24070a95e84ba318cba18d74c GIT binary patch literal 3165 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 DMqmCA literal 0 HcmV?d00001 diff --git a/apps/colorwheel/BangleJS2-ColorWheel-3.png b/apps/colorwheel/BangleJS2-ColorWheel-3.png new file mode 100644 index 0000000000000000000000000000000000000000..981c4d56d6868a79da4162b0174fdb12a1e44a42 GIT binary patch literal 3095 zcmV+y4CwQTP)Px=(Md!>RCr$P-R+jEDhvkT_Wm!rvutbYP?QAn@dh$~&N_QgF+8RLt#iNKZjW33 zWCVgn;GTekj$C&88G!_x5JE>F0f!#G?0f=F1EC|3fI|;oc0K{8fzT01z@djPJD-5l zKm2ac=i8_XuA7mvf9y+eA(YTLM0dQZLpL zHDwgYZ4z}Ess#Lr$m8`?2qmL(+mV5C8z$(*0V|^2k#kLUw_g+Uf`ARss+JKH;p<>t z2e4F43sXKM zag&ozgIN$`1Lnd-Ehl`8o*tEoH^KxD7jWWLVc&;$f6^4Mq`(9`f;Y%qC6uZ zN|C=a9lRKb=LhVKnD0$=3thbah_$zyndP3 z2kU-LtT13D7kavY=(%PM=OqB#+3qCLCFt}sWzyCt;k zu}*xzr+8(r5pqWDZFtDM9%w0;qu_0oRuWlQPFJ;jIQty#)n&6?EATeGs2^p|%E*YR z@xcMi!Yg;pPy@wjhm7}g9(SETC@OJLaAN&hR2!Sn$!Kbp5BQll1l&T$mW?IQG3KwA z$K&F~0NjliXSE_C-W`iK;vTe;6T0yX+*LkcWaP+jE7N+@=X@n&H&RB70T#t;n~^04 zKq3o??8Bfo7U^eYC%uRV0iUh=dRA5K5KoEsQ&Z?o@Y<2>Z($EutoChT?+;3C%c=1y zB9$0I@dItNn8k_hn$0@}VE|%7Cfs#GYtJ%7{+DUgZNH@yd9qH#<=9ZvD{D!0zP( z9dY9Q(mcz=NO-?h5B>QFeg=jrAFeSc-~-RYO%6n~y=6oPV6^g~jyUmFn9>uQt8q>l z(E%9g`KQFomKFf99^eq=L;Wi(?17$jg8+azlQ~`nhMmBDGjZ+vSF>8|KCb|Xsaco_ zILn7_G)Nn+3mAU_ml>FFrK}4WI|CQ`=r$EG24A+h?*YF3b}3@uDNQ%?y0@ zG??wbAIk>{;1-_a?ZWBRKvh{+fPBff=XLPOTefE$NB|4fuk&;CE&5)kH2+hV4N|`5~5=)G6Q!6O>vV% z%m^+x-sNiGoX9co?!_bM9k_jJw#+*4K6IIZ8Hm9%Fa<F)$654cte}^QWQ2XGnzIqD}F$ZrSV9+}Fd?*s} z>#Or;KUjz<53wK5g#I|?aVroL^w5KJnDkjM+=%$n!`D&i5!L!4=rS3Y6Y8aFVHRM2 z#5Nh&sf^&DEx*yVBw{w+GW(B2od2CVF5dnc*a5IaD3?M!jCaQ@5qTPBZut-fuw)3A zKrDvW4sj3OF~G`MSQ710<%Bq1o3f&(e1HY4iTAtgGU3XEI$phu?2~~Nvaki-DG{6D zl}Fr*cRT|N0k%Y2pH2kM#^!Kq>(pZ-*jqk803JJa$))#zh#~NfW#kdOGJprNFb>}1 z8(soHhJst(qNOdFalW{Db#JooR&s4(O1uM#h&I+L#U1{SbW?9jkJP?9HyOahEF1%G znNf&WrgpO}>+S*6K9<=2uSa~ee2^<4j%84B@)6L|u40GM;)u2kq!==*9sNH63B2ln zBjJ5oAsZz(VZC<(wj`EpJlZcfza=`8Sp-A9OPCI}7(F6p!uHhg1`>dgo;iAc43g$Hptup@n9FVH;)Mz7_s(%efDpG7d!)N;nmN;`zV5CVl%w^ffh!riPsJ= zU?w(0Y>5{v6Kmr&1&p*RVTRWu0|OzR3NXs5MB=rHfCXOD4E!mF9oL6#hOTmy#mWdP zye@#fGVxM)9m@zyyl#LKvEh6446j^kysm()5gU%<|3i6{4-U@_d*F2kY=zhjujeX+ zVHx3t7Xq;M?dGNN8X)$>ivjp8Omm$$5$i<28!r@Kt#U$V=oouNsDTwSF#=vVz|x2r z%ygShh8P7eBw#7Tx*{2SPrQs^@tf}9^cS_-iul|3f$0u&z9P{fLUx51aUOHaVBwB$lhgzg~P66 zAme>!;)rm=XW$Z(**hM36oVp${YwRm7{{8#5l##aG9cc_8Mh=b9pJq_CRn#?0)lvk zjJpKj<4L+_WB|M~W!&We? Date: Sat, 25 Dec 2021 08:06:11 +0100 Subject: [PATCH 292/503] Update README.md --- apps/colorwheel/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index e4177eeba..5b2aeffcb 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -1 +1,4 @@ # ColorWheel # + +![](BangleJS2-ColorWheel-2.png) +![](BangleJS2-ColorWheel-3.png) From 9f910f8569007c44f23bf02366ea31289a1ca159 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:09:01 +0100 Subject: [PATCH 293/503] Update README.md --- apps/colorwheel/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index 5b2aeffcb..58d382851 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -1,4 +1,12 @@ # ColorWheel # +Choosing the right color on a Bangle.js 2 is not always easy. This little app therefore displays a wheel of rather good looking colors and reveals the associated color code by tapping on it + ![](BangleJS2-ColorWheel-2.png) ![](BangleJS2-ColorWheel-3.png) + +Please note: you may also tap outside the wheel (for black) or inside it (for white). + +## License ## + +[MIT License](LICENSE.md) From 0d6cf7caf8a820dfbba29145d7d7d5bd3dd74732 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:10:04 +0100 Subject: [PATCH 294/503] Create LICENSE --- apps/colorwheel/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/colorwheel/LICENSE diff --git a/apps/colorwheel/LICENSE b/apps/colorwheel/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/colorwheel/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 970387a7214fc628e1228023646ee304dd3b8b32 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:10:15 +0100 Subject: [PATCH 295/503] Update README.md --- apps/colorwheel/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index 58d382851..2cb94c439 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -9,4 +9,4 @@ Please note: you may also tap outside the wheel (for black) or inside it (for wh ## License ## -[MIT License](LICENSE.md) +[MIT License](LICENSE) From aa358138c49d7f8926b4fbe9b6a38e0dbbe9501f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:27:03 +0100 Subject: [PATCH 296/503] Update app-icon.js --- apps/colorwheel/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js index ad868ae52..3d7461806 100644 --- a/apps/colorwheel/app-icon.js +++ b/apps/colorwheel/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) +require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) From 41a50d457f79b414e419399326d142e5b607c84e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:28:51 +0100 Subject: [PATCH 297/503] Add files via upload --- apps/colorwheel/colorwheel.png | Bin 0 -> 3869 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorwheel/colorwheel.png diff --git a/apps/colorwheel/colorwheel.png b/apps/colorwheel/colorwheel.png new file mode 100644 index 0000000000000000000000000000000000000000..a15fd1c85f5a73e0082acb0806f79a1ba557a301 GIT binary patch literal 3869 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 Date: Sat, 25 Dec 2021 08:36:02 +0100 Subject: [PATCH 298/503] Update apps.json --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index c76756624..dd5f0cc6d 100644 --- a/apps.json +++ b/apps.json @@ -5072,7 +5072,6 @@ "readme":"README.md", "supports":["BANGLEJS2"], "allow_emulator":true, - "src":"colorwheel.app.js", "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, From bc58b67675b484270ec15d47ab4ca76d7b1bfe7b Mon Sep 17 00:00:00 2001 From: EmVee381 Date: Sat, 25 Dec 2021 14:23:35 +0100 Subject: [PATCH 299/503] corrected cs_CZ "trans" messages --- apps/locale/locales.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index b607998a0..a77ea16d3 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -589,7 +589,7 @@ var locales = { month: "leden,únor,březen,duben,květen,červen,červenec,srpen,září,říjen,listopad,prosinec", abday: "ne,po,út,st,čt,pá,so", day: "neděle,pondělí,úterý,středa,čtvrtek,pátek,sobota", - trans: { yes: "tak", Yes: "Tak", no: "nie", No: "Nie", ok: "ok", on: "na", off: "poza" } + trans: { yes: "ano", Yes: "Ano", no: "ne", No: "Ne", ok: "ok", on: "zap", off: "vyp" } }, "sl_SI": { lang: "sl_SI", From 4e19b5c7db68548e86de6c5a391b83471aa27cc8 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sun, 26 Dec 2021 10:06:54 +0100 Subject: [PATCH 300/503] Update app.js --- apps/colorwheel/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app.js b/apps/colorwheel/app.js index bdd7f1f18..7874c3f54 100644 --- a/apps/colorwheel/app.js +++ b/apps/colorwheel/app.js @@ -49,7 +49,7 @@ g.setColor(0,0,0); g.drawString('Tap', CenterX,CenterY-20); - g.drawString('on', CenterX,CenterY); + g.drawString('on a', CenterX,CenterY); g.drawString('Color', CenterX,CenterY+20); Bangle.on('touch', function (Button,Position) { From 2bf23bb5dc1eae3f0724e422fa683c3d15468763 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:00:22 +0900 Subject: [PATCH 301/503] Update awair_to_bangle.html --- apps/awairmonitor/awair_to_bangle.html | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/awairmonitor/awair_to_bangle.html b/apps/awairmonitor/awair_to_bangle.html index 2926cca9e..4e4465b75 100644 --- a/apps/awairmonitor/awair_to_bangle.html +++ b/apps/awairmonitor/awair_to_bangle.html @@ -7,7 +7,6 @@ // Don't forget to enable the Local API on your Awair before using this // https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -const awair_ip_1 = "192.168.2.2"; // <- INPUT YOUR AWAIR IP ADDRESS HERE const awair_name_1 = "Awair"; var bt_connection; @@ -15,7 +14,7 @@ var is_connected = false; var reconnect_counter = 5; var reconnect_attempt_counter = 1; -window.onload = function() { +function initChart() { var chart_co2; var chart_voc; var chart_pm; @@ -23,6 +22,8 @@ window.onload = function() { var chart_humidity; var dataPoints_1 = []; var posx = 0; + + var awair_ip_1 = document.getElementById('inputawairip').value; $.getJSON("http://"+awair_ip_1+"/air-data/latest", function(data) { $.each(data, function(key, value){ @@ -105,11 +106,13 @@ window.onload = function() { let current_humi = dataPoints_1['humid'][dataPoints_1['humid'].length-1].y; let current_temp = dataPoints_1['temp'][dataPoints_1['temp'].length-1].y; let last_update = dataPoints_1['temp'].length-1; - if (is_connected && bt_connection.isOpen) { + console.log(is_connected); + console.log(bt_connection); + if (is_connected && bt_connection && bt_connection.isOpen) { bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_last_update='+last_update+';\n'); console.log("Sent data through Bluetooth"); - } else if (is_connected && !bt_connection.isOpen) { + } else if (is_connected && bt_connection && !bt_connection.isOpen) { console.log("Disconnected - Next attempt to reconnect in " + reconnect_counter); reconnect_counter--; @@ -148,10 +151,13 @@ function connectBT() { bt_connection = c; is_connected = true; reconnect_attempt_counter = 1; + initChart(); }); } function disconnectBT() { + console.log("Disconnect Bluetooth button pressed. bt_connection value below.") + console.log(bt_connection); if (is_connected && bt_connection) { bt_connection.close(); is_connected = false; @@ -167,23 +173,21 @@ function disconnectBT() {

How to use -

+

Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -

-Step 2: Modify this HTML file to input the IP address of your Awair on top (const awair_ip_1 = "192.168.xx.xx") -

-Step 3: Launch the Awair Monitor app on your BangleJS -

-Step 4: Click "Connect BangleJS" -

-Step 5: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the bluetooth logs +

+Step 2: Launch the Awair Monitor app on your BangleJS +

+Step 3: Input your Awair IP address and click the Connect button: + + +

+Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs +

+Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection +

-
- - -
-

From 8d5eb78d7b147d60b67f89735f4f4dc5ad423e2d Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:02:53 +0900 Subject: [PATCH 302/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index f76800494..b88840a12 100644 --- a/apps.json +++ b/apps.json @@ -4940,6 +4940,7 @@ "type": "clock", "tags": "clock,tool,health", "readme":"README.md", + "custom": "awair_to_bangle.html", "supports":["BANGLEJS2"], "storage": [ {"name":"awairmonitor.app.js","url":"app.js"}, From a8d0baa434c446187ce4fdd9ace60a6181e86356 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:09:19 +0900 Subject: [PATCH 303/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b88840a12..ded742dc7 100644 --- a/apps.json +++ b/apps.json @@ -4935,7 +4935,7 @@ "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, - "version":"0.02", + "version":"0.03", "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", "type": "clock", "tags": "clock,tool,health", From e75bfe48830ff294e2e4673155d4b1e4fe4f5e15 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:33:39 +0900 Subject: [PATCH 304/503] Update awair_to_bangle.html --- apps/awairmonitor/awair_to_bangle.html | 493 ++++++++++++++++++++++++- 1 file changed, 488 insertions(+), 5 deletions(-) diff --git a/apps/awairmonitor/awair_to_bangle.html b/apps/awairmonitor/awair_to_bangle.html index 4e4465b75..8624d01f6 100644 --- a/apps/awairmonitor/awair_to_bangle.html +++ b/apps/awairmonitor/awair_to_bangle.html @@ -1,7 +1,488 @@ - + + + + + + + + + + + - function checkIfSupported() { - // Hack for windows - if (navigator.platform.indexOf("Win")>=0 && - (navigator.userAgent.indexOf("Chrome/54")>=0 || - navigator.userAgent.indexOf("Chrome/55")>=0 || - navigator.userAgent.indexOf("Chrome/56")>=0) - ) { - console.warn("Chrome <56 in Windows has navigator.bluetooth but it's not implemented properly"); - if (confirm("Web Bluetooth on Windows is not yet available.\nPlease click Ok to see other options for using Web Bluetooth")) - window.location = "https://www.espruino.com/Puck.js+Quick+Start"; - return false; - } - if (navigator.bluetooth) return true; - console.warn("No Web Bluetooth on this platform"); - var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; - if (iOS) { - if (confirm("To use Web Bluetooth on iOS you'll need the WebBLE App.\nPlease click Ok to go to the App Store and download it.")) - window.location = "https://itunes.apple.com/us/app/webble/id1193531073"; - } else { - if (confirm("This Web Browser doesn't support Web Bluetooth.\nPlease click Ok to see instructions for enabling it.")) - window.location = "https://www.espruino.com/Quick+Start+BLE#with-web-bluetooth"; - } - return false; - } +

+How to use +

+Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature +

+Step 2: Launch the Awair Monitor app on your BangleJS +

+Step 3: Input your Awair IP address and click the Connect button: + + +

+Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs +

+Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection +

+

- var NORDIC_SERVICE = "6e400001-b5a3-f393-e0a9-e50e24dcca9e"; - var NORDIC_TX = "6e400002-b5a3-f393-e0a9-e50e24dcca9e"; - var NORDIC_RX = "6e400003-b5a3-f393-e0a9-e50e24dcca9e"; - var DEFAULT_CHUNKSIZE = 20; +

- function log(level, s) { - if (puck.log) puck.log(level, s); - } - - function ab2str(buf) { - return String.fromCharCode.apply(null, new Uint8Array(buf)); +
+
+
+
+
+ +(buf)); } function str2ab(str) { @@ -590,93 +670,4 @@ function initChart() { let last_update = dataPoints_1['temp'].length-1; if (is_connected && bt_connection && bt_connection.isOpen) { - bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_last_update='+last_update+';\n'); - - console.log("Sent data through Bluetooth"); - } else if (is_connected && bt_connection && !bt_connection.isOpen) { - console.log("Disconnected - Next attempt to reconnect in " + reconnect_counter); - reconnect_counter--; - - if (reconnect_counter <= 0) { - reconnect_counter = 10 * reconnect_attempt_counter; - reconnect_attempt_counter++; - - console.log("Trying to reconnect"); - bt_connection.reconnect(function(c) { - console.log("Reconnect callback"); - if (!c) { - console.log("Couldn't reconnect"); - return; - } - bt_connection = c; - is_connected = true; - reconnect_attempt_counter = 1; - }); - } - } - - setTimeout(function(){updateChart()}, 1000); - }); - } -} - -function connectBT() { - console.log("Connect BT"); - Puck.connect(function(c) { - console.log("Connect callback"); - if (!c) { - console.log("Couldn't connect"); - return; - } - bt_connection = c; - is_connected = true; - reconnect_attempt_counter = 1; - if (!is_chart_started) { - initChart(); - is_chart_started = true; - } - }); -} - -function disconnectBT() { - console.log("Disconnect Bluetooth button pressed. bt_connection value below.") - console.log(bt_connection); - if (is_connected && bt_connection) { - bt_connection.close(); - is_connected = false; - console.log("Closed Bluetooth connection"); - } -} - - - - - - - -

-How to use -

-Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -

-Step 2: Launch the Awair Monitor app on your BangleJS -

-Step 3: Input your Awair IP address and click the Connect button: - - -

-Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs -

-Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection -

-

- -

- -
-
-
-
-
- - + bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_ From 0a12cebc6e3c62a54c4fd095ea7b3a22f0e47576 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 06:24:48 +0900 Subject: [PATCH 307/503] Update README.md --- apps/awairmonitor/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/awairmonitor/README.md b/apps/awairmonitor/README.md index 69894fea2..f4c7c42c4 100644 --- a/apps/awairmonitor/README.md +++ b/apps/awairmonitor/README.md @@ -5,11 +5,10 @@ Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awai * What you need: * A BangleJS 2 * An Awair device [with local API enabled](https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature) - * The web app [awair_to_bangle.html](awair_to_bangle.html) that will retrive the data from your Awair device and sent it to your BangleJS 2 through Chrome's Bluetooth LE connection + * The web app [awair_to_bangle.html](awair_to_bangle.html) that will retrieve the data from your Awair device and sent it to your BangleJS 2 through Chrome's Bluetooth LE connection * How to get started - * Open awair_to_bangle.html with a text/code editor and input the IP address of your Awair on top (const awair_ip_1 = "192.168.xx.xx") * Launch the Awair Monitor app on your BangleJS - * Open awair_to_bangle.html on Chrome and click "Connect BangleJS" - it connects to your watch the same way as the Bangle app store + * Open awair_to_bangle.html on Chrome (desktop or Android), input the IP address of your Awair device, and click "Connect BangleJS" - it connects to your watch the same way as the Bangle app store * Once connected to the watch with the app running, the watch app is updated once per second ![](screenshot.png) From d71e267610218b34a467277a94df8db9d10136f6 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 06:26:01 +0900 Subject: [PATCH 308/503] Update ChangeLog --- apps/awairmonitor/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/awairmonitor/ChangeLog b/apps/awairmonitor/ChangeLog index 88e9690d8..71d6399c4 100644 --- a/apps/awairmonitor/ChangeLog +++ b/apps/awairmonitor/ChangeLog @@ -1,2 +1,3 @@ 0.01: Beta version for Bangle 2 paired with Chrome (2021/12/11) 0.02: The app is now a clock, the data is greyed after the connection is lost (2021/12/22) +0.03: Set the Awair's IP directly on the webpage (2021/12/27) From 979593acaebb5a33d00e4838858c379fe961c208 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:06:40 +0100 Subject: [PATCH 309/503] added grid positioning and swipe controls added grid positioning and swipe controls to switch between numbers, operators and special for Bangle.js 2. --- apps/calculator/app.js | 271 +++++++++++++++++++++++------------------ 1 file changed, 153 insertions(+), 118 deletions(-) diff --git a/apps/calculator/app.js b/apps/calculator/app.js index 9f801cf22..042b777cc 100644 --- a/apps/calculator/app.js +++ b/apps/calculator/app.js @@ -8,7 +8,7 @@ g.clear(); require("Font7x11Numeric7Seg").add(Graphics); -var DEFAULT_SELECTION = '5'; +var DEFAULT_SELECTION_NUMBERS = '5', DEFAULT_SELECTION_OPERATORS = '=', DEFAULT_SELECTION_SPECIALS = 'R'; var RIGHT_MARGIN = 20; var RESULT_HEIGHT = 40; var COLORS = { @@ -18,97 +18,45 @@ var COLORS = { 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 KEY_AREA = [0, RESULT_HEIGHT, g.getWidth(), g.getHeight()]; + +var screen, screenColor; +var globalGrid = [4, 5]; +var swipeEnabled; + +var numbersGrid = [3, 4]; +var numbers = { + '0': {grid: [1, 3], globalGrid: [1, 4], trbl: '2.00'}, + '.': {grid: [2, 3], globalGrid: [2, 4], trbl: '3=.0'}, + '1': {grid: [0, 2], globalGrid: [0, 3], trbl: '4201'}, + '2': {grid: [1, 2], globalGrid: [1, 3], trbl: '5301'}, + '3': {grid: [2, 2], globalGrid: [2, 3], trbl: '6+.2'}, + '4': {grid: [0, 1], globalGrid: [0, 2], trbl: '7514'}, + '5': {grid: [1, 1], globalGrid: [1, 2], trbl: '8624'}, + '6': {grid: [2, 1], globalGrid: [2, 2], trbl: '9-35'}, + '7': {grid: [0, 0], globalGrid: [0, 1], trbl: 'R847'}, + '8': {grid: [1, 0], globalGrid: [1, 1], trbl: 'N957'}, + '9': {grid: [2, 0], globalGrid: [2, 1], trbl: '%*68'}, }; -var selected = DEFAULT_SELECTION; -var prevSelected = DEFAULT_SELECTION; +var operatorsGrid = [2, 3]; +var operators = { + '+': {grid: [0, 0], globalGrid: [3, 3], trbl: '-+=3'}, + '-': {grid: [1, 0], globalGrid: [3, 2], trbl: '*-+6'}, + '*': {grid: [0, 1], globalGrid: [3, 1], trbl: '/*-9'}, + '/': {grid: [1, 1], globalGrid: [3, 0], trbl: '//*%'}, + '=': {grid: [1, 2], globalGrid: [3, 4], trbl: '+==.'}, +}; + +var specialsGrid = [2, 2]; +var specials = { + 'R': {grid: [0, 0], globalGrid: [0, 0], trbl: 'RN7R', val: 'AC'}, + 'N': {grid: [1, 0], globalGrid: [1, 0], trbl: 'N%8R', val: '+/-'}, + '%': {grid: [0, 1], globalGrid: [2, 0], trbl: '%/9N'}, +}; + +var selected = DEFAULT_SELECTION_NUMBERS; +var prevSelected = DEFAULT_SELECTION_NUMBERS; var prevNumber = null; var currNumber = null; var operator = null; @@ -116,6 +64,27 @@ var results = null; var isDecimal = false; var hasPressedEquals = false; +function prepareScreen(screen, grid, defaultColor) { + for (var k in screen) { + if (screen.hasOwnProperty(k)) { + screen[k].color = screen[k].color || defaultColor; + var position = []; + var xGrid = (KEY_AREA[2]-KEY_AREA[0])/grid[0]; + var yGrid = (KEY_AREA[3]-KEY_AREA[1])/grid[1]; + if (swipeEnabled) { + position[0] = KEY_AREA[0]+xGrid*screen[k].grid[0]; + position[1] = KEY_AREA[1]+yGrid*screen[k].grid[1]; + } else { + position[0] = KEY_AREA[0]+xGrid*screen[k].globalGrid[0]; + position[1] = KEY_AREA[1]+yGrid*screen[k].globalGrid[1]; + } + position[2] = position[0]+xGrid-1; + position[3] = position[1]+yGrid-1; + screen[k].xy = position; + } + } +} + function drawKey(name, k, selected) { var rMargin = 0; var bMargin = 0; @@ -142,6 +111,56 @@ function drawKey(name, k, selected) { g.drawString(k.val || name, (k.xy[0] + k.xy[2])/2, (k.xy[1] + k.xy[3])/2); } +function drawKeys() { + g.setColor(screenColor[0]); + g.fillRect(KEY_AREA[0], KEY_AREA[1], KEY_AREA[2], KEY_AREA[3]); + for (var k in screen) { + if (screen.hasOwnProperty(k)) { + drawKey(k, screen[k], k == selected); + } + } +} +function drawGlobal() { + screen = {}; + screenColor = COLORS.DEFAULT; + prepareScreen(numbers, globalGrid, COLORS.DEFAULT); + for (var k in numbers) { + screen[k] = numbers[k]; + } + prepareScreen(operators, globalGrid, COLORS.OPERATOR); + for (var k in operators) { + screen[k] = operators[k]; + } + prepareScreen(specials, globalGrid, COLORS.SPECIAL); + for (var k in specials) { + screen[k] = specials[k]; + } + drawKeys(); + var selected = DEFAULT_SELECTION_NUMBERS; + var prevSelected = DEFAULT_SELECTION_NUMBERS; +} +function drawNumbers() { + screen = numbers; + screenColor = COLORS.DEFAULT; + drawKeys(); + var selected = DEFAULT_SELECTION_NUMBERS; + var prevSelected = DEFAULT_SELECTION_NUMBERS; +} +function drawOperators() { + screen = operators; + screenColor =COLORS.OPERATOR; + drawKeys(); + var selected = DEFAULT_SELECTION_OPERATORS; + var prevSelected = DEFAULT_SELECTION_OPERATORS; +} +function drawSpecials() { + screen = specials; + screenColor = COLORS.SPECIAL; + drawKeys(); + var selected = DEFAULT_SELECTION_SPECIALS; + var prevSelected = DEFAULT_SELECTION_SPECIALS; +} + function getIntWithPrecision(x) { var xStr = x.toString(); var xRadix = xStr.indexOf('.'); @@ -218,8 +237,8 @@ function displayOutput(num) { hasPressedEquals = false; prevNumber = null; operator = null; - keys.R.val = 'AC'; - drawKey('R', keys.R); + specials.R.val = 'AC'; + if (!swipeEnabled) drawKey('R', specials.R); g.setFont('Vector', 22); } else { // might not be a number due to display of dot "." @@ -299,12 +318,12 @@ function buttonPress(val) { results = null; isDecimal = false; hasPressedEquals = false; - if (keys.R.val == 'AC') { + if (specials.R.val == 'AC') { prevNumber = null; operator = null; } else { - keys.R.val = 'AC'; - drawKey('R', keys.R, true); + specials.R.val = 'AC'; + drawKey('R', specials.R, true); } wasPressedEquals = false; hasPressedNumber = false; @@ -331,10 +350,11 @@ function buttonPress(val) { case '+': calculatorLogic(val); hasPressedNumber = false; + if (swipeEnabled) drawNumbers(); break; case '.': - keys.R.val = 'C'; - drawKey('R', keys.R); + specials.R.val = 'C'; + if (!swipeEnabled) drawKey('R', specials.R); isDecimal = true; displayOutput(currNumber == null ? 0 + '.' : currNumber + '.'); break; @@ -348,8 +368,8 @@ function buttonPress(val) { hasPressedNumber = false; break; default: - keys.R.val = 'C'; - drawKey('R', keys.R); + specials.R.val = 'C'; + if (!swipeEnabled) drawKey('R', specials.R); const is0Negative = (currNumber === 0 && 1/currNumber === -Infinity); if (isDecimal) { currNumber = currNumber == null || hasPressedEquals === 1 ? 0 + '.' + val : currNumber + '.' + val; @@ -367,23 +387,31 @@ function buttonPress(val) { } function moveDirection(d) { - drawKey(selected, keys[selected]); + drawKey(selected, screen[selected]); prevSelected = selected; - selected = (d === 0 && selected == '0' && prevSelected === '1') ? '1' : keys[selected].trbl[d]; - drawKey(selected, keys[selected], true); + selected = (d === 0 && selected == '0' && prevSelected === '1') ? '1' : screen[selected].trbl[d]; + drawKey(selected, screen[selected], true); } -if (global.BTN4) { +if (process.env.HWVERSION==1) { setWatch(_ => moveDirection(0), BTN1, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(2), BTN3, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(3), BTN4, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(1), BTN5, {repeat: true, debounce: 100}); setWatch(_ => buttonPress(selected), BTN2, {repeat: true, debounce: 100}); + swipeEnabled = false; + drawGlobal(); } else { // touchscreen? selected = "NONE"; + swipeEnabled = true; + prepareScreen(numbers, numbersGrid, COLORS.DEFAULT); + prepareScreen(operators, operatorsGrid, COLORS.OPERATOR); + prepareScreen(specials, specialsGrid, COLORS.SPECIAL); + drawNumbers(); Bangle.on('touch',(n,e)=>{ - for (var key in keys) { - var r = keys[key].xy; + for (var key in screen) { + if (typeof screen[key] == "undefined") break; + var r = screen[key].xy; if (e.x>=r[0] && e.y>=r[1] && e.x { + if (!e.b) { + if (lastX > 50) { // right + drawSpecials(); + } else if (lastX < -50) { // left + drawOperators(); + } else if (lastY > 50) { // down + drawNumbers(); + } else if (lastY < -50) { // up + drawNumbers(); + } + lastX = 0; + lastY = 0; + } else { + lastX = lastX + e.dx; + lastY = lastY + e.dy; + } + }); } -// rescale for non-240px screens -if (g.getWidth()!=240) { - RESULT_HEIGHT = RESULT_HEIGHT*g.getWidth()/240; - for (var k in keys) { - keys[k].xy = keys[k].xy.map(n => n*g.getWidth()/240); - } -} -// draw keys -for (var k in keys) { - if (keys.hasOwnProperty(k)) { - drawKey(k, keys[k], k == selected); - } -} + displayOutput(0); From 95f0891ad7135a48731b66818bbd929b22565b67 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:07:20 +0100 Subject: [PATCH 310/503] added grid positioning and swipe controls added grid positioning and swipe controls to switch between numbers, operators and special for Bangle.js 2. --- apps/calculator/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/calculator/ChangeLog b/apps/calculator/ChangeLog index 6a3308c50..a08a0f5a7 100644 --- a/apps/calculator/ChangeLog +++ b/apps/calculator/ChangeLog @@ -2,3 +2,4 @@ 0.02: fix precision rounding issue + no reset when equals pressed 0.03: Support for different screen sizes and touchscreen 0.04: Display current operation on LHS +0.05: Grid positioning and swipe controls to switch between numbers, operators and special (for Bangle.js 2) From e7e051a4614a381eb18bbf97e568e9be64df5c89 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:13:04 +0100 Subject: [PATCH 311/503] removed one spacing error --- apps/calculator/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/calculator/app.js b/apps/calculator/app.js index 042b777cc..40953254e 100644 --- a/apps/calculator/app.js +++ b/apps/calculator/app.js @@ -410,7 +410,7 @@ if (process.env.HWVERSION==1) { drawNumbers(); Bangle.on('touch',(n,e)=>{ for (var key in screen) { - if (typeof screen[key] == "undefined") break; + if (typeof screen[key] == "undefined") break; var r = screen[key].xy; if (e.x>=r[0] && e.y>=r[1] && e.x Date: Mon, 27 Dec 2021 15:48:40 +0100 Subject: [PATCH 313/503] Create app.js --- teatimer/app.js | 233 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 teatimer/app.js diff --git a/teatimer/app.js b/teatimer/app.js new file mode 100644 index 000000000..dd7afdadb --- /dev/null +++ b/teatimer/app.js @@ -0,0 +1,233 @@ +// Tea Timer +// Button press stops timer, next press restarts timer +let drag; +var counter = 0; +var counterStart = 150; // 150 seconds +var counterInterval; +const states = { + init: 1, // unused + help: 2, // show help text + start: 4, // show/change initial counter + count: 8, // count down + countUp: 16, // count up after timer finished + stop: 32 // timer stopped +}; +var state = states.start; +E.setTimeZone(1); + +// Title showing current time +function appTitle() { + return "Tea Timer " + currentTime(); +} + +function currentTime() { + min = Date().getMinutes(); + if (min < 10) min = "0" + min; + return Date().getHours() + ":" + min; +} + +function timeFormated(sec) { + var min = Math.floor(sec / 60); + sec = sec % 60; + if (sec < 10) sec = "0" + sec; + return min + ":" + sec; +} + +// initialize timer and show timer value => state: start +function initTimer() { + counter = counterStart; + setState(states.start); + showCounter(true); +} + +// timer value (counter) can be changed in state start +function changeCounter(diff) { + if (state == states.start) { + if (counter + diff > 0) { + counter = counter + diff; + showCounter(true); + } + } +} + +// start or restart timer => state: count +function startTimer() { + counterStart = counter; + setState(states.count); + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +/* show current counter value at start and while count down + Show + - Title with current time + - initial timer value + - remaining time + - hint for help in state start +*/ +function showCounter(withHint) { + //g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + // draw the current counter value + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",60); // vector font, 60px + g.drawString(timeFormated(counter),83,100); + if (withHint) { + g.setFont("Vector",20); // vector font, 80px + g.drawString("Tap for help",80,150); + } +} + +// count down and update every second +// when time is up, start counting up +function countDown() { + counter--; + // Out of time + if (counter<=0) { + outOfTime(); + countUp(); + counterInterval = setInterval(countUp, 1000); + return; + } + showCounter(false); +} + +// +function outOfTime() { + E.showMessage("Time is up!",appTitle()); + setState(states.countUp); + resetTimer(); + Bangle.buzz(); + Bangle.buzz(); +} + +/* this counts up (one minute), after time is up + Show + - Title with current time + - initial timer value + - "Time is up!" + - time since timer finished +*/ +function countUp() { + // buzz for 15 seconds + counter++; + if (counter <=15) { + Bangle.buzz(); + } + // stop counting up after 60 seconds + if (counter > 60) { + outOfTime(); + return; + } + g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",30); // vector font, 80px + g.setBgColor(-1).setColor(1,0,0); // red + g.drawString("Time is up!",85,85); + g.setFont("Vector",40); // vector font, 80px + // draw the current counter value + g.drawString(timeFormated(counter),80,130); +} + +// reset when interupted by user oder 60 seconds after timer finished +function resetTimer() { + clearInterval(); + counterInterval = undefined; +} + +// timer is stopped by user => state: stop +function stopTimer() { + resetTimer(); + E.showMessage("Timer stopped!", appTitle()); + setState(states.stop); +} + +// timer is stopped by user while counting up => state: start +function stopTimer2() { + resetTimer(); + initTimer(); +} + + +function setState(st) { + state = st; +} + +function buttonPressed() { + switch(state) { + case states.init: + initTimer(); + break; + case states.help: + initTimer(); + break; + case states.start: + startTimer(); + break; + case states.count: + stopTimer(); + break; + case states.countUp: + stopTimer2(); + break; + case states.stop: + initTimer(); + break; + default: + initTimer(); + break; + } +} + +/* Change initial counter value by swiping + swipe up: +1 minute + swipe down: -1 minute + swipe right: +15 seconds + swipe left: -15 seconds */ +function initDragEvents() { + Bangle.on("drag", e => { + if (state == states.start) { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if (Math.abs(dx)>Math.abs(dy)+10) { + // horizontal + changeCounter(dx>0 ? 15 : -15); + } else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + changeCounter(dy>0 ? -60 : 60); + } + } + } +}); +} + +// show help text while in start state (see initDragEvents()) +function showHelp() { + if (state == states.start) { + state = states.help; + E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); + } + // return to start + else if (state == states.help) { + initTimer(); + } +} + +// drag events in start state (to change counter value) +initDragEvents(); +// Show help test in start state +Bangle.on('touch', function(button, xy) { showHelp(); }); +// event handling for button1 +setWatch(buttonPressed, BTN1, {repeat: true}); +initTimer(); From 5fac230cb9254c3381328ea379c27a1a0942c8c0 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:56:22 +0100 Subject: [PATCH 314/503] Create app-icon.js --- teatimer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 teatimer/app-icon.js diff --git a/teatimer/app-icon.js b/teatimer/app-icon.js new file mode 100644 index 000000000..ae91f88d7 --- /dev/null +++ b/teatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) From af47e1c672a0904cd01cf9289d5bb3f8d0d0c7ee Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:11:21 +0100 Subject: [PATCH 315/503] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..e11d8b4ba 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "teatimer", + "name": "Tea Timer", + "shortName" : "Tea Timer", + "version": "1.00", + "icon": "teatimer.png", + "description": "description": "A simple timer. You can easyly set up the time.", + "supports": ["BANGLEJS2"], + "tags": "", + "storage": [ + {"name":"teatimer.app.js","url":"app.js"}, + {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ] } ] From e0e75083616553cdac118128f3d524c94c61988f Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:38:12 +0100 Subject: [PATCH 316/503] Create app-icon.js --- apps/teatimer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/teatimer/app-icon.js diff --git a/apps/teatimer/app-icon.js b/apps/teatimer/app-icon.js new file mode 100644 index 000000000..ae91f88d7 --- /dev/null +++ b/apps/teatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) From df52a6b307ac34809a8ca27dae2fae5b1378b510 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:39:25 +0100 Subject: [PATCH 317/503] Create app.js --- apps/teatimer/app.js | 233 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 apps/teatimer/app.js diff --git a/apps/teatimer/app.js b/apps/teatimer/app.js new file mode 100644 index 000000000..dd7afdadb --- /dev/null +++ b/apps/teatimer/app.js @@ -0,0 +1,233 @@ +// Tea Timer +// Button press stops timer, next press restarts timer +let drag; +var counter = 0; +var counterStart = 150; // 150 seconds +var counterInterval; +const states = { + init: 1, // unused + help: 2, // show help text + start: 4, // show/change initial counter + count: 8, // count down + countUp: 16, // count up after timer finished + stop: 32 // timer stopped +}; +var state = states.start; +E.setTimeZone(1); + +// Title showing current time +function appTitle() { + return "Tea Timer " + currentTime(); +} + +function currentTime() { + min = Date().getMinutes(); + if (min < 10) min = "0" + min; + return Date().getHours() + ":" + min; +} + +function timeFormated(sec) { + var min = Math.floor(sec / 60); + sec = sec % 60; + if (sec < 10) sec = "0" + sec; + return min + ":" + sec; +} + +// initialize timer and show timer value => state: start +function initTimer() { + counter = counterStart; + setState(states.start); + showCounter(true); +} + +// timer value (counter) can be changed in state start +function changeCounter(diff) { + if (state == states.start) { + if (counter + diff > 0) { + counter = counter + diff; + showCounter(true); + } + } +} + +// start or restart timer => state: count +function startTimer() { + counterStart = counter; + setState(states.count); + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +/* show current counter value at start and while count down + Show + - Title with current time + - initial timer value + - remaining time + - hint for help in state start +*/ +function showCounter(withHint) { + //g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + // draw the current counter value + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",60); // vector font, 60px + g.drawString(timeFormated(counter),83,100); + if (withHint) { + g.setFont("Vector",20); // vector font, 80px + g.drawString("Tap for help",80,150); + } +} + +// count down and update every second +// when time is up, start counting up +function countDown() { + counter--; + // Out of time + if (counter<=0) { + outOfTime(); + countUp(); + counterInterval = setInterval(countUp, 1000); + return; + } + showCounter(false); +} + +// +function outOfTime() { + E.showMessage("Time is up!",appTitle()); + setState(states.countUp); + resetTimer(); + Bangle.buzz(); + Bangle.buzz(); +} + +/* this counts up (one minute), after time is up + Show + - Title with current time + - initial timer value + - "Time is up!" + - time since timer finished +*/ +function countUp() { + // buzz for 15 seconds + counter++; + if (counter <=15) { + Bangle.buzz(); + } + // stop counting up after 60 seconds + if (counter > 60) { + outOfTime(); + return; + } + g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",30); // vector font, 80px + g.setBgColor(-1).setColor(1,0,0); // red + g.drawString("Time is up!",85,85); + g.setFont("Vector",40); // vector font, 80px + // draw the current counter value + g.drawString(timeFormated(counter),80,130); +} + +// reset when interupted by user oder 60 seconds after timer finished +function resetTimer() { + clearInterval(); + counterInterval = undefined; +} + +// timer is stopped by user => state: stop +function stopTimer() { + resetTimer(); + E.showMessage("Timer stopped!", appTitle()); + setState(states.stop); +} + +// timer is stopped by user while counting up => state: start +function stopTimer2() { + resetTimer(); + initTimer(); +} + + +function setState(st) { + state = st; +} + +function buttonPressed() { + switch(state) { + case states.init: + initTimer(); + break; + case states.help: + initTimer(); + break; + case states.start: + startTimer(); + break; + case states.count: + stopTimer(); + break; + case states.countUp: + stopTimer2(); + break; + case states.stop: + initTimer(); + break; + default: + initTimer(); + break; + } +} + +/* Change initial counter value by swiping + swipe up: +1 minute + swipe down: -1 minute + swipe right: +15 seconds + swipe left: -15 seconds */ +function initDragEvents() { + Bangle.on("drag", e => { + if (state == states.start) { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if (Math.abs(dx)>Math.abs(dy)+10) { + // horizontal + changeCounter(dx>0 ? 15 : -15); + } else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + changeCounter(dy>0 ? -60 : 60); + } + } + } +}); +} + +// show help text while in start state (see initDragEvents()) +function showHelp() { + if (state == states.start) { + state = states.help; + E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); + } + // return to start + else if (state == states.help) { + initTimer(); + } +} + +// drag events in start state (to change counter value) +initDragEvents(); +// Show help test in start state +Bangle.on('touch', function(button, xy) { showHelp(); }); +// event handling for button1 +setWatch(buttonPressed, BTN1, {repeat: true}); +initTimer(); From cf865a5d779be2c3bcf7430f340a52ce5f164137 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:39:55 +0100 Subject: [PATCH 318/503] Delete teatimer directory --- teatimer/app-icon.js | 1 - teatimer/app.js | 233 ------------------------------------------- 2 files changed, 234 deletions(-) delete mode 100644 teatimer/app-icon.js delete mode 100644 teatimer/app.js diff --git a/teatimer/app-icon.js b/teatimer/app-icon.js deleted file mode 100644 index ae91f88d7..000000000 --- a/teatimer/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) diff --git a/teatimer/app.js b/teatimer/app.js deleted file mode 100644 index dd7afdadb..000000000 --- a/teatimer/app.js +++ /dev/null @@ -1,233 +0,0 @@ -// Tea Timer -// Button press stops timer, next press restarts timer -let drag; -var counter = 0; -var counterStart = 150; // 150 seconds -var counterInterval; -const states = { - init: 1, // unused - help: 2, // show help text - start: 4, // show/change initial counter - count: 8, // count down - countUp: 16, // count up after timer finished - stop: 32 // timer stopped -}; -var state = states.start; -E.setTimeZone(1); - -// Title showing current time -function appTitle() { - return "Tea Timer " + currentTime(); -} - -function currentTime() { - min = Date().getMinutes(); - if (min < 10) min = "0" + min; - return Date().getHours() + ":" + min; -} - -function timeFormated(sec) { - var min = Math.floor(sec / 60); - sec = sec % 60; - if (sec < 10) sec = "0" + sec; - return min + ":" + sec; -} - -// initialize timer and show timer value => state: start -function initTimer() { - counter = counterStart; - setState(states.start); - showCounter(true); -} - -// timer value (counter) can be changed in state start -function changeCounter(diff) { - if (state == states.start) { - if (counter + diff > 0) { - counter = counter + diff; - showCounter(true); - } - } -} - -// start or restart timer => state: count -function startTimer() { - counterStart = counter; - setState(states.count); - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -/* show current counter value at start and while count down - Show - - Title with current time - - initial timer value - - remaining time - - hint for help in state start -*/ -function showCounter(withHint) { - //g.clear(); - E.showMessage("", appTitle()); - g.setFontAlign(0,0); // center font - // draw the current counter value - g.setBgColor(-1).setColor(0,0,1); // blue - g.setFont("Vector",20); // vector font, 20px - g.drawString("Timer: " + timeFormated(counterStart),80,55); - g.setFont("Vector",60); // vector font, 60px - g.drawString(timeFormated(counter),83,100); - if (withHint) { - g.setFont("Vector",20); // vector font, 80px - g.drawString("Tap for help",80,150); - } -} - -// count down and update every second -// when time is up, start counting up -function countDown() { - counter--; - // Out of time - if (counter<=0) { - outOfTime(); - countUp(); - counterInterval = setInterval(countUp, 1000); - return; - } - showCounter(false); -} - -// -function outOfTime() { - E.showMessage("Time is up!",appTitle()); - setState(states.countUp); - resetTimer(); - Bangle.buzz(); - Bangle.buzz(); -} - -/* this counts up (one minute), after time is up - Show - - Title with current time - - initial timer value - - "Time is up!" - - time since timer finished -*/ -function countUp() { - // buzz for 15 seconds - counter++; - if (counter <=15) { - Bangle.buzz(); - } - // stop counting up after 60 seconds - if (counter > 60) { - outOfTime(); - return; - } - g.clear(); - E.showMessage("", appTitle()); - g.setFontAlign(0,0); // center font - g.setBgColor(-1).setColor(0,0,1); // blue - g.setFont("Vector",20); // vector font, 20px - g.drawString("Timer: " + timeFormated(counterStart),80,55); - g.setFont("Vector",30); // vector font, 80px - g.setBgColor(-1).setColor(1,0,0); // red - g.drawString("Time is up!",85,85); - g.setFont("Vector",40); // vector font, 80px - // draw the current counter value - g.drawString(timeFormated(counter),80,130); -} - -// reset when interupted by user oder 60 seconds after timer finished -function resetTimer() { - clearInterval(); - counterInterval = undefined; -} - -// timer is stopped by user => state: stop -function stopTimer() { - resetTimer(); - E.showMessage("Timer stopped!", appTitle()); - setState(states.stop); -} - -// timer is stopped by user while counting up => state: start -function stopTimer2() { - resetTimer(); - initTimer(); -} - - -function setState(st) { - state = st; -} - -function buttonPressed() { - switch(state) { - case states.init: - initTimer(); - break; - case states.help: - initTimer(); - break; - case states.start: - startTimer(); - break; - case states.count: - stopTimer(); - break; - case states.countUp: - stopTimer2(); - break; - case states.stop: - initTimer(); - break; - default: - initTimer(); - break; - } -} - -/* Change initial counter value by swiping - swipe up: +1 minute - swipe down: -1 minute - swipe right: +15 seconds - swipe left: -15 seconds */ -function initDragEvents() { - Bangle.on("drag", e => { - if (state == states.start) { - if (!drag) { // start dragging - drag = {x: e.x, y: e.y}; - } else if (!e.b) { // released - const dx = e.x-drag.x, dy = e.y-drag.y; - drag = null; - if (Math.abs(dx)>Math.abs(dy)+10) { - // horizontal - changeCounter(dx>0 ? 15 : -15); - } else if (Math.abs(dy)>Math.abs(dx)+10) { - // vertical - changeCounter(dy>0 ? -60 : 60); - } - } - } -}); -} - -// show help text while in start state (see initDragEvents()) -function showHelp() { - if (state == states.start) { - state = states.help; - E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); - } - // return to start - else if (state == states.help) { - initTimer(); - } -} - -// drag events in start state (to change counter value) -initDragEvents(); -// Show help test in start state -Bangle.on('touch', function(button, xy) { showHelp(); }); -// event handling for button1 -setWatch(buttonPressed, BTN1, {repeat: true}); -initTimer(); From 1133ea25bc7bda4571ed0e8dc52e61328e5482ab Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:44:09 +0100 Subject: [PATCH 319/503] Add files via upload --- apps/teatimer/teatimer.png | Bin 0 -> 1900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/teatimer/teatimer.png diff --git a/apps/teatimer/teatimer.png b/apps/teatimer/teatimer.png new file mode 100644 index 0000000000000000000000000000000000000000..29ca58f0ecd948dbc172fa9f004f3ec9f05c94bc GIT binary patch literal 1900 zcmV-y2b1`TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2LVY$K~!i%&01Y- z6jc=d?wy(4+1=UxZ5PohKLuK(R;uD};$H-W01s$lBt%i;FAt58_}~-z;)|j_QH{p` z@L{J9q9>KfC_;qVCSk$DT~T`CZ1!x7)B|5LEt8aHt3;S0^H==MwjKy?A&}>-w)c zPKuj8-?D7mr5jT_(r=8|4(jPv6++0;Q~xu#Bv6zNrgkOnYkc#_r>$boslCqj(N{)o z$8M^mxNztX*MAGt=dSoleNRM4(cgNKk2Q&w{!QObTDeYAK2-ksoX`sj;u!^@eECAa z$mwL-sD-?0m#@r;LY>eDL__cGlQyhqMYkc-7&!%35600pq(ij?s4D|OK_Qcp)l&;{ z_-4fvG7+o%%N!`VlPT(Y*VuGWRlr852NL5N8YUzbpVHBliu!gbTLpUCGB`PZ8dEVF z!-)b+tqKAR=3V#0nyOV`i%Xl>QV%CaB(6ND;Nqjq-y7KKKVL3!v`#{;he6==s?mJdFnAwIuDc+s0Ou;|=$?@z$3YB%*MsydhLu2{? z4X-AtQJpBxK$a56Nb_2}AV0=|!WXcpc!5s>8}LM?9m|hCj#y@}1_BZj^{bFt`V5|p z^%H@8o(Xt%A*9-(x9Jj3w5(&(6s43SR_jgpzZr!mcwNzKHJKiti#4 z9~M8tVXM!T$@=%;XsC!uX9`6seh~insIcV9*+HpY;nR{MeGG%g4Sj z=8R#;`2|ZNH$#bbBAPu;E4LBq4V{L}YjAw=4h$MeyjFaR2-Dn$N)QN)09!LnB!+Ps zD`T569qWK@4pGpy;6&?F7_Gk?y9=-5s5OW@m7w6;h0X*AWENA9TF6aQ$J(Dqs{J`k z(yoVr|G8%PD|kkU~Mdtf%}PXp_N7<2mIrbtxW> zJ_4txlS5HbBc(ZUxyM!*4@MrsWm<R99qR2RuYXOK@A6EJKs{+@}25RYzse#g>o_Z`s^Yl zdldh7RNNi95ADkGKzhL!0al<(y#iap_h5lsbWY_N3h5fBY^@TL3&eaRMDzJ4z`o61pPM zDwj~tZ9|(+SMo(5DdwR=>8xmd26N069MpwNJ)sDJC2}cRWXt&?P$E$axEEM)LlbVY zE5VQYzG9$6p%$>x{0b>TBQ1GR8MVtf6Fvyk239djmS@G82#-oZz$bw!qPGlM@3S_GM@E0Z@4-L2djP}3$~G_PP@T7!|1SU4O;SBh3zKHrS+hHu}pEPiS+ zFE#blM+td1?oiN(cz zo4%iLOn$L>?v+Rx;UdjGvoskqgHimS$kR-9!YE?8nvHJ9$;XvQzu0r?184il?lk#P zV>P|t-cX~T)&d@xDrix%zL4qN&5tz8mk#e~-Ich%Nx~VYp9<_(rMqSU3FZdaZ~v`& zPUU&Xa`khjDX)y}YTDNP^1%CTl0RADuReN`+Z*}Y1OB9CP7>z>q`V^JRGo|r#ufeR mp62bzw+B95cI&~mpZ@?#zU_Tr1SRnR0000 Date: Mon, 27 Dec 2021 16:53:17 +0100 Subject: [PATCH 320/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e11d8b4ba..1c01db9b8 100644 --- a/apps.json +++ b/apps.json @@ -5069,7 +5069,7 @@ "shortName" : "Tea Timer", "version": "1.00", "icon": "teatimer.png", - "description": "description": "A simple timer. You can easyly set up the time.", + "description": "A simple timer. You can easyly set up the time.", "supports": ["BANGLEJS2"], "tags": "", "storage": [ From b513ef8dee7335a8aa73c225cb3f9f2fe6ab03b8 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:02:55 +0100 Subject: [PATCH 321/503] Update apps.json --- apps.json | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/apps.json b/apps.json index 1c01db9b8..e5e9f8f02 100644 --- a/apps.json +++ b/apps.json @@ -5062,19 +5062,5 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - }, - { - "id": "teatimer", - "name": "Tea Timer", - "shortName" : "Tea Timer", - "version": "1.00", - "icon": "teatimer.png", - "description": "A simple timer. You can easyly set up the time.", - "supports": ["BANGLEJS2"], - "tags": "", - "storage": [ - {"name":"teatimer.app.js","url":"app.js"}, - {"name":"teatimer.img","url":"app-icon.js","evaluate":true} - ] } ] From a15c9b3a746d018eeba58643fc4f677641b45aa2 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:12:37 +0100 Subject: [PATCH 323/503] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..1c01db9b8 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "teatimer", + "name": "Tea Timer", + "shortName" : "Tea Timer", + "version": "1.00", + "icon": "teatimer.png", + "description": "A simple timer. You can easyly set up the time.", + "supports": ["BANGLEJS2"], + "tags": "", + "storage": [ + {"name":"teatimer.app.js","url":"app.js"}, + {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ] } ] From 411a08aa701ea713dbe56c92c0f36f22c18aa075 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:21:57 +0100 Subject: [PATCH 324/503] Update apps.json --- apps.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 1c01db9b8..c9b7c638d 100644 --- a/apps.json +++ b/apps.json @@ -5063,15 +5063,14 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { - "id": "teatimer", + { + "id": "teatimr", "name": "Tea Timer", - "shortName" : "Tea Timer", "version": "1.00", - "icon": "teatimer.png", "description": "A simple timer. You can easyly set up the time.", + "icon": "teatimer.png", + "tags": "tool", "supports": ["BANGLEJS2"], - "tags": "", "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} From 807ebd6d9e326409149409b9b33be7da92ab81af Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:23:06 +0100 Subject: [PATCH 325/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c9b7c638d..0401e96eb 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "version": "1.00", "description": "A simple timer. You can easyly set up the time.", "icon": "teatimer.png", + "type": "app", "tags": "tool", "supports": ["BANGLEJS2"], "storage": [ From 8ff96ed6abd58f66bd9fd0fc665b15fe2c6e72f8 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:28:47 +0100 Subject: [PATCH 326/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0401e96eb..9f9361818 100644 --- a/apps.json +++ b/apps.json @@ -5064,7 +5064,7 @@ ] }, { - "id": "teatimr", + "id": "teatimer", "name": "Tea Timer", "version": "1.00", "description": "A simple timer. You can easyly set up the time.", From c4e17af0d2f9251617155e75f9ddecc1e32951c3 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:33:31 +0100 Subject: [PATCH 327/503] Add files via upload --- apps/teatimer/README.md | 45 ++++++++++++++++++++++++++++++++ apps/teatimer/TeatimerHelp.jpg | Bin 0 -> 47004 bytes apps/teatimer/TeatimerRun.jpg | Bin 0 -> 45034 bytes apps/teatimer/TeatimerStart.jpg | Bin 0 -> 43935 bytes apps/teatimer/TeatimerUp.jpg | Bin 0 -> 47055 bytes 5 files changed, 45 insertions(+) create mode 100644 apps/teatimer/README.md create mode 100644 apps/teatimer/TeatimerHelp.jpg create mode 100644 apps/teatimer/TeatimerRun.jpg create mode 100644 apps/teatimer/TeatimerStart.jpg create mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/README.md b/apps/teatimer/README.md new file mode 100644 index 000000000..fd1b3a1cf --- /dev/null +++ b/apps/teatimer/README.md @@ -0,0 +1,45 @@ +# Tea Timer app + +A simple timer. You can easyly set up the time. The initial time is 2:30 + +On the first screen, you can +- tap to get help +- swipe up/down to change the timer by +/- one minute +- swipe left/right to change the time by +/- 15 seconds +- press Btn1 to start + +Press Btn1 again to stop the timer +- when time is up, your Bangle will buzz for 15 seconds +- and it will count up to 60 seconds and stop after that + +## Images +_1. Startscreen_ + +![](TeatimerStart.jpg) +Current time is displayed below the Title. Initial time is 2:30. + +_2. Help Screen_ + +![](TeatimerHelp.jpg) + +_3. Tea Timer running_ + +![](TeatimerRun.jpg) +Remainig time is shown in big font size. Above the initial time is shown. + +_4. When time is up_ + +![](TeatimerUp.jpg) +When time is up, the watch will buzz for 15 seconds. It will count up to 60 seconds. + +## Requests + +Please mail any issues to thomas.fehling@mailbox.org + +## Creator + +Thomas Fehling + +## Attributions + +Icons used in this app are from https://icons8.com \ No newline at end of file diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..107f5586436d8a93e88ea47eb84707bdeb4cdd8d GIT binary patch literal 47004 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

X6?7CE{e~ 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

gj*$atXf!mvOSb7%%ch6rox0KmZ7sbSI;Oxqxh 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 Bupj^c literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3217988635d0b2f2c45c70d73dc3a1eff754c770 GIT binary patch literal 47055 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 Date: Mon, 27 Dec 2021 18:35:06 +0100 Subject: [PATCH 328/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 9f9361818..ab53b082a 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "type": "app", "tags": "tool", "supports": ["BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} From 02af613074f3d7a3ace749f96aad184b59e57cf0 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:40:49 +0100 Subject: [PATCH 329/503] Update README.md --- apps/teatimer/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/teatimer/README.md b/apps/teatimer/README.md index fd1b3a1cf..71bec3ea8 100644 --- a/apps/teatimer/README.md +++ b/apps/teatimer/README.md @@ -42,4 +42,4 @@ Thomas Fehling ## Attributions -Icons used in this app are from https://icons8.com \ No newline at end of file +Icons used in this app are from https://icons8.com From 98d34da29a948471d96e1218233f9cb316bea8ca Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:55:32 +0100 Subject: [PATCH 330/503] Update apps.json --- apps.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps.json b/apps.json index ab53b082a..66d456daf 100644 --- a/apps.json +++ b/apps.json @@ -5076,6 +5076,12 @@ "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ], + "screenshots": [ + {"url":"TeatimerStart.jpg"}, + {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerUp.jpg"} ] } ] From 07f959454d12bc32cf82db1d48695264284f5353 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:59:01 +0100 Subject: [PATCH 331/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 66d456daf..e6f8d2c08 100644 --- a/apps.json +++ b/apps.json @@ -5080,7 +5080,7 @@ "screenshots": [ {"url":"TeatimerStart.jpg"}, {"url":"TeatimerHelp.jpg"}, - {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerRun.jpg"}, {"url":"TeatimerUp.jpg"} ] } From e36eb14aedfb497aadd1801197fc8fdf499fbee5 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:02:40 +0100 Subject: [PATCH 332/503] Add files via upload --- apps/teatimer/TeatimerHelp.jpg | Bin 47004 -> 5125 bytes apps/teatimer/TeatimerRun.jpg | Bin 45034 -> 3981 bytes apps/teatimer/TeatimerStart.jpg | Bin 43935 -> 4245 bytes apps/teatimer/TeatimerUp.jpg | Bin 47055 -> 3737 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg index 107f5586436d8a93e88ea47eb84707bdeb4cdd8d..e22960c668b2e7e1b783163274d6c80cc3c90416 100644 GIT binary patch delta 3730 zcmV;D4sG$A?*fG=ka+^$ z)8ROl5rg?kBDpwiKXopYJ z+AlN7h>V^=$fs{1duorUvD)d3e-xxKkjDa@BszR76`(+W-OW2ObI-Wuj>Q>N#U5A^ zK3=$|#T~4JDGCgBDT79$Ze7Vdh(}11{`nP3&UI^bX&}kT1%zWAO*M83?Gwo~NG11dwX((YUq-Pg7FaE!U|ehvrZC z(3m14Vn)Xb9lW(d3lIhcSha-0j0!4cv+|N@xoA^&A&%NutR#W9f49opao;)r02(dr z2!rif*XU)I9n&JFKEW7p+3(atuNWr-i~%sr4aHX_oK;(b)%h+ z*+c|U9+cUHFvetXe*hG7O7x zL&8cH^y4}GX+}Eg1(+ps2bnS$z+Cck#wr1*e*mIZP$4{q-JFBdifT6*SH%N5d|&m{ zepS&u}k0ci4zwaMB1sKg5G?9qt?aX$fC3Cn8Z^tD1 z(^d&pfop<5JvNSNRF=99#Pv>C%@H09jkl470SmaVziO^f&|hQ=qhH^!BzS62bZUl7FoZOP~#o z(nta{C3pF28y4w-L{>-2xk=bJ+8CDGf7^gRr9O4@0!4;nl$DUiRIUK#tFE3?3mU)? zco|HbP^OR&_>psA82RYV>JAX)ilr{e+vK! z$iSpYH$)wV+>D&|qQeD|7~n88ttu(QFbC^Jm=6auRDe-H3yLTipRJ79r~Pyv$kAHE zU^J*TiJB6S(D+!b3#5xQzI!1o`qibQ80Wl+B-%;Ou&6I@e5oRZLuPJ_264uJrCea|f2hdrWNUpk zTaF%0rIhT(4m;JmX+-gcWFUY#jCG<*ON|Vj*vODaj(+hU!aH&JQyT6m8fX?WWF#fn@rVG0Jzd(yBGwd+RFi6LbYI6!#nYAXww+6OHg zI1Pwq- zAMO7DLq%&1iDj(QNvwn>dsQn~@2kg>p#N|W`bMDs7o@qns2e}kOjp=>cNk+(e3 z0lm%v{{UyGAFUSF<{9o}IQ{IKhtmLmN^R~0mkRH0=@tVp$27}Za+WD=I93Xwc=cQdws-X#A3T62=w0MxSyYi}4~zT6Fj^v*F; zz$F0rtgL%&6)mQKe{;-g|-l9D9$N4qZlZjCQ7dvS^{5iaUtYaAq5FbJD3tKrTX#jhCFi9S8!T zjpUtVnWSj;y8we70mt;I^RN*^EcbU%hLNHTY$Phaq|@5wSj^BaSfr7r{`hXE@TX<4 z!dU#hM#PC;e?ncp_ivQco1G`$DVG4{h$C!pXP;6sm&Ffb`vYz*~M_k%&Hk2 zK5^F_sGbt)u|_s7a!T=x9R9URTUA&m1Zl&H<;&$8bxC-XkKn0*G!BZ0ye-po%$I4Hr?FL|`!_ z<2z12I-ZkO8BY4?t(pZ;q{_u|&44&3`clDif9@M{h9GD6XK?y`YPoc{5ovc)&lwUU z=ge`qjxY(psTTCSk}PmY{#%qJ0gTY&sMxdKDq6I#;zPBWKt7%7#j}}hqLI3~20w_Y zYRCyOS5b+&*5kMJIcKZd-z~h+;z|nA}Ejf$LIR&Lu3QVbcMZ(=?oP zf4CMgkws=hC~64OSlmW~EYYw7)Z(Lt)a*eljOqaS2pvaC**hQ-!r#g_4C#h>nCH}I zie=5KEy7I?m=#mY+a5F5J?fOb;0U2B9L&(n?&Wj88944fl_jc7BqaHvd-;SM{V_vp zP$Lmd<^qvRA3S{HYW@{}IKU^GnKUw;fAkVdCA^WKe<{lqC$9v5T6_?{pXR!Vu%&h> z;PmF5)rN$MDXp^{NUVj6ZY_?dC;8K?;_@W8R$y95On_&x!2Xn*Kti^c5$VF!0uoh~ zn4Xy@{A$gdb43!zC`=-S1x|B{8%+$cimdQRlRUQjH%X2A^V_B>Q(Z(21ioOJe=?qN zK#iQ^9eAlNpz@2m5M-2s`02pM6gI3f+Kh@TCQB zgOz*?ij3*%%#`ik2{>G=OO|!c9^b0)1(BA6jD*arLJL wKD3$v!H=ywarLRN2w3{mOzqD#Neqn0{{Y^mnP2XL#RZT5**2K!YybcN literal 47004 zcmbTdcU%-r*EZNg&Ik-SOPV1`&KZZChRgsGMY1Hx2#BO1M{y+QEC@&vMac>XLl6)X zIV(z1(l*}DbHDHI@B3qS2YUK+b#?c-s!p9ceVv-ixy!G>H60CY4FCdx09xQ5aQO{a z3lZ$*0s#8@06zc#L;xuS0PsKw+)?&|_5LH1PCzIDoWC^yAQN)!uS^UcV<1cb{y+7B zatQOkayAk3;jHI^fgd-TwP5U=BP7_&a#{-}Al$ znCJ@`$V!Q5T$Nqve5Khxdmjfk?*L)%+W{OB!s5abfS8DwsGO*noR~C+sEnKl_%8tf z+z&AS)d?r{LBYRrZo>8d(Jz7T9~q(o0OA__US{0i zXORN{&QWIiUmd{q#>LCb_*W*$%=}lrR{UT6MMXr4A^*82*k;8z|7~B&-eTPU%A^y; z`2Ur0>B|0#3)G?fzt>*LIRB$tIqv_G@&2nPE`K@xf6AG_`UL;04$=RT{};w`lK)lC z@mGH`5SJMExU0`qFLQ!hF1R`WpL+KHR0dx5=c+!q1zhbfFE1DWa}4hO_QBtBuwLW; zD!)1henh0iW&ZEqpcXj)u?Da;|EcxgZyixFJw07L5fKx8u;}t5pbn4|laP`Sk&}{; zQc#dn(s0nyP*cjL(9tt6GV$>8!QlK7l2Xz#vU2J-5gM9W+BzntX66=_RwyUu z+b(xp-Q4{H?ga(~hlIvFjE##=NJM95W#{BR%6p6{Ei136tg5c5eb&<2_Po8Lv+GS? z|G?nT@W@;2)bz~khq?KMZ%fN7t842Un_K%oe;phi9iROEbA=1E(tlw6i|qe_iweYr zgNKKUM|gz`f)fO8xKw!foT3EOsz^cyUz+P;(L_+SjFRTp#9ZRWKWH8OCQ0bHCBE_O zUqSne?Ef9G2mim2{R`}Wa4i62xS;7#;Zgz0z_%mpZUYqIE9I1BK%#G)@Z{RlDyZjS z)i6E%-5%lhI-6G)JkTtYf$HtEju^P0=&e-M&+q=>9tr->RgY-!~$ZT@vrbUX1x)0)hiF zZsiBa48shn-S|kCk*uE&U>9TdN*l`!!Z(#YVN(o6UGPg_zMLZaw^4zEatkq#@g7?! zF|M>rck|R-#?5Qf;NqRrG)98H&EY&-MZqQ8Enem$Vj@gK{!}Djfw+RnCGsIMK-qPG z$?{-KvUM?V%e9Nrbx1f*Djhi6T-Ik5fvu_eJElky$ezO^TZ|4r>K4$94qS}u9i44l zjN7bVPYqxh4Vt^YhtKY)5;{35>;h{}O7$Njcq<(FCe>lluDM?>l2db@3-=Oe&=hH8 zzn$g=P`F(JcM_bEv1|5uaYWCPlgXwOs{MRp(8BNZ=w#F>yALG!a_9(5k%44({2cdp zg=a1{N_UbHo0U7@fz{*q0(J-Si0|v#%;|CPIxn6)DfkW&tzn{ z4ys7aWh$$$%<8T0+oHGGs7&z~vz^4Fve+js`GVt=k#A~{G_@Sh_Ecr6A`;ltGESzB zt{=TgV*3PtGm@$bJqLSVKdoISXzpY)?G2_hb~k2+JN2=$j!(0qRF>IJ21Qe4Z#%x$ z861%?C{^?}&H09>jNAH#Qug;Iw(0XsN>6rs`8eu)K_c#KMy1ws49_gCaX73?Jvf?OGP3{f~S~IUscel9lf~(T$GR9lv@(M zHqfb?S+jIGcnq}IHLvS&ow!9l8)2o(nPi(xI)AiPn(byEh?D9p9LT@v zk$jEvn@+&M>!nm@r9h4;Xx0~6{>|nn2>avmmFTgg^ZddXD7m8izNQ@CXy{VciCJXJ%0}!}?@$M}je0oRn z+AtESMkUY|@O#(MA~NMTD-@sL;vdj}&8e}G$QVpU0w~N6DnG2`AS7rJzNgHq{}>tb zxt4!*$auB<5^!z*C03=BBV`bZb=8x1jMh@a8sV@Vgqkq8Bp(*zpaDY^42N_U?m8-S zy@_nE}@fvHa9S>;kptH@+GhET-At{O0`1q>&@^Wh*;>%Ihs>=)`wp#D#FqrYTd(n-eFxBIv?7h?+4L`qS(V;TEN(8S7nraZfJB z0ySnvxiJJC5;WtebWK}UtZ&K@i5>o0o$P1Fy4cE_X+sDHdX)JpvW^!qc- zImgsM{ee@7``Hl~g@B6jH%q^XQ?pBnhTLWIY=Ux&S4gC89J~38bd*Z0uj2lwSWtx9 z#`eOtqjjTq5xr8W2W5b-7Tz*pwAr3FHB0W0BEG5FJkoJtQPaogWscKtY}gz(L9#J7 z+!Z3`F7PLHgdNPD983CL$`x9Zp1uV(?XA`JU+iBGij^Z2fbGZzQ#%-i_W+LxXG!-{r)@ zY1{!^GVBBdM1nU^F~*6{)(SW#8$r;bDufkKpfwvXo`4`YC|p4qv|Gkvf~?u5Gi|OL zIj!jtbvho#n{`b;wsQ-Psqf!fYxmdj_{=g}g27kK>nxK19#=P7jI{-@ZZ^DyThHy} z*iEdpj*L^bnSPpkSXvC^n}}mv@!z9RfcKuS4mlmf^}P-Or^KgEZn05pg$Hy4bfgr7 z*xdAo@1dW*HV;U|DX`@*raSGIaL|mhOKC0TCo|*O@2jgiOt(IS8bLmz0eNF1fKu|U z`z5e{%z4}Z-}BJ**VHU9F$4+^BX^O)i-n(CC97B3n2+WXm_uaCt*2eM(zTZ!!O7{n zt|``t8*%V4R(tbVnu=fJ&+M4gJyq37EpWYcLsv?mw=Di=;zA*m#wA@REtfii?5DD>WL+# zKYyi}ZRB4|w_s}@4`JNYTv(AAGmD!@3E~`HG5f^pFF0DBkN;gqS5?Aw5BFEqth2}f z=jO=-SHV8)ch@CAba8Lo`HuzNjU~;x*b_=Ei4kUZx`W2);MK_I{ml74;rJ`T+t{bs z<#A6=MkI>74bFWHvjy4j8kHp%>0mx@y2z`%-uAicq8RgrHHdVh1e)d_V&W$Bgzj;}SHnnl-lR?EMTa-FL3C4uI)?m6bukYxC+qwI)&A?p} z4K3zioQl)FX2;J+F*;fym(jV_*-OBT@3b;Xlig1_{0nMp=Mq?cLzec9)?d1&S-OFi z06%R1B8Cs!X=eL@gi_5zYv-=6Qw92sNLgxWp{Iia#-?Aonv@7KOiR5`n5QZ7Q zjB10Uw%G1X`<^Yfc^ylX*TV%!wKU(IOsD%_aI;IF;YG@=9kGA6pc4R%@ZkxiX60~q zNqS_9ZB?oxsqB2${&#gtJ>{f^09#rbv9H?XuTxTq4(g7~)8zK>mYxJkW=^!67k>Tf zQg4M)Fd^WJ^0#`cT}I&6&Nv`0JKz{q#j{kFqo_Kdad(OjxPPxSVL*DL--%VxJH2ZM-u<}`H>IR1I=cLZ%b!uW zAI<+B-qxSHC(U{-Ux$Knwmr==)Lc?p)DdZPJ+}^;smY!j_RI2ERG%d*RfV=qF)3~} zLP=A467Hz#9n#p-bwNuj&0pHIpl;;sbP|<8a!qT;L)svvDjmj$i)~MPbC><$jFcf1 zy}Va5QfKFtvI?sgN9T67aa4BsD_Pz!nXS~G#V)FSQeEbQN{QoiEtdCOD@V{n!g{>*&It|O6H!EJQYe;5%j;UAlD=W)Qw?d@*NBmEcF zrJ^wda3NuGx_gj|m>bxR!{6S}bq3EFlew-iR+2BfB(gl36*le9Q!O9viDCVX&#`PP zakENMW?@Z&OVl?h454t_xlB^|D$FYKnYwvCoLZXj=A;-dX5HqE%R z?s54{M#d5`E8iOyX9{;A9Am8R+H;={MoIHyO@`CTp#lcrE^CBa_{oK5(^6@FeBr|= z1~viAbivBYaGG{WAH>Z?(4g|g^Y^}^B=g(Fa=&SP+4^!mrKPppXyAOe;a*_m{_@?6 zjk?D@h7U357@VHtv*33&wM7Rx%DW_3c~sqG8dJ>ek>qD>EK;3B=0m znFfirmMbq%g;IM|%aYBQEZ&o*)M4J6W@Nbp5-CSt?V;CvA}#^BrGap*L!VcWO=wR_ zV4+B~%BCu?l$5%Dqdujpj4Y70t%UMGYPrWl`Qd^caS2AIUhk%&A+}Cv)bp#iY^}~$ zH1+(8Eb%)Jz+kwj(c_l0S?tBQ=e+?zswePV4W|db>TY$AK>6~F@u}&rW^V^|`sW0c z*81Q1V1fGRa0?epf6;VuX566_SGf8j?lzy&{upz zYNFe>F4bs=y5C*2b3q|nwu}C}A6+G*yD_4u9}xFbL`#r=tGh3@V8-&IR2rpDSj~kTEOm+S4bQIKNM%HDWPpR>++#6JQL#d*F z?u4ZpZ(2f0R+zSKcQ`Uf^*gpz zrnuD=AYRnYHn&jyBEw{j8Qi~pw&mHY(7>^M00_+)<6HppT)7wwkd^r=usCPG;N} zvt`{tE6r=2!dGD)R<2<`lpa#8v!s6i6NTYuB)`%}dWJCz0l}K;PlJEL(dD_4Ne&l1 zl;N|9R&=@X&cR$8uzCug(sXLQh&ToVwst?b;S#HU z{}_*UUSMeyNk#1?Ff3;nS`7|+*)in{Wk)cW>*n1)F{$aSK(;J+qYt8_c{f*9Pxa_&o;$+*1bj&rtPmx2NU{GShPIKgewsb!37kpwv}> z@?!k59)Jf5lr{K;HjS+mp|FK(t?g2+?7s<|FM(k5N1=({ddJj{`9!sp=OwNqhdxC% zMmF4=4WCy(sH?tf;&cP0cFcg=Caw{E^J$NNYf$a04pYsOSY}pepi6dOkRZgVP~Idq`J%F5QfTYOoXZHS`_W@BZWD3sMSBwC zQ0n;-%^nvQXbLt;_7b3uIDCKXk+&$2M7z&5^X81O9Q(m-8J~wkHpTT4=$|!w^E^QL znKg1b>Y=a&~Qwx3-)o`Z~5TmaYVlSgZTrC zwT|JjN1BOrQ% zi?#~IcQGxJts)i%T<1?WQLI~RJI0IZ`o4K9L&y3=ngZO`>k++6T^?+L#qX;Q>uQ?I z3ntp>HWi*ckwmSK%JdCVST1GTsZpu#X6}+`^MSKPW{$o8m>pb=bi_a15GT+3HsK@h z&a!NBTPby+Zuyw}!@8WT#W+59(H!qEBMHA>*5Z0YtXuZK60jmNsKuEca$Aus+*}q+ z=jK8Etu=1YpRRHqHChz4a)6W!Pcky@+Wf&-uJ72Fj02xxE$QJ@qd+X!RUB|T*JuHPQ zH2sx`p6kWq+0VZE`2KNLve}4DO*f`FzrXw#z+%?L#SW)GvDlOSF=Z0ekRM$>32C_h zy7c~TO5)(QTf}TNBMtb*CXi6q^xp05YbpO`4On_m5k9Oci7j1Sjd-6NJIAZcfo=Za{aR1nmr4&cC zx+#ghLmcWy&1|h?@jH{=Be(Pk7OrUn>K!SZ?%=%eaxOOrytJW!KH| zubS&9btf%()?0Gy?(*i&_&nf9;~3J>IDM6ZD-w>F5#O}wl$9L1qW2u`<6>PKTLwu) zK|k7KD_%Vuf$y=gh++xCd0zC!{Y%%a(q=I-XR2+pi{WIVku^+CT=IH%a9S=UzpwVu zyj=e5Vg)(BdSSKOAY;dbO6{*7?{B$2T=!n6WY zFp24A;uMlq+)xVHnQ2IWooQuMw$65tjuO*n4kUx!ReM@8!KU>GX*1}6MFUsfv7!>9 ziBd6t8TFo|_K;BWrrY-^$$IWg1~BIkST5)9J7yurSVg@Pdo8ev3e$g+{`t~3u0x&1 zu3(mYmeZL*b9FV)AfL8zOhri=6pNjFgE|!tFl-5MQZ1_S0&EW+-}P?lyv?e?|Fj~` zppXCEwwd|3NT_jA6J0z>8MZVSIhV^aQ4kfb)!ay5piKUUX3rP5diBg zc0m8-5?xZK0V5a#a$AM)1c?T8L{$ht0M;Hv@+nGW=Q&jEkm>6UZIR}>NG@cYv6W= zo9Jx)yc%a>W~1>7O+R;j0IvFaj03KisSumyZ$PJ|D0RPnBYm2@%Dm`F3CJ0aO264JxanX!c9?^gQd(^UnO#33hU`CTOd;O% z(nVD!#lyPwc^8CPN?ID2_37DRUJ{-PlRm5Dl__yaY1vZumQu29WYrxG${fb%DUjhU z8hwbNw`^ABbFLkJNvjja;0+3`%HB!X$Rd7@vDt!m2r&(DNwr_4e_PqA3GIx@?%fyL zC5oua8tU<13evpK{7sP!y{+H?a-mKV9YZ<(o}S(&hgGgxUnsL%l$JA2k+)IAZYdTASCyY{;^AWqIMztH!?r{3+8FUb!oD$;PDH-B?HySa>Az zTm9`(#m}DVH42rV)jv1ZD2(Pcb7397)!$Y8-1Mi+R_MB_{_n0?cXiVDXM8R`n`K#^ ztol2KvUgCM@RBBE6Vhju-oAWJ5e_!I{Xv=iL6z^%xYrt!n;-(I$yVbIODVL}smb5n zIot+pCXz{?=F#AKpQ801Kf z=h%%$nj(Jj*{)RBHP9fgK*hghvw*&|W$9a?6iyR<1fIRWtb|HW~kR!d|IEB89e~Fq(r0rs;ro*@SFG`p$uf z!S3~fdO<_*je^6Y2JOYwM7*)N zjOGpvK|Igb6!ug<+p?LlydIW+yOahqUK2>S<4@zi>hgD2CLxQUnp{PL&A^P$j4uG% zlVzEG>9@DSuQgtSgXKSkUPt8|BtfJ^qL@H@vOs#*GB41oags@d>Bx|1Li+(BaQKda zqnhQ)7Zl^9!Wh7`0rKz6i6H>JAQFQIZ3V!zSH)H4N(TmUgIzN=!ewmo5DWX!k_{A8 zWue|k1C-*Q^i`lT7;My5dJ5Z_;Yr7u*;IYsimym%{W(4r|WA z2<8{SObi&rNEkuDX_^rf?mz*TEVvq z5%QDE){*1Wf_H{!W1Q&Fcsz_CBm&-ujj?~O1s$UCmCt7^lfA+U8v}S42Slz(3U3LD zN*l)@qHHF$aL{Bof6%qs_h?>MZvomp7zFMdq-=j^@)w+3Y=b)yp zpu0K20A5k8h4)EgD-bttUpKOx4_kj?c&_(&dm!N5$!($3_-)ljB$+TiXJ{R8cYy!7 znZ*1`a%&B71-VbLx3}_!3dx7r)C!|CluOjUEi}9=OZV?@^?Kt-}-IaTX;m|76h1 zyCscui1K#(Ix+D8ts;?c5@e!<_eJARAY^O4DzL_hLp7wjnN4sz*KX@)?sbLB-t;?Sp!aQRV^{ znY}<9KLPid7sFJSzzcDdX-fKacXcZW{>R_u?>V*vAd+cfI~-0ULv3CL(iV6Dbsslv zF6wHS!yd$N5jJh>V7e(PEG4aY@S=RNRrJpaYdyS8dD%T5O<;$DZajWaMUaJVviVH@ zGiJiEu%6t%)o6?V=2bYtmJJy@d3ugISFZ5wXPN#_|02ZGVa31{sfh}5+MA4-=z_oE zy!dr+!#C0r8}<9EK4O%!K+dV zF1A=K2K++m zd<)GtN1~z))>I|y1ifI5m5BHGGsA3rhSS<3P?-}F>NfZ-U^o9fR-$znc}TzIeE zFEZFAf7w|n79&6fdQc-*-28o`^WjTCu`X?aG8A*=vBhVqEB)|=aG5>{$n9qxCWwM#H&iy3cstcypib-$K5asB(KVfk zIXZ*RMt}XxkSA;R4?k#!J)&wp3V9D;BXaGnCqEAbFz&AZB6rLRaR8fEGtx2+s><+NL#Aon-j0>BY(Qeg&p(O72qc}eA(gb zua_!(TsQkjK#7FvpuVyzJ1ILS3Jev%Ml|8R1kAtaxaxg<`f5dh@AS)TcZzZnLwsAn zhk598L1POMbXVd)_AB+Xx}>I|qwL7^Ngr<4cD{P@4@+G zZD6b-S?#rav8%WCJKp{$*To*3yIt)efUom}Hq|Ad%v(?pk-RKtFRlC$;{_-0<*7OJAU(N;uj;Rd4o%OC$t7g8_5{TDyzy^1ppl)8t5 z$bT3}J2bDg8yZzunZvW!%++Bel`3yimyb8#9GsBhEV|HIvCk<^(^r29EZB>3yL1yP z&$MG}pY}`nSiJZos?_#zE^;Vec@N!n%GnTSyC}#Vqu0`D9nWc?wQXhnsUz{mNptAZ z?yD6p%G1M!8?g@!_La6k8eSk{pOSveMAK)>BiQ3Y^;H^3>sU>n#PvbrW0iF>ScJ>Q zrXL?Fk9X|~T&Vsy#}615< zAa3Fb|d6Rpd|Et&J!cX8AfZm1WT1>ig#oeQzjL+ITm(yur9gXNsyz zB8(K_pXnH!m$oy@S6p92h98zmw0sH7*!l*RQ_20T1=kxo7&_RrJCWfobiTUQJrEF0 zA=cKwj_z+!@57Gpi~1K9n-$oi=Z5>Lp_ucp^CNCSnGv13ov@({%nn{syDY4&AA1kk^+rYNXFI~GGD zBk);LmeOlx(K2!<+w!0hb9#NYe+|9HU03bzbmO$Lqelj$h(`#^?i@B^>~LA6Od=Jg^}|Lz^$+OYwqq;b$a39XvuXL7mba|9-FUSU zM`na!xWS|6S|YsOcfdZ*csg~P9=E1mNNGMdAmb6cNMoKG0ii8g-KLnwIXETA>gjA- z#eS((+P5~4BTNlx?44@Zr=Re49dp(m3ocHRyq>mfr zMx?$}Rk|6UFib8|KqFvd{)urOeEl}_B-ls&4@bd#m!xR&Qr9No-p5Td>m_Cx>$zV( zT06eBInkGZdi3vqlqBv&EMHTj(me4ibJjd2 zc(@?lx?jwy-LdA+M$LYe^R}Kbef9)7%xA`RL*?)6o7R#Ah6$c<%1@wei^omJ|1miS zQwCjza-MuoX(z3njpuq0{?uS^w6b@(;uh{({3-wQ0cwr+AJayo?udW^rbPb4_1rS= zJMb1+R`>L&e3FfaSXAajnSo=-m}EVh6j@o7!i;}aF;=jzTH~XM-yW-m2ZCawkK!T>ay4ezkJ$Yd)pK&%2w0+S)*yfe+ ziSCFl#%3k&J|9Td`rl`tZ9bFuco!g)ZS1%N$gbbpIm@34f4%rYP6hJET&a!nNkA22 zZv%XjQ*1AhDutON^`vTBT`s&x$L{CBU8m&cL=1A*x-&mYs<6PL(wu<#jv}P&_G{Jw zgNG?$vh4WJ23sYP0?{iiWH=o))#o3fDfe3~INpE}3=F7LUc6f&!RssSlNGwoh@Uui z?}(31G_p%MCtwzICcHu#TkB2et|Z4nla0!bT?zJGZl$U}AM}-@Q~5%RwmxjySR^X1 zaDUE$D)F-FlT&YKI<;aZPW@7Ij8lvIPa~@&HolvUe}1^Hn|*WH5E;`NIy248WriDV zWnj}sSL6PO-6eiZkq}z^l#}tfbmjS|W{Koe)>1y1kp|x10gSF#bASM3@P$0`V+3#6{`eXdYN0YN=Dy{@xv0OCbwAY9Qd4@#zbkm(`~`ovxy^CI>X}$sb9=bB z%i);1=eCTa{Iv1?ZK^5p=+rQipfuDN2l>~7>n(>5#jR^&#%v_g(SH={5CO>+0K3i? zhtubOOlN}9#~nTB#B+Bsi_g7sn`^cR1avUv+_$$Tp47!I$OY9Lbi5q5^WB2C?^(Jw z-#^{8y0+3zo8?i}HPY?2me75Z;t307h2Jd>;}0nV2=cy~x^EQ%RT*hZlFdkyC1&cF zV?%7QCT+Eb{#3q8R|CweDcM5bD?`_Dm3CCi2nG}%6jMYFC~p}Rxi1kjr+}v>)tzP$ zLgLx5avY}U6%rr!rAA(mzjHP|ce8X{F|i>qIVgb)bliU7Lkvg;28Pd9+)bD#W;sT4 z2?;U~Ca=|>+)0?bPiuT}ZOLv{cB=9Z)0#xnNNE1yQqGO&#J#|qD^3d?yK2fOk9Fo0 zFs5?xCbd%pAEC6av(zVfgQ7#IhS2%8EVdjYREc=}RO-jJKgkz4U+V7fdbppKe(rlc zCge};a8h=mni?_Szo0G=M6x~YZ<~Dy#K8(kKfl~lseCddGhDMm+iN@0;fo4<%a;_E z`oh%k)0}HFHPOY!w%MWOv84>-iepRC@f7o1Z)@uS*4duM`ohLz&ewW6>t)n)2vaCT zV}Q0`ZU=6r7^{5^iLGdN$YK%@{Yy(jv@{8m_w^|5d(gQtFRr!P=Qy=%%{Li2cJcns z#FO78E^IAw(~Dv-{fSB4fp{M+oUo2UeQO57mLaAC{RciU)-qq$}i;h*fmG_p@ASMu!yZCm5HPCHFCM*EU85#bC$+Vq3;@C-6Ah=%_Kspm`gRP*X5Yl`}J*~5@F zs-YJLq??3@F$)fxvioscDyv#t80?P&9)-nZB=R(t>-LN-Nz<^T&BvQ1k1f*0ZT7R& zTudK{B{HgR1XmCA_x$;whNkVOr%sKU*_D^3zW>7+R#S*x*2o;J^&^y6UJU&pAH>L> zS=A(&5y3U&^S1aan*hpt2k}WtY@#)@dQ7;SEbwEQO%~$(lb<7A7i~vL)!vpIH(&ez5CgTgy^>+wp>%z-}$?bma(d2 z_igq^t_h*&&-IPzlajPi56}QgO-2Ip{-iGHUL!}%$Zt3Ezwt;doaHqFpiQYsRGNIq zP4U9K_2qRd;R1mWPaZ`%c2oy9Tk9&T#zQemqz<=9q5puektjvspyM1%{#qBQ8Qi-z z6kUt$Qc2!LO;%-S?Q~QhY`h$P|7!JiGv^i(b?w!$4GUk2ZCTc;ouy}TQ z+3(i6^j(4v?4QT(!Nb_Dxje6Jv>hWF-{>RpZ4_lFI=2?T&F2X_o;T;x|7N`e{1Js9~M?Qt~V4gnwHl?~zRP_-$!8Sy|YBz+_ zDXk(v^%s#tclIIoC4QSDe>X435W^KPz+~ z7E$vcU>AiA-Qra}3Q22Vzmpw6(B5^ebk_XzbrV96jzAWd{}P~IRnKgTOSuG8cWv(X zFnTPb-^T4k=czdGXdES_6EMzgLcLo%m35P14+_eKMAT!+g?wI@4O7 z6E8Y?{d24JQ(Bs!+r-*NxY`52S{|`jNCs4KD`Con1=C@eLtLU!z#d*Sm@lz$zSUE0 zY1gD7JF-;uJk|jZwmn;E(#0r==gjVF6>YME%oTiRa0&%;Z%2-pP zGIK|*ZEblnzo;_6F*hBbuK|a-IRf5mZ*S7^2CYVd0$}BY%1b2|$!&u)Bc+YQpHoK< zQ7BCqQl$?%l*n@S4&ydQ)}u|{eX((m)@VeU)uWcFE*(;(R9W6GmiR%It+Q0y(sgmJ z+hWrI7pIfCQ%x*pgtnlzKfEnq8)b6;Ck-byqyLq(nuob--_7mR>9zB()(pCMFYhuE zN_I0j@(@Vx%7n~6F; zX-Nz1(9PB-J%S!poKjP~sat4jia;ytWD?Qw4l|7DK5-4?l`#E>Jk2%|b!%V}9l@2D zY9d~J>Y$PwYO?0ou{?lzN1lf4QYIED;1gz^d+dGv6Kx*I zFzZ}psp!xIJWwK#$^{wBN<5R7?}F~C+N>Y-N;_U777Uhcs2SXB($uB@1BSr?k^F%k zbRuI{#3{(Z;=K>Gncx6<-qdVJ^itZ%q2X~|68Me-Hv|32d|?BED-UG%O4F&vNZzF^ z%T!;yW3NCx(RuA~e~euQsUtMO5^Y!zo7e*uMB03#lQqS+Qc|&3{a7IFKJ=$OzKzM(Dd;(YVg+T!*6u2y)LBfea zO1TwChHR^S4Ja!HSM1|UV1Ut?>mj#o}WVdE;*diDwRqgZK)O>vw>k?zv@LwT*p;4IFJWj&4~JY0aGt2HCZ4oF%Yo zhQHnksX`3?=)g@x9OFobR>#%ngH8~4rA+VO#8tUuLEsfpOAn*;7bm-FdwIX3aQzWc z!3s!YoGHd;ec;oMBCC9MGU*oZKj|eLYwx+-dkm5hykK(G}C;eRXxF z@6R)(KOtJFU=nS()FrtpJzJ%X*Tvq>%R)~qX?}jiJa1(ZBoW}C!Pbq*mAv*eL)a#y z+)+Psf`)7lNmjv#j~*UYSU=>0#JR5Gye-6+m&{_sAANW2cPhWUM{M3%eBojE%iZ2i zgbO4Uf$ZwmvWh8;Yb4nr7F@TQes)lECmq4ygpKRj#uaOPO1ta4p3f$bX*6l0agi); zYh+r zH&Iv1@qfDNYBWj!*tu$+Z1`FuOkH7>@4InGAA5=&%*IcTboafalO(k|O9-vT+BZi> z#;7X%!0VFT8s8W4z0>cxPo)cUb{l>-YIn5(d^KS4v z_gyOfjgKlrv`;x2rFXx!zZKAcD1=; zXot)=q!Eqm;(pPds?sY%`;_cSvH4+zOmaoFt(abI3`c52tuC?ET+F8Wt&Mxa@#~B= z9(1CbsQzj0$TnIdA96QcKdZ+fA>6XV+f$N}eL=k6ih>wu+q6zAxI)n@z>ws~_6M;6 zKQrw?k5G~wTMf(B4ZSeQ-)~?$21#VU`V;3_HvKc-A{N1x#%_EyG>D|Rqjrqwq z5&9Wzpgm1$th=8MR73`>Yd^iGIQ6q_^;A!CZvItQS0Fds?2Xv$v+}1 z?0zhHJ*?TarHSmKmVygp7mvfm^>Dxx+0`$50BGEmL6&=G_glDW_-1^VZFzdu=cl&L zuxqXA&a0Yu(#v7&mHh|vL6tJrIrST347f%N^)mGPVCbyB1)L7@_5;sS;w|}=xq%=G zUj+VlLga#@p)ZkF{|cu2NH%2cxfic4)Jk`H!s|93%|xhaCkJBLFQXRj?ThZDAxQJt zv^0ROH7yL%+H&$Se5zqWQHAY#(xa1Se(!j9di3P|3tDh}<(7z-_Y z)VLl_##WeJ^g^>=o)uO=eedpAz@ADvIx2zAB3G&20`xzx20 zE~x9@rVACNkT)aUMR;2F8%SaDUIsbjdcOJ6&*P1d`|e#tmF?59mUF&`gdX&0*?tPK z&-5SnD6ZcU5PMMK5j>wnHBz0_ECl|XiqrBaW6)@r6rQ`FA~ExfpGmDBK3$ zi|Zga^uFP)y06ff9eIC4)dNk*mer@n2z_lON6fXGF((KvwQlBU+t5rcZ>xG9;@-j%yB<5TfXi|E|c|iL{`YaNXS}zc)ObQK>@4k)0aB@L)R_neN zmXe4?t8wKo(G6AjSQu-yN9_&Cyl%t@Xps6hws$655B<8cO3Trea0$@rCNbN4m+rXd z*2%S1PRnv1?HY(qYfwBUCEaMJzVB=MHWi=$V=~GF+e8(=bob;ZOHd@n`sr|T1@at zXEgHw;e(6^mRhTr6H_q|e~yfhrFyp?%z^hs7<|oS!(J381z>&iXJIAXo6<9usxMQf zE%83Xx7;K|r;WipIZj#y0G-k&&Tlv>{$bb3@zuLwS0SnHt|Ul$n;tv)Xti>xh_)L4 z);^!K^cUgmOe7QZov`4cs1bc->h$ybpg`%P9y-E1#A96%0%`k}mw=&RNlnRq^P%LK zNYp&8wKeppy83*LoL~Z#o`bjS7& z6eHz8@{-*os4wy-IrI{siX4irvFj%W*CWOSPsevOPEXn`F_Q>Tv3x+M!7n1*6nOe{ zFTy^UfMi3!bk19jM&+HToDaCmMdcLkLh)*-mS88DT6PP zfuVM1!H5Ie8M|-l){OUIj45Gekt8_6JbV+zm%t-1@GZuy0fd;9aGgkO^CJ5H;_AKQ zn#`K_;m{F5qy*``BS;AXB2A?C4gr*2g3^nELg)~wQq+iuKW*-v>1@n3;+ncJ{h@W4pK?`P$+5g{HY zmlj6Up^I09SM!1tD6rWOC~d#n&nl$aC8IQ_I7R9q64dZl?_&31$GK&=P;C`|HUQMqR3m-`jZGNo5CL zftU!I@jJtb7Ee;){8sJD2AQVPy<9TdIu0~261G9sO0vA$;%;PR@-Ua(l&B{`4sv2s z;X9=kGurjx`IS~7q}E>o_lD^PtljQBpxKt^Y+`c#Mitf;(k+^m2kQ?WXwMZ9ZdJCB zwdX|=3K0>EObX_7Udu)Tbtf*6WIBwQe-mP79#=H?dBm(ht5)9frEnaszc%r~EOOn%p%P3lYbEF6_l#nqo^ji=%rjoOjku zV(W}Fmb-$-#zk4W+CFbTTs=v9tu$DcWZ9w0y3>&7u;O#pGZ$s*e_^Aggcf>cy2+SB zaZq-=ZIn)%VwY(T2m4xTbjhn}Kb*c$9(Uox25;((u}SY&n=>p?tr8`#h!Z>X;4+Fz zKUP25>^{R}_SI%V)OE8VTK4l#8?+`me@Dz=sU19{wTndJZnapLTbuaPKnNcSX6mPa zy2TxMn=YU+BQuI^y|uOM08~MOW2s;1&)?EuyRDvSra9}>|B7B}T1jX8(Nn2w0eVr) zZ1DwJ&yLQEH2T!2cvWvQi-Z>i_}9MV7%!w*%XRkgT$e3#_)3G|m&7^U=ns+Kuw_!< zYq8@Y!-re#eZ$tVK3dKF;Ce0stsI3UBz79e-%`zY%o5vySK3+bKG4ux-7aV7xzaIs z>+7j78;ep}I~_;)$E^vCEDKY{AAQFhXIQ*nkfb9AWJj{KG;e)M3-@f`d+8Ff4M3d~ z{%6*EIISJm`~v(546iF=YKB`1dcI9If5(pE?G6k}1Onr4qiXBZ@t?i5t%V-^vN5h> zzH-O(;ad~blG%_A(|X`zR8y(pmZNynG)~?P;UoPnBVv@tBRw|lwoksSmxs}GXN(I* zmnOiJ?HljbO?+`qa`VltwD}`Me(>~r_FH9Pf=#)a7gB227FsD_qE+Hchzpork8{at zb3JN{IREuu>EjhqH1b8GI~Vj$>prCJl|S(@uamT&G6?I|n7J+(x>IeX6JR?>d&Rm^ z(6u0H)$vg_^>}S9m-=kuQwc%YsJfnI<20f4jZFuOOwYnK)G{&-m`TWv5OvKKpl0GFiCjzNbbPXLO+M2678 z)F%X04IVpqSx^rF^5Tj5r8i8D)KoESeSvtb&@$ooq8O*l{H z`J=Gc1CQ*-xj3V{*!4K>bVdLei4m(^Q)r%J3_aZzz z@|rnEN+o0v_BDyUaj~DPM)jssL`B$&DJ^rAizQd|swINAzFKZqi|a3)-b>gzr^@x< zyV)5J+G50a+_|5D>6-QtX0~RfqOVy?qdZfBFe+uXbw2bN&0L4#sIKSFQ$)cQrEVSp z4?7z{NLA&_j7IKj*it^`DJYj*H>Z3@2$8B%X1OqImr^wz(EBNAA-%Q>w5zH1UT3W$ z9gxCl@wnb88P=(HcJ7#z4rD1U%f^!qo6GTZYM!TT_So;q-wE6`!*Q3E4@t=7A${oH z=`>KEx)gD3B~VRZVQ|&aF{3Nx>PGrENBPf54DysM3EGRy-O8DXWtF;y-@2Yl4uACw z2??EJ8IGN>ZcdCK75wW7iAXl`!u#Mzk_|<1tnkNC-i!KdH@duyJ|-77k9<<%&-U&g zjkb@tEWxPh=K8>Po3erRTP1tiS~21jDrc+!>(ZU1-*cv=+e-; zr1D*Vk!2%blo`)e@lB$D$IOT|SEbm^vebi|zn^4DO3xKuFsqWlNnFUI|@NiPcuXC zK5DQ5fi@7P>MCWhgK`-|idl?0^L@Z52#4eWs9DxyshlBnD0KQIe$>NE!G-{SuMYjU zGz|re5@bR_22hj)@WsIw5DFLIJOMlu3>W;W9&8_RAj^qSciWAAW28W$_nLqiKDJF9k{G`~UrB)ydBVF2<{sI~AU7GbTGOnfF3G?5V1q%VdhX5+x? z$J4TjqJWo!If8&}#J~_x2B3`P-w(+@l7o4K>FgBqrUi!V4MaLNl@72Bj%N~5j~*n>@i2)(6JI9ucLcD#V?F(6d&C7!G8s+$ z0(z?`QS<*JX9BYY7#Jj-DA-?NX1b8(fW9%X{_*Z>?9D8G_jgv8k%!riQl;f)w)f+i z!7qs7{hcFLVqPB74jmw|LemKbCqsPWv9RPs+dkH&ItA(9-x2jm;?++a7Ci>kcmVi5@%h?b zFi?uB|08n|g2<5|zWDEW!4?IrYEZ6#EEK}LOTx^?)#iCbhCZA~M~$nU2;R%Tr|Uy@ zdffmlU5GqxHhFAejL@_KwI2IyqCF9vG-JvL(4vLu?}B{YWy=hzhdoFWMEF=>G{UGk zz@%z|(z^ws2hbufflU${LQ3PqX`$|k3V7g1llI6vxH%<=QExr~`3lWYq~#)AQs;st zQ7~(Lgm(N~AKkW8Lr;Z4X3&7&(oSpdRlDHg9*K(Wjw>n&DHUS^bTM@ID$1L-+!Zo%0ZBAvV-DZJ8^V>KFEo_ zOwKT~akiX<9Dnhi(vk$PqtcH2i_@{|^!dBR3XGr%Q$}}P=Hsl;bF0>c+&T97_(4>> zJ4HMKkFK3CGnFn|@V}E~1PJhpP6G_`|i~U~&2xdj;o{ zKX3G0W-IvA9S$%a9?C4$L)yisa-<@_8I|wF^~Sr>E0kJ+jeC_UgSiH`*T{CqM~iOM z=s3Mv=^@1UkR(+ryL$o5||HY6?K`xwE9OZgQca+eqz2CEH|7M0$ zL4_Z)C`+U7^w+f&6L$eEGDff?gUvMiud@f?0a&wTcvGVjDZfgZNbex2Eqj$d^=te2 z>!{1vKfQ5@V~W$9qeBOI>q+3Z;v*OCn{ap5^D?$?ZQX3<4rwfo-X2-K{`jLT>|o& z|AjI24S#x~8H;`Y&-(CPm%B2Gi`X&%{Jd~!c|}a2VC79|wWo99{Y1_bkCy3B>xgfb z-*f;_0+}@S&wwGL+cxW}y;ZzPGRUElLX~qUf`K+zD02cxKY#TMxd!6Cdm6Nd!xi(F z;QEUW>HIy*m;aj8E1A{Lj*5%neN?>D%ujD)npjX=R{!g zou3RNfB?}Bj~qIyDN!A*oc@KCv}*Ytzel&ujK0rw^Lqu*3u94Xzx1~am6uEzZB*3W znAxr^NRPXM#K2?y?$M`RFBVj$c2@01Y@GV(qyhr`7U*$Sn`bWA55rODfv`7kj)Z0M zT%N}ozv{H$(2&na3+no^;<`7=%{Y5gjb<6-w6%0xD^$GjE@Xt}FCe?#tIiIxk0)ml z2U1^crKvJ8AJ27(J-t!xD|{rT`A=lddBH{D#&f}I+8VBoEO`&l=G;C}EunH+K%(np z>u0rJl~np^x_E<94Wz~HX#w|qi}sQ%1&5<-J8C&;Ha2d&){o;iQ|V&FpCw{QboXFR84DkE&}Lb2wa19Pc{zj{@O}$( zGxue#qU1@oY}JY$#rh>!7N-=4_6MuYM7P|K^Wpu8mu01&eB;`T)0uHB%`@UQXogmPs^?kdCYU-)?&7U}DTgPW}{F1^r3_W_n z`>7XiS%>MIE_)%irT=>sv(&WlF0IFyL-?`7S_WRBOF&^R|I2velTFgy_3J+Qa#R>%GSiBn*}gZ?br#Jv5I*3JA1S_foSN^ z)^Tk086Zshf0hEMWRVilOqFFnJmx0;g^ADPksfP5ZL!eIVZr%NyiKg@|4lwY0q^mQ zLLe0|ow4dCtiF#nl(#QbD96gq+6iRZf@T~VrRF!}>vJYD05k&eMMdd%tL0WS#deg} z$=WcN;t|O{*}JQ0VsH0z*&+j8o-w_UVtsDH)-C>`dGQ*$Rmv)~{NhtM(m>PyvlAQK z>{kfO+}E!Bok)^Wy*tf6pYo?Qkw~8Hvnc676%fh_*1um6F z^dDzsPsuDJyB*2R6?}DYB9r&IOB%kNO#WH2xPZ8gYg_up)lVmDBL5)$7iuSHaF(^+ z5}j>If+hMB=$s3a1ARK76B#r=e-{Thy+hl3oFp>|@?Y3Pg+2C}tID5N?MHSmDd#6^ z1!XWN0M`V9LudhrK@Ze|348UE9b<+5oa2ZlKysp_wzmsGuD}rMyB{8HThM3ZXEcox zRy>hjEov7r`&5Jdg1;-%i3^yo0*Qu1aD%9WPf7Xy&C!e3UZo@`jla=;C zre7Asv{umxh+V0lmOYc^&}3*9<$nRIvQ&j(4yn4cYMndZJa{Dr|FBLd#emYew;klj z<_ZofJR++Bx_eXLr?nZjI|Udg}P#Yp~oL)PHPljLY*a;oH$HB|#@)H3pi z*qtsRJ^m5fxoQ|qkWovD!KrsFDKs&!)q9X;E=4ufZ3VUzchk@zxP2P-D??{(8{;${ zwRIWUDS(WVBrhX&joB29QZ<1KohK!jgE*fwBVUwMID^bw>>cJhY(-ohdAtj-nr%bs zCq`1ou)e3ayNVy{e+2{*+b&WpOS zkdQ!}tmE7RIAG`+!L$cRy5#yQbzzMf_tGGLd`nM(YE8f%!!82k2KoT<64x%$S4urs$ zXo)XTJwTZ=fZByTRNcg5u2M@5Y9efupyQlAh*lxAAs`=vSLnms5~=%_ozH2$Nz5@6J$Zus$P>nnYS57K=`;r~pw)+|b3E~FM4Nv+Ha9} z!rX2++Lgq%E|H-QsOh-jm2f6H{BFh;9&P5|0l6UdSQ7k=%Wu93CrQjH70Qx3OGK zL+J^nt#$Wl&|@}&vmP>wU$_8~bytj)OWa+$*5AJ%oYsO3{oRh& zQ(?B7gTLqEkKYy-g(n{TUO)5!i38fQwcxHU@n+$gnq-oGNnKzilo^>ZDrICjt)o|z zJ4(sLy8LYU-+Mh{c+cd>^vl$?5yONNtZvY#QgFI_m-I&Y+jhhx>GSuoI#_9cR2Bc_ z>(eV5rrltM@jpbJPOxp4eb!n$D`6Rzy#7E>`L;M}z&@MVGRcS2>ZXUKqA*^3mR(BV zXh&qyg6D?SR@&^HIHlj^3F`{cS^b;^_UH|Do$8>M=k_ZierTOban%0|&(n6NdL=)^ z(YZ!HXQTL8OILNY^x`RR)$tdhW#0swn0!+dP#Nca&L`*u&InLG+rY<8>Qb4@Ak9&Ki!gV5WG0Z7H=A~{EP0pAM74GKygNe{9NT8# zrKh2FdCj29ov%jmpD-=4Yfgi_*neX3s1yyhhIGZY_%B zVTSpQPKp^wP_A1S-R`uO)fC2&{kC?MmSXFA&(uqW=^yoTPcSM7^udeCy0$!>d7ju3 zk2NlEX#{uxhHIj$ru_AH(d~>E#@#>O#M^s-Qr&0jTy23Y{3)+3_Z~PthK#e_ZJ}nN zHRoK?XMYaXlDl4I8=oT zF+D-esRd7mX>zic61e)B2L+dYUkpGF=&`pY_ou`v@;vhL9;#mK<0cc9^Gz!bO;-mP}&!afty0f8@nc zt=`GNpw!1p22`k)9rH8PW*xb2Q-s*;n)%E~VkNTgDy5C~tJjHLbBhcqwvLe%vO~^l zn@b}f&Kv4PwcA{3K%3O{1^lY$%Dg){C+q3WijzPfyzTqAwM`?&o+-)?3VFz}*z3`z zzI~1Nw6x$_;EBbomTZWE#;xOhKSju@9gYUGn%m0)^-?#CyuCK3B$$TA@i(i)m1`L5 z@Kt>uDB258^_lCa&9c%`%Ia8P!V(LZ^!PSlJ*$qA`%O}6Cz`Lxje6u{?w53f z;I2Aqv77OrdwKBL-bGH@Ir;I!s^4heUI5ebDnG+GOe5hGv~KWIvFD%kceRVcT@gdq zL)WMlibqPkg{=4=jw_HEXIl&KMg&VfidDj2?OYOQPA6*!HqV)k%PmQai<T`A3^Ag34u+}h^)9F98oNqKgs!b2aT*~}PSqjbIqBQ~! zs$2Q)0A2clq0as;{%DlGuIFf}y7Jyome;C*!+bn58u{NQ1w2u``RV%GUN9W6wJ+xf z0C7HGzk3h6R8*5WiIvF9gwBYNp~Zs=iV%#e4CJWpQ^>zu-ZPCGpt2U&M;Tve;=zSt zbq-=jmL27fn31~%!88kkF~7bwX8a3#=93a@nd#e@{{Wx`#W!8-A6>J*BFKA6OWBJn zanUSP`rRU0&Qd;6=HvIPFX${)dF2oiP4JC4NgwS4>9)PM%j%N%bId@e6j6pq|#_*A{F!E~?w~!fb)o z`aEmezc7K@645P6uL6}D{PetfxCVY1FPbDC4j)v~cfE+)^QgleXsC4GP)o>~`e0&V zGs_uY5L)#XU^toSw_krp=EHfG=yvcA{)N#2fBmU!BWiBa1Q*m3$kvhcBWk4RLm0_n zhbN)w>Cnr#2SxG&y#1gqWuWU!+>eHJq1I_o8jT#B{o(C>bldm~+N!PrQy;Xr;?lvjS`n=v+eS<%V&^o+{n4aiournOde8O~Ro4sjB%}vxa^EYEj~(+n^@a{f$az1S==Iw;);l zovTutwx{Ufgr?6`63V?#B<^ggM%DM=Cxcaa?H|58187y^jqhC@ZDW*LGI=z#mjJ>~6 zy6{5%!u9^^2D6M)O*5K}N?LxgS>q*zzc3klX5)1X`UXPYYy(QFImi`P??!3${_AW( zUi|b;S))I6{gRi&e^Ue?cb_rjkG*eQ_^#4K(_G0v*Yd^t4T}uD7SFqy1M3qfx2wdW zPMZYeGdd{S7^6@Jni<*FZh7g+-F}qHWXOCL)@RPZY=E0NK!A1z70S^MZ>r`DGzsNZ zAak1;T{#yqD^`u209vpUQfou^b@;`ph8(o%*UYqq68Krt++wh*!O{jtgyXy%DGNqj zC*TP8GN(&lMh@gC8Sq$T>h&dj;3cr${~m6^Sq&+cAjxGxtTLz{(}}(5#!X-Y(w%BLv)}VHteGd z=X$?XsPd`(i>|v~TLK$mK{6A!P8S+9pW5+Gzc?Nk=EMrnr6}Vv)kJw5Pm)29-y2u< zs8{lp(8SjgCqAVb#e*niBcpsWBCsX(?2WIsMDX{Mq==LvK}OLZRApr~Z~EEDkOH%a1)3?v+@jP*#O`$M|4!>z2QT+HmKCDa@oCw(wwfb6-5 zu*IMl<{2>SCVqxibHzuwr*5$d-M;^9AjTc!x;&VIzApk#bK> zfHM-_kh4EOlI%e8L06)RL-QA!I+rkDTU%+0lbnx7U`(M}$K4zE5E_tpJ%H7Kze>n4mmABgXt?MtOJL1;1}3%pvfmx9fG{V zin^BCUdf&f$GN@5x!u&@p^r)HqWHkeg@1@&{ZMWkO38u}S~j;9sVBUwqsJ@<{Z*#= zw$!|)i$Dj}3oy>pFkBmrK0rIF#`qN>t?7h|uUd_xAFqj-7* z`>9^2+O+2Nce_zB@}~{8>y{x5i^%Ich$pQsqTb{EaKdS-D-FXm!-v?SYFuDE?zzLp5yeGnT-qI83XjqVud8dF7J0| z&aBJS@P_bL_LSZYyFS0=UHVS$3d1wFx+2{A=*yt{S59lQ(42OA4!^ouMIL#36>q)i zDN;;^=+xxRy7~vJ>(*yyST=LGepd@gbhjs$RkfRqm$fC`blm-&>LB#)^%J_7w7D(Z z(V)guq*dgQwP0g|twYUs>s2M?+IYaqGKcj`H&bHOl}>q&-tQvTQ|nE6am?uJJ$t!( zHgGu-xpZy$5ls)hNi$pM>|vIyPFE><=idj3s{JF&wnDB%O*eBZ z*OYVe1;$363ZXK}V+Id3&f?zU&UlcI4^x|_BXhIHQa}nt4_vTQqF;D_U5=#enUO_8LZ#X zME+qIYc?PQxYJ5|kyJ94_risPG{cT7wg7^0emGjI-GP=s15p9nR^=??zvaO>No-7J znZ!>j^k|pf#+dx9jC7MY$(0x5u5>M8d;vzILPTUSTdQ+H$#PyAVyX*C%(#<6*pOl} zx9b^o+#R)#Ej0taZNT6Lbm1P)e968i47d>~E$bSfv-tIV*lOE=26jZ!rD%Xx)TW6@fQ1Sc?`lNShpFZ+gd z8A|cP?nC8xmt(9IW$r?bakxcI*D??=r3o} z#*hNxkwKw=XqVHzy;MVU%Bz5anQ#--;63iZJhHjHNT$oc1sfMlL9;vGQs>jtO?!eM zUsZT*CG%g{2X&vqdmSJs+WT^(0$RodTQ>ClqGan*2;rq0^(}ScJmuYiO9BU=dxr*x z5?R^l^1qJ+9GTC%wGH4g?Z-)3C{Yg8&&3dY8Oh<+p``-2p0|0YCA=grzegITZPr9i zuk3iLC3yjJ(m`p0f}kWH6#0TZGGmAYqBz2(N^PZWcS=7R*139Df&vmtsz`WrLV(@9 zFdtf+ZFH;+MJONRZ(Fz1H*gA->o)JsFs)aR%tr>t?C7bE{=W3pPg`5}>v%TRExx+Z z@gQq9At7ikKu3r|^yv%=xkw`f+GyJk3?~(PTNv21y7WuM;xAUt348D@EfxkTZ-TuBbV=5XyyeS29Jpq3M{>u8m`Z@G}o{MCA2gFP#R>^cK=OIRTnL z{JaL@D~k1X+UVPgl9@p5oqom2B(n>dzoKzJMo%?36mW-ch0)wHr@Y8X@H!D)N(1B( zfANbZ&m+&O-E)!&@3ns^;D^-~W?mud>BRh-5LUdZTJGL?0Zt5P!zoS`<#&Wr&EflM zBQV8AJ95@1SFvJtL-oQB8`f!>*@w;hOzN#5pn$8YxA>C1l%7sCuv2Ll3os{h{}*QY zMgN>s?0{*>p1JH zA<$qnBgXa1*TrA4y11IOsFsjlpU~1t+C0dR%l?o;akinTS@Lc0^P8U0Ngj%G*cXUp zsw+E{Ue~E6gt*E(Ivl>nW*I!7>3r;Ti}opUtieQTly5%P&N7Tm5)PFpK^5AZDO#OD zcOw4NkVjqQm#kguS{ryLd*ZKJw72SKy^BESMdy}(-0W)UC9NKpog$a#{>Pq~S9YQ8 zaFyci>$0vNflAe*S^-*{b6JFvy4D|_G!Y=z!;VPF8@)4RElI+e8k@HBu*{)8D30xG zXk`q8{knNLyIF|HlY`1Drp>z>ti2@UZsW6uoqN{u@Pv58$5UV4)v0@~Fx7{y)_rHP z>#z$rSS>uMA#-av2rXt<=j5+LsOY8h@l-8q*&MI%nFrPpEPu()jq*Rp(Yp1|5QWz@Mm~PHJ#-BjkDpwW!NExp#Jx?3?JZ% zRf1J!OuY&rtW^^Ca_!%qKO9r!w5}gMdsQmv^+05HzQdPP?}E4+!tQ+OT${GO=Rb>X z2OO-7ceQ_aQfo26oyDIiCvC0{rR^P^UU1XhQeVYX{=8Z1DD&*{$)7i~PkFIyZCo)y zUVrik-u#J_UR_*&E+PdfXHMouw5$a|o)>=Qcr2Hmr;(NusYj)w+C8?&4!ndJ{Q9}O zdY3%2kZ!Kb3sv1%)rG-Tcu-jf1`ul{wO=3W!xAIy;SX*J?rYG<(p{%}>#0`tJI3nAh0tmfYFfGR zhDb8q0}*f~pA8?s4c{yuD6y+Pdez;4YnJSnBpJK@$OP|W(&ykQz&zg|mWXZcbym-j zO9kCuE`RLTE&bNz@du4m4|}vCkuZVI2VE)I3RZwPmYT@ zYN=u)CW^2~d55LYbIUax{vS8Qzd1{`vu314pnaH8Ue7Y@0;vptSW)=%a6Qg{>D_)d z5M{Eq&9(BoiiM;UACA$WuBVf6?&AC~L^HIKeD=BCp7q|r^T?b>T23fJ(|9h4$9Q_psvj zFGfu-)GRu^S=;=HEH9U?YY0;pFA|=Pb6rNpPG7m{9*`Ek|G~T`Vb9FUE;TO~SN;}0 zNAVi=t9n{k@b0j?#QQDON<=Lq^2`g|;54V%H{M0kngwSUrP-@OpU80jBLQWA`_zP8 zD&Dw1*Yf#O5be!v_=8G4-e#IaGI)+!lDXiBhMPxL*|PON#Xn0$%6Nr>#=IjP76s%l zq&(n|z()F<=hFhce)NvYU*^1j7ZrXG#ZbKzBJ@bCWTPtML~HpK|L!FBLSueXcF;@7WY;ZBif6Ua3{M*$)kQ14&ku?tnTiWO zDDm4URoU0y>uU%7aeTS7)w9&mI=dr1`8|0@R*f+(kClfA3s$`OV^Zy@ZueQo(%C9y z^6(n{u7aSmD73j^VB(EMY`G(-#n1?gv{^ac#@sWsn%B7tpWeAY7(R(irS>iC*7U@x zj&WbWKBUD?YTcR>A;aEhPvE_mRIIj!{qgaweG7-kcTdcCZePIEnxs^=olbMg95!n` z^M_uiQR1gFjnoybsqfmdD&{2HOIcUWNUyp2HEQe5=leAA1m703o;oGh>3Sq=9NEw^ zlaKf;UU7>WSNjwszcN59V|@m5vq@teX%0>rxEYx{O+Vq|O!`kd9pd_hQ74rAn1h02 zC#!E5M$Vc%-TiR+Rf74%hcTtvtR)}JNYuQ@8T^Xn5s7BdD=sQR$_GUmpL3m@6YQ-~ zj6!*fiT}dph2F6r^!Ve{yf80ae4aX2Fo=YZ)7=D#r zwKj{D(g6ORFUUw3M*<(9tAD(Kot?9`ADXzxzFbttFs0ewYEk)ML%QNaYAqQLGGNNE z;+#chcSMlE&rzzp$dD#p2b0E92aM;Z>@18D>FmRqG}r;EE2sVb*HE13N7@!GHwZzh z4-=hhgIPvg_Euo%w@V>U;e`i=kv-hJ$r`I#|B_(_M|SW7sWt=PX;}!5T0tsgwV)S) zQGLL>Yl7;mO!O}uL?LU>W#-@a*Un`>o@Pe))Thug=*W@fG{4AIE>VYB-Lf%r+Fu(U zwB{Vou|}I{IYEJl1+4gD3Ofv=#chy|dd)C!TkARrRi=V5xZdDq-RRg7#UbK_5pTxN z%36J{b}AA1?2NZKo|cTLXFl<{XQ$sDjW7Uo(Z`snPYDFgYY+8i^RD5#gZdqZ5IipT zSl`g7zUEsw!Mz>CXB&K8*@G?xzU&C=rYe!K9Sd{yepLrmy1Q1GE5(Ms}VO z|F|>RQ+Z}1L|!EcKarlXH(Sxv>5z7QPe5puVTjwOY~;v*`t^2Y+A+G;91=Ik|Qi#r~NXy&rve=yjAMaGD}W<#i5TK<{Vby6GWCh`VR9Aq8s< zPdusEB6wR&wTFTCYoz7x3ET3JaM!%c4}SY-8V4aFo%_WqFEa$2kHZ8G-#E<2{sMQ# zwVf)iE0E8sym`mJs^Dw2ky?^rv0z>>WnF{aqVBuAc)xe8g*k7vRK(;&_pCRWa(JW^ zOC{fDJoH?R-L>w{xBc{OFHM5x`3V-(i7DQD7UhqhE z^k|;$q^37BmLD8-wt6}%hrDJHn>Ug+>tQn?v?RJu{^gr|QHTf8^u_ z>0FxWr_(uSo(%i`!c9q>WK<(O^ONecq0so6zx@^8-r%bCh{LnN5<+$Zqg?zlzg-5j!7+3%WFTZRXvUSMj#f^~+{_TD{!$|16#O z9WSZP@!>g%_RbEMw=LO?b7`l<-vwU{u;7*6IjNnyK0%u@_WZ29eYWq3Lm%t!%yG%L zw!d!RevGj7>kyl<6oW&=fY??viiP%J^q{z^aab;lj@r8um+cPLe=dG)tmBx zHemp-Q}*^dhGNR?pNKueH`3zq?v1dFQxclSP5X)$Bg_;wCR|pcHfMLaqB>f*RMmFx zcLp5TRh0fCojetKY`Y4MY&G)1M}h{@_0*eXmv!1g6<4tppR)TBMjYoo`EFhuCG<%a z+76n1H+p&fguuQ(mu|rqsSD`?k9i$1vpYu5Q(|<#T9cbLO|o24oB~&(!QCv4Cnp&E zSbtVDeTdYgP%)A3hu@?ztUP>@=SmtIbukNat=BYXhWCF}Bq;pS3#zVb7 zwt&dPdXt);;i-n*XwEj9q@)|E^ly4XOS#^U$C$Q!v5Wj?nefbb;H%u) zFs-wer%$NY=0j`U^&mVg$Mnh;Lvqn)<6llntO5n_(QLM58yjsIK$t_DGi3I|gopKE%o`*< zIMzWF3|z1AACgS>OYr7oG~0S`bZs-hvvzHB-S%;3aOfQew=a_ZXyOuU)jY(0&4szS zG&DVT$r>8>8S63IHSY;e<)upbRW+p*WE4(jiN8ip@DmK_cR%BCUcG1StYroXrv=^b z9$E?etEQk44ja|08U3bDkI7RQbVONRc2+0OiR5e9Cx>dEA=G8#WkxNJxlDA{qa5#> zrj*$OrnD7X15cdoLA*j`DZQ@#ZAvv+yp6bBVjdW@JN)jc;_!4OE1RiW4&!yugIn&0py=&Zta4hHh#kcv-b8QBZQ|JNN$#p4KTJNcy}I^hxnJa` zeZW@wK%yB%YSO*;$u?YKJAJ=c0eI1`S*IZ=5bqvzG+bQ<;#3NF#tAEVt#hvYpaSs~ zH3P~e4@bVrOg~wX!>$g3F1%L*f(!k z?pajrux48WxQ;YLkOO3(V^{>pC30y{5u#bIyNl#a44f#wa4T`V^=3vD&qsV9HSTCY zC3JWo5zxvXrVvW;sk%D}yIx`K-41_85agyisVH`PX`t3nKny9KlKb5neimT9KSt1Wk zAdA=9OLD2xSlw=mZ^~QbOi&2vGRuplwwRxiGko@VU4OXAVZ3stMJT84^6ht&I^oZZ z1I)x63JQyz^#D2#YSi_AG4Utr0}SfT{F%5%n?bbzBoyV;+h;MbODcdC0dRQP5D*d~ zbsdA!Kx)K%NE%R$^weV@q#smVxEr0|1z2e6Z~iIF0AC)nJ^`(wz}euK;RLY?A+ide zS1~DJ2=*oTP=eBA2kiX~VDI zjgT0Ifb9Vwq8$)V35@uE2)`h$3KR!@0HTf%;QtWmddkC4zL1C>fl8VtaD{_wPbI>D)r8Hf%@s<6oAJ!`?(U+F-j+{JYs zcb|~}G--br6<|5D!}LK5 z!#~#cM{MAVK{^bwOGpApi_kKF%m6%?ILR0o9W$(@7^Lry2l|H;3!V%q5~%JEw*V{w zGu>m*JE$ij0MZ0l72$MSI^mh1lb~ODwbzai)+1}Yz{MP*KZ4&v7Dmy+?%@@A|= zC-YZpf1mkBiO>j$%ygoXKSPE}>XAB1Fb%4#URHGnrWXALbbftpxA4hqKnUsKKnG~@AYOhB#Rq5Z;MtiawNVvx@r*UEoWz&se>?unQ(a*?+?iY>0!?TAdM0*FEqrmgl~wX2~W;1vURZ#k~z}# zE4>49%TeT@`c{ah-3Ql0&1k`>Fi)zQ4h(S1G2%0=WSJwK5b&OzEi zc8nJ=>XLjY80hb>413 zS2=xpVy$imlx&$o*h-z~MrZWUX6n=?%+pglB^i|8^%cxObxli>53Ck*qO$Wmxkoz( zTmbB6%TMqQPe=_)H$*@%BIcjlt3}zNgt=Gs9Q)O~>?TbL!M^o@Nw>}nc+zMF`h=u$ zq}{IqsrJNkqV(1B>1LRIGMS6UK~7Y+z-{U7H?BpO^`vi%zn_uf;EG_%>JnZV=wv(x zTJvSFPf2RM_{B^h3F9Q>F87u?u{+Rii7kCZAjn?h%3*^lD5`AA?uZc#*`rOmzRJLh zr4rT$=j8hE1a2L8)xB18Bp213mXog8Bos&pL2iKIy?B9giytVjF>WjgOaGrWcwXGrGiu+#o zI*oD?Iw6^yr^)tq_QQI3j}JDU8I``QcnoSu?~Ll?VNOf&zGbnKL}bXVG8^Wp{ye9> zkn-)yd;1y~W6N#I5;G9inaDRy0T$iE7SnOqBXe79U>xT_jxOwtDf3~9kuczw{g!=#g@3S{$WRH|h z#wjBlWs^NJGEUr)y*>!1qPpx+X7+X>r;LWmN;nRegc2DUB_sRud!0Vt-ye6!aqqi( zJzuZq>-l;<9?!=!lm1ZBn?^)MnPZKe>M@=;dRYr)vXSe8*MF~EDb1bmLm@eG46mLl zzhrUNl`AzjRW$2uxBVuk-D+b-qB}m(kAiRfH!a8O8#-!F7R)jkZJ*L3-4)_2NoIk^ z(}lb|4I+ig6_jp|b%z?h9F&eVY)D$MDSR37{u9?L4(B7nUG9#9DlWD}uU+fl3^(3B ziFX%~R5pRtp60mxkO3h!-XQ_fdg~yw#b|v$d#a)$wHI}mnA`FNEfn5n;iqj_p2)4$ zGXiSS(j^nTmypH2x+#cH6%YRO4hCBEX+QT4pD4{gm>g}!a47qvoF?@5TymO=e1nYR z^LYGX!%;_#!tR{x3N9t zL%CgviRYbcnVKeZzHoCR9Y!uUDOr2@R%rLC?vX0*3?eg@?W|_t$vt|gdduUmfxKy! zt`{*)c^LHFV!sthy4Yxh6f;RxnQud{$W_Q-O}}ZEOd2B4X-`ICV??J!wCxFK&4k{j`$K zjf-#k57y?;wU&Q=`C?^|j=MG`D6WC85cFnRo7K%8w1e+;B?9NFL&O4CUDOAZ3Y-299RxrLWBYq55SSVzr~sJUHo~|GirDNo$eAWmY3X!Tn<0I^=WZ zyxNjaozEp+D?VSia?*F4ZZq0os?U0jc8E0hmD6q2$eTzLWaYi~Xy61b!<0`2K5y`u zU5{9O*$vHjSzEgVT`77hn-igOYVP@5cP4ZDmIl7nuIGNHTGNn{l2%C8kfJ!?|5hUP z)$7MksWvz=5s4*i)T^_n;QTp@;y3&>7B~DjZ!58BEa4OU>)xcF|8fga{ig5sveT-) z$CVkgGYpkAr=l#rKbP_@X+Du!9iVq*b`3pk^JdX(!EsTT?TWoedX$}^H^W4chCXMK zMM_nLYo4KU?j*yA!PC#Z_Y9HU(!%zW5Q6sc*b6v9eT98J*KB1s&?ZEkkJs9ixm`5c z`+Kl4nBW*m4HTL3MBY`{RWw|Vbb@9_KWdj=t3g-M^M}^ouYI&_5x%d@$i&$N|8XMU zE#nDJU*r_W^qKZjOV~wgp--{rjn_YNSG=5}NkSzEUp`v3dC|n)Z=X9T*KgAE(U*!# zJ3*dB&GuT7|ANaIk6Y4yKDD`*kTq%{5f@$e&Ebo`nY~u&<%;NeOMX$ydWe!c(J*U) zez+NIk9S3p-99C(ll*E0*$sCB>_mY~F?TSrX*-dZwV{)K*Sn%zacL;wJwvogB~P$A z-IG#p=_tjbLG9f*+J6^~rG`PVX z#F-_TmNXiXV`47Zhu+1lC(ptsP=LM687j21@u+Y{xzqmU^QtMDAB&a0vdqH5YreEy ziLwCX!=$)`pOJ$fAN7yiBSZospq}1cp5*lyCl5Ottw}ATnnE^XB%vM_ZDesY6>|P# z0%Jh_9%;l*a>d(GCOmaF`2upYnmYediJdy=g*1-+K~h>{t`pCF zgA(i1udmpaIQ*d@h_lhzx9QX~z1hd;FKx&Q_ehOmKG-rt%-6&N**;VnekJ$uCG+33m@n3@Q0NpS!>U)W!C@(;GnPjGo=S*g3A<6`%ZHM=aHX z%>F`{8n2+(a&hkt6Lniw>@FT*MulyQWoyg4C_AvRz3YQZ^-ub!fgas?kXCq@#~l#8 ztR2u;lRT!F)vKDq8H-CU|CKV8vFz~StDL$358Si0_wU&YK>FY$X%niov!1bJ!+M`m zWmQYm`a#M!Am;V$SM4TF+Rt%ZNzdoxCCz5Ql_#Va0Ss$qy+GTLXLtF<-FtS)V>tIV zmI0o+%hqF8WCUAfFU*gLb_hl7kv5NDoojY$Sce66u7|1d9QbUOYhyMk{W18jm-x|A z7$YSUhTOQWvZ8;XuofSu-Op{V8P4!mC*FmHp~FhfFeiRB_ZOX;iwWf~8Xt)ka#yn& zOW&L9=~mFiRV7R;9bNAG+;rP+;k)CKg?I$z_}8;MW7q#Y+WUBwB|qI!q+<}O$EJTj zS6u4Lc1!X0OC#y5HG@wyi#cYh->T*Ev7b7)7qC@*y^ITM*qP>aKu_@0yoE1qr(Wmf zHU0X$nZb-NT79gs#;f(9CO?#>^Js);zvp++506_k5#0012t_8UK1XzSuya!7L4@v` z{gR63+7DzTrLSl5mVz*d`=LVeq_vJSl~*iUe(`m2nc9QL*jTC0nQ}CTgDT3cJ|gL3 z{E6(OrfNP4asEW2VuF)Al`X=qEm5{fv1(G4GvRqS6C+C&UKt^TF4T~?ptPUzw!W9y zS;{m0)ECkdJ!5{a+_y&k#hcdTM9oidCIBv3)|GWt@>TQ4#c^JD+p#dX3xnK3u1c4? z!TZ2DP*L+pF|Q%~*@f+ku-u8q{ixN|Zdp;m(T#2&mZJXHlX4;7_ed^xGkkxktYW8b zQr;&iF?VN#BHb^+U!o|LfU9MUoPPoILq!Z~Q3upk>J|H=S+~x{yZ!Uz=;FvPKp|(W zE}XGA%KaBw`{<-cUsBnL7Ae~>9Wc7g--Au|6BQgozD3fX^*x6HMGERK7YQ%j+*mkX z5J7)i@?n|=bF$`#)A&p4aKzxXx2MmQA`gG87`wu9iS^$V+T-PBuG(w22yT8T+}XYv zY2{d~l#+b%BL)-P)~+iIxa|1ap=g?i9DbYyn95qM1LLxeh4SDDYueSoS6a!>?!Hwi zcq|WXm$crIl_(QI>xxm5YUFoQ1eQAPvy>?tfW!C+M+>1v05-QfUCS=6*9li1F`nU9 z%LCvR8y#Ume>-F{pZ8|3t-xW9Y6|e8RbGfHdN++{p0hJJ?>3Df9a7} zagqnZVfhmdKDKG{ZDP|C)e{q ztTVO?p6BCv9l~9;7%a-WS(&t?3Q^K5NBt?PQ-nxjqVIhxVpD#-ym*HBWOq~Ni6%qT z+UbUoV#aP=$p(xkemhY{qVdiw&idiRw4Zj{%@6jY9!gKiEi&i ztd?y^eXzpJ{4ud123ZjS(em?+tNU3_D-3G4qti0G>3Ro@%bf5VY_rcDf=U?^R zB(zPxlr}(R5072y!XqaN?dfwSCQW5aq&5iU7R0aeSL)tD;kc5+4!t*N;n6d@#E2@b zd)D?;8yU0DP)3$v5FT`gl9V!B~p=I@f^2_#*C3v1C zy8iZFI?$2)2OU_YDx8Q5WeVWlV+hqeJ!gGE;isxN)(qb@QdF9i7F@UvW1lL%hH)KB zVKF#;vKI6wslB#}eK7Rtg2i48KDwOIHFUGC712@%Kv$jrk+1zwfUCLD|e%mKs7!%d7A?m23Au}5SDH$P-Z@D@LyW&0h;T4z3>_yw4;l!d` zZ_(O^b5T})=SZrFZjZh%JKQw6>@tDef19$Z-1`CftFrf$zyjlnPCbj6vbTW7=}^~5 z>-WDG;nxmObqEKGzY**cQgzENfs}vY^reBb=ACdLLjRhl>Cuu?*u$1rG;NXxG6CxG zLZ|n!*Q6mP)<~!e;`pRF%j(Vb&5Knnw)4&B!={5}e52N4An3=al?7(z9=ipojgo~# zlrv&oN2Z!;=9GcjB4*ik|0K5u|9s`Xhi7&7+DstxT*Ozb<`nl@MKYo#x=psj!)w_t z^=_j4PjE_-oOZf*hOYs(Rn=XTLy0YCEEZ#q!SEw-BBNHLR&xTKyjVY|<)Hfa_}LHi zhM)=3O<1cp@q|C0@X|z1?1fLWcCv9xS8*QHpdVWg73eawo&83nJ8;S2H+6TCRkCB+ zs;OF~&_4_}dl2Oj_w@F9-FLa$GSR5I4#mINhQh}s6Q155Y!6?j zHI5~jp@Yx95VUvh5L8`qHg#s$I~m<(`6XCIFtcRuhMW1uQm#{#oF-rEecTY@bnR4;vFcUCSI?SrMcg{yzGn1rMEs#G?wN7s zx_q}FM4u^E>Ju?%f=e-aCA98`EX^HK>Pw7^EydH2TBN|Y^9qDb5SQ|**=i}Db%$Mb zSTU6eq~@6iG=tN!TvMfOa@tU0w2$XC_Y9#axb+U!OL=ZmVSgYU9WxN5{k=A-geH&2 zer}Ffo{x<&!G`Oyp3gv5A4m>6m^4+;i>h`Rdv}D~q&8RTC}~CfRhk3|M8uvs^dZYF zxd{74&8q37b>ic(a@Dgf5Yc1v+oOFkvzt-2FBTcwuID+ba|!%|V`;uKHQps;)Rkw9 z77PEJ{|r5nbw_+#RlqveWhIg2j_s>q>IV+d_n&3=1`eRMG^pLkY6qOB!OqSg37qLj zRZYES*xpFOoPm|;fO!Ye>ICz+80kuZ^rPlyzt=eT_(_{z+IraQDd(K_7^K<2+A4F) zy0~4$;=J;yKL6`%ga)YV$2&huOVP%XYG2+RO2>9;gH*h{hQx`iI>+~ChO?tpYg}Ag zezvuVob3}nBILD-{wjCYbX7T1SX?u&?dq$Eu--^pb=;o4-X^)CaMc=}#IuLXn>2`5 zw^1lJ&d)kXvi3|Dd-wWjek^?v`rP=1c`3lSk5@CvYkK}`z!&k@`Kja&HImJl$L}uH zygU#>Kc|oT`0}!IK?i}?P&kC*(Z2ZYkqz9-5=O?uOqKoDIPqpvW87`|W?@H|qR};O4sE7`NB^4d)@Xq94-h=j}+g?I$0rN^nP ztuMmNy0w?Ee6R-$OgBp&eYn;UV;wBdd|RVB3@ZnFmh@mEt6NrIe<<=7sw%{c!Q)k)UgS2$GQ~%v-`)YniWlCPo!w8%q3GC+nu5z3i-aYWGU9C zJ?-kcmSH?9i?rorQ9xgJq(~V z3XLV8u0Tg{ke6U{wZPJFm#-q|(18eQp?HWRKhhimSU`$PIpk#=&1>8Mgqs`A?@$Jg zj=jGMBh$+Pz;O(IDIur@@en8uP|^dPdy+ttUoqFzcK%;VI+Ob6mAfve($CLmf0fNYILG7Yy3K7Q2d2RLeu$bx*`$0`!E}X^b~c$F^bW; zJSu~_>d=-dPcOV#Sb2~me^hrp-QGr*KL70QRBT{!utQXhg3Y!_4x{$Q$LiL*OPkdw>cMDl zz8qVnTdYQg&i4$?URC8^w=|eR%4l~~kV=J5o%quOFGM9Gs|n?H(iHt(3N#=v9ECpI zrwUBakcuDZYtA3cE5 zi{A{op}KOu(~NLiR}R->9i;!Dp|c!dj&TP#1y>Fd^Qibd#SYTf?0koPlYj#o#04&2~@Dt!f`iqhF01AOrEKBb6vgF~oCKdJk(B3ADHmyFZ$;GK z>20MA_wMttC^6`jVDZUYHz9VZMO@LddzaO< zbxQ?mT*ue+n9Ldf;1<{Cq~^9WpP!{!j@f)p`>5?vK&R7*&m z-qQki&t1$P&T_FjGb^axejRkDc|KBsI+2|o0Hl+1^`4GLj8rV})jH~9K6k%~d%smz z10T+bZI%sA1S_2E@s8mOGG0Y?DP=`E#IPba0I~pk{O1Xd;bf7~k__0giH7MJW8sS2 zF*+kj@Otu;Cj-G`c}-(d>ah(0CJQ6m5*7hCw&bM&2Go579atv)B;Cf0UTON+PA{orAE zoKTZTcO~W$!J+DX=fh;NEhf9Cr#G3g%bT?ZgE=Rp^Ak55MzfM)-uthlt^uL97b7Kc z?l)@UuBx8bmgR&5b9kye1ottG{H)!&crOm;JMjRd}_J%o|GQ@R+3~p#X^GVM!UC%W5n(V)j3)@z8`8wk&&z?zomr{f)KWVKHPMo5; z=}S<>oo%#q$n%6#VM>y)fgOWBxhom8mJuawp(eAcI9Y)*pD@K)6`a?v`=<;hTQsEj z%7r{L_ay7SZLzBu5cb?}{WF#O^PA0Y_C;xj?k8?L+{;GN6o4f0pV|z>eY`-r&dmT- zZ7l}K2;9gHy!02jsPivuDG6BuNLQDFUsBij|7}I8(y=gc2ZjJ;RL3+2pxcK664roH z!epd2B-{mHdt$Qwv9U1V%*)SUE zV&i{iUHdSu>qbGOF0-KE(IJpdOnvzxNHq*$SS@P7n_2_GKesi+SFJT|U)4;wwV zy1Rx9fe0r0ZgAAleL=$Ood z0Ve1=Ht?m*iqm{q8?qhPm)(l<^9$*7t_)dvIhG z-6^Y(FMatJcn7IJU^}jqx5qpqOQ;J7y(g11`@ooPhC4$PNALn536D;1F!8(LnR`Mg zJ9~frQAl)dO}~3Y+Si-kGWzc&I}~K|wBb!vT!b@{TS_nAGVm009@kKm*8c@-Jc6?v zwbWe>&R8Pm-TEAykvq~HnlP>_PG$RhjAf5KV*U1el`h6W9!iLGvkoS%2UI$?YLT}` znoY7WZ(51pA1)Q>Gj)!A*4u{*I^CY9Y4*>#O3xl$qh&@)b*|7{Q>~u6?qukf(U*bI zv~mhe3Hg4n+eHh9ruOJLRXybpc%2Rk;Uw(jFgodJG+ia`+>bqRF5bE_n~vvSXv_A{ z)a+ihpCG=ODjr0I9(*$)1Pd%Q=qzcA_}pe`Sas%H!|SPU&t9uA9gU{Y{>c`fNLjTO zxUQ8Y*iT>ggu3(1rG@-p2M^cWKJR{4P)tCM2f>y=cIhBQ1#0+!O++r0qGWwb))62- zFG~Rfo4qA- zE5Le+920Q+o;)Ua(T~#{sJ$e})vqTmXqM#5`4O&bX*=8M=tP$+7ZVOQ3>T*MH&%61 z2MUDosp=-0ZbM^Vi}*jnAD40vW8j$cDNeRrbxpYC2$Qf`QO@!URUF$>83n&XDrLgG zgwz*^&xYuIPq*wloSGW-Y_k;&7tD%x?m*d41x`1H-t+LuQc&m^L{%KFUbf(}+Lnt| zb7`17(Y--<=^sLIcq_<2T4a`(iGE6Ji3BIKeyqMe)YT?Qi~T^7nVA1>B>5JHq(#%O z8J9XVx2s+kKGB7?9+gVq<+vItsu3>S z5jZq}ARc=na*3~ygBCBO#Y>Lo$Y$l9Coefb?JA5vZ$Q$W_(4}ua7RxTDR8P12a38> zC8S!%X+M=7Etakf&#qDGt8>q33+hzyRDxpRp9n?*M>nD~otAWGh2maj7 zn;jJLN*FDe89^&vYz>ynuqLij25SUsNw2GCR(G7SIbuEo_0bP#=hFF>pN8$}wX=doBh|H#eHz*E5m+Ob2{nK!)K3?CBv2 zEQs=7#|wjy1|7?A%?|cJ@T4b8dS$X#L z(p<=h89WJ#B99uz`R%q!!5(-3Xh>M9b2ElJ<`hR9F&r3LaOjH#*VJOT76mv^ z?s0cDM*;VWeCTr9As)fOY&!n3^h6NIlc|WA$B}9F!O%~$W29uJ`!bnnH zkVO)g)U#}OvTr`UnGLvqGNp>lTLy8=!&F9uCfJ`{x-qQXSV-X~AZdc^t-=z3$707^Ar_Dc)dVw( zqRe3_-dYSa{~L`=D8?GluL`pup)7ID(GD#@*Z?A=Ym!PoP2372m3|`V!Tr$~#Pg?A zbJLzOV5?LVkbqMh6ao5tiS_s)9A?}SNo=@V%j$6H`NiBcdkm3xG>w_x3I?d3a>1Zc zvE>mMTQIZG`bLOzGrGd3ev!}Ke-BT9dr7Ie=`{_;Cxd+H;lfB7F}=v)v}F_UZty!P z4v@){KUKY36%-y(L=P*NqQ+8?1~bINaVIgPh*DIwG`yJ$A~cqY5;3QKl@qRkp2ZWl zqN_0;dlu~zSs0}rZBpVsgN!__W~N`qsxC$mHMLpkMzf{@_f!2LY46rvVQ=wTs8d1r zj@-}fcyOx*&pm0pYMTrJF$MGTiNOoO}>8GAPw9*kEQ{|3YdqR?r9Nb-}ruly5GB59lJ_e+j6_$q=9CXw?Q0U9PZyq$H-GN`SnG<3ZRA z@acF6daPO*Rz|T6f_2aaS$$!wW$6qsUyIG6Qs-LH#sNMq?6b z^f@ZmhA3&Li?-k$M!pJh;;8vlq0Au>U6IwT3VApsg2qh9LB|Y^;mF@APJ-yJFiS3j zg%(!60=!6wd13H+5kwTkcUTP(S?(?w&`NOgGX(PUf)Tr6Ea+nV z{`5@y4`%;1eE#$K0s=~V|NZkuQTr_Um+qhL5y;)4`W_zSM^appm+$ywtlIsun3%AG zMVQSO(Ru&D$Nkfl8%1=V#tq~Lc1I|m#cafcK=WaQX;2%L7Y^9YOAVm)!iSWPcX-LxW;>6*S&wnRG9eMhyHn-gtlkRL*7b+EG>h!gUn?GooM z;U%mnzq+=Kj(TGi9iUm%NNwXqf5{(_#WeK2#dl&zS~t0s0$`vV6$93qF3`KEkC5dD z1Lh;G7HllVd$hs`u;s?#&N%g`+W0JaE0zwZz;@5`p+uz;ba@MW>44oa{c2275R^~` z4~ob7J-_?s`B7X|{xj0Ue+?S?X#W6-b-(>{U*%S-u=1txF=(VBrL=GTf1c5dtDX4v z$vCJI7x@*-Wk|^hjFInJr@40}xJg;a8@U{90;jY_iqa_G?<#<5U92nUOV**Zh{J9p zZlJOJ$u&IzY%)0HTiGRIyIcW``e*!UqS!2<%Z?>!KQW4{m2g`X5k@{z=(}=8Ml(+P zCQvIC;nn_C$4WVan6rvXe~}1irZW%4BQ~&qzx^n#I?LWYEI07YZ8&33w;%M)f0bFT zqso@-DRDrAqJSyOEQ0pkLBwp#2=&0tI^~(A5urK8aHj^XC3Ic39csjfQb{Or&rwJo zL1iP73xLEC_~M7Sbtsl*jc1II>JX9+LlSuy_Ny+QbgpoxYi;@Jf3IShX4SXbqaECj z;_Fh@Z*oMUfD(!ZV)&hNX%GE${)UR@tMML&9s7o^of6{dj{hWkNJyEwR;O9MQ?O+_`loLtSFWE8w0A+7cOZHRiQ|%CY z7BAUPtsi9n0BVnDSFsPWk6K@{udOd=KVo9|rrafrBy;=E=xC{a_NPTP%NrYZ5hvJf z{!#v|f0bDB*ZZQS$(XpSh~8Rtz@!fw94Q3RXSirNO0dYme-u(EDJhI7pbGO{EKj#- zIO~DZrHVzCHIWWO42q{4E0U#mV!W5aHYJgQ1A^G%oh{P|e7KOi013xz)q62>l3LEU z5Q!Jp2BxTzv$1L2Tq!9OV|b-^SVjK;T}SdXR*_m1je8-BC_n3({{SkR6^k-tHx}{C zxsYc7|9%%Fwa`m zQ;XmF*2KBAK6|-L%8-sW2gx42sm~54fblDS;XmV&<2+`tfd$9j^n zW{9P6Hu;*~F|_06bK0hYDC1a_8-!8-^{bYVu`5?{f2N|sXg)%7kTzqlH8L=U>SmMW z4y%vARa@QV{<;gT!%2ywv-!pgIbm08I*#&YkkKHc6$Kf7B3;%o;D5_O{EZc~HU!N( zPAwt-0IqBNs#@oJki5PVygOBRwGMfPb(Sy)^`3hhSn@fFmWl%Rdca& zp-sGJe{Td87zBD#_9<}q`IKN99GfX51w&&!j%jHOVTLwh#Q`V1JR+_zpkt*Cu~`Ph z&UTFY;*@}TfN5Qh!qGs&iUw!vX}Zk^{WKrQ(OXm4Mf-pF_KW?&{HjXlAY;0y%N$h~ z)ooRXG6RoF))eJEiImiLCbzwU;C}7FK9xRce@YH6%&5sVbR`6V){#ba=BpLC+Mhdj z0+&wIe%ULg!n;OmcR{FgGbK{;nHWtK7KC#4$(q zo$3DomSVd8uMXxu)lBf%V+O=zzv{YqeZ%$3Cu%)a^Dr#%G*+=_-(9v7d zf7nfyp#K0-ANzy(Q;lFF7gdht;(d{Z5wE9ud|Et0HS-DG-n$i5P6&&^!z zWsNMtnrucufSmREnzpiAvBH!m+LY9}n;dOqOrb|A2jNbvS)jBEKtp)Dp&##2T0!Vb zC5!z^f4V=FDK(genu6x$J9x`Tz+$d3a&|&)%I7kku7BcNFX8;fXLx-70HsPl*#5Po zKZ7D={6ud9SvvYNq#H(XTl!XXG^mQJ@UoSijQ2k&BqDm$*BV^5@tIMwSDrgpQ>_&) zQx#3x<&75gr6w6$E!9t`t(xPne;!%1bW?YTvbS#YpaTDYrjC`2k(DBB363VNtn0RBl??#cIDO%X-y{=9HYB*}P-QtR`s9 zA(XXqoi<;?`HIf){{REGMDiYznY5TXrWNk5C?46GEKW9e^%03i*Gzr zCg_<+_NLy*sb?`_2gpb1O+~3#O{-kP(G{CeLI(;7KHOJLTH?MkX#67PlvgRJtTMDv znJkHZ;{62#)d=ME8D4AIOMeR$AB9@C)qc+c#<1jp$&S zwJhgri$s-%3ulkUx$4nSe^)n!M<-&1hNC^j+QjIgNI5@+Sk*3NwuKrX2`z)4r4pu< zMG#YNH!BETNvm?6EpAso97yw^gVe>d-$a?9a1wCf>f z8Oh7HQ&)v>)R#1yIwGvBEjqJh4ir>~gniNUq%~-gn`yT0?CcI$l4(D)ZAb8awZFHS z9?Bv8pKL$npX*j5jblKFFr%QUl}Sr-loHsDE#ZxWBw!KVp7ErE4xxbcq~zPU(n(lo zw}<|DujNkiV;}O(e}5`DpK;j=5eG#B@TXF4<3UP3l!h%RqyvR0sbEO7REUGHq^$`I z(@im;qJR>LU@a63D5L->MFSR=kP0cnkPliaL_kjhlQn3OGes~8C>T*d1r!V@#Q-Q2 zw18SD7*mBHBuXk6itK5*t&sssK*E-g2xy>TMF1@=0~88eXHo#g7^DF}pk%SpQ1=m4 z>A9_u1BERNVM~fYA*7)UDbxT`(iq`ONr1Sdpa$lYPy~rZLjtq)rV80?K=Dq+CIaG& nQW(=sriO(S>KFwmq`+_#>{PH96w^W&!e|Dl2^EDE4FUhz5Y6V6 literal 45034 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

X6?7CE{e~ z={FZM`_48MX4%0{X(6wXx*6cjvHrSjn>aM@PCH#j$84?tFwg?pk6Wh@=Oh#jXGWqR zwE%N!QXEzj14*Q5l|lnxbvOjsTxe$WJ!%dR97mkEl*tMLwqm41@5KV4oA0`EmM<<; zD@{B^4|_Pb9-kv#KN%x$9$?e&XwxIU&=x>Q8@jAPP)CV8yR7GXe4_k%SLI@*;dkAu zrR;q2^i`*(TytzhM~++*q{pTQ7Ik(N6s02he6>~&H(46a^i~)ag`1XeI}@@Ug2hNI zw9zS%#dBB7-+JkOrB^;eo1v~_5E|sAgFHZF4CWHmW^)|Bc~Om@@x`ekVK>DvzthxLM{}0*e8qiZg#X9 zx}Fm^6bQMG!6zTDv>H$I!bc_+R?~V1;OE{6j=SRQm|~FrI*tnZT8JhloPr???h?TS zbW#Y17#)EoM50yjbe=>JPyG;4f;;+6l}O^}OrF=YlGApz@NWiAKXi5qhXm^{M;w>q zr)DubT}!2WYm}NG<+AmnT=CkLh$x-635zV%J#*PJuOb z^XIpHg!;CvTS>DJe5r=;X_bB{|7H-TW~{vt3nI#o|;iE1b+cTjOp1q%Scl zXyw$MNViPcA2Ho(E2raxG&4Ud7uF;i7X5)xx`qRWNloL*%*lCDblG~4y=AhP;?*~E zLFWhGj28@i?5n!u615&XJhE%`2Ja*piFz2R(|Kh;d*Y*n6CG=)OMZ2}%hz_c?i<+m zSG47haL+5R_}XaoZF}BAD}InZ^_okM=iBWP@zO=(hf*3lW!n9@cS^FJC(b)udV^^1 z(#h0Z5P0B++^kkIWrdV&-I!32xGV%u2Yv+52x3F$z#AN-F|tN>ErEp-;f!ausc46O zhMD|csh0R$A*6SD@;A?m=&v}nf`979lmkbNZ030efDBY&=eeung;AQ>0`Q0S zE_W|U_v%L4f9bMG#0)>Gc~%$1K%FE$boOLfi_-aD#}6_#`es~Gxz$K@pj7a@Rg7A3 zvPjG<$m5HSF&exne~+-Jk9bolw&^(PaVmVQ{J_B%n(;~Ecmqzf9rfesz9pPqkm15a z4k^F*V=EP|%^Pt?bcSKg3h|QmcEpzwytk@hJ?3xRbuiqcy~IB;9maQEI{7hovsjIK zRoO*vlK|4_E7cr9B|D9sN>cNo*N&J#evB~IExtv9dk8L)exs97HT1hJ=W6t2Nd5cd zsq+EYFhZWdAISQx@yp5!%__$ZrxraYRRA-r3Xpf3L1;}kmVCH7Hno~M}f&&*dwVO8YMKsAO{4%RFcKSss z%AGDJ%XCcZCZmFVHoK$2VrOp{jwEnr^uQp>@oZFc;ZHH`bn8R#^me2tgb6OD0zs=L z2x82~A@uZKK+8IANi~h%rs8aWeu&N0(QJ8ecGX*IpNR}ERe@+FyRf*LZ*iV;`pLjQ z7k&|Tkk{zba9?jDs#pQB9meT^kOu<*TSR3r`Zq}C#t2%EQ9pi}DV$=m8@T;*_1hC3 z-UVI6jkAlyk&bLSjqR%Yo3CfCNgBP6Xou(7YefgV?!uMA7c6^tNKNcKbnlezc|B|O zWO?R86M=og>{1yW0>67?BZV+_66c!s_G87Jw2QZH^QBmc2huj>XftSeg+58`RMG#= zAvv>UL+>tH@bY2E7Up`~L^Z1D=+x)#kYbsFE*`gqdlQNMhP6I{b$%sjUFZ1yyphuE zA|6|o!UF=!5D57|5C@0)PP}LwZ5A-NTU@omJNkM#@Y2^0juYV&gaKk_frb@S6Mjq{ zt&n@!S5?M4_WJSc+Z|J_*iTg{Xsy1oCN$=xf!!Y{NeQ<&H@9KeEc!6E!^gt4)?9}( z@%|sE5(CYr$%{8b>;KXEUG}m4542-5G%IzE zs_e=iND%Xj?NhbxvXb#r0S{8G@_@8Slt4M6cdpp;Rl;I<`xjncA>x2wVAcvjMignY zc(L)l)r$YcHY+>}@-Ns>ZB@gn{eWZ=!=+ zLMV}9x}$OW&ZePBYc|S`A@i@37NxIz;Om*yh*@S456G%1z2H;RESNsuBzEuE*A^K* z;Tsth(CPfs>QAp!EmWSVG!@lRFu0Q!^{KQKk}7HBOe!~Y&2-7jdG|sOUF0}=L9u+n zwruP4fR`RN&dflJ>Pwl3$lV@agd$?i#@#*=RcUtFwC~pMt#jSgOqkgU4&9+?ILBzq z#c}J`guCGdbxN@PfQA;{?tOi1yIT8enqSYGhotf8lu?iQUsPJFzs}1(e-9LIm~O>g zSXymouil(&o8G8W(j4|Q_I+|F|BZ|WLiVQAT^y^YVVNS*>+Q#7@2qoQe_1Ve0CWUe zO|8%W=KpT1-J*T|$ZlzD=c!=Ca?Uw6Qs8{5M_JRV@8#*5ff2!PRcvh6`wYCAe~O#T zs$Ae{@L%^Pq%di6jAn=m4=_o~Pt3MS1vSv;SX~~!h`y-MTXH=&jM1@!%C~LRu)zM6 zAOGk@9v^-CU(y-lBmb;uWzFFn@OKttWA%mocYeD(q&Lp??a~4fR`|Ye-!ljduPY-0 z((*)5c@SxUB2&qRP7?5>f)^@09&KuU(HV=Ero=BF9<%F_StBnczc_j!X90Gm9(K6) z57Z((9@~*5#`%%8pmJf4G=QlAfA=rNvsJ;F0W^}wV0@h?K5pg_aioHT!CT+=z;N`| zD#MDA!;Pc#Glr^!L)5mg zQ!ej64ti^R%Sz>28Neu)G<)j-Qzp%|U^|Kz#=k};d_J8W>xG~Keig_l%9Q3(%hTy* zzTq3gPsb4++4$g_DU*KPkV5OM*3HN`7{#F@yD(G%Cwn#_j4724c%L?^jjQx}Px)Xk1Z{rtl zB$F;pa*iea<2n9X$~S_>4cbLZ2E2fV|ZYMi;pT$P^%Ej?=# z{urfaUYv_-nrK4z!0&l(7pB8D#76HiKPh5*J?dfFlEblGefhW6q$2FsYTy@sf$RWX zK9^+Iy?YyudFhKSp`Nd0~-(6a--kg8Q_CvJI@EYRd$8!f)jqB2}SRD$%2rL8U z(c^kd{y+`jRS*#k9E%lwJa%DYKLaTQ)uW zXSOCv;?3F@1fL*wQ9Se;39p|-iLALMC+z7_d z>WGM|6tG!JYzk~v zT)+cTu4gvZLQo<7O=d2wWOlRPXWN2#DF0xw%Es|27ugKchIepASI!kb#Pfqe0{h||lo#^C} zwgH8r`)xXZ81JlEH&9C?3o?}B>UdpN*f*Mm5`77S#S26Jh{`_T$BdETXdU3*XqH)= zUpsJUrZz9(M(-juc|*O@A4-M3C?9mV9Sy$)@6(Zg%%fHuX3&r>m)S)$2w#7U6rR?=DXfxw%**q37_O-OOw=&CCK&E0M+I%@KbeF( z(lhE3M|B{l(On{KVFM&CNO9-}*C@{YQ983R0wNAmy-CfYCxK9itjX|$BZky>!g(ZL z-}HBMCkANxcbo02)6=c*-N;$b6#~|iHrao2wADU#lS4bQP3;;2xcq~wQg|J5YzTZj zAW3Hv!@n`bessay<{7|$rdh?o;+)*Fn_sBy$FEEldRKRfDj68r^mN#{GbOcFqq~s-K+GhhUe}tS=qhQ@O#Uir@K^I@Xyn6 zW#xg0$xFv4J$ZihUzZ-+_ojuM2Ez3e6A`(XsA5DId%Rw(H+-&5(RP6Bum#GaW9u^S9U;bm>)#&Bgz-K9~tjVBd_IyiXN?D z`{KPfq}DjBzU5T!ilK+^uqMU_MzZPFg!_>E$%Td@iCfgZ#5_;2q^Y87n@x-)K?^1K z2UOL=Q~0F2j`N!8?vlz5qPKMDu?oQRFasN_4+3Pn19BJ$9y|aEVG&Rlx!lTZtk4Ak z-$ApYkD&6@w50xsGlmd=ivXSA$DtnnW5bhtr5_e<+{`sQ7m=%WDPcg^9n{?{ACr7& z?JxMBAO(H=1C?8lLjAs?=jR@YczWS23&KIfCriFPh*rrfaUm;?2t-U4H8*z=6RI6d z05IR#dI;kZ4zlaAa14lX2Nd!vJ@X$}G$_WhqBPQuAd%3mkEZUBjYxr#BuUT-zAn#} z?AhBs;&fy{%{mpNPBC|LEamBPb(l^P^^6t^f;!Sx%-}eSz-xmHMaQ@~OOU57h19=` zvLyZXwF&u_sEtWgJ=sp3Q=*b~N?9!rc`J%=FeNiUnkVQ!m6`nW`THsl^f;coC>Sjo zvYzajN5y!)GUOfSc(P?B=BtvX>lT^GNdx?<3%;IN8vyyhD?zt7s`L;z_LIiz>9oRM>lKJ$zvr zq3z=A94qU|O1DbWlp{SC9onRlrgerwMQ`iIJ561_@x|HvhtzLQ$EQ>m3rEvmA=eD# zIjhA#`9-O?nkV;3usNT)lgWM+vs-xzWI*Kp0RWq%*B)Pz$#RPvUjepEjfm!+3+HMR z-_OGKOdWtw`Pck*^)ZaldvUZ!z3Q?M-^q2y1N)5Z3`$I(gxdy(EIokk4^#3oBn8;}FUslddR=-)BCbjj zieeHrjL%GDS-t)PNp;q^e@RXozvNh7dpwb`33F<8PxEGWuMeLq_UdpMu{4ZL zMg=rBGC!z()AM~I{YC%n`^As%GO2HLIhNje*Hu&`Chd^ieGK#$`bXXUFF(nuaUJx& z`ctCz?8YDoj%??o8I^HbnyAG-FrK{Y*6{AKS83g^zWx;aPUUH%Y>w>1wz@B2q(H2+ zZ*AYEM_J8cy_{p2Jm(7GnfC>l)Rb1a)3y>S1z|s8VX02~{0mXjZmM9ki}$Eu&pNe! zPQ|5PNJ`iL72IgWS#fH`pe$?*b}faJwtu-mJ@*%HNP8f7vI}{au56F#DRabVGn*Q*=zjsJazpy|I(Yf;szzj zQPK}RA2lbgvMM8XQv=c4nhH75@47m31Cmb|FDsw;Mvtf{s|}cXEb@&m)F$Y>>=PQs zK?%b`(SK4O4jYy*a3`b&U>#jT*isVaa(9D=pb3{!)A2EPrVSIEw0zxE3F5!e|#7&LGw0TClDBr|Xl-sI~HBqC!eaJywdgVa?S8<}T=sv+3IK5bk?%SSh>{Ii%I$CbJqh(2p!6 ziN%sBm5E|@`vy+7IzYOGpf+MjW%yKhOixMBmi5g{`HQB{;qFkx8rI~LvR>J#<9D2U zI0s(3&E#tZGd8t$zTp!{y$Sr5tdmnmln!q6!G)9oyMOo%8r7@VJ#HC@2rRQ7yY?b{ zOXPQb4f1qN=sY~@uxK{c)-(#A^MbT;x)&pWG7?$U@|Fv88dc~~@e4w7$)xqiUJ%@I zA#E~ajdc}wo@Cj5_}viY!Z50{!QYkA*1#a#;J&`cvOh>soWKe# zbX3m}czPurCWBDO`0O^h$wFm70@C~2XCd<$T8B<)-$;Oyjoq>nsk~WzE$GBV@lDvV zr$61zJ?<;-u$+;4_gP(0-kShBSYCSTX(1tE{~4l85JH6|hD#EC;=+;#H3XRi7Q7dv9(5 zS}z~&K6QPN^vgJ5bcxXZBnCx49l?F9uJK;v)w5n3QC0od+Ed$De8k;O2a3*<_~=4y zgF!3QM&NXU>g*U*9nL>AQgPkwl9r;m5$7mAYQ?;GR>Wh#T_>?!qTEbMj!xgq8f{1r z8!($rqmvaE;h7#?MQm8C6;#u9+3Pz;W>o=k5Hp_Ag}pg#Zf$I`daeWSzM z@gri<$SGv!+U_|~8 z*|rftpT^){G%F?`(9|<^W#K7S%&WGT;!iSOla*~nzr}WA#k9N@aSW%GrXOZ@V3h;9Xe-zcw3K^2eO@n^U5=kuBF0}F$?;>u zF1Ip=T9q{wbr#eeyh6X?*frnOw3ZjJUF9j#6L7&e`5BLUAGuuABwvt>Ye{#v*MX7T zwW`JX&Sq2!Mt7x?WD>*uA2!tQ4y2~x8!%XwJJ;Hgww9qewn6OH*sYX%IqvsQ8@$)G zI(|WUar0K6xaDw0`3YByQMc#Gm()i*BfBfcVDKSL$tq1|3ylbEhJtp(~$Ve;9!9R(td}n@hC{*%;(zO%au1-Hj&N_n>(OofCqE+DwD%A2Tdcoy}FsWR< z15^|C?jlb~`;E_z169*gV(LRUvULG9fg6)`Mx$I0_M|E+O8O!5oCeOs;HJ}jYn<1* zoEdtj{jmnF_N`(CMiDV590SZhm&>^KbP4+^4cPPZ#)#(ZzHuYP`lCBzCe?ce?7}Ko z*gm)9j4^N9J1>17YYh2%vbV&W;pR&l!y&JS+RK6&hk_5LTZb3k$1eF6N(9kdAWYnu zzgAixzI!!e(?*g`o%&)Stb7rp=U(YjFz`c;?THhLjU(fCFk_&(A z+v+qOx=8AB`*JW8B#i~(ToWJ|OCte&R6%keMq2}HXFg7GMl0bUnKYS>hy~*6QFav# zX9L?KKoo$+L8h3waAxqX0CuIgq_ZNSEY0Z4gpS|8TCOOYymKGdRuc010=LTwb;l>) zirB!d*M7on=YJ^dC9|G&K(wqdM;j>cz?t{5oBbdV^sGVb55J)d^3*-c*;AfNL^Nx& z)fx`!3o(*>h|F{SZl|k9PlpoCKfExH^C;>IKaYMw`j+HsXqx)cUok4r8}lGBo3LnV1k-d`-$mwI zFHln+gf}OU#`ql-$tFO}n#20~2h=c`(ffM3O5BtC zRJDb&T~4S3K9wO`&+oF@PwBc7fp&##(SqiZbBFGfE|KeQAWtLE$qMXggY0zv`XLqw zo=pV%30Tw9f%yQ|B!?MC9dS^pk9DoumiZ60?JD&cWQ0Z4(bSR#Ip^5al2XzqyW$Z8 z`3OA$R!tQ^6 z`s%}6m#T!%BAV6_R{GOGo^1$?iJxxE8 zH-52To_vht_nzy5GWi3WTw)G554`1#JF25TeKyE6o`28vY`5?k`8uuAPoGge{Rn*K zv$;(9%dwfC8RvIi{DBNzH-6vDzy!xjF^=j}*?$WC9cXvpwU=kkGaj`;@B3Qx!*+#2 z(So*Qsb@b2F#~ABQ_>-TAd2%K7rV(v>A>R{cKOw9ZEcOveUM zmP;V|6&YYrK63qX{P}gG;GWm=A7q}FjzwH7JkP~y`BHz#OHLadgxLVX0V1LZDkRYH zTERMy#aspuUpm8b(>K(o6;(74-+3ULrpqz?$6M@#5UmvX9&b@a`%kH2*1;sF5HGjM zb2WL8(F0~o)=@!ty`v1DM?3j=7k9yYO;b^iGHrAhcNfq#HxU>DhKbfc^bhp&8vF0C ziR71&UsHxsVoqSC6V{ZsqkpYlsC`oX_^WjoF2J@t3w?m#rY(^GDfL-kDog|aF)$wz8AgrM z6dcvJnn~lIJOpDf>sLd@a@v-!R`kaJkjP7XS0LA~ifMMte~_5&sIDUp&&kEdB0>T~0;_>!15DnJ_~zn?6i#De(f z=vRAMq^P=!8xEjOodCqD0H{TVdl8TbSZ&0VDL@O@sdE752+SEUG$qyn8^nzFNp?R= zhy>wgJ%jQ5H64X3Iia>drZfC&oUgA6cvPDRxK}5z-5sjB@+54M_y`_ipA-l1W~aU` zH?4r`*)u;=UPlao(e+Xaj)3R{qG1Hp{~)Vq+5)J$H`-8)Rz( z711RTlJOUEW4sjsu6tJa4A^aKCJ+-qU?dPL zYIC`0jifXR?w?NvtrQAWe2Dd68T5U_cP3CBQ`0ampRh5Z!@^&Ac&N8aS^ z3gpOwA|ItafZFCLK-wEZ{&1mb%qN6?2Z96xp92HV&-!f4*}!^?{^F}vSK z9D7dJ6^4(=(J3}pw_fsEUrthN`4at72WzJYsHK4q>8P%Eo`Q)f&matt(E+0eKt!!% zLZJ{0=_RVW;AkdgVHXRZ?Erh@asu*5q6lubU(kMl4@d>|5?mJ@J%yNJ0br~_*8@BE zAx#735*3#C+qL7{BF*-lv-B~>Kv8rxqdSg|

1 zmrQcbNA7X&Pn|47I#40i0QAp8K1xYd_I5D*m+2xCj1dRx)Bj84d;MX`T|j<2GgUNW z-p*GRjCSHuCl!&4o zrT#z?%V>@ik1j9_FrEJ{(vkiBp0ddrmlZzv+425uJLVh34JG3l&CfY~$8G7+qsy?R z+qF>{)vbBbr?=HtePubbvjPj1DIobDFCD4mX2f+MfB^t77fPc0x6=*2yBHvj8Er^I zDkc|>|NUN2YTs)DDqB*SN)Xuj9)Uo;!qARQF{he^h1&J0b!2|J1|^Q+cv70ZQY6v; z$rL`XJXFtY+kYg0u@P!STOCj&j`|}NPhA|3YH;g^k1O`lvfH^_tWaq`HE?n_XPd4? zjDTj$Hbas8{+xe3vq zdW-8Ho#P*Ay6-%FWimU^rtV(oOWS95TJ|sRKAAa$Pj49X*f+HQVj$M>^u6UGh`J*> zv;l%g9Gk@6)RS6SOJwX9KBAni2po;AU0PtKK7m~`^VW`4G3z8%KJNe_6d7TA=0+GF zRuug?%JrqfF#h%;%plwRiT|vzbHaR>G1p zE7F6SDW=n$9>c(yT>GG!uOSdU)g6}FMRmg;b3JFCqc`02lS`#?~_{RJ^7w2t8Sh{2uqe$ySN{{;TPiKZK^oBXd_rmimu*d zs3;x}wH_?_2aAvVl`c3{Ib(FZ%$l{S#5g$PHsOJikNBtiO#Jie)iK>@wKp1}HgjU* zf!S9BN!1*FTl=n3{;$Dftf)N5`xeOVlH6sFY`)KqH<-tczShX8K+2eFj@ai)n#^vx z(FDW3*`3B(-ly7kn(YYhg=t0UG6Ow9=S2UVVwEWY z!wO3-dD#)k2=mWFSan#Ih1z$**n6|$(Y)qYjNQEEH>0&D}F^l;-k;xif?5BAiK;NpB7CYAPhQL>`;3 zrnX{XVYY7~EixoRC(nw#Qz~q(*1$~WT-n#afBTs&;3!RDpxFw-04$A2^`*|JB_TbE zI-B|P5S8X>g&#iAq*&+V9Q~v+;mU6_ls{nQS5zweKXd$UKLnl24DwhivzwroY)osx zwt=*+vfB&IaBGe&?333qM$}tQbRiWk9C%N&qGvd+esvzY%>LuJf!_K=lauj&T2i)Z z)yJ9}_2hOHCr|g#dikg`s!O(AlH6qHEW1H43n)B!4Be6&Ip<57K}F8yU=9~N@h7#d z=-JrQ)4^9$qJifdeZdo26z#`i!Lp&JbDVz!qj=1x%}We1;D|oPChuA$nRQ^z{K;k1 zMO-N14oul;j*2>^?pb%@Ta#yspM3XX2%(QaR0u`kOK5k0z{UZr&fwbu?W$RJ-%$ zNc;+R`0Gf%EF(E;=ao-dd@ zF{iR1bpKNo(pSLTC^uM;uZlB!H1Lt2C69LDH{R7Dud;3Rk|wmJ&c2NH&;-MKP}e`4 zeLsUAf8x2$uK<29w+T@F)diR0Fas;?IdG}3!*EzOQUk~YWq z${Qb8vta9Dp?!K4K9QDyJH(X26I&%^e4yJa=Tx@hW6@%(l+%5OW34Z%N?9t>C10qr zz2kR3VdCR$mRnqWcR4Q%@^l@F8-Tbz$i-|Q1V_XwcuIWp>a=L7OE=??g!6V5D(*}LiqV1elDiE46Lm#;N-@3-lV`Rt@+WK1zOVO>)xT7b?OP~t5P}h z;;sC4Zp=qKmSg2}b~&rtr16cNgK^iyWdrWoY^442W_?Xn+O<=)3^v&IpW}IfS1_-Z z2xRc)JNsiKty{stl7bZXIXkhBRrlFGGYMf=JFn3N-Vg(O8}LMOKo$`#uuq5k&RUp~ zE`Z7+iJJ&b(8u-k7k&8yt$|&ttR=!audf!=X|UdVnv?RD{|}_GYO!5@PcJX*w#okn z7O;094Gyt)Ie!gzQC@1h6bmMD?pC~MUkmyS&xXF_yui_0rWjkgeABc|f`@5uTg#`- zYmY9gSA+)6Szbp4nrpv*PTVMBv9rFMpSlJ;xCC5@BQ@@9HmabL+mv zTE%l^eoEM3)#WEU)uA=D_2QQ?R|jl!ce{IrZ7uCw(;g_?c-4G+DGJ9kt=Brynl9r! z;O{DvNU&`_e{HEsk}o~G%v;_M`suY?tzMxNxQ$qSeY)}C&5Qv1{zwhN+S8x(Di(2L zQL@}tLk%YH`2+J?;jtUSuJj}$k4^=8iMl)8Day$o&8uxaEdPnUHXFWS@gUAXOjTW_ z?#BDuCYTLz7yG|!&ih@A^WV ziGDf+o8#ez)#Zw<3WQqi6l5YiFYyeGS+f$ZyQMzSbKPnpT=n+7E!!hbOkdetyp2yh zRm$wV0(~j5}7G z+>6yfFKs_&qw&p%or6^M{ePYtZG8IEqyK(~UQya^5q+L?p|Xp%!su7s)EX5=@4({Q z7ZfT!m&>X3RtYelzx&$G$6{8D@g{q<_fdzrzBmw72_^CZPpSs_G%t-di0Y>vXWS@V zccnS8zA+B7+2Slrocb7Xy2Gfp?=+8dZshyKa}W4l`5MiWE}>7evz#XFIwIP6${Uk8 zb>Bob&uW?E1S&+aGuEt{1rh@1OfCjf-{%mZjvpUUV;VSr&avD#i6+gl-Zg}GJV>86 zhA(2-o-p1RD<5^HK_Efc*oC`1SOI$HQlKbX@aCQfTm3`}|8}+4Gb@jaR-igL-&gzl zYV~DWxqj(Fwh!FaUlZ3fFM@~5Y{sZ}shd|V-W*E^6bFgbKa7B}5K(Bl85HiL0Sztfd2mur*bXxy?M zOW}$+i{k(vg9T^&eSslXHl8Yvqt|&}OckUo>d^Z;5KP^byVa^bvdu`Oj*k{Ju|`lZ z0Q!Ms#-b)~lmL}N5TNdLn8;x}%wAiR$D*U2)YOu5+qQ4*+lXbLz_D1mmxhBUPo6Pa zGY=~~uqn<-1A6Uy0nvVe08|@PT5KgA`K1W$J|r7l=f%XfY!7w|0kIrkZqz}>J zzynOG!H2V-dzEMq1v5zb;8_jd9JY_u(~mpkOFj~M+Rl5I{Gv)4w^P}})?H5eXBMGv z8yi186Kt-|IaRrCrfe=&&f7v;lb&QQ&3Nf8%KGfeU{Z^;oxxK_rv$=g)dwZUbL@}$ zm3qrVQ|J0In#kWaOJg@aX-Kq$VbH}P`&u|3!V^udE%1aj)7yBKN3A6Sk^$xh#%UCB}5DviJDXJGv8w%~Ntu$2e zyV3D=!*QeOmFRVU2g~1l3irCNBq!)LZ6d#R`D+cP(=bBhy(A*aFr8S;zu7XwOl`sh zUB1L6e%7qT7QZ#CygF$;L38LGVe;WE8qNkgXDie~JKBO}z`rh#udIEMR1oW)H89k0 zB>XZz?j}ismZ|%EdZ`+xjkrh)VI}e()4Su%@ceS!pSC_;Hoe7J26#FGu|4tD90c zRSVEag$KrGtBZ|9;VE##Hp6makT8NMrp>>u&> zI>b36i0P9nW(RU6sujv2H8uu3mZQGl4NL)Ly(?tA$y08D?VmLGY4S>C$Y5SSLz_cx z=(h7x)EOOgtwS?UmBNWboC1+`JNdsOge%Lgd6eH{Qg45Zs4_dq9=1c>y7rTKiS$v7 zSRNWTkW=_8?Pp@h_U|Ks<6lodW3@i0WVb!&I~;0PXg90w`P0C7COY7ILdc_Qc7g&w zx?kv@?&b@gxG$qp|Gt!1FDNo#Si>qUDR$~MZOeD-kHnJ^r;Y7oMT;wM4j+L%=8Wc@ zJEc9>;&F|++xv}1+~e_*(R&k3Zf^Ur`-{ThcN+EuQ0K7;GC^b2i=j1)f*rw~yrA)1NZ^K9_gOwiFxp7WMJZ z9@s9AxtJ&ARLycHUmcs8zlo;#@GVy5o(#(VhwV0LxZhCJ<)6hIHx(Z*=@gUZ!JCYU zqTjx8dcNfFt~2jGArn|}rSDh>UsX&KE7Ze@nS0HVj2z3jor;K?;s5Sl^vq7LPMG_! zBX4{^tWkNart(bv!|4va>3Zoqg{`W%2ds!v1gL}U?_zdFQB!)+&g9bbHmFw60Ez;e zcPlR)WP5#sv+8J^=>l$Hry$C;@WYq4Cr=-FrkFR2a{nK(Hl=PYe{e!5PW?b$ z&v)CeH$k>H<(}U3k41iUbQ5rJie*1V(e{VMMOJj_0tgQ-U<9ApZR^0AwmDy+f3I-s z&8e`suQ}bN`vYlJCtkJ zNnZDYKmb<5I3nb&TJ`kM>kC@qWe>d?K;I^0AZe5EF18bYdp+QpP(Q?7L2z-|F=z;W zabsS+tjcWuON*_~`$sDT)63rYv^oumYMlT5)Pacc&vsxNb=6XJ(JAl%89G9=HdPrF zu13W5KBz8gt$da6*?vt>KyB-c^|_|=;$_1Izst1KzrT0yKU^gB&E1U*RTm^3bPX{5Z5P zF%aJTG(Fo6#$952v4#>pZ-J-UL&+UMK%3+`Jh|vjp#(rATx+1hSNrqi??SPMEZ!z_ z9O@iAl2vd%Q26SVyqxqIx57pUm77lCr>Hax3jpe#W$VO85$T`@Wvi} ztA9mRtOnC)7_#M1HTj|B+?;^ct%6z^WC;m!US;6@`oE~U@<1rJ_djDSWo;Q*vMXk& zkWto9*>|!eL<=*NY!Om}D3djmgk+bc+z73bEkz7TC50keQj|*F-*etk-~0RH&Ydvx zp7Si9XFboU9de}51uu)2T|M&6Q+Xjl!1+oU*+(`q$6&w3OJinOzNYY*OeOCRnhHt! z&W<6}U44=EM+H05GG-o>UzwFDu1c=r#c4E@ImjM-c}}r1|IVTP9Hr%9y^dzLm^Kr2 zmFgc83ab*OrBxZ3uen{wgqmPWXW<9lKB*Q5`TFX*ZyWHOJpncRGt%Pt%5=qiMSkwq zT(y0#`3HI}KDe0eFWk6qx7ee5Yus9H^u4Ynx9)Imbl6!_TDYP~flu?F4Ujr7Y{og{ zh|i>&vG0*oJO0ust!9JG?ljOVR4Hiisho{AUlG}FFMmLh=e<&HVLz9Lk+Rbk0aK{I zH9mM>p|NYDT&qVI^AHqINy5Tl?(<;`!An)MYCBYH#myD4vXl8@U2OXed9!dSEBd$ZR3j-%MPa=Xdi>qWC@Sh!|blkNJVv-GaU}XF)GH^ zE$=__@Sn1q8veZd?xdGuOVj#NpZaE_K;iSN3XYZ!Pd%oV+3dk8O6wONF!6nmr?QMK&(e?#_25=V`(Rjpxf#c5d4~QmFOFrpvy5`OXU!g6sJX zwl%A^OQiJ(Mn9HF`&2i+!##OI!E{A@yzQaArXhl-gNR`5QT70WxdxVBn_UU%A z`c>UJSZ|s&n_vfCuh`#-l)G;q#<*dW;6Lm?>UqTBF z98>J3!z#=wwbf|%d z3od_s$g|`A>k9IsvH3d_2++K#L2lw7G&=c$`1-2Q9{wlj;CVwqg@lG#U~6Wxfkzs! zK|fd%c6?=NUrYM|Hew%u7x25Gl>!)QhMhNuS|zJo3A?&0^}jz`lM3xc)x1lc=TQAa zw3`N`{rg4O-}0wfE6*4?ipL*pqOTD2%>P7oX{0vcieha~nU&?5>ehyMKp1{>%p zunQGxffV*QC_CP$N%+-xqzL#Ii!lI-QCB+lNv+^W$Gt<&A+W;ME!X<%R9j; zc0gcw5=L$)3+HR2jUv%cLy7@)V65PJfzn{=thautDg~Q}?_%@3K*3#vmF4|sWoR$9 zs~PTc6BfNwLVS%0gL6)Vqia7vz02g@S=^EQh&4QM_YxMn-Rq7NzMe6Fgzj(xRA@F$ zSitMr4}%t39FK^j*?)Bl%^1Msa1e^N>mgwe&J%Rc;;xF`-{Lj-%X=IoaO9DQj;^L+ z!Ht40t_?aIzBxYUu@iPBQW&+N2}cVF8PxTbI&M2~a=D(jpm+9vE3mCo%Du&tNE zw2hM`Nx5vPkXr8VkPa*39zIf_1li|%33F3I>+CE`;9xV7H^`=1(}0ESItt6zJs=KO zn(aUSAXB?jVM;M>G@concbVj3BNsu|?w&LvxmZ!cm?HEUtF%oLM+lkP-M=O@whxEq z&Uss@dqrm+&#Mca(9G0+-#SPP;8G5q;8!*I8uNQzEb@ucOQF8x0fCBb`hm;8MlRSE z3|;d6V)9VGRFnr2!Bf4kSqyhs-660W){!ohSOM86^^V?hKfzTuZh2O4^L*YdQ%x%Y zfs09%ihlEz&X-qi9xzo{jwuRip#(x<0FwsHG-uyva_cP4w_qdGpi5pG(6@41Q?GOL zZK46-uxhthy%NX_r|DxGn7_%f+J z`l*}7XtXB&TyH>9MwO3LGGDPwdEe&l^HGeH7*?MGDom_A(+^2F;`7`#y$_0EEAKwJ zYT9(t_c8yS?ym!E8jF*~FEYL){0x;ZWLr2ddxZEaBQW8o|4fR}D`RcX%QyJ_FZ*hL zE!Y}wJXWFW2_xoS$*C-sUiJyN5;>Dd`>8x8P*Wr69dJiXR3{@a?(2ouj|zU;jcByM z(6WrZI*{)0HyLZk;}gWrXvC~G$=P$wS$j<5JNoA-M|Vz><~==G_j0e?=VqjQ+ie|| zEj)VuPS15r?v`FS@`-d--5+T`>bEE^J=uDH#2#4yQDgQ|#w1U+{OKQr-{B4;5fkq& zH?8{1izSAjZUIGi{t= zl<8-DL=vUGlx3%F%mLy#h}d}(R?ZE)PdQp)m4)J{FXO6%J6$^>l!&{a;12GP8e@@TXe>YE|)up ztiqnnxJB60Zd9)25WJ`loxtm%*oMjrx+>Sdsy#Bc9A7SZw956ETd~@SQ|{SUBdAXY zn}hos%s;6%Z}OLSdy&^b$*Qym*HGf^zp?C<{?9iabRar1RYwj`wfI2}_r> zSpTBpjRxTl#%iSa8?%h$i8y?-bI*m}aw?Kxo!1&4$BvnkeI9FVUqV`EQ$4I5k3$%0 zxEPXDgR1k`tKomg2Og8wo_rw|KOJm4``cIHZ zgMia0%w8rwW^PneT<9R z!)u3nf@yr;*rOEgCfB!Inz3tks=mE@vxYFG&`Q50?7|xVEYIRM@s5=I{RdiOIddv@ zS366PfN}6d&h;#wf!KJkA_i$nli^-LVp30LUEUtmO5et|?a%g<{qt$M<7i_}%c>NU z`Uf)>^Ob4)#D?R0aK%R#X?$x>NWjFJ(VEF86|*;PN-n$mp`5`D2OyS=K4I_LwI6)W zr7eCTye_-O(>r>t>#RDDAq+EcEn@Rh9K2ALI<3cV-=5WTbMYY|-nQ-`O{)7wF|m^E z)VpNT=g(ZIr}fAaOEUX$e`r3O(#VyEk&J8jvf^#0D9}o$E@pd5L)*5_$vVsa5=YAw zNjF8!q}K-@cn9sT5gg5q)B~&Dj1KpiI=e4r-9Y6*?um#|91i!vJny#`h+978zljq% zv0Tru8^5#l_Z6$3y1jjap=zzVXG(n`X%~Ya9B>>C)`KZazDZ)+a-2J^pqZMoF8Y1$G>5*`nt+R50fjRM03x_+Y>oPLH> zBN9JTzmw|y_M%jMvSwB$Q#2}F+`vQA^ZG?!o|JW=9ZrdQ#-sJ?*NU$U*-+-0?Uecd z&QL+h2svfalm?o2!W%)8<^SZnB(%y4I((ivw3o#Ge5Z72e8IuC_x%!cZ|)&o*UI&ExyOXf9?6@<96rPo3&aVpRUjpWn!T15fe%Sob1W6BUdU7 zPq-cW8t8h=^+m_tAj41_WB!9u&;9B2p@`Ck-(ON56m0HQS#?oODgCMGqqgekcFH|R zQftDdU2@sXrjmG zv+q_Zgj0Be_`EczyBvyIG;Lgr^gxx694&cc;G?pRm?4lO;jtt^Snc;|7W;gcrQ9oG zOs^Y1u3hM1zwL5wU+Z=Qf2(1IJu!dT2WNH909NuDPA5Jywn&%DkdnWCwP@N>qcUUr z=&FksHa--|B4mliI&R9>&YX%r6jf$Tqa=tGgjgq~q+=9|C_TA(r|Mj2Gp~DIw zOLoG;nVfn|ftE6tfn{|0(u$$AH^|1#IU%$}eh$OV-Nw4v!7W=fUe(b9t#)7SprUnAQ|HH2i+&#i}SrU_|whd+={JZ89c9mjqj&-%T~JS8F{q;Q(6UDDI7 zG5hPm8KY{Cc7<1@mH^tg@6}iI(!hi3tPDI+6&w!H{3l=e7de3{HEutD>+D(lN*TJf zx_|h+@Wp>|gE}RZ!6&)wVTTiuni1Xa!*~Swk?J~% zPrAUUDTb3uKdyOB?}qfN-@wGpcOU=+AS8XmgH;SKnDytdZL zf7$^t@T>ki5a%y|0>5B>WXJCaT5FJ;|L1Endy|GKjx>4w+=vHr711t%3ykx_HrB@2 z=OGj@PzL`m?iJ(8QUCYn36+XrHn*$Njjqtm)+C<`rSvfGQUa7e23pw<$I3L(a-R8; zwz=S)EFIJsa%=v@ZM9-1-MDPUtQu2$FMvjf+MYfBH9t$k@NVsK`{nsk2jU&7#{xB) zN@dc0vvx(8RHhve88^1Xci?v4xOnA2tNGjKR%>Hz7(-31d$NOEyOs0m`B0MNe*qPl z?pdYwh}*nwlF=7+=gHNn163QEnD|z~4_ObNEmx!XzY8i&72P?$lD8)RFz4Xi$((}f ztx@t+d_t_2qnh%sxtvR-L+`^cK68-$EkW8=(|bT{UzYmV%UD&fhxdc+pmJT2m_F*T z@Zyy~3jtVC*|_O5?jwmcLm`*z-_&^vC^!<-1oMC8hB{ z6Wq3j#@AULTzGBW6l#*n1p5t>fFXePFhVgNpd$-k06jr8|Hm`P1%VGu#g+KpA9-C0 z{0igpPoQp0h9$JMO2|`zS$XPWe5(nf9uIc)YRh>XY$PCdaGBjn3;R z^6%fnb)M9ZgJUXZj1=M&d`RhNB zE7#-a&I<4QcC}u${nJj#vdaxSoWef+nq&XQF4=zb z%51*EZIO)c*A;f2O;o&lBU@(I*-_5QSNgX#=F7blWu2OC-t71DXIA8maMsH!UNR8C z#w3Z%evRY$X;|C%@rh56tPa^PaN0E%A0J#eMp4Q4dibL0zTGcH_b+a)M-sBHFIcnk zfk0ryK-{EDOm|c2?BK0Ww{PU!-_Fk+ZPuL-BKB6LcGBSxry5avu6*M72IkuABc`UG z6B{6`^wX z8+<+x*1Qe#tmyzlw|vP@0k4>e0?nw*UMbSvDyQY*J~GBn%FAEtRlXFJJzq5R?njsO zT*db@*YjjEZxD4i?tFj6KQ5mgza_JVF?{K^rtNhbEIy`LACskYsVdpjaD2|M3C#V} z@TF6c`LKOfeL_(skeN7It185-pfSG-ZLr$WY+!IKbBAHjr~4O$VStmHorBjtmd%4K z0Bf5hoZ8uImB*95RXKMrbZ5IV6h$^1EAxAG-kdR+Rlc8Se)C;jTiK`P>O{rNf`s9? zuM9=DrX#mbq_=hai<8{^Wzi6$?)4|kFCD?cTv{}vH&+tYx=E_Pz6_k%w*-t=NZ^2C z8Vy;ITy~wdxk|&a-`nIM6}H42JiSgFU%WrnwN?G7+p)4Wy0Z)U_jF5^801M)b+hT0 z_TJt*CB5|rbEeq6?o!DB^}5T};jFa`2jTj{0_7PqP`Uy%CE^de{;Oq6W@&q`qvV7H zFe~t&p%u~5FToYJPqMSd!td#@SnVptIfx;ahE=h{c~~Oea0mu}y)65c^+R;xRC&CZ zZ^NsbFd;W%w%JiVfUz+#%>EKJIJ(XuFuU77j>^kVD(7QEQ(H_Soyg(yW`2`VVSt|G z;Obvr7ANoXe7bS|=Fqs=z;m1ApqI4qXPsKM=OK|>+@m|vq2vE_%wh7;<)+SO*VA^z z^T|!PZ#}xUg>MZno=3}xWy~B zq=w4ikKW0Un3DckF;{7NDD-oDVBK>!q2NFVnK9~9m!8|RuCX{x+r;`S38KFxAHB(G zx%nqZxCq7zjHmM`h!pEE#bP$C_=ccF`54SBVopD(W!DIi|h4hany~XOZJ~1NoIj+S_P9%eFA;rn>lyTWtoD8?huUBrYJ5oBlfk2o{Af6V=c3Z3a%3 zcuZSrMQhw_8JW+!9j6ww@{G~QVwq)K@vPv+MvQ}y3AKSlV;X)Hx=Yf3g5kme|Gh=*Q{#IA!1rAd+&x3HJj~_`Y{;|w|8I?27t31)e%1 zM-CCcw3bN7bk%{OU%z4?I}w^#nE4_|5W z^{pXZu=a-P*y`zq9ASUEJuWlJBw6`F^7gip$97IZ#G1B4SYAOm4?9u|4*k8!lebQ$ z2iOH}$bIXPr1l&b^6Z=J(+WaTVX!cVQkZb}jiIT-83NAz*EZL-biO>v&Haa$*a!(+ z{(WY>;+utEbqEo!-(RgUIj1-uFQLiISu2~PSU0xfQ*6PRm~4|D%y8n_=Z**8HfTTF zIQIV0yFR~|e?cI%=g!@z@%MVa_3JCIrPH~^>r(f0|!~)yWHsZvCv`sXW>suOi1rwSu zwgEa~LkvI)owsuzx;*h}+`^Z4^!4Vch!2%tRPA;OpZY0wBC0w8@RV|X2-CE+xN%{hgiqR?;UD(nPn{d z?3FoHMbCB=+;6$gZKuYhjZJuYosMOhHor=<;HbEVQ5Y*JhVfDD_Xv!#O>Z&i9q`Y@ z)bLeGYQqm^PEEhNoF7^Lowd!4q2IjGeK&nNAfZxuxiN~-b{%Ro2&wd-h>}#+G{Q>vwa__zzlt0)zd+Gv9Y?zbBajh?(HVpAT;sU|;6at;VLLg{&XAn+QNrW*FtF3#1BCf9;7NS3Jo2qVyzm z#vnu_)0y<^ad>8zTC?sMCWPYa;-FqZ!m|com}I&WV_E(;I-_Aqf^p3+W_KlDlA+-^ zOWg*_y^BKzVRUw@oyOxG62tqRv&X)jE76Kj>|*?*;S@rg7ilYcAavMzjkUqyJv*+C z)|ItQ6jX2ghWvU4&c|_Mm~M|Jp{lZc%hXu;jws?trb>=abrZi}fOki7^OVaEm=?si z%(H22w*K@KS@E%EGfae=XBh>wF(2Nt2*s4Tr!R{;{qGB6s&?kVTib7yJu9^W4gHL2 zq%S$+pTq~gf>va;(Y}Qj&#i{^bg1QLxxv?l@gI<{IG4dMKACz4(oFS<0&=(fSo(Hg z*#n8XVu^d{1Az&`Qp}NLs&MYAO4{~_H{Q5x*++{C9$f9470Jd0r$e>7JVqkzo@}#W zm#5^3jb2s`h(D+8zAyJc%hWT274y$~3fgeDMlx)K)Sd+@a$T5EpsqMucV@oyQg^ywX?MuTcB%^td*(Dmq}yK*3*{GR*ki) z=P+IS2fCp)Vr1Hg6X^iaF2Zp+zdvHQsrYMUmQqt^*e~vO-GKaiG~@4Obz^*Wwlux> zM*9s~G*)E1<0|o0*y%DoeC3~WO0Qm>*LdkYUM-7byw95I7+Gm>jl$!?c=}QxZSOxL z%t&wL&`G0ee%p#C9J}?e2JF;7^xQzhRk(dUjgu%EcY5Z`bo}$}s=^xjGnQPu0w;t*+U>bUag@Fe2c?oK*x)?PdaQJK`s3v* zm8Rg<7jJ`r6hf}5Wgp1ES+;;(-Nq2CT@G`8HSTs8A~nB-?dSg?A-Ji=WEZzFP{`Y& z_r=H7@6Qd_27Bze!vC7Nz_TUUwgjpo~(&4 zaTiRGLRn!OF{ZR>XIXp{KFmW17LvYE7g3%(U4)0QgaY5OP5?eb~lo$g|9Jrh0plf#ydzbqqD zQM*JB6{iieX$|2JL8002*~&Yc0HSvqJvOycd+9E(&rB+mNjNF6N-p_i&a>N@Uwn=q znmpY|bTB~Ov)1^eFeK+f>Q9;1z0MweQYw_DF#U~w>ZBI;(*`3+A?(IItC-i&T+;Q^U$(02t zA~Yz-MfwN^5_&4MumnF5cdCac%zhn#XV>O!3d3g(wcn|Ch|;UvO4xmwntXWOFQ0o^ z6b;XL(WdW}Mqw)H6=&AjoWmFL*!kxj8|iSlNf&$|Hl~(f;?%dS`X*%1!fuOs82X$G zsP874860q8m8C(_Q1Kf1`>Z52QkRQGc$b9s%QaR{XGJF8eqa-=8WT_T72;X07JXrx@``nW*?K6c%Fvzd)f~xWN~ZNZqY!e$d=l$78A4 z{naLC{zO-f&53rE0p?lz&Ioe2{^xTBIEN0a!5gW!H%jHfq*G*>qI-z=^vYRL2Ofbp z633du)KAjimCoYE%@TbAaDIEl#~~8htF^+$mes#PMb;Z- z!IN3?g4F-iMy`*SfdRp?{!r(+sk(tCIXlg`>+;V+!g@$~okL)_R9Z$kK|G%vjn4E_ z5IP=G##sN)ZS%XY1TBA08MYDUD;a*h?Ezh_`|AgC#wdfijsXrv$}`UP?1^d0@=o8! zZI`tX1XB+d?1@@EN^TV_=EYkCJWJ_bmU@aU+ofZmm#o>v>i+_YW1cEDG@z*yHKrPQ zL%S-7I8HI8-evGffVwt=MSY`mVu;|&ed31HRvj82MAYi%O<&Kr9c5u0qbV0T$~Y31 zLQ1Oxn-IyujsKl3)wClh!KE(tD|J*m+^;{(l2~-S61%`}dU-{5BH8NGkKtM=^Z3io zVI$<6ce@_%%dda->I++hg7@db`u>sXIFIQeFFT10nHvh#Y@zqkVT=SvjsZkY;!x!-)gdNX^Sb;mBs<`Yc! z5NkDG`MO)`T=mHOeDE)g|2NQ$HD3qAe_Q4X+h{%Eb6!slg=H$%hzL=xEzB=keNhXj zKZq!7ngV@^WD;%?M!-T-7Q8D;wZN~vsc`!V{()M#ecPdm(123TsXm>idxy%T4#hjV z3TJ%@k&<7RDIgV?=u^<YzBCKf&yI7OP-O$2GFhT&e&^a5L1p3DA}a_MS0 z+sAxLIa{=4K?BQYHO1MPyrgfg8Tp+gaq^xbxApOwH?JunFdnGWi(ag;pfCBPX2&@0POx(_TfEd^p15|U{=!qzaY`zH$Ref{ulkoQut&JxS)z zZXY{c7|`jwwq^Y@+$OS5Mlaub!V)sm(=ZB)vfOqs>=dZZEH%i8hgKR6-S3hA7Z)zb zBJ}L%6iA`j_wN%=Q1aL7E*%>Aog$~Tb*^Hhk40#!p%vY`i7?d`b1|@qbi2$Kt{RJo zqz)#V%s94NJbXe4jn)Z;P=42;#2P8>UW)ZwYAL#i1bW3(EjC7OU#&7f#tHuYaR=3a zhs?X8JOdi?vs~ug{SJ*npGpsR7X+z~95sKPJY1vM|NMYyPBd}i^X`{ONWf{OgOOQk zej7xvs9e1iQ)u~X}U z1^t{;-&b~kFbJY+v|sY(Y^L(!gy2d6eO0F9HOmml^8Zun7>

gj*$atXf!mvOSb7%%ch6rox0KmZ7sbSI;Oxqxh z1MA;?G*psTe+vg|P-wYR)9&^c*I3!m2jhKN_m2_uWbO2H$5*9HD28Zfekoh@I;eYU zdA?eTex@p1JO;)c^$A+DeH;DfV{y|*yt+7ts~XHYNU=1_!^^6dbPT1|oOVsB^dH6il2E9%`{)jsdO{Bf9V?Q5w2B4^#pUPHsXcejAkO_Z=icjQR z+0o4d0RyJa+gD@rEs+ZY`rm=uIa=cSgngC3SBt}zTRrW<#D>QnH+-NqEj~^%o$GE} zPmKJ#{2u&q{m?0Voe@-QI@&{(y` z5b|8Yj=RrvclF$kqKc|fR>u{Jm-+Zz+g96h)NWyiHuqMC;0;^-4L{PLvv5DU0<_tROanF zx@KQTO~c7yF2?&Z0@e8DwN~fg*-4j*wOknj#L#G>6Z;@pyOVU?<-oa^MT7mX-9D!0 z#d}rygel)vDV3$bH6pTWPo%$eSF)xF2G$Nnp0Bv_M%f;h>MEY*xhyK@Smg%uTjInN zT@)MvR%Rl@gk~qOScGX5G)9}j0kvcfjj*nUf`_9p`zrjLsyTp}ZN$WDuZ^u6oAQ$B zU|!avG9SbX8Lh;w%_3r(G%8QpoLtCInP3}cRr|W~xY{F@7l%30=-F}Omcj$oY#SOk zn^e3qj;!7B=C1$qU`<+HW3F8?`Fo|q$3r3w`Pxieha43eP4gN=3Oba5Nt|fP%Eeq< zCe53=-8cWJ7Vc7ML$|xQfpH^(lYJZ%_VCsUj)`)%BNEj|zCqdL$XK-T0pUr57(aep z)6vR3La9lHmGPR-GVEn08FsynHp$tgMmBKgxTfOa`V_0M{!Jkg>Xiy*Z!}Bq2OYW8 z>a5-Qy?n~`;ggYZv->(9u2;%mjDOcX`m?)TD^>5+w~+;Z+pnWH!s9`(2UDI0`RW)f z6YY9Xcc$DWYPtGoscGE-wGTZZM(fTOxJN7obx6N=6fBiVx)V5VRg={aO`Wk*3sS$W z>dBL?lKikxYg+1Sb3lOBr7z3BUSB?A^0j$9@_TpN!>l8(RGt#=9}-v3e{nYJ%2n5M z`&X(+)R-syQ}xlODC+ZsML_ceH%>yUi{_Iu;>ai5D~!bPNNlne)v-E95JL9})5S zMb|Q$4b>~k{NI<_o=AV_`nrFjxC)ihco>Z>7gnDXrz#oH_1CW*@82YU(PY%~Ecej; zmyzqW_=iSqPmg6f@SH2{(9FF8{nE?AM9Y~0p=FHvjd7#l%+P!D(25#+aAZ`hH>G`f zgG_2-wD}E&;^rtA6#2}jp8a58N@ht})z*ErFH^Z<+X{YKf32urHoD?9-B>DoU*_|( zwQnfjIXabIt>ACG__fQ(`FK>|3b*)(q1~I4k9himuN8CHbc^bxx(8i7wG{G> zHQMPpxw>R#+%-tzw2ncki`>@4)Gj;B7@(KUI=~6o2g;VyCIlud52c^uh8NH1e5j3;bNoN$p@Z>?Gxo{Z)N7_o`w>~ zJC}0`$7GbMmQDEY?sy?2Sjuc(k*M}krP;*IC&bIy0j`XVA>!_{T$;o{RaWSrOjbB0^?~-}h;+q^ zw{9J{m(FGW#g!-<{N$<@-_|EWG1}o>NA~I{7QeU{$h*}xq;%?|>&$+eHx=ZE+w(VC zCY{U8se==~$)Fr9vxLpdMD~=qGy0NR;wKIr483+cnqipoBUa{iy=C|rmrnt-t+m>j z$FKMe9DDSra6n&s)*xymFd09tCrp{bFX|?2@_QKHC0+O3c%D-C&RY4%EovM0o#0%K zcWVe@Hr+z=xgKva@$I9LJd4|7)eR-8V-r(%jy6ah8F#$xcu_YlJEfmg3ShieW;szY ztj}Ok&ox;KzsDx5zca6^q&sV+by{UpXK?I4V!h$VI-C#0Zl2JgMW^XHyOTfE<;JgB zBni_!cG)Ht(fMB#b8s5uZqM_3DDG{4=G=YrT{mraj<4B$Gcmn*KXnTvF)IS?vs0>N zOAGsLTs(&c!Bi|&WU+n(@PBMTQfyHVIuy|$@ls8XynxJzS+af+G!wz-<68<(!)ymi zeTl&Z(vUEv{RzB83roeEO^v=;!N8A2YkU;btxo*vd}!*z#TVjHjAS&e-`@A|ofmhWd`a}qo%%>t%)8UqqJ9?t{N>fq4SMR8 z8J44~;&_T@1O!*hJ(Ig>9vgf3d(X>!#c%g&Xy-VLxR~(=GDGlN#tJv}+-7WIJKUy5 z+EFJKXmY(u(;!{jzHVb&t6=>5{Z37_M||Qe4LRKGc^ZT(P0!ul%D6s(K`?g35x@jE z=pYKV)`XIAR3pcJ3_YT3OopEFh#cd9Am!=8+}^_7SI@sU^8-Ue0rwd5n{(OK%xvVR zQlVCvvLpee--Iat;)a{Uis9a531cFTKL0iM?J%9cCAzb_-YlcfamUOzejWg4b^(8ol)kN5FmH@4hzd*;xZ!pEF-Y zpklpXnmFb#5NYDJPYZPt?mu?QQ~my61$B|yS=@Nwy4?2A(S*A`cSiZ{Ff8sMW?wi` zgA>*=*ffv{v~Bdvu1$e4$!wv=x8B986J7Qlnrzmhy|wXY$ZBO~u1FWN@e{v3nkN6) zbQlK9_J?juyCiC)UvS_>{QQigPbV~CG(!^xo#n$-UP+}9AF$2Il$thD3pbY1EIAzO zZYqkf2fD7f7@y~;ocvJc3i+|S!}!I1i-gD&v-j`Lagql%NbDsr{LHtScl-A{4X+Oi zDdSnb;i}>C^7k@n792Mk0|(0=E{hNBtM}5n)a;bZYnO1q`f>s&G>{SEknW{07%O~% zSwKw?QrsMDYryZfF<$m`P}^pg{vNC0XZ{})Iy8KD)vh|19K~>lR6Hx$oDT;MvhMF# zyb7mfI*VF2F^*Tu_o&HfT(f?+TFjbDCc9zFTTvLGi^~$lt=BK~#U-YknCb zYLQ_ekp+aDew;dOjDHC?1@m)njqlm+xtU9>+fV37r~0Ix%S^-YSvtO5EP~eHUf;@0 z-ETY|H1#V^;HQ*5*#Gc|Ur7L8ZBMcK`Rjw0jgUyZx#j?5i{iSI$>XW_{($ z-c0)ZW7c%Y{qt-hd1u5i81VYJlZ$w7ZwK>i;)C~#1!2tZuIey+Hgq>wDdC0Jm? zJ7&fYZbu&6nRm=Hb-?`V_pDzVrGL&LyKInf@Tb#`=LseXP_|GK5>($;6Z$F~dGE;u zRe;`ORU34l1AYsGacpNCqhPA3dwI3po7}4sMxFiaeV?+Q4Cv{-_*s;;Co6?P_SKv2(RPLo?ArlvF+h-6tZXhL8gBZn=32~>EEj|z+ z9R&vHxHpjw?g4N;(s+Bf9*-#*cUnZ-#{66%{a@S;D|dyk;=1>Bw${jfjGsl>L|Z%D z)iC(w&eU;7tKpqi`?C{t1IWPvip=^}k1g)DQ(u7=hlVda=Bg1AryD(I@Oni;w?5I} zIYavnx(}MOllpmK+@RHC=K(dgZ7_LQ``V=>Q!AzS|Khketr2>x6(iwBfNp*pA#>Y| zPGSD)OJvy)tKnv$I>CK)>u+nGZ-kVMxDVU0FQH_q-}W_Jo=+xZRMr@1JsL}K)oyVR zP`oC%PGy*S&*i{p?*nsU4n<#rh%bkXjNy#RE;aQhk(?TQIor~Me#^*JlfUy@DHL9Wq$E9x=?&CG`amK8^&o#R(0*2DDXnz2Hq z7fy57`)ciX{tS*vKmVRWF&Mczb!Vla=XLgWF%D zL>0U8)mnI^<av|80BIw45t`MRcrvt2%%I!^F&Kd^XfA~5rp|wkWMY1vwKTPWjoF3Q zE5I4)ka7(yv{!oOk1t*gtF40`>Rf$zBH}AbYhL{}d8>VI;jWOKkN5M*H1aB$9y^uV zQ2BBHr8MnxMyA^51WYwfw=13VXQu6lceh17{qk818-hfc8PIHn#IgJ~-vS$`R3DG- zyD;^xq+#@e`ggrO;!VTRhy3ZJF@Bpj2jy$ndPfR3`MoDPtGr{_&{}1ZsM~B#JpK|? z_)~6Ie1LaoyUnIoN*5$lY@cflbdd^_uin^0P*wh|P}lzCqGH0&O)6$z-A{7gr&^IB z(t>9!*Gw$a_BVOry*{x&@5Tl=$znWtzhc=A_8rXBc0rfM>oXg|xU~!Ch=KeM-ZQkT z7%mSyf*D(ouu+MJ;cy9G6gDjOFiZ+}Ay9RwFbo$PgUf|RjB42m!&y!&>AS*q6y88v zB@ZMWg~T9gh6*tdA4+p5Dg%{5V@a!7%_~cV*klgWjhh^Gp1vjxn!qB7Q@SJF-hmF^ zmirRZmO+jdz8ksOY<36qWj5!;E7Pt}9QIh}iwL zbZt-Ut?!4S*^bPl^%3MimCvWsbU2jKbf9&e=Y5i?Hgwx6JHaMhqhG=t=$F_S^J>w1Hv+Ix~sGns?Z`yOt=C2?>*G^pvGTcHlsw%pSxZFmX)PfQ?KW z*q!^eOznu@`5_bI?Pw+Fz$;daQVN5^yo>O-$QZbp4gd$MWBwW0fhcW83bxWZMv0tao3ko1BphRL`);oW+So2DFBBVQJlg`a}VJNtSJ7%@2^hodis zI||^l=Q8lv&r|?wA!*7Y`qI*{LI_;8XWJ!>{3W;%1;+_De;`qk!cK=G>B5dkBDsmd zKD`kq2Cconi6`J+=>8Y@#y>}6geZ_LXSv?hbk?#lTt^ifIF`o&UHn~S++sL`ysY$K zN8OKI>G=ceS;&rD9`sefXyojn#$N(7QYE!unf)a)V6*^$ft&8qSQ|m(goh)sk$*_o zkxX&^U2q0hA8ZD!YZ$605^9J|M6`{wh7nXG@_&|Qjb|>U+?Ps8dXQbjq((9U-hfRS zq_0T?T+B=6SwK{G*`vfPL{c*>3WxDgmKFzh->f=MXJs9+eKh6T;eZ+#toS3}rfPEglKow9AQ35El3}rnDn1~~U4e!GA1EFQ%4|op* z!|L-ube7H|!O`2ekqszPeTNBxZ?MPw*Trq=WF#wa`yz)t1sm54B4dqTfCa9{ZG_ur z3efmspu*AuS;7ZP{ogQS?EZu(m_v_=0|*M#pz`}5U~51tREFmvr1~=p!6*z)yTSHg zwlMngLFW>m?&a za03Jc-P@uHbbO5JAU4TGFoWs`ED3}Le1t8Lv8<%n(oZqrWW6A*I1SY_crfH{<`w_U|Gq0dVmllZRY53>WEy(65TVe$w)}H|UX<7+Y+y;j z-^Ie8+o9p>;JBTKiUv#60gcgSq_Ej#h}7bcE=KT(aE22T3C0d&>r|U@fWj+)%SzC? z2%3vj7EOB4p|akygd8Ln)`Im*qZGk*CKLb4f>?RVu}1Pk+?-^aUBX^#&{WfX@M%^t z1%qrdT@<6XDN;lheUbDoDIFsAAIyh7++4N`XhegG|I%?%mUV&!p=MnU@lu@4Bv!I7 z!1vT(pv!;}61Xrp90_#KOJ2IU3^oa-0ow+)^d+UmdYh%V{eE;w6&A2ZL#El7IDK-Y zPdE4X_JRsc#-2D6bA2NK7#3}iHXkTz5@i<4XHaY z62Zo>Dk&Z@O<4gA)T%&>PG`<$pp9Ai^5gW0IiE zpBBRUvcKI3OH^t`LdM2Q6e2B&0f>TDivR2n0SE)9j>?BD0l`EVx0wd0l&L3~Aelfw z0VG@z`A17b&fuvXr^v#Dkzf1yZ|&Y z+jMDFAVf)F@L&SP4!4Ne6$Bqhz|nTVLZAgMb#MS;gdx&_^Fp{QUK&r<6~$x#Z6X)} zJA9N-`2W?0Eel8kUjc2i)j$|@u}mY9CtebA{Xl;B{jn#(pk2fYJ>nhg3DtCGXLeHI zqJkcjh6Oi1`l%2>9<81*ujM|h0@7d#W+oGx7=n5r;2nI_orv@1nlL{y&7pX<~g)SOgv5O=64`y&7Zd&VL0nyV!HlRINE?6^KDO;o- z_yQ;wwRBViAt(}G4fs+DNL3~ZfH0ItRt_#RXvT?v`@>`aiv%}tjWQhA3dHp8>s#vh zY(H2Ro7}S^t1DuhZhL~l3lAw6f#soDDL9*#^i?o~WE6b~vacXNEX@l-bcD6&!T(uX z(`5k~2{#N^On~>NB#{OTfFoE7w)pU%f*Fj}3tcGF@*9>29U8D+OUw&Od<`xuGc72W zz)WgHvT6H84`D(FT;nr{`C!8SlNbpJ48UMeU~sHXz|)cT(8)lr>QkgbBJK_|{+pVV z?kotP^yupo(ckS7yv+s?B}-Z#n1^?4G)`z1uVfBNB##gE^r)u6LJC& z-e4yEuZqB@xQ1Bsc`&CA`FtRiBe0EOAiyvk&u~WKjeG-%G?+p}fluH%2%tnKD0Bg5 zARGs7N!_uVTm>5AyOhD4>}|x%F{1D!B2l$9j_a;u0_p^STd-`V&Gfj*jfM0&*pmmO zo_;X zFaQV$aDny!@0x+x&F}`N)4UN~>cUT@;J7i!QPJb-L-&-B$ZX*9lT2|4K6AeU`oVZH_%6&Og1RC(KPiedWH=2(8X&cC$sbGx31uR$0hc)U z2Toa22H>#(6J~l%`S;;_;n9@fT#iv7IK*a9GZ6j;5>*Irl^4llX3WKFch!j>38LhO z$)_HsKDKVi30Rey>5c^$AYZKENWut&-~rH00?m#C!=LuL!s%1=?s3;q~nJr$S?f3U#B z>x#OB_u!`cQX!`Js6$iF<;VvUhA9<7Ow0oY(!-O$Nq3_zLUv`5M$dv9khwS!o zje)Te{8IzXWDwB;j#0*Tg$K~_HlY(kt_X|!xP`HA1ryrAkn4gs>wt~rdVmk2k-u#Y z)S7|&3m9*0e}mM(mKFdjaHEM4P{MD(bJi)+1{NhkSuMDDo%pL${6rFoHG30e*rZpRTALs3;0snt^3zpn6^} z>HIn%uVAJSd>}LeqsJwSV0Zzt4I_V4wP7AO=0+OtvSvF0JL28j2+}Lih)@*75g$Q% z1oGUH%;gQBqbsTcrlJc-!AU*__jkgBgyCwVa zemMe-<}LKq*TPh0%n1@j00&4_;D4lH)JrM`njn3W+h(qSPzvBQC22}tRxGgPLqw^C zw|pIwN@?0k@dqEo9gIB?tq{4m;?!0Mc#wjC3&-AiR|yguS+=t;>8k;qOx;L;Co0p% z1bHw4NENlZJ7D`T$P+qaBoo#ni3hD%&Tu2svrw}Z6IgjaMlwbUfb_B{z-Y1;(9A3q zTno5vVJ+Xy5;uZXz27IHcrI1$c7oe#LTbGcmrmAptoFfnn5`PjOEIDq6D5TGL= zv6d>7bk@_FEf%OS!@qzlZ5Sy615g+5%L`A)%Q%$>ck}_SLKK-GCD0OYt#WK0&<0=& zz7aS993gyyHGwr9O{Bra<82cF>9x+l$;}XX2%~d35dSWc+U9ci*#Q0-4e4?Dg6%}m zk8}-$N>>!5OKHRiC@j%yjc*~f0WAXoO8oT!kwLaeKWsVym=|oGdgyU&OXKZg`!a1r zp=%vQ>_J%%-tg|$3MnB#Q{XrTEV9Zq{8)0fktw4 z{)mzX&=m#!X}~(fzXq~;0p5t%08bH0GF6`|!2bZr#aUUBejv7iwwQ z%KpK~v*R6-381^6bEma5Uyxi&#`sPFE5kqX?VkX`#!DAwWti4s^`D89iAcI{ARE?+a0?@fo9nq%S znEN`^lW(okjPC+_F>;cdeCDuN4{kIb_3wg+2w+wfvTvf`O@l2my0)YPnCy(w`Hevg zm8oNWuq2v4sKG)vEQ%h^oP|yae+c8nY!6uDTML)u*Qx=q6vYaum-Y3y#SJH_z`xRh$C18(fmsA+@zGrVWm7#RxkLjTVOwt? zJn7C@1;{pUVBdw=T=o(4N=R~60Xu}g#UFVi?&22mAhtk9v2NJMf=w^r8-;fV(A5t2 zBNK3oykh7(ti1DcN?)J^I4xN80pL4 z5VOYlBPR~9fn`%{@u5Hxn@p7C;uNTmv@=FtA1sH2SD!R%R^|rzFpMa{hh^%|%M{>LH4pk?1we}skbFnIB=l5Gpq|-hWiP)^<0zYgxP!AeKD^>Ept7U7y%#=*O2*wT? z24R|A{EtkW%NKOpaxxcZq83a$gsfi5xY3X?;Zxxv2}D;5sB_sAyvTg!1wgudVCgJ+ z`OSf(ur7RSg;-z*ZoLSR*HQ=QlEEdcju?SV6fS~8{N6M$dmi3G94V9usSczs z%n{HP|Gv~~VK{YU)zmw|$vjK|Nw^jhD4IN+fg49wh5t3_TQh)$ zJO$_e!#Yr}A=>1rDbN+vUF-*Fiqs0JWY_Zk3Zm_W|cEM|*0BtIl(@DD>OEl;G@ zGMsx^g>}w|RbOVkHTZp7kgPMU;<4N5J!YY4@i!`XHgjeK0ro#DXQjn2u$~e}AK>aTnpu3trQZ-E8h07udXGJF8Oic@fJnfm+vo zDvNEeGqaiNZRsM$K}N)2bR+;1r5 ziC$^d%Tne+ihngP9}Evj`!__>^@82Mf9a{6GQoM6GtpZb5A%)9PCaAFsApV&C z_MsF=>ayn%p##)44;L3OA45G>ivwW7CF0?&No#smxUeOs&(zZ?l1?j8KND;tq~iY=2J+Z>y!I8F-F6wAUR(r2G3S{Xlnb$rXu~hsdq}b+!kkvF!5Q{H1O80*_G?rnrxp9UOIM{($qOe^y5kT74*7zeHnmuk40#>RNi}neOFUasV(pN&X#{_XD0?4LT{a%Pt7->eg#y{EInW>E{484Iyh6p9U$BJO|?E23sNEJu_DTP zXr;Dg1{7E?J@(dqwODbM)wXzzP~$5k@^B2<64Dr)^#v!Wj+U8rqG5=N6%c&YjB-{- zHK(I)C`i{ZI3Dlb9jS`ZpK5cCIzvMI16l8)?d|8yCkxt71+w*s7T~UrL}0^^AvH=I z#4A||*&(K{H^FK(J~*Ct*&-PCJ~R7^k6ca66DVw;znaGtj>vKJlXeHXvK&V8&IB+& zWj>}(3fh7AR111LdlUh!4?ERg&Xsaqb6_EW;Ui)O5(Le6)bU`ky~8AHyKyuvZk$ee zdO$2%sNmXPE^|N@Tx&zG#N)Fy?(VPD7sReVIGtAzz>xI};A8Y#;ZYw-*#uPxVc$G} zlm@Lfts`!av)mW$qhzWoY2$_(>c_=##}64sH9w_qG%Gh+jl6x<+JWi>ra=yoylJ2b zb$H}PO&*}-!La1Pa9^s?_KCTB%FK_SD@JC{M%^x8(d-xs;%ufD-|P1divUtTMm=Bp zH7~GH}VLEH`y0Q6su;uOt z4DUu$(6^_Q7Y^A9|E{AB6#k>Q`6@$9(!)61{?@YR+!9l?*pyKH5uTRd+ra0yB@x^z zV8b9ww$IgmJ6FRoti_xfCM>?wz0|p$@Bk4t)fuMs^bmf`s4vXB*SRcPee2;QnGhB8 z$$ZZ(R-=Zt3yBNRKpu_+s5c!FoUF~`D#u_!5A%HAI)VI9~y?_FERVrSpZ>M@z27co96dg?i35y ziIaFWflhjio9OHZ(6*_W-lLzfX8yOP%`)zpK+qS}QA+pc-}K7!*T08Fi}!l~H4Su% ztEh}+tuYR}>{u;8ZF_Y;7lfVCo!@iLKgsZBf_--Y6lPmxwsh^Lgq&X-MHyP_>RClN zt#4ePVYr1qbjjEMsi0rGzgdK5CHJ)0p6uA%-N}$Q$wGO@$cXSn*7E}*)aq`NE;1;D z*bBB?4*`kf>*ElG>uXt(+fxp*$v&iSRL#(?+~L$+hk5|TT$YVB%18@%2@0WtJI}01 zs2$7h?(>~-1;?FyH23NJuG@Q85(LlbPO|P7ZyB$DW;+k|SBP0FRh?*1!;awW z-P&^O#L?Ju-8k;p`0F!a#XJV(e%v75G=V!uce~{xvM@~Y^n5dyY@acIIK&2`!K_wedC=^-z@MFWcBe z3u*XTM3tLoO8I9pFl#(+;pbFgPDj01^Tmw-=Qklv84if8%&8&a4vZLkVS4IWnH!)k&AkNjwrXgzerBL%gm%f2vC;n%>Sh zpBt2O`Ow~iZ%Y&Ap|**lY0H1hNed6A2l!G2u^f@iZ{w5&*os%LJmdT+msXD}PC)=j zsG~l|H11k<2eR`#(%3tu^Au;V7{wx5uq=F(QdEFLlZ=Wk9L1Y>%vRCF*vg;>@~J5j z#H6GED4=ANP-HC>3`!^hf0Xh}FD-_4p>i?n!Kd9bG>aONNgKAQ!TRQ?yKEM$cRXxP zS05=kBR=&kCPHNMF~g9!^rXbh!z_}(vn#sEwWK&dFUopj-mEjc`vBa{u~@3M++js4R_(D_+fO9qla?If8}O5k*-wWAeYTsn+z$2h0XinA6ga~^ms$EzNuh^>rU z_Ji}WW1m_%kaDsm)74#>H!8XLkaRU8*_Odw(VSx|+;*d!c98h(%xi^H&m{Vqcb5ME z-88w7a`=*aAfByiwXu1woCzk&J-87zC{{VE+bR4W-ExipCTsc{%k7`_3G14)l zL^x&u(kzJC+Q8zSp5b&j5I`dYQ9#0yfD(#eHRMSC`vLW*DGV|WMLTr?jVx%vS%4>? z%{iS_cQXJzO%`ErR##l91X9u(3Md$2iUdnVK_xvx-Y2%2e@0xo#&CXumKY+2*hqMyoO@=nN`YxB_6s%iBOdk?t2*)WbZ z-SUP!7OxCf=cc_H7)bUiC<+!b_ zhuD0#cX6)>tS~(){by6+E;|Jk1qBoVEhR|Pw=RXf|#d|cN0G2?ape|O9vq4v>Vmcf3S9iIT_9=<^?lHAmd;l53LS& z8i@7;;|Cn`OHwklmWA$o@g^7y4l|0G5x^Uy&JIr_IX)V}Z~WmoDcO{gAU zl-mj}(0!@%hbZfNaR&39&gU$BYI=z~yOfoXlwy#@qJa`pRFWeQIVPbuP=k*#e>$ZW z_6wv)f3B=Dq!4JL!wk|;GC3xWF_&P!Q%zf#U9hq#KE|y@+T`65gPxSNB@B{S;~94Y z>S?QU3$Rs@Nj`>}i)!M!CLGaHFrt7Kian^?D?CJ2l3h(Gx3da@@?!F_{svSJJn2V;OQ8C^or? zfAo9Tc?>f?PCim=X1QxemUiaQrFcf>%^a^e4)lVf7x@#*!F*2vCY^h_ZHO}$T1FYi1G%glo2l>R*nos5g%#IApW9|NCH7IHVWuo3NiQxB1Jble$ib|te@~uQ zG=zCoh~u}0CfynZKBA<}OKt92No+xT3AnX*lz>|w&atjExnYF3A+gsLy&8%-Gb)g8 zQf&%#R(MV_+=J^=YsdF7f4qN{Hmz7c<=H-q{{SHM{{VQ^*?-kP(AE?9*`$6Gn$thz zArJf2)QZ;=@ggZ~6t&9DM+zwje_=G%V5(U312srTDS2>iZdyarJbMb*w0kRL07`}N z$<23FjFc2&bJJ?=vd7!)zvr@kbvThseqbYM8PBzHxHY-Zq?r^~P|W*dkyzt62BW{4 zSRgXQp|+lLO+(&EiOWl(wVtYy0w*CDeny{nsKB=GvBR+#02D{~3K^feq>J8u2sjlR{Yuco_^?6ox@f;)KjMld`3)Qq9j zs|xvjLZn{%YAa|>Yl8j39$_x|y~Uux)8^w)DQWvQ)ge{UVMdmcqvXahZkd%~xfAe}8ntRlRm=$K>0p}S9!|BuXPFb^xYT;AAdjI>Pe=fc>KkGcz@dy$dW=B7{*yh z4;AV)%f9ZpEWr?oihCvzJTNyYR zz@#s}_S~ywN-_HMqn6r*!W;PIVSvCBfJoy$m2Rd{abt_Pw4$VBiOm(85m}Ek+So*P z(HND(e-wsPZJ;k5g23ZiX84G z5~a1gv)V$BwPOvtAo6*wI#X))Lyo~pDhefzip}mKaievl6}X2ATvUK<8@FI*rfFya z4L39lQAC?jo6LH&)^ttSR7%mICBb5-9-E t!kfC97zU?qqQD!eLka+RB9|hh18}C66d{e=DMJdY1&I;(qM@N5|JnRKMOgp< literal 43935 zcmbTdc|26n|37}m*moH_QNoOUU&BcDeH5A~QTCK2YP5`ynixAZNy1pNB#pA9WG!Wz zkc0}6wawO|e&>$r{r-F&-#>oeuVT*Jd+s@}b6)%Nb?)!s-)|v)TT2^D2!TLA*5DuX z`yJBS;$)y71UWcBiVy^`LtF?5Vg@bn!PgA>{b_UcA^0FBMh^%|NANS+9N;?zAr7%@ z_J@iP693v22sDIbTnA4fG#LH)!FL)$lhHZ%wOWi3Nn6D?g!J!KWFyP2iEBhD44X@Wn5clNe*!8yT$Ab5Fs z1qB4yJ%gn;c z#tw)E9cqC}BalcYW+V#>Gf;ZO8CbZP1z5Ih(=cNdbUDPfJq)E8n|703cGsQ9Lb(1< zJG6Yl&vS4Ji-?Me%gHOCF^bwcx_bHshUU91EUm0e~9Z@9?^Slx{BT-^%{ix&*+wn3$Q7%xv(w z5KPhF7b(EZvQ2|^iM(Jm!$q!hI6*3Ge3=-l6?Y?lZhJ#>)Qx zE$saN)5`uW>_6)ofw+-C^aPLskSP=tSg7#+XJD)S6o2iq_*SJ`&9m_{N+i~7t!A;3 zNVS00AIe9Ymjd6sI@#-Lhh0rFD+$-coV#mwK;4uxdiM`YqaQ{$-s!KlbCvkhFW-!@ zR9g+0%Al}bLGpd3Mw$k6@@NydHv%1V8yn8jB4lO`ZR9?@Q7Qduj?K(UQ^W{0+nR*1 zj(p!KT6mSsNNOXm{>jK;VdvB#)f2GjzA|D}o zn19O|^t6bU$b!Z_gw&bY5~q}0z9F*rw9iI@p}Ny$7+V#(D1mQ4=xA}PNU zn@Fj#*ckC#P*r>7^O(izJ+?N99}BHbkPnTTbZ<5J&@FxV@(4Lf1Q9ISSt;$8!g|9< zsCD6v^U(s?Sd!;+Rm}aQ6_@71g?>oC@GAM;>dE?V0Y7%0_Dynm-tunBQfr0!#aCe| zrHkw*!Y6NnG3gaC4w&|>D-i9_nC)$16>Z3p3Yhk07412RVlRYzNd{Ml7NXr-_nh_y z1HAQ3!n{4ZrzQ2+V@3Ufg}@a4eB>kQR?pKvA5}^|-*vHY5?QN|Sx7`rA3FY}@adCY z)I-l0tgLqZ6}BAdwSX^^Y(y5LYUm=H*-)k;vY9n&m@8hE*)_^4u3f~p?x8L}KQJ;Xpw}3iM z0sU_*+xE;%p*)d6{!1iw&&YzeqF%3>XU*8L;66u!Y%02CDvW-ac)D(OJdTz-Icw1j ziAr*sxaN{n)mykv(@y70B69nWLsnh|u_;R=RVeHO+Q`x5K&GdUB>zcNJ+h!bjGeu6 zOe&B=D*H0=u(!8M=T1%tXC>xBC$ZXOq_d-t%_uQX`_Fb6H(H3?pU^A$$h_sKp8@m)0U7n!W55m3BvshMw%RH8iV1z>i8gW8w1Psxiq}2_v)o!Ih(fN`2Oi6uAemPA@ z{#@=G_|V_bl}{&8+zw+JmP<`#NnV{YF}Tpl&-u{(9g!u-T<2{OL!@1@b#h0G4vkcs z^ebG=c%r~srL-%p->OZ+|3^X2ol-&GiKITnn@@#wA|D=&z!1bCL!YFTd}ia)g#d(w z-n{^5r64vzY?{bv8~_#NLliVrRE)3;V03jN7zc%u*+}Mze5MpUtBTYk@m-w8XlSKdjR4si`o&%zb%ED=RvRMp&te6h zzuxZGJEpVy4e=*>wj1Y;K@6Y}ecbeO0cf|K(j7N2Zgp|EU3094xQzz_>6TivPML0~ zgQ~ykC#eCqN6qK7T;+T`9?~M)t$BKzRL=w;wCK48PxH;Jf*?%&2ehbvr9^!`a_3p? zg|FE71#~{tKLQqph6gW{>zKC9&$2LRtMXL`vet zo5l|A`}O0NIvj9O=Bmi7gF#OCH1&@*!y5t6SkhO^cLUCdm)a#s&d6x)iR)OlVjxpK z1e|ckSsGMdyp*qu)_#ZOSt(N1T6cy@WW-$`YeQqLQs}XEbx8~?CV=#W5Wed{4vZ%;#q7fS$)aByCsOWqooje_Td7L~D4}TfSc`=LS zcufIpbis0&f%d%BAuM;D!)lFMr7w?(uRKz^g%($XVIMgi?|nx);qX|;r{^x0CTNb+ z11m?avGep8rYf$#C{pMn;F>O78#w-g%FAjkR+*|H?qA*RuNNWDT3DBLh|^<5a?cL- zs?a@Z&tvG9OD}H?i*@hX8!wV36_=LrQYT2BHzCn+P{qT6w_9cVZexzsTgOg_*Nq;x z&@WHs(Yur7!=pAbxg+8=)g9v|%{}2z9#==Xo97sWm%D7SjRgfo7Z5qoVnSV~vMY%G zI%e9{B59Pmt|tMm#e7RCJ$H0OnMGKf#Ae$As1ZTOa2+{^L%G5sDTg2_^{7L$^o*?>~?E4F#|`cHY1ff^45h#8OHG?E(V$ z>JkV1$Q}7l6RB3(7xe8Ax#9tSF>`@4LR~j}{y1(#F$ zu|hRkq|DkKB|J-OT&W(_v-sWb$bnDyUAk}*wRJ_tEJFW+dS_k5=hE~CSyR)MyNeRf z1u{K1Lo!|4DC~N7!NJ63_)(w+MIqdZC)Ra_YA$!NGeosBf4b)IK$e`T<`)e|^p^S( zF4haWz2nf}(On-G7O>tND7n(ELf0RU4Bkex^UopPNW?xP?A1?54j~d&i=J%1yW=1p zC}qAg!jc722(zkGN7!Jw#xv+dkyRu&Y|9=Dp0Y(h1kt5jj#r9Xq@>UH!4CHtIgcMCKU*%c@^Z!M*5+w-{dK+r@j2DS4N*^x&r&4l1B z{&H8mx+4MEnP0gd6XkKs`mx8>6+w5_{ccm!jC9e-bv2KcFlg?b!RLjG$e!$_`pcD4cCeK+8QzsK>c;|Eat;v9 zEG8lb+_i4UtQETK2|(Q)eaK;oEM~c z4#Yf(uRuIqEx_OLsHq#dBKD-)Jj}4oI#f}(0CPaPcKhzDDlbW~k@rV9=J5(XeI@p1 zTTPSM?7|tP8tx!Km}&R@2f{ zk4yJ=rOZ1IUh?Ih! z&=jmiqaaQ^WRi)4K3Y*BsnUEV66;pbg@lGs&P=%9Py)1V(X;cS)<(X@tUFIP=Cox_ zB9{Lt`5C@&X`rdyb%N6v!|xp|(t9k@#r<}ZNB)wI4`?1KO0r18%?r(JwNCHohc)ls@hMFDg?iKC(Da%T{YE9DTHiQ1{CuEE z|JuVf{PAI#swjaZ3lY;6CANcUZErC$ds@T2Z*Mzosu8$D)8zOSX=?B#tmjgv{>`O5 zSyw(QZaLlxx$Y+Ib$s`9h3aE(9PSrGyg15vt(E%fO@v^=tr+2#4Z#P_btdJlJh9g7 zoOhI9+5S`Av!;-HX!@Fqudt5$KV|z!AdScB z?%$PIGx%IgPR>t8o0kSf!NLRLC^T$zpiEkaoC+iltYmR2$E+Qe6P?dSps%5x$9I0E z=CdppO{a1JH-BJe)@BxHF*oK+0JL0`&+>5{#3$cDaKSM`UWN$n8n=H#Pj;Vcgk>l+ z@MQFc{SBvid|g=#siaLsp=2nHO%3$u{Jh$&XLn2Xh@nqv2;u{1{S1)0_R%egul!T)wbK;moI6?Es{fhd;Nqe&I%F^av2@!Kbv`Vex)L5>%`ivh7@7Gl@h5=sUDoh)ePe+=L{EJ zf9?AXH7FJz^_Z^x4Xyvo&#v?2~*9m(c=|(*5QC#qHXnlSyHyWk%Job2fyAi*IGVV$H z*r`Q4UNUA!s;`(>Szc>KU*Ch@Pzr`6++gFK=)A22Z}#)~#Xe;L?+DtS`kez>3Uzsz zCzx^k*VyuZmPLFag&>DA=&8UyyI@&BIP8;7t#KgaG6H(Wj>INNeSnq=?|=}91RYogJ4=P+P!R9nv-wxQ`d6CEFHC3N z*ZyhrT=h)32W(Noj3^pwf&3Bpk>5~T`_m7EvstP+LGrkh&5}beX^xkFP(N00W4o{Y zuB4M37$Fv0eQ}ax(nj2(zg&1l)uSffEVYUKY00Q*PAJF(I4af--!(B>eBPSBlQU<5 z9oxyAG<1W#@67p~TO81L5^p>>CvHGed^1v{ySRNrNx0c(POZ{tOv3C(iT^CQCH;

sF-wZzyuF{YY7NaNC(Xm&(tI{f1mIDTxR2K{~~UmWc52sf?MhRi@feT2ldKugv3`jXWsuT zGwJ4&6j-NE?{GcFXTbKgY@0=LO<}G4lDzKPubo9zyHnnf>J|d+{GwdKxDPIoPR#|& ziqvH~Bk}_BkwYZN+{zX*06=d)-`Egd6n$OJo=3}+6O$|t`+_8+<%dc zOQ=$Sk-r;QiZ2rez3!uFV}RqLcM{mi)*+T4MOyov90+zuo0^Gk== zS(@~VYrT^if85c@uu9qzyp6xmax4z{eW+}o6n~VJrJ8fXYI&;e`h9Zzkb_6Z?(1{K z1zJAKR^e_lI^5?T+LQHoYlnGt&nVs!?;f40&3be4?cfbw)!`$k_n(p<9d9a4SY|1c@9*H$?q`?b9Xz` zH=|RR8_!mS=^iZ~?P|Jvsw&SyOsrh|Nd0|xZjHLg;x`ROA3W+)x@nP;lrAsh`*F>W zy9EeLQMzGYNBkuDX@~bzE%K4$wqu=hXDb@C? zC*(MvP=v!hb?es+0?^3U8k9u5xhT^ZUHc>9t5&WLVwinUv~}5;>5K&oGccrp&la-9LrwtWfF`oxgc;&IFu)BxEg(wg(V{_WT$oFTq!`|% zg#>A}tC_DmGr0gD$MH=vq(*=+0$4%MmT4fhW##*#YB)q0)r*e(Hh`KGw32`R5#D2hxMsusO zF`duPO-0vLsZr%*M4A*1VL9?>^&o%|%{QC1szeH>6NS#=!a4#C5!hB>^w9bW6zBki zx;l?-zCmDN0*|0sZO( z_>Rl#&%oe<;H-5h4$JL_tebaq&4``Fa?JwMeZ3T+_4K=|`Ef1#D8Xnv@-T_1wO#F8 zOX_);5SBuE>?L5~rONomO7So-V+0&lZXpCNajx^cH&l&D{9q2lUq=xJ_8cmE^BN51;GB5blk z4gq=++uMb9BvLi5L2J`Q#e<{YxQQpW->O{e(t0XXKu*XPkK-9VLES(7EnFjoaJo?Y z=+s!SQjMO7-ll_?K!I~Xi$~lP$b+|ox5exYkI4AG=c$LBgdj4*Hi)|;TkLdRoDO-d zdwRy$SaG5X$A3_l*Jg^o(X=+B@@+6Y)8S~;7f;Lhjp<*tMINl7ggrJvc3aVlIO|96 zY~T2jn2!5Z#kqDKMVf@lyE(+4wz z4e&R*DBnl8> zQr)n@5oTyN&I|$u)z>U&;1`@~#gUZ9)DFd6%uUM-fUzfq z(|6Sdv$65HLzhO!d8d05HACJjhugFVjNeRuUXbT-_?N8MPfOfB{X-eeJBMQHlQfI1 zx(vz*0JPf0@6=?}>(JT9c@4qy{CrHrmebESpj*d>?Zx&E5ZQZm0$(8-T6q>pj)Q4e zq5&)50603Id3L>jl*9^xT_FCzY{Hfd81gt6WC#2NX|y=_&P-*Pq<$=?1_-8oW@P9; zoDZWO(xB@f@{!|YqO(^ z3~VQ`&c7kf%FkPKit(_zsdPQ3Ry%Y9aL9h8$ ze4kFOl)Wh1e%Hr$1HDovv-d|!wb~*7#%Pd7zpHnS@*`(R=LE~Fb$czB#avq2O5=Ng zVSlgVxpB|Qe&|u6(|1rf0bJ8s7x3L1Wyk;QF>C#gK)>M9XAh(Gv@HVsg>DWdK(U=n z^$rJrnHH@oe4{uYp^pxI`uOvtfk|zN!Wdhv-DuA_0WYevS5*Z`X0U^+C{_# zmzUb7!ZT8?>HnM~-aR5w*&_VJWgah=vqM-Y_kz8VKb>?Qc@uatSm?O{6SM)yIFj)a zxQ}sI<3OM(iR)tm|A7I69S870G2*ak1RMbEfP9t$qR5@^bTUmW@sI_iMwR)v0<_4= z6R@l3BbEj8D-*B>JS$ZS0nP)BT0k4~$Z%qa(STtJl|Vs*&=AmbsSk@-E{7w$jn?^x zeNfD)P+7$6tV3hcl#cIpOP7!PM+Ca#&R{nbXYM@sg*2z9;GfS3oeB-UKA?s-%ElV% zReExrZ`6)_?qxA!^OEZI#l1;>g;gOl_h&(-nV4y$%X3zq_mi(jwb5KhXENxu+E?)t z!%qfr!{K<5KsNJzS4sM_v(DCqY}+Z~QhZ%?Qi=y{Mb#Gq-EY6M=5^Zpq$%92!yza@ zS-8jEEq(YyPV;5)``smrAJg^;_uZgbT7PJv40jvJmiG3TWIdg0zBX$*ZrW4K;tII* zsXgfi{(hO=`+enVm1;Emhq6puPj{r=MDldn&SvkhhYUF*qBxXT+ohoV{GQ`l%VqU) z!3$PFbl%zoo`rNr#9J+&%Am`n2E!Xm8!U2uel5VKpqF6|7*5XHjP@aB?eahc4D8=H zxZ^kgM+lHq!e#*ifDr+3R|dyG)G|$CRdca>^C|y{5nrWRB_!1jG6`0x56k(`TK?*H zXQrs1fngvn1D4hTVgoiakJf~S7S};I#%Bxcq0I;p1&3w;e%}-coZxwbd|$gs?OUU< zi}wE8%5vv4Z>)aa-@tXQt!d-RImP;gW2Uj<5)HVed1r590%=-@eeHlvT7U8$Jw*x1 zh^Ufx^QumCv~5nEar@XyZKcyKsgh$0F(0Y22Hhb6&6Ss)Jnq#gT2*u!Q*+sO73w+1 z+41O+fW0hFT%#$zt~^U9>cEQ<5dj;S?|UC+sf8K0QKe6EVk7YJrygb)CmYf~;LT-v zG*7l4J<9X(F!J4!z&pf;g?bmFz*mZtf#sMfQnnR?tn=#qY6v}uA3i-Uc}5!wmgSdVPy z8#)|P0Btkn2#d1X6LSV*lVG$0OOWHH0yK5N2~N zT7#_y5CT9K>tOc-r-kj*k7lX7=Ry3&JCPdsGe8s`ZQhCsXMjc&tmv#I;RW=85k~^< z^O>8?uj8QQf-5WvL5w8RIPeS_0l1$+fY5O9rok1jO2jIl0#RyH|k@rZSeTS0Z4{>?~?P4&=&I5Zt0_lOTD6n znNY*H^6?8YGX`b8cRVgW?%`2-jXg5?de+9-+GUmkfhYlhzrcV2v05m2@T3;;?3W5ghBUxeKdD~VM<@+YW59Y*H2!}|6O$iXs$g?Mw$gLrQRPnY41 zK!^aO1;mgKX#`hT+pqvmhC@bRHVcS?a6r20Gy#Zo!Zcy;z@FM$x00?mQ-Z?^jTV;L z-U?W&$jP|fS9Yq_*zt8ex#AC%KO6T0BPYHTUa+WS>FYNi%D-*6B zAgmHg9CgcW*VXrE$kXo*!k#zs7>Ig16z&sphN%eKI(2B#<2U4ertQMpWz8l_W z+i;h~ko-`2-7{UcZYg?Wk^r9V(NInHgikaI$4}@V{-XiO06i@Ph6qFwK(c{<;bu4; z6a)%7fERdUGy=AMfIk3Df%|chL1?jRif6>~SVOS?Kq*YcA){X?-T|U<0EimZ7tkN= zK}C81depv-i$u;_GlF=Ka)ZwyF&yC33W({imjxhNR%i9aW+{-vA?c~$ zDr`Sy|AwtF49z!eZL06nF<&bwfv$GPbp$nPDLIg8!8`hv`(23PP$+VWoBn_;G#;hfp3$PE| zu|Gj=2h*#f5gOnctD&T8=Qa_~fvHYZ)*F^5C%)Tl+|u3`+y>7pzT~ z=K+|L=`lIe7p8&n6c`EpxEqYS4b{>z0UnJ*)fEXtXeMHHT|sQRBL4$=CN=z&xxcN~ z^*~Pp^P>_c3*L1}@M(v@ABNMJC0`0A-wPg^oVVsrGM;U-;R9oA(?wbbpPMtx2S*IR<&vPL~tpv3sdGq}ZTU{^$Pp-@R zm39$c7u^WEyOkom&Ky?Rfu5&tzW?F!K8+O3>x>TgG7BhqHj$#dTyp$9pK6No1Q_oc zhjxgzr-8+n9-giHz(jh_v>(Es3fW;+*%214nL8i&p@$0Y4oYcQ<3nr?OVM7QC~iM`2a@B=~m0J z=!8ddQlpB9piiA0*z8sK44z=$GWAPC|8vQLQ+_F`@R}p@4%)+OOr#uyzhBTIXP(;g zEe@XZAxv2g{ck^*^sQbpwyI!b@&Zr86zxi+=fJ}%+N#;W@Fn377 z<&@03)wl(r>z!Q^EUI1Zyw0zzve9+l%)P0@=(_L=k8P^q$N8*SoIG-U+M}23f_5-pxgiS6&CbnTzPFd63xXrqK*Mw14htw z9=ar561dWD3EJxD*S3?@K19&;qWORsQAbgp%A$o#aMK6KcM>NoycR$~;7NcQRU)hF zfZD||B>^&z7KWnhD&+eu4QAmkp5W3I6gIu6sz?oJ1T%Pm^iY$E}W#Q-kR5S-b;r47dSP1gis%x-lCB*FsHJm9so zH#;CO0SMqcUF?~GM?9Y%d)Wpcn2eAFJOL67M!fSkLIsf!haGII83(xFPjLtn0DRz< z?ATZaHuxuyWu%MDz-qFRpff@{F2nS|7OfPxWh$c$j)wGG1Xvrkg#_V&x3OiE zei)?Fowo(#Gi$pt+2YUd0?P!^dhEa9T;Ti^$=weU*tgi z9+xpcOnf0sDM-)E{;U#owxPfYHH{O*ieM|4yT$S$0Sf?t!Vn^;859s<&;-n!@AIE^ zFk0f^W-J(4nt*1qRkVS-rEjtkEW9{_1clCd4Z87P+xYOtBJuc`<(x7ko@ao%(k6ec zA%0u)barfl+~!_O+x`&-1~$py3kE~{U(@+r*^lbuc{7V8L?Iq0=x+_wX6m>00bI68 z!(Pa4*E_S9=mkO%ZRA}$Yag62N=DohcTDujt?DXt&~byJ4x>sG5gyunOZF9(KNExH zTW(GbYL6@^ggm-z2YgTv_+jv!!Sp>MTTXckHh1sY`${uP<_FH7`Ni3R#_|J}R_YQ| zu}O+q{nuvwZ|N^)h{EPc3qT?${FAI+kC#8wEV6hOSt+|kLXqqFi-Zr7l)+|O zizm5;ORUu78p4pK<;84LED02bbdXOF9YFG29~k=yvPD?$;7Cfz z)Z@u{P17cKr-|K8zG_>xR#J9Vl1si;4f;~11VeG1VGr@+d~tn zZPp<}IXiaLowQ^nxaH;OUFZEeyKfIUM?1b&?Y2GrC8pE`%M(FrtE=-3lM!plQwp+O z=n080w~fy2pSrJ589DmID=E<=bExTfmzDiwRiOT8;PCjxUyEnvj(w^EB%^9EKd<2? ztAZsx9}v&8ZEpy)vb)kfr`Q(t1v7p?GYmhPwtE_N@N8DFeZ7|b+mr?+gHF2~j$q%t z65DThCJi%0nz2M)nky{14E16B!J{E<=k4|`IO|PSvIZs#=vD23C22#MqDX@h5&!VR zRixk0p&3~=lDXfmq>1~h#iuWvEeY|B9p#R?m0k95g5OxfOC#%Dgi=h$hZ+_FCrh^B zME#kvM>02jpxeg0L32sqy^0)-FgJk-n}hInJKjJgfOC+PKSyVP!N6iqqQ{sR&SW;@=Ky4Du#>Px{aXkm`xk&dN5u-p8I*7xe{iXdY|?@ezGa@D_-7h;NDT^$RgeH z6x;4SzG3PoggBx;@IiY1_luVOkRfufvi}!9Kb4_|!jG<+BUa`C;~_C~?O}EiR2Cswz*dHP zgh2ESOfyKu8D0k1CD^VrXYNTw;TQsr03E2 z^7fUK?3yDN9d`G2YsWv4zap67;$|cBe^k@1>Z}Wl=c!fBrn;+ltb}w;7(+#6(X16b?JX-xyvu{%WQT4P>4~DYW zLLF9Ad`Qpp8H$~slq3!v%YK-d&jL!0%FJuUTFcY%@jb!LCVn?{&tO6(lu-z;UTewE z>*SkfC#G+Wjk3RHj%^RK@Vd^eJiTQryQ%H{-C0-q=r_p@6091w?+#%*Z4;(u#0nHA z4(qA?x~yi}>N%28tGXw3kZUy=0G!M#^0NZDC(MzZ1uEo59K6 z#17sV(#%}Ys)51vZg8w$12Sl?WLLes|J2dktg2b7-4T|%5j!~9@b_2mN}gU3Qq{xQ zwwaDty{7D_4}AA_Yu!!P>Tgw+0&8JU+Lc8d5UqzLUxd|V+#&RQK2pb#J5w3tu44V_ zTKgDJMC?Ajmq%28R>wr_wbeV^JzS#lxDJbuWutgV73Ng2M1Gm|)qciv=F%?z(n|du z+?UD0c|{??BH?Fi(SoR{tsSr9#A}sw9)r@VS2)RW+9oAVLrZeH z#I9JYATNHRCcVDEugG6}ZaRi?wV@_M+kb=NutUHoW8Ll1mxYAS;P|Uy7mJ#6(9?x)E=^lT-^4$PkbaP)L+lXKy}B-t9+KCw`|p& z1;!f+Dw6K|I|TBRcan=sOiw(_YE_7ej5OF!uHkd5N^t~rpB=s5CK{A}qDe8?0adQ9 zf?mI&gCg{r{Tut;*p($~p1;BM$&S^qx?6P`XxDK0I~p>XF~j>7nEzmiSY@7NfggN%r9>(!Ou^ zI@rEGT2#3)_@rVR?u$j2uBGO(>o_g4^ucr*UuEQARPvMajXEq>*s8Fr6_q~Ha=!Xg zwTEn@vyv4gwl`&5T#E3Ldyp4$s8Kw3*U)<$fu}LkLikHqcSQ7-t5r#P^|x9(%Y?R4 zubW6~IL1g0-VG_*nuW`{9;?DB5_SsL>8^eCQdU-@i^~CI++AJNbj?nzX*A!D!361K z5m#T$LA@TU{L1qESYL^9V6Jz|h9A6B_JpZiBK*EB+ovJLXthlGCEXYEBK0?U+L+wL zj4?9A-BYBhV^J;lik53x7;&Ra0a3hDY7VKO-)mcUQ`fbzfwP^>Kvc&Tjo)R{i~n%G zMw3u8rCZX?OnPx%L;S6q&XEXfr7b??-61tL_2v4Fnv}Zvle-OGj~5q>4a*dDL(CJp zCg-akkc(z^eBJL7RiE2u+=$4_b&HX{&U!A%eUDdvR;}U5Tp<@+^*8I)Dv|oWRfGL0 zO$t8-`)7YcpWjQ<|A_-aBu*khHN5#zdZ-KRE80=fi57?*+iCcu1GyE)6Xi$Di6=T z`TUJF#{G!eJFUEfVgvW_wv&e7aq_VhwdE>H>AFWB&;1je30QD`Wv0;U36v)C?pz!2 zwn4~m$Z$4fI}=@N(JN~#U8AU0C2e+3t+VOfY14(5I;NMz_pCbx5>!IgPy5-}to+J) zb?~hw^|Qo|@L-WP-}iAFbMJ3{F0^eFLtY5y)$o!}=_Y0DpE$cEFw~+dU0HuA%)^?G zlArW>Z{j*f*=LbTk5*x5F6f*=%}MQ|T1<$!BCVo`d>!NCDyYTFqq|%!S9UkF{T(-f z^87Q0$sR?c++Vf5cIy}Gf694nLmt%M`Lnh!fm5Ajr}WgNej! zLQ3DoU_Xc@|4IVJ=!L+wDsawN|2Ne1ODLx}WqJLsSLCDk=W?H~8%TGh*YyyKikTyR zLuKcv;Vwv`>Bz6zmx=59k{$YAcDA97OOG`K=fFmUPfdMO80ISK?p*$$R4!PfRXA{E zP|Ek0S%xpYy5#frnL9n`cN(+%O{6DmteT?S*SP~vTega~edZhcBL?_Jv6GL3KG4p6 zW1}9sv~EqU-+E8W@6kuj&SX=%;H-tnlA!6uVKR#%;&Hp_!sopDiqWgLc3qBKbo`;2 zMyGaX7I^F(X|ycMNlKtAZ-y^v4 z&;1QUJ&5t&onx=yAH1GQHoJA)(z6;_R<$08ygJwY%vxBRd4;KRNfhFoy4I*ij(tR? zHGXyVNsP00RK%iYs4Co?Id@O(MvRxg9t+I~&K2lBDmt#W{dVS$J#Q%YEh zWKr36>91d;!Dl1>>q`LdA}6+9>`7B2l$BM@b6AyDY=cFBc<0@o7`I|lqkpEmm;aKOE1uFe zWYUoEAjSTrv6OtWVu=669>?Gq8_^f^+BRd3V#8HwL#c-=8DR*rXY87VgIM4phv4ww z{c+VA`cKM!^*yA$m$J2|7(@$@XoayJ&&>C1t7tkJeM;=t=Uddz+ZFC?O}+BaH|6cG zT3SHG#^=^U=n4|ZarZXlJj)Q<2pp=pBq3I*vNW2xqD--UUJX)75Wd}PJbJI{Oj&1` zo$vL-nnM2bBNh7)sEYkVjnq%WGy8Men~Ox4Pb_-=EY5A&D7md)qSCpO;wXm^$;o0~ z*?w!Z`~5?$eeGVE!}B&fJ9aKlSK_iK_X~yQf4!(sU2)$sd6YcZq(@Dn*6$R|N@5}m z+z3S0J-OMYin~6(Pc-j(S@!DtYUo4o{*fKjs7UqV;XSy#3w759-rUSO72>8Iww8<~ z`(`3X8ZxFWjWpkkXu0$r-@RK+q1KjM7}AUGdHgy9kKg-nhq4vEp@z1L%N0jn=?GDg zgAdJc9@vaW|J06P=7WqLh=VaY-yG!ln+ZMxyxNqFkM^7tP>suXHoYiLJ<6s0VSRT0 z;~&{t!LGh^Qgfdy{!jD(_FfE&(N;RSDg;x4;MvEe_=Xud}VjX~O6?nqJXi2P~^w`J|A+T+hU#fqjYaF(e* z3QEVYz2P3*Nnsw3UuE~JWLgS`kIfBYjPB&G-MX*)W76n2M+wKi47u>z!*BHG+ZA4k z{)YGnudfSqsl8(N{jyr_Hq>=F-JmRYSy4lU_ex=!mn96C5A!?c9x@hyh^s{Y#qq$ghKd4g-Lo18XU&n#0Guf%F-Wy0cW2e zJ*9%9me@-GK?7L~LpT`FA;V_yf6=h1_Sarwg5O95m1&1z#014#EeOLM+V9xGVnodJ z-A)t?pdwM8Oi6yArCmr;1x84|KQHrI;3x|cMY|x!j2t2gih}%z@lIqsvKuW5+M57p zdr>Ef-K&tE#HlJQh}wjr`=EkJ;UrE-1N8CLhOSu#9!J-4#Ln6Q@hyVi1r(L~@Y?aM zs8k>*!8s%BVDuH7q6LTb0D24FH)SkzGvUH=C9M^tCem>-cr<`>!L7|40-&e%Fti0L z1lSlk`1LwCo?^gZf6OTGuba@& zO5X$!SOYfg_aO!b?PAYF+Qr}!07e;*IT1dOQ>#*6?vz5qgp?4nc#N)A@=2QB}HU~B?#oBrf4WDP&Mc@UB@gV`o$?Sb171jrD; zt!RuYz^3zU1_v9cf9b4tM}>krqgpy_*}s58k!`^a7&@&ZWCx+ZjFJtpRWD0Fq$Bi$FMt zuu$iO>D)y6HyOiV1$a>$78T?Oi4`o@4jWI+M*>*-EC#a$;HR0J?1E*QK~@G80(M2L zAT}`wOaY__X5W8xa%M0VmLBlZI=o#nh1!rmNgqV)v6mRNk3Z52-fjgJx`?qnu}u;- zy*W7X4eA4M^sP>N$&Fh8E~_(f_6p3@oPtHqaa8mkJ|Pa^P@x{x0F7v5(-XyW`0N9>_Bi zAF4UUuTvl`Y>@^-yZ}TiIRS4acv`Gz2dB4Q^v%K(M(lbq{SB9)P!wxHt2Bkh`rq#U zXWKSgAQ}f7g`*?T#V`O3^Y*_*jS{F04Fx5?;S8e7)uX=(> zdrO}#@|n&C#sG-NrapFS*Q$&6un{iUoafGnbxXY_`(xM9wZcV?m#nwbGM-C=bK55L z>&cQy262m+m$e4++{3OmZ9%)=brMd7kh%*xkrvimpt{liKQcXdFF-X1wsQ=i06_Fb z*1+Px|KWAXp_(xq?M&kM!ax%rqroEit~EWbEf=DiiOJ>d-1CN7*wdLxQ#jMoT8xewTPxVoq_xc?q)nSeo!xmVf?Q+qT>z_OcxGp5#NK;C1;LJ0$wW{qOy*4bU|dQVYQBsb~iDS}^; z;>_*$UfQ!O8kwYyKt1Uz%Z1%%)ff1N?oU~setyvKK;vC31#9V`3g%{Ym;FddAD^A9 zW4RV<>)aQFr(8Z;@g}CyYfExro0H}B^9>yTWzAVR>wMGN&3Fa#pJXMEW$Kq-tBGE$(sU` zJKZ7@x{@jmR5yKfEpjgt5=WWQ0ZxqD1&jD^ePepz@m8E) zv*K$AG-&gYE&a#Iki!vP{0YygvKq(srA0@V@{NZFS83ddi$?s^j+c6{rn8%jXZkbIozi3^%^Y@1&B<(g;H9#lDT%6F&ubea9g78P@ufHh=l zP%{AHtzU6b@M#Qd&W5iHQ*HM-$&?G1?-X_B;(HL?MCP)ON@OPJCTtsC3~`tB?;O0w4f;T zf8NpO`@8sMvL$`7==|_w_A=v{wFJS z&|>kQ10rrU(A60Q^JRSUpN30n>OjOVdp6UcFCUVww4u1`aOZ0Udwbg5o}7Hj-Yrv- zmc(Uu&#ZuXV##CffO13oz`Tq(FL?D=vHPF4lvbK-#bkFm=?$zIjQU+aDn7-fh{PMS z<;*6=G1?(xRpB7G9#C58%iUTvRZu`5O{g)*abt0 zyPpL(G``&QpXE8OC6#J?nEGeBieh^3Zi|OCypek1adoRIS5U(K_IKf4lQF)P)J*Ev zgT(bFRDz{MLT4ZGbH|H@X)Vw`BoUa<@FUTJ2MS`Ni7+MBEz zOsUW4Yl*?6rV>Ma5%x<(+-mx1zwMIw#ErZn2lSjj_5(gd`jP_w(5d%ue=aCG(qSt20Cs9 zjlB^R!8{E+)%Vt*=8M%)sX*%T6^@j#M;23U<$|2^zYqmabAOw8g+})|jri)ap4n8O zaJ6K;qzV@=?Y0PbIM`^$s_r3&rFJEKS|^8 zUDcGldlkkw@G&JR!c3E7Au(R->BTAWI7!0^!sSkPt)w_{?VsKnM<&tfR(U_|Fr9++ zGL(#%M*^R@7K#HOn19<;5GuHUFuS#;yJqo}eRbemb|YhUYwRDHa3L=F1?&(Tn^_L} zdRF3uC$8c@?+gX-AOs=-f!T3Thld0y8+GlGs}@WE0Z1eyPeVy{?PClc_D!p+U3sxR z$X!j@$H3P@L({WZvU|>X{|FD?CbgUj>uod&n|ZDbcQJ>LnqpEC3s0B2xs#dS>?sZI z&0O@Y;=hW?yGGtbN_e)pwq`WYp6v2cl~8(Pl0+FjWSYG0dMz(6$?I%~J88lg{Lg_; zr@z|N3PYXf_bc~IV5>Io6RD(Gs)}Zm`CyBz3mun>)y@rNjK_Sq&;WurUJz^@>u4bY ze)0!d48w-imyJ7b{A3o*OxfKqG!>zOC!+jh_}M;~^dSZ1T%Gd=?k*CNhDs`RwcXrr z+sSk~Q$*YoCucvq)moe2X1wD9$Yk5c09V0JhMoM;<`34q(2xF*V z#YEA=fqP~R*KffCU}L9b=UZ5{hGncP6a+Sd$~trz?-ios^6?@fpnXKrd=#u8Q@_tc zvMzxiMt|x$`}+4)-&wbXor#+o?rTpzDZF;Q-gJ@WJR2(^d6(NuvM`>x=Zk?@tJJ5n zn3~tg4;?VZH`#DRS(Y5Kc)3DvzS^h+To={)b*MFFXDyak4vLa+ZBkdiNUzY z{~2G9l^c6_sv)$+JU&ha7|Af1s~|0QF67H_RLEB>682Gn-zTeP6Xj2N=-XiHa>HFH z8q4}-GPQ%G3+lWxfKuhe@?4(lNAShG->{i(w3(M5XG>>DVTbkm52p;jmvX$ir^d3M zF<#GQ71TRE>?AjH)#FjjIMdktZOxAv_6aV+gR&|R5#>0OAP3yaLU{uUzY@)t=jkt$ zUux5w^4636aEtx)phCy#m0SdKwT3*K>8p+jllWyMg_|DXQ{$0IistomR9LDo(;V!g z$MPJ=)$}c3apn)B;1$u$LD_EbR*EKp_m<3~>L?RKmmoKM2YNI}5d8|@dbBGjoLB7V zQ?0{F&azzjO}HOhD?9!cD})p(%Jbw7`xZdTBz)#C%1-ju`d?i)p-oaJxxU^W2;RlnHjQHl9R z%dxIvY4!-8x$H`2Q?-zNM{=-J-SDjn3T5WJ&JI%wu6$L|(WC3Oa+Sl)*r0%TOf|@t zK*|DEl1k9s}*9X2n51pe?-#5=R)R~E6c(Fsjf4Y!iy zdpCNSa%x_WIY!sZT(zTF;{Whfah~D3$JQ1!wo)f*^`X!^ijrqdBfzFBRJ|xgQflb& z&g}U24eOv=F6;&q0GOoLTJd$s_#(>bQP)Bqz+y5n$mtUpWn-}=#)ye(EK*+4LglTj zq0y7PZ$Z)9D}tF6r)llxFRO}UjAR6-c?0% zJoFSy&{HttAt3aU!|0MDq3{*t)SyQW=RFzEnmn^R61kTiaXV@{QegGV*BeD7D_irK zEg`ciMV3tL11~-uDcJuu+UUENm4_9CJ)BQMv|dFwplumhEs&sx5~O(CF-8rofPniT z3dynqL_utjFT>__<%s^N^W006oLCx)EsfXmmp^nP$fzA%K)J%t?S$-8kpz+ZprU4< zf6p@5Q;F)xJ-T4kRTMIBFIpsAK>M9}Y@!6PyRFPz9+w};RNjV>{9x^R)9R*;xr1YB z^?@>L=r%%kl(ZJBq_O(H`hDi=9hubq4+Os4h(yX_@7rwTD}6D3Z&%Pb-reE0Q*4$t zP)$^AVms9T@D&Jn0^oqvFhC8suK_g*1Go%$4FW49Ay05}7|LpslUprRk+jo2RW@ju zQQTjcV%;=GO>NTDv_PlNr6ZQs;B?H4keuQ|P{F+;X#y8r#B}B?sq*=!XM0n!hl3rAR+k z_~GiY&(k8iuo|55Zt5?rDmkS7hWYJ}5$LQ=_Lhx`9tD?g+wx%S2$RlBA-OD9&uFl! zsbEzhsS{@#9Ag?>^p$|vNDSZ%NRB|n1cpR_MNR@}1oR>=zzB#)4^TxA-K9~u#7qE# zu8MdIvmcTFAahsMy0@+A+lFPDv4hO4K_GTrg00{ZY~4-04SrFFQc3ET$wyWri;P6t z>N234gZHvj3|!zD6$3Y;xGBHe)hbSQBp?qqs**(+sC)ZV@A0#pWJTX?y~?tT_vu-= z^l=99OsmlLlv_YUYn4S=-)eZ%c{K-fLy(*keLk%?xujeGQ{TnB|b6)XK;5GXL#@H8q zQ8xu$DcC!`e_RdZPdwFkZOA___FR#RJ=|CHUqoE>22)Syl*_I#T^K5%JHnj^@#^v*KSbwp0G{ zRJy_sHxQLK2-oJLUy6~71gro~9*yF+DjNf(?_y~=TA%5^OS0nb%u&R60xxZ{^r*#c z?|%G@{h#jNrc6hq7M2;tX4HV50ec0YYBiEm-{=XA!f}ovzsiAJ#L6V!Sjd@OPiPq= z6xIXg2;IHv((KM|Ou0TNwm}vr&-q^p3UD5X5KW{4f-#rQFdXPcng`-2)cF54128pc zB$YGREr?bZd1H^G6!f*1Mt>|Kxl(4g`<-TPG;7yUb;(p=eRjn&@shP~2P@^?%-wM0 zrf;I!Exz4b@2cZWsC&4dkm+ELojy^|ybv{8u{BWUhRm-)(5UL1%)09+{krZcs?V({ zzBTUpfpUFV)Ro;z53NhrMSuHHer6&hhFh5&@f2mZIi`ZQ5cdRx4P7(4Y)UX%EozKt z%CO6tAls?Jo^EoKVo%$~a9v^?y1Yb2LJ43O$z{0D-XbBR^lI2!=6<%YKGjQ+*9-&0 zb+=pzFD}Z?KdUJsoi`-V3E$Ix$bB$2cw_ap=DF1>9^3ph*t&4qsQMic75#-Vh?kkJ zlXKKf+6k-++q5qn-Wjic{*9F|HJRU_7Y0Ql01zhQ2^!g{(h9y6Qt5k>X#Mk>`XZQk z-yGa;KiVToq5_fx?zwoD3UTd^NyY$_1t9w|XES*Sq%3gAF}z~{`vmfjkUxN`M?|}C zK*E5o^(oW1=B*jQSNr^qio|WQ#lZ2=1wSVl^PWrEjr>ntWbL18ZE1BYbhJ(e<7Xv4 zE9)T3JQd1(qAx@WU3?#P)jbbQqbSp9$@gllxwcZ63ltxohDz?H{ZeCQk97>7bho`Wfov~(R!3p2fE8&(M7^}LhkFU-?U=`+WiyMWSd?7nZBK#SQ zMf<#kT?$!BhIk+D1A)!)N&%%3!4_+hrw+S{Ls;W~I>QULwl}l_u`s1()u3^nN|;r3 zyl<~lX4LAK3Jk_B9MwF!R)l9)!=!?k1pLSPNcQ3GYhbC$OxeOv_BV>S;|e%ZYI5z* z*aJFGNa%R#awk)p4>Xkn3_=4`1)iYs-)6j5Ki~fg3v8;M))9*Ns^*&>9p|c{v@kFF ztL#<{dTM=SOO%jfZ7&O=1fmZBnL+aZwgZqQkO4W=LM2WOjlf8T3={j>KM@!jz;yXs z!p^^@v?%uVt`TsQD&)b)$T6ZG{!Fc?^cUpE!nF8SA=yAV51A&eWk|0N-@I z;QG4GD<$#r)pMJr8X{(yH1}uog+7(N3=$f^#Eib1Dhx*$1JyX8ApoZSfFO?P>tEPH zTgWe3@7CZiiYXr=KW6UwvyWv=CQ*7vtx3`r3eyLg&MWWaQv8L%SiWi>pb)SSzqmdD zmYQPzsgUuPk`EM9-kQzJ-mGq%kLt+b)_fpz2jDG%MQxM{TwMAg#gHa@<+?GO9 zIyK?h4Hf4zl050uDLjR%VgiAq4%m+i5~PHy3m5i?>21l4v}MNQ_{4i73iyY{BVLg& zF>eV2gpDAy^w#A8HM^Y2D6*l`ThHujRP}FRiMHb}hp7Va0L)i|dH@)qY6vm92P+(Q zMG`(`*Vw6_c$ZzcEPOc4*dlr#Y2IH(-H@-46hnR<(~42 zx1d+u&820(GW&$UEo=HsCM36twYP6AyopT~ZJrE}+%t{$wt=Cc-urrkIpj&&7}rM3 z@CT_02T>JqKzo_vRPcv9fR-h82l4<0@I7!@ydh#Y?RZEwv`Od z9|*7uSM*so7QgN9linPYm?+uuEpLkxbnBCSkb0a?9k(@r>IguIfj>?SCHm=8$wsGu zZ%F14fJ>_V7i$8W6Rs=L3Anr$lSPdtUwkq!NsK&Tk{Z@KCy`uX*xcY!ML|tt#$>~6 zb?<|NNn*JFIhl(?N|7a$B|WayH5~MH*U|`l_4U)|;Tsm;kf%tk>KuGjcw=bDF<1~O zK%NZ586*T6m;m^R2I@meUj_>TF^>li5AXCkwc49hUp_b^V3;ub~`4==zjWe1MJZ zlyHcCnm&vDcw>20(P+94hoD=+gg`$D+zN~ZJO~+#w^(gI(CI3rqh}2KS=D|ah|=OC zZ~&)YD?qU+HBO{I@PDzXz^QjiV{iTxHEPH2K0o??8J5p9{iM!arj}0;(}c5k{)pyyDOX@c&;$oBRS| z=<&yWlKfQN8c8;o(EJnkuGcMgYqcCH*#T4fhHkGj-Q%vy)nL+3h4_2h`J=+?_xRWc)FR;xUSbV^u%=%mR{Q0>HTgx17}+ZRokGBA1Ek0 zPF;bM1*SB42-Fo}QJ_q(i8pGX23=_U*vrB+X3|BP%nr8{){1CZ%>4eaQ?d)oUVEFc z5VL(FdC3Q(Y5vfw9>LiZTvx+WvmMM7qTP6^jVa#fx{28npXv0bM*@W$f*-5S`b3Ca zpm}rOO!!{^mu^5{1ZiKaA-xuQruig_F8`&x(h=_PU4`%gAHH5{71$P{7X&O5n?p-5 z#?dV)EqHe@=)lbMd}%B?GHz_#K@?+X>E%!PXG{`Oc9&o0*0il}jzX{$m+Wr1pLK^Y+YT$;>g9JJDV52N!N6ukDIu zMp-31#M*rInrYGrFL*vQMA=Kdb8+^tyR&W{C%+ZBCPvt)8BxRnX7 zpHJs?n!w@fsf_7G5E@Agsfqdy_AlV?XMs5ub)+$9kAR;O42Cd>YlqtDK&Ek0iwHLbt&+_q}GH%0tl7YAooGF zH}P3(v6v-guz+>F-B-NqY9-4&2x4|iMcyo|bN(uGBD&9HE1yo;SM4Q0D*tCrj_C`K z?F43=Miz~XMC&N4i7{Y_>I7cz7h~?Ky}b1R5uKPoNA9L|)zQdLY!a2Cj5#p&b^2|V zo02%dwTds!L$oG&nA`usFY5LdA66J&LBz_r**RT|quMYd&)?!0dndE*qt07l&y4H0 z1z6Br@dGcEv#7zy2n>K9pPqXYD~UXTwZ_99;fRe~&`_|toXU`%E2=Y9IUSF) zyA=y~F>9I!{2Krwm)m`3n_nwHX|ePb`N!vA z$Mx7q(Bt@@k2m$9NP8-C=)a#h#F(4y>AGyWIY!N01?vgw@Ms+srQa_V$KGiL`~QXA zg&413S<4$HDVYJTvgPV#eTR$XtC3Pf3j07QWzQRBz2{=FetUo`^QMBo;Y zg(S;SWD<~5gs1@!C?FV`RRRY1KSw-}7hl7!h}s0_@sM^&SG|(=Z5%X7a9U!<@tmBf zsyz+ozb)q?FtbRbpWR)N7Iq;pL!tsBkxzh2wzWA!W+cITeieSeS`EY2qF;^0u%`_Gtnb-U-v9 z&V?m@Ce+pybzzT|iR;`2lP_gQ;*J=Ob^|HJTKbs>C|gL?s~$HrhUf{qXX|>J>A#Irp7T-m8)1Nb;JEeet(8KPTBu;`(~#+i`3Im?DM z^Oe+Jo&H0nPu?qZEI1d)*ArfH!Mg@=x@WeY)E=&syp+}&nNpDWWk7_R}b#Wvp#o}k~AD&a(L{(mYw1*)``))p245HNm$Oc zGXOPn34vS+Ntm0cX|h6ry6kdYVatMG%Sq1wPA%)tvHr{_K1X?%$_3-I+ts(yspBuB ztW)x=?@urKiadxJjiH>W@>rwJp8X5My9IKdjx{V@Ae~IAscJv%H8^To6)kXD?BZ^x z{dH@;zWueGS1{E9eKN!FwBsO~7%;Q&qXMQW+IzU`#NApUm zyU~Vle%uwc&*$^x#X1r6_UDX3I~PMS*Nao1 zv6nYxG|4#Boep0A6Qy&%a*%8M!KKM5ykS_*vzFVRtS*%{h;@38J$ZHUI>j^3-6{-n z`m1I$7Ive3JTW6?IU271bM+d<`KQ8XT&zv+V>fUd#qtxKN1QlO``yYOM(>HA<$j*& zSLh0)vQQ3IXN%QysYYomW@WGSi@;#B%P;PHdHMEI=nqXP9KQ?8sF}J^6%{2Re-L<( zsW`7GiefckwO+O}0XSYCL%%CuE&j6d0RrY1Z(o5B&yo9!5oXtU7(&n_tR5Q^=Aha|?GcCJ^0bw|_&dE`w; zO%?&h#@wD_hxt|7ojTt_hN12f)Hlr~XE(*;ud7sKya5FClv{VPMuAv9AFDVQ+O`K0 z^jb@cjt6Z)I5DpY!eO4wfEwV)Jp5zm;1G;2T9)_1$}nT7JnUhHL8VGOC?2|-!Gz`p zb~R2H0~F^moklbKElxYs!GMyoh5y{m(sT68`7bVM35HoOo5ZP+#W0nCcjyNa#GAMm zUJs@1NcSVAi&+j_8<{cm^;s96xn`qUEah1TwE7C$q7t9X#Q5gY)PLKrWa(D60$`Bl z3#F*0RfS8KQH#VlKf1jFc}2Nwx7<+vWy;B-`UYn+((!!P)skk(+a3wIe9yjUu31%` z{FJ6&C%_h^INGoVU9#e6i8K8CYj}NNuKXgzWO+Yj(M-WVuMT1J8$HuV`v8zqPc$67_tUrV@^g6Sd~>>UX^{2w zz=-jHnAgUQZ~iFB;YT5DNqZrzHD{CsqYPV3`zz=1@U%0!n6cRYo5E)@3a5Y33N)(F zlbOoLi~y3;?%Ph1b@7QKW3Un@ekRlOXOBhu`#GH~(^#&<(dw*l*Q+Qd`&AWi6@Z9@ z!o}t6{Pn5o`TDkqSwE(?)@CVjk44DyYc7Fg01tU`Fo*_VhfrxD0W#9SIBJk@%s_51 z4@6UdsiXs}HyE2zo-rP>2--?uRWV9k_Lg=DGDbNTR`;iTsunW!=NNr2fhnD`@i&ov z*W~oToZYT8(8FvPGG5P})SpmtxDf0sU*do2)g%7_^&nblZLZeK(+bW@%3ksxuN-cF z7!OB;=46#DsWwDjr;}LO&ed3u#(Wr$Gd_2&KbYE1e>_3!k5^06@8RAD3mq|5q20{8 zxcZc%5vnP#>=cQp8gyXR^;L0AD@p?}vre7w)sly;iS+EabK+xf%L2P*7t}OLK0B}Z z(yQ!b54pgc0sPXnsTN#~Y@Fm|6UDl&*SPifVcLg~{t3YEDgf4eOSGHLM3=?O{9TEX zsGAgv{MAMFk-ywO+|`ss%;oqgp<8AbH}law^E*m_cE#Q2%?!sb66XCz%Ru_TMNDl&;My~;VBc4dxoRtO*orf*1%W3Nfxf z4)%|IgoLcnLtfxMbf73n04|Ij>+-ePBlo#^#6$CmF^o5;R!jO$TXPIqw+`WV5|YwO zGraCK{-pK8LxHt=1S~5jE;8&B7=z<#`lovh*%gPxfkAXEgWMT831C>ymUnRSo^&HX zSp$i1Ms0QBhPBr?`|27ph8h6AQgPcZs<;eni)wnTgy@Hu$2ANI7^RLtjVMR=b zle4yt6)GI;-zN;=Ke~cSLpc`|cjk_&o&MlqpZA>-H?&6+k?kzzhoztN`{PDK6L~Ji ztdTae@+;UE3<;E@7 z7l`z^UWjM8PLn;_Ws}-uB*AR_z=f(yC?WFaMZ#a$sozF$FdGFQDn}!Z?A#K3iy4n> zO;GoSv0(`>YVGlvwit8cl*Ed&MQz_geL6+F&Vvm~A9&nN1W^u&wA42dL_#XagNMP6 z2JzN`bJ-~{pF>NM7-fR_1^w&oM|_V)MIfQEeq#KYRlK47zT;CFVxq zi$g&%t;DYyq%8J3x%AE1qp;gchy5^zcpNE%hjDzMfufy42|Uk}(eTTcN5FUG-Q-YvA*h#XP&@yNIOyW7fnkO#Gh53_f#{W zP_*fK#>^Lb3O<=xp5S6dZT~oF1ZV!>b3hN-sFtY+_u`eDH*W`*EYMv%NLZED(?-0> zqv7j}|I4I_CYmTn;!b=M3uP)K@veeYaYO^nnA}Q?vh~NSr4amvn79(*K>8VpGQ80K z?WG(m!hVSOZ?ju{m$+iSpq2H&j2qEZO-?O+QE<4PmEXDdi-&?FY&4gJVfroV1Ioo- z6Z)4HqU38|0eH=v?FhJ09xohwfV%a5>ut- zovH{PzK0)wBz;26J_6I3%=JYD8aMRgxCbVdlWtu!Kl>?NU2Z%Sf1}`{lhngyH|EsS zB$wfbLP&A*s~BW{0_6f~0ZBOy*)@`w-v%&s*Ot!e^bh>Z#piBHdAIcEYA}CujsK{p zu2Geyx7vjk4siGP8k&z6#f~qU-^dZI1LKk|pM{^(%9gXQuGyVW#@RhZh-|*o?FjWU zt(-mmoZT%I(}=gzkzLM$L4QpHrDp@nWASh=9 z>nFzI7jj|uq6S`t6~3A}$HVTXHhKMVfG}TONV4Wi6rzKP_uuR4{ip^5Q0Hy0sSHPNJBUV zJOUTd&qV`J9J~Q(1QRzm!sM}*mMt&np}-y!#i8~G&{zO&5A@MeK;0RPU?w6!@1ZOd z&{-ku0!iZ{iKMtoTqrQzv<-Zf7m*%FY=+RHBW{6z1Pr3dB7Qt9m-QdT8U&vPFo0`; zZvpWJ0fG>Z`zMYAQ>c^U1QJRIr7?u4#M4KJ$O;uAV4?-YltvD|<$nMxGc=<3%Rk5u zTn8ja2=##;r01d9KQlfV<_BO|@DBls=xbmRz@Z=DipGgceGJFsAJ1f(2c1Dw7FtlY z>;>&!C}#%O2#!+xFW-VL9YT+W!AL^_co8+8KrXs~j3E1&Ur5z|p&a1;kcRStw?d4_ zbBJW(1WF|3!vFeSAn8KodqZOP3iy2RCA?rjFIaL`3cz}T=ALU2{|N$o8>$8IfH~&i z1;ALM?}AJk8922@gcI5WfUyb$O>8|7A%X502zW?gl?b~)&xx(nfK&rnA>d93z!s@I zw-7Qvjn%3F`Qb5Z2*m#2wjj9z+8lA@P0|0Fn4vErFYE+En~8b}Ai_92_``Ov3X{)p z&>MLLiQ*uK=6!(~?m*SR%@+A z{YSgU1B8gU%tR8@*<^zYYK)=r-wVr5<-`JHf+%_tXqVV@feFYEJq)@yk|=xd|NrX0 zKtn-8SLN|YQ1JT&z*hV>?F=Z{@klK&5t6tQz5#8)5icI->KY_zuu~xRgf^Jj2-b`^ zi4nSNm{N7t$4COAFgD zk{l52h*9h(SOw5Cc;(fh=W+staxdQUonxRv!wGUn1%blL!P8 zHC_K*HCRX>;V7cA|F_vdD6d2ViH!IuIA{+63q~#*M$_V4YO6N>6n_d-i8`U?DzX9~ zFG#Uvp^2&B`9Gl(SCHh{f3z9m$14(tQPJ%fh#wyzNn;IZ8eDTc^lZEy^cSGS1f&3U z1|H`RFf<{QE}2-00#*o;^9r=ScEH3z!U9KVazO^l`FNuOj0+U)0i{BFZ|K7N@u*ZX z<48P&7(!E8p%F{RW(?qb(EL@PV4}hJE=FM49KmnF(f~kf*1xd31#F5~qDlfuf-R$f zK~jL_CrfG;Di9dx|_ zRU~RGaq}O0dSFc;hXH6eg3#>|4HjwG&wSj|o>F?flw4?Y5hX#EOVk^%SpCqFsfkAd z)ANleo&&J_;Ye!m?O;EHP4nuvfiql*#^@aamK+ib?MTBRz~2Y5Joz0o_$oo8Oo=N@ zR7F0Z&+%>lh`zR7k5DG-t8^k$|-Z z5HNKPjwP48pAVp>ykd;d#98pxL_pE8{bveb1xZAl7+MCvYNv+g9)h*qfJmodkwIX* zDrX8i@y_*LGrDWI%WaD7u9n1MC9Bj zga=1tG>{h~t&d;>5D(#He>U;sfFU>{|B zGkd2s!3W$544UjmG(r?0lDG@bO*%DmsdFU6k1{@+CyFei~&3_IC ziW}Ag$4*2iGHynI!@sPUrk^C$oEoJVerAmiaTewAWO`o9lc`@{vZ#fBbH`9)+ce&h zZT_$^;QjLz<=5!&SLhx^yG~qBs!B#=VARXN-3o__O$&czl&dP3WC`CR#AP`H-T9}l z%ur|rnTcc3uJ!ZXl|fKN_t|`nDwUcqj8KiCA&57Mq<*=`p!$kK+{jqry(KwNF}jvj zFv1(WnFO3kIv+|3?hvTWU<>;_V7x#su>ffS+~Vil&0B`EBnmF6{wL%=G1bPqzP9mO z+;+43`W#_DlbZ{47;J^_-~k8h5&r_PXmE827r5Tmsu~~R{ocqI-t9PLqj;_1uHl9x z5udMW#HoLvv25;%&G93%*vBSfhP6HFff97YMU zFIqNjX;g|SPfCk?`SwF1>k7WJj82p<#Wr&Jb_zazdiTo>GjZp#c5-DVdGW7i7rceC z+f)zoHF~}vAJ2ZD$zKpza|Wkn7L$2d>VCj^kL|@hcITf{b2LDYhteN!acJW)qxTHB zHXsIvUtuTdSzvV-6vx<}*Ramr`GuN-~mYg2)5+hfIUq(5F4u1)Pa*H~Lfzaya_ zH0||%-szej9o~>RCqneTffz7)AQU5&;fVq}E*oq$V9b+Y_6j9RME}7V!K|1Jj|SsV zy8Bc)+ck4zrnF`vo0OJ@qxSmScM3PGmfMaP)4i7&3#D7D&wR8t(nQ z)q+Z^Z+o4My!uA*geIp0#4Y;AW8nBZm1BRCKv_rJ5JXx8=sFGpbKlA5!TtdiL2$30 zg{03IjbB{1BADiK{T|KkbGn^jg6m~r@VzRKGW`$SRMe|1DRR_D3Up$n1ja6YHNxdxWZu#XknN06ZzgM6c zb>?y1T8sBGat~Zc4Vg0{VBtFCgN*o4J<0KeL}V*C5aN=oV_F26Pyc0g6kkGT0k9T| zk-!WyDCd$gzKMm|xn)kZ58A6o95q?2g|vyscetm*I9%ZGnEKqMGtoPI(9yr&bIBIQ z6RLM}VW%{fLI1J9feSpWob9ucLfLXyXRXtpu@R-Y0)hML#S2=&b$zaq{w*xOa!EaR zi%A4v2QDG3M6<67JaZSc^>9G0U4TqOLf;GI0?f;+A(AMx2BiQ$A?hh4pZqgnSbL}_ zz5+B81k4sXhXSOO;Mm;wy%v(cu-NNEN=q+8KtW?fbdCizF9i-GTKphhf&q@0&m~>{ z0g91unsJ-CH!}>Y;Xzgz6EpT>%{$;Bc2<3s&0Cf=W(NND?(dzVyxjfh9)Fd}ZYk^a zJ3?wRNal+9s<$=OR!^u&D;cb)mT3BN6SH0SeXAQEwO>Ah8|{>a$*eGmm=|_04jYOs z$9WMwPv&wcchj@p2yNSwAC!Xl4mBFyo)5wK7+6eo6$sT+Cx~yGDYFm#c>Q}R@PV7w za6|5<<;yz~67B3ls*?>f%d0ASw2~OF7$fAz8(S%Cr94uX&ajvX#|dS+Kha5Wl26oQ z;V!IE_ZBMraN**u-tS-agf?|2e9k;M=gBpC+ZUhsBa@@C475(yFr3qE=Zug(qrn#J zdlE12u-z%Tqygb>oGAdGArY4v-23yGa|?UpiXx140kYF~QKIBd}M z&G$n-HS3`_3m?miLfX|0_F`qD0v>7uld+<;Is8I;X{MdzsdkF`+fJLy`3=pfb%4VG1ElrK?21V%GyYf=1{t#cXEOAg13)gg*0zrbStk>a_nT@ z8({|CkL@_cvS}qaO@@m3Rs^*uP5p(j*5$_UzWHjV^X4IB8l;!O!53iE6z#=(<2S}W zKf5~|^ORDmQhGYQf1=XsY7XlH59Rn%mXnfOwqBNCw%+*!YaPeNlahoy!?MDd-G1i+ z=U4^3vJadN(Mr=yiSrEGmhpj$g)Q6HH;rmj@=_+Yq<5u6Mlzn*dlr(kY~Z?Q8dG*S zUHB8K%*FScjE7xmKB&=s?W#?_Y~|oqKmm&x*+|KN+;4swrAKlm-Gfj8H`POGugtGZ z4|?t|Wd0DYrT><>J>{X~le>~yE=Mhzxky8>Q=dude~^@ktq+yssCz5&k?@iyGN8;|CrSQcy-cT{`dM*rk;y6Md>U|QnI*m{PSafS z>ie(P2gudcW85pK$>y^Fr*Una5Eye#}Mh^k0YoDMNQ9IH?B&5A)z$JYo(*e87Xe=#Z9=B)(Ea;|w3Blj%~b zal!Y>hgXXOWx7EZYEB@Ce)T(`EolT2(qSYs>xYAf+$={xbN|BLTi^TePjwXnhxdR* z%ZUXD1k)Do2NO#gO!sE*OmKc5l?-#g58A@2>)u4OldFS{c&qiUOtn=~vrN9prOtPG zN%vSDd}qu&s51`&#J;;BvTJ(Z8>!a6yjd6!Q)&|C>EPU`+=zSjoz~Ues9t5+I*?|h zwsu=&wAr3xtmXQ|3`=-2Yc#D`YOR|#$oZ@W~t*(JsIc>LR?%8V2yNj&L zC6zpPH`(tE??{nC&;`XktbSM8sp+=M+{PlGahMMR_M;bLvZHTE2l$AU)HPZ;z1PW^ zpKl_oF$jzHZZ$E@s*n~=tz7tFkZTXxa0;Hve6@;QcQ<&`Y!YC12|np5e3qajuDnUF zwO-U{XSeIvW*+=iu9YvmIEL-Dr>yZkUG;gp{aEU>yj8b?TJQ14<}ryT*Im3uZUGXz zRG;vKJf;H1f;o`oSNxKQ3WoDN9 zTO#dF>PzEf{d*;5R+ys8OYcYOEakt-c+bV8m_1g5(-?GWOuJQ9_S|nycf;-*C26AZ zu5e1!l~|1_RMlOZwl#2I3$>1&2w2q>NKbhByQr1Mz=EKrj{OqNZ_%ze=Fg;YD7dlGcPu zFk>)d7iR>&-Y5*hg7!d62_AMCNyVfJ0IiN}fmv_&4syxyH>BM$_TO2H*HCj-U2pdc zf|KFTo-bZ6=Ij!ROwIjV!lNWuRT6Tt^8lq1%7?TvT$yZ))eAA>{EkpP>O}KUbsy&4 z7}`5MIJzMMINam%fu>52l|CT7tnhChyD3CE_tGxD|3p%63~yyKsyLh*nXs0Su5$d7 zWw`K?TwbX|S9vn19a$pY&bo%0wxTf^OE(ClP$)SNCTagx@C^i>1vvmZSP-@v2kl}P zp1e>BKX5Cc|IT6zI>O&e?;Tw@*m#a46Y$bMJ>>K7KwxLSv7cqYm5bdG9dq=R>5j@1 z>kk1|KitanMu%gV7TtE3KPvOM(YC00XDGz!?r-lM$(yF6ymR3RcbPT2t#&u99pe?r za<|HE`$(xu-!|Z&oK11bSPJ2MYVuK+u8SX=?YJ-dqLpc=y7B^|XW?{=(5#cxIf0Nl zZ6xt}i3<;w+;0uZj2&0PbF(en;){kob@XE)X}aU8E@-X3+G-`xTEG?-wRFWv)W37O zyO|Z+wb)fkZM4m1=94me^PHoPmZI81y;keE%qZ2{Su+LB$4wcGDVnX_fg_eJ1?Rn9 zHt|(mQ~eTyqVf)MO^nIvcDaa6D5^YN=Zs)*SPL+n>`K#GLHB)I@vG_ z3ouvf8fUDV(Vp{T59cG63WYmIib)^cWR*^>yI<7|6{9*p-x@;{F?)wbrUS5x2r?7k zYSPBlY;TOzG%u9_l2)VCi&I&9i1c4YVh7Gj7BHPZ!=Ec*Y=ML$zEJpXZjdg_){XPW z8J!%!*kY~E4Lxh~tGvjjP5e=ZYj!bKLcuL;)We3v}o|1oIBGiYjyAQ8TsqgWGVK+(+M+7|X)XxCs+ykPRa#+Poh=XxyqscD49GPk6m&(0hDiK3AQKum z%!7`n%xBF&aw1-*S3Nr55jaq9Y+d)#qUXUbOUby^9;JI7?eaE&WeY!?vwk!o^P$7n z?UxyUrYS{X<7f_WYVUz7FReDWtoV4z^X&7(2r<3weyimXM*G|xJKgt>^$x7Kj-3cAK7gWG0Nb4aj1*K0P*M)ba5e7hM%X(`7LR2H zUG-dIWWGenC`1sUO^VR7VL7g3cCPP$(Y)Bx{q9K0UYYY!d+GF{aK25O1kg{mKj?l; z207ahx!Wpj2b^w(o+%a~VL9#5I?K@MgHFvXVwhPvRQyu-NCKYVh4r0&_eVHII8i%k z=6q`8HQY)HhYmyB*!d!!JJ0f}vJ$bfC77SLm^X#b+klN*9xP|Z%Na9X)JesmQTX&4 zY<2}Zg>MvvUA*k(I@~DcAR94qNyrEm-idZ_;oBA;Jrj&KvMS-I7$ILe3)A3pQMipmvK(7{Ap`? z?RQyCUVT+?lYb6Lb~;p;R8`{laNmys7!OOCxX#bvE*LX^wyc?s4Z_{NR?2i`@rXk~ zDC_XkSCe>Bd2E_0y4Qj+#_2s~3i}!V=vK8fXxe<*WFT7JK=6CK3&#;;4Jk!3C))SBk1D-;18pr?07i zz~0O34b4)@HfZGP$%+RjiFilf0kuwWlABsm+v(7N*q;#H9`{px3*erI8N{K;_5i#aBpj6$k5 zc!-Xt=6F$ON^l?C$cJG6} zghX{v`jJiYHw8i3awZw0!8zSNSH4mCPq{LbE%qA=hukoQ@8-jMy`?pVA6Z>^jmhFt z?rc8YG{~!2vmDTr;12zyVNf+Lzl^uVE7PQ!4hD8%MpQLAYRFv9q#%){(!VOsHzVl4 z@qG(~1WJ!cfH2VsEX;($R1$y1+D*0UE>`8e=pLD@%irw5HlDG3&G-dy$?n?Qg-vFe z`AG|NE$~;enW{bReSTh;G<^KU*Dv>9JP`A22fctsDOoYgQEk-To^0{BOMZ(@TeM%X zAK$T*)EaGi1t@E+WbTv>s}v1mSCXqdQXY9Fj@ML)ylY4a1xK`J)beR9M`p@5+g4D` zSA6fb7_dxzNvE*dbCDE_yukC)aYTujL%P*6DUAkt9+l~ikfSRAZ`HFT$M?=1zQ5Akp{3$)#2cu_Aj;Td!T^QX& zrlC@P;JS@!3M9T(GFgbF^T?0#@$bLr{{qgj7)}Dm=qz8mF#u<(yh9a%x|p4QVSaE^8(Bc$z6T(=qmW@U7Xx^yW%yw)9(AV@0mg8g;6e%#&jy zjIRs5Zb-T=yHGD`bYh_)QSRFI|gfWioV`7S0@k!0fKDM?`|h0_vqR z(8wV%FfmpH258Qr3tBQD9^FOE8MfZdFHAL-*=3wTd0Aed3dZNeibs&jtdon;1wmjj zR0n#u%Sc~R2#@)dd(sEdY6Fm`1j=~<@QannXM3Jhxn$IFg=jo{6zyexWnnLZkG}34 zd&JL*8=j6^pFi;dv^9Nn0-@Zrd`H>RQsd}?R_(7x@>Jba%O(0#Wzlf*ep0lwOPiwP6MT!GWVi z7YW-)O2zyzFw`eh{HZ2)DAnv~wN`8Acbm}s&-l54AVICz=@M|Xx9EZfsfWI+ZaU>9 zKw7X0PIky{$h{fa_lfVe2Q6Jk<$`x=zbFdH4 zD{u@Tx|0NO8UQdR4cJDYXwa6aScD7xK9U5&-J)RpRJ_GB6$o+nM*d$(*B_VU)wjoB5+!Dsr2%_Gu|Pw=^oD5TiDq zwpGupbLe|lwCt4S{avsn za%?;EOoaYUsI*d>ipFa(hl2Y)Z>BPD+wUeq)}WWYFxX2M`Z9>>W*Gnk#~b0Y%6gv)Y**{Sj| z>K1$jTah`;PwSylW47k-;QG8Oyl@Z zU}qT?;FJz;VL4g%QWnVbQi&+s8#rzcKm?d|)vg|?1@sU89(46WWt;O-)yI}icb>E- zr5ta=_B3qnUl!dX>gc#hPPL_Vmfw>9F2Ia1W`4);)Db{V!z_KbT^H&DD~G+y;U&z1 z3m;$cjx=Vp<#tP zCUk$>G3Kh(X!jXHnbZe`$Kkd8V09;Bgx`P<`W@SAhRLS#DGMSg2-CzZ-wP=tJYL>6mMPNRL|7}V0zUUbF zE$Ah@F~%d!(UQtQDbtnJOy_Zr;#g5r5`zfTdqG2&0!!^R5nf1Na#EctB9XD{80C}+ z(+?_QjMGe5#qg&UMzE|XK7FDta%q&sTrtd>F*>P8DMN5Nc17vD`4;$Ct0Fb36Q{)V znj*pYzZz%n<>#SPa(&4BUw|)xJ(6O^*?2Nb|5_mq2#Qt9H}FWXDeB}de2#oGtpLy7 z(t`8@Gc;XxHu6ggU}v?PP~;##xUL*~I*^`C1%*k4_YkMVN$Aj0YMj@Qd;Wst_$>@A z$jLTe6f<7i1N^Lf>pF0;^-Wbk(Y*evYNQTa8@#~FX);R}NUhjG?~*iVx5?}<5vKfU zxDY0@KOfgjYY}rD>)9L6ezrlGks0?*{nyNBZSBo*S`*z)EBp|j)mKyj1|t2NyGfNb zhM}CA=^DsY1b64zvb>SiL}f#wiENdW_n=b=`0C7x73``{6Loo?byj?8F_0{Z53R zQn-31r5pGAEt}QfhWk~%Tx;CHLe7SVEch;%@wYYGs)2?fPRkQSwR)?N-Nn~I8IdjZ zfsBqAWew_@R+Tt9Uo`fbS6uOOP4ruI$$P({7I&uwPtIwpBH41zz*+cz=5aiXHM{;;LzVumTYH zKG#f$sh6w%}w$d?g}ui_IvTDwr3Ct})@ zGUicTm!Xmd*ON6M@nDvq;8yjG4mM<1I&`%=tndQp{z%6FU7^$!#gL?M0M$3%yw4-2 zS_&Eq>To}5d?MfOA3~8`ljxax38KesG?xTC*CJw#47kOK_l0SiXa=w z9kV5vEO5Q!0~G$J_N99x`j4xGQ6pdN7MWhp#?i{}y39s9L{Yf)v41Cj1kYAE?8~VKKifr1lQ*)kgRgE? zmM5kN2*uX!vOJRa+FNC^MpTQ{oY<%4bmQ1}2S2O=@OjlvlWq~A-rTICDW{|(ycv}P z{^1som>rb@b!2P3u35flliq##i(7k&qi zP$6cRjTt<~1W=SbGTTc4$AVMbI>q%}M`m7aIlB7zCP;FfIrvSkNl!jL|qdw)#>&D;VQC8Kr z!JYgO%V=kDF0YQ&bIpV`ar#)pCKCp}sAj%0Ve$!9FMJ7l=mnu| z4T>vF5kzpm2Jf1>A6a%GAq0>tJ?JqTsi;HUatFw84ObvMgu6*q%vU005PzRW9tuR; z9R5&3nfY|c{MeC%0*r4Ik)C_1?L|){dYg(UAM(QN_+z|Eg{<)zz)6;8fx6ea#YAx5==`wq#b9F#w)Y$}N))7aoTQ;IqwH<+ z@1Yi-ILIU4o0_QAdq&*pcrA4p0!I=GCH}Z9Y$3H1@c$CjnX^hy_Djc41iW~d&e`DJ zRdnQ!sj*dh&qDD6zWsdOcp8tC7@M|wf3dw81*CFv);b`pbbTV2?s2Moz(=nz(n#?N z-n4%m-0zmON7?1jvp0t%@D4{g>1`svS7 zR)`Ho`<`(Ivzv`?bG%mzcZHZA^;g+xEB%CVL@1xog0O-c2(gL`0+Yc`kUJ8saKbC0 z{Ts#tmIcwA?ZYZEB+7~bRsg7B&X!Z$3E`%r>wGFdoE=Kr6u%=NrLz6#Kcm_=h0MKY zQ}+P?03e|Dx4d>+vDgU>3jy{wG!46)E3lOG4< zm|*?0kKV%0m63*-3Y5a3>^Hj}-h?OlfV?m&kx}yj_+I6dBHds4ye{JQUF)gqGh=P!Wckf2nfVEeFk5ab5bmVw9dkGtXU0v?$^ncE^QdP5xtKlp7bR# zqhYP6aUqWsV`cT`g0Mcy8s>%VV%yWT#Zzr4LUt`I)?-x>$*#+%-lANn8jA{P`t<-7 z&f|qNWeEye?$v>DeW^dIh)Qr)uugU%6JpDoKtK`HTY$8K3>wztM*P>bd$C&=p7~|5 zcFO_M$*bIJNn45+JxQ8-BsYV!;Ki%@#23ct7IghEXHYQxp7Zlj6{?tev}(J&!GbbV zm-UA{DYHxJ^6c#_vaKEV>eRVHnk#EXH@w3yju>;yy&rS#LsIW8NXm$~X*Nt9G zwDp6@pPntA3zPP0G97_mm?xJlitxWHE72}KwRehj2|K{IPUQ)&MKv|Kt(Q;-lkr}n z(i7X{7VaWse)HbwRn^k8(%XvtX>(XPr<)X8S59@a5H*-HCe%rj!|?0s zq0j3V*kYZEAF9zl?(ddNx$8lCD=~Zbcef6uaesf(jF!CUKi(zO{iFD}MvM0KA6FOT zH|%n=eug=s!-1l^l!M*hqRiCTjOdFiugpg64Mz4Jm`jbW<>`ES42x}_;bb{^v0HGF zN#6}!;{3MwJDG3vxi22XoYe>KOmkF=j>K0ScS|nOua_77QApd9{6MyR^9}^a>tJ(u zb#>FW(X$VTd6b_lXDW$)35!rBkK@|#>pAj*ZzJB%gWUqnI^=3jz=`wb_ho!>&-lRd z8NO%z@Upp8r!EP%e-kAAoSnITIB+qhqmBedhuceMW8VLBAJ_H3W)Y8Ey&hUg)uq72 z`e@2^Z9BIyy>(jqjc4qWN9ylX6IS`T!a1m0it{37UEvd_>$*Otk}&XyET5~kzIASW-tzh`gb1H)}yyi{vUdO Bupj^c diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg index 3217988635d0b2f2c45c70d73dc3a1eff754c770..80b8c3c8abdd8bce55727722ab9bcf782a5f6b65 100644 GIT binary patch delta 2331 zcmV+$3FP+A?*f?}ka+-Mz0>DHqPP#`mW{&g1oX~nEyjo-oujc^tBCS_EAA?-fOn6~l2&86h7V2&6fKHd z4@n#C?;8c-0R(l%PZb+oNGFwke^8;;HTsd%`%|#gLGOM<1LbFCUBqO3y=jej>jcGc z%!#-*Fg}#|N>MB)o=A2B2lzXWeALx0#IVIBAQ1GTni(Z6BM_u@+>E}X6af<3uh|ye z`B0%xzA33}%Hg*r0nZ6dNTkNgZW)S+0NQIoKPp*cw@C{~_$=a1y~S3gU5{IM{IC#_$za{a zc{CeP(Yid2%Hsz#t{lYJ#T0}k6aa^%6wyeMmZZcepaPPCneT-!98=6Nr9e2OKY@$td20Ce-{4c zuF4EDGYyA-KQYEWl-X~v>j3L*``qp<$MDTrse6+53Q9r>N&pQM##t8c=}Y!!^sKqi zdnpU{XQS-T?MJjj_A(Rf&qvvx+K*_1*s?RHAvrOoew5>68A6p(e+NK&Q}(5MCMdKj zFfah^K(ruWU_hCQ`_z4u{{VWAXdc8vYk~KuquK|uFVR>Um9B46-IzMI0LdUx71GKW zgU0-sIO0aQAGe#Z^>e+?so&(%iz0BPZ_3Y9ZetrL8|R5{kTP+ zml>v!e^FPtXB1K(j`aTkqDl0mv;P2(NdBMJkFr0p^B}o)8iXnsfJYYj zE!1#n$!I!}NfTzNT$A?bKqnO_h;B0FoZMnUf5I`-6=u=0qy^+b0jpTve=5-nrFJxB7Q^cH9UBxjB)mqSSO`HDfdo;6k_UyK@%#^(KG$I1s< zSL!DE_bv)6GZH(5GC=6PNT$GsI29YH6#7^%?%0ZG8SdkhbWzPDFtm3v$a+6YtLRrg zf0hym8ad^1MjYf*qlm1sx#;+(ak*aPBGsc~u&GjW$mv#;1sDJir8e#omBr0LBqi<= zOz^ajqU^#*U7vD4UdN?6+T1{=oU?T_H>HN>?%1BAnlUV88l`ATc6TeuX)KBrQX&8kBo&cmlO|=9Kgi^!Sr-tPw`-h)OrxQt1Xatqy-e}LL4Zm0wYbUM1iQ~C1YkC zKqi_R+^45Ttgh@gHhP+E`Yci;h%ilE^*R%N(#5G}SYuXTPJJpX*Cx+$@w*g~GlX?a zb)0A|knI^GCaVMA4P8fKAgf4L${^~{l$`+}x-gULIJ?Z;{bt4hRLXl;&qDLhr` zPjYH}Leh$o1*Zy-94M&~5u`O}kt#XA)XDzo{#8h8a<-fPss8}prfPj7{A#+Jui}>q zD<}*B$E{bt7`4FY2&9OE_mL&1{Ch|As(hvy2=xKpOLvaHzhm|KZ zsc$T@hqycr)mK}c9P#*;<%^FuX!3gJnpcm^gJbn0pRFS_(zEJRSg#`+Q1Ci*sV%Kp zB=coCV@sMljEU*3QDr|&*|Jj9q BJIDY4 literal 47055 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 Date: Mon, 27 Dec 2021 19:07:10 +0100 Subject: [PATCH 333/503] Delete TeatimerHelp.jpg --- apps/teatimer/TeatimerHelp.jpg | Bin 5125 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerHelp.jpg diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg deleted file mode 100644 index e22960c668b2e7e1b783163274d6c80cc3c90416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5125 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 Z!0XbiQ=eYi86xsdy&oXAAyW26{|hcX0fqno From 9084865501c9356a8f8ead9ad8db8a54bb880dc6 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:07:21 +0100 Subject: [PATCH 334/503] Delete TeatimerRun.jpg --- apps/teatimer/TeatimerRun.jpg | Bin 3981 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerRun.jpg diff --git a/apps/teatimer/TeatimerRun.jpg b/apps/teatimer/TeatimerRun.jpg deleted file mode 100644 index a442d12a577e17b2335a4a5d6be07c6eb597f27c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3981 zcmbVNc|6qH-~Y~H8^T~v$xbu2%-EH+3`VvY!ro zn`|Yi5aCug3Te5w+_(tyd?{|v^ZNbqJkOceIp=*o-}m=?-tY7MoY(M1d9MI*0^S}E zKp+sn4*UVU37DPD3EEKraC8JT000mKgdqR`2N5`lwS&CxSojG<41jJh0Du7z-@roP zIuEh~;QPi0*pQuDxC(*>U>k98gkU%L;^3MC!EInE5O+Z(zjMHB7igQgfKl)n5a|~Z z866r3kQ}w0Obm7L>#@)l0D!&SoWuQSp;0=a0a1$jI(j<#08ST&HO1mgaYl+*V^dvY zQ=9<+s3zoXYJ#RGyV7@W@8|5LevLF9Q0)f$7#8s2ETJ zI}_|j{?nKJPciVd<#j&Tqt<60kN5EV8k{!1!A2b9)%*}&e+D*PV-utQK7uNs->U&U z&2OyDk$}Y=Jm_#xSC`}nhIqdN`+;pj2w{ZaHerOYsOUB^Nkx>TgoNa7Ie8gH9Sl}i z2cxZ}XG$>FGsGKdXFDk>_8lvGEd)SV5q4V?ea zjn@t!1%Y&c34XVo#hrm3TfW`9jJ?I^%M7 z4)e;@+`Jpb?2^*5@`_(?)pHseo0_>T9i3g>J@@YSJ{TN&Iy~}hbZmTL^7Wgk>6y2) z?>^7{{bhdPpT(u+bzfkWezUdZ?0@(|g1(?|I1DbZ?h68q1v?B0=TpM+OIW!I_#Ky2 z#+?(Cvd${1yDOxkNBo4ML<}ILRrM#-KCfHbaQ445mhk^_wq@*JU*muX3@kk)3<+2O z4>_M6IEKlU`h>X*)6QrLoD`e-i4*>XF*;Y4n)BhJN2hdRrQ{;%TIT{%XXd%>AjfU? z3qB0xdMS)Oduz3eVs^aS({azi7aZlwvw6R{H6Ab>`o*?^c}+5enyFwN6kS^{mm)cL z* zkvSy*n^vioKBm=un$sazJJmDs$aubdd{OJ9CR4P$J?8P>MF&bGqD~5*nT>yeT@5-& z6wh|y7o*=>HoNn6X35pZeNAt$Gj7|CWhxK27=33o^5>~Tm9=vvpRrW7atSAFwO}B% zGJkQQ*SK6lW(n07VAm^@n)MgCj2o-gZ0~h{Cs!^6TE@ZC2ho50r4b+GTc!EdVWfzY z(iy4}%BoxGH86u5!x_Kv9#f;V`an{b16OD_MzxCi($#1dSbAknxHk%kHz&Srjlkpe zoW82NXrd;D*WB+BOcJlw(+OFE)KWdMZWY7YxI3%p8q>a)W?Dv{`a_KUotqTC^vC6R z)f7Kqe!v{JJbxn|)2EfN@WQI=*h9hj_I}f;+!ADwNl$ngf3;eaZ{x0@t_wta^zp~8 zcJfvMDh%QHF683mh3059^JrRNYUVp}hUk8Yld=nyIt5WR;bp-gOYd${a*qx-{a(E5 zdB)^>;z(G;fgAA>bbiWWek4t7HEJ!HK2!NwK6%&ILaSBC}Cd(ubo z)6#p!oU0X%@PMEUsz;sJtqk(dw{BMNp;}NVi>1%iQdJ|rK7LEBIJ;10W6-yAXAE-p zXvmuDT6J8G=iIZeH%fZ1Hdm&+BuBTi#dgYJ-~)lpR1-q&{ku{`GzOE3W+DFe)pBm4 z8NWX_SVFg98f1y?7onH!)MS*zQf^=AFjUJ*fF+Dh=4%fLooUW&1%&P$8$OMVWRM>< ziC>g?#$Q^_sIQ~F@WEiD{7;m`dfM;+U)wqTLs?|0w9`tL&=wn~b`5n2cf?5g^FwZC zAn-cxX4zd?4&B8(qAl3QsMp`zy+1;~`EqZgIE&x+d0?rAdRw#b-VZ+B*L5G0he?xB$I@cGP5+j4x&YGp0C^NV|{mg{lo<46EKY8yIqwZ)* z$#KJ_yq8$c>*>hx(ggHt&zzm-iNJg%GpkP1Bck+12i4pPM9nBn2EJpEdKdbCJf_)X&XSI@s;uymF_d01S z@qn7(m0!s-r!%|urMiXpC?!#LNl|`X_B^EGaKu@2`|3!{ntt+#7D4worq4aHE~3cs zc3>DBB?~`ATEK)aE@dCyA$JX<%D3O&ES*LZ@k=(ObVGKx?NhGNW%-wEtMlUTdK8no zJeeJTDxT(>-Z5a=LFW&APiyHHSk+g!Kj2LowfP#ixNvFp?#i!(8Abn=@;*6tnc)!k z6dWvrFd{W&b}{>Dta?*h!mG0%@0#bB(+HwE56gQEqSWB$MzZkH)0HUhc;Vhy=oP1@ zXU8;4J6iFM4Z%!~TfmVpC&$X#k}3y{px~A<+plp?2E2zx9hod1 z;HvO7afy_6SVhJ?eR}ejtYqZPvQuZs`>YNA7JBir73JX%-Dwki7}Yjr%m|flaB!34*fHNE^e1KzI`X+W{eh>cF3m&C zKb#o0CYLih^Y&Tr00jviz+DZlcwCU3OV7|6GzwPe`Z-3dGLA4)v~nQW<5fVKR!813 zyk-3L`Q^OETi$gY*}KQHpK`Csg&a9pWUC=C;Z)_t;vg*dpJ**o_{)`S_0~b{(kdaY z#Uck|a5XtEVS0M+i9Wk_N)0w5#ya%D%-(3dcOJoYXIg&Eb+QaYG z5Q+~u?{O)ndasF7WMN70i2HS)wjl!TcOtVUZqj?t#7cMIi8DN)gkUkc*1)z%R1R1< z5C-!yUDjjo#D{w?ABxg1r&oTum6MAJA4{H=epkVDA?;ksz&LMP>$nM zY0~p0>f61whn>r-^IqSS_u@p6VpBMXuDW^=*7AV6Op%rf4>)wk3QrR(E)No-Ht*xg zA-e7UjK(xsSS>+(Im$)yF@COGbGK0PSa;AJbl<6A`gHd7{IT2q531Cu{Yu#lk@Sz zD*~|;f%~?zjy4sZj+H*01E^~*)&dA2^XDFp{bozQ@@uVN*YucY0#PpzH}fb zSvWAGhx=~8#ltAcb~hy{x!A0Gyz6a|ory(~=deydW6};qA??J%5{c3r8*x&o5q7$* zr9eHcef&kZhUQ5f?NQEtc&fZ+g|)`MQlI|TJZYKOh@bGc3Ns5%EK~=VOHaQjHd|KM z?~_A3{|s|`5BeR&tolW+x^lbxjp&;&a2>O*Wloo%?&lq>&0X|?c} z#Z=+@Ln>+hmMOZ$tco0ahlp&6(KPLev_#dz$d?75*@>b>@$>9Azc&xsds3S&tew0$ z Date: Mon, 27 Dec 2021 19:07:29 +0100 Subject: [PATCH 335/503] Delete TeatimerStart.jpg --- apps/teatimer/TeatimerStart.jpg | Bin 4245 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerStart.jpg diff --git a/apps/teatimer/TeatimerStart.jpg b/apps/teatimer/TeatimerStart.jpg deleted file mode 100644 index 4fa8f2fc49b04d4a40328b8cd227a60c958e2325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 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 Mj|KVpyVpkl3!DOAqyPW_ From 5e6b6b03b56451cabb1bee090fb033b7292de427 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:07:36 +0100 Subject: [PATCH 336/503] Delete TeatimerUp.jpg --- apps/teatimer/TeatimerUp.jpg | Bin 3737 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg deleted file mode 100644 index 80b8c3c8abdd8bce55727722ab9bcf782a5f6b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3737 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 Date: Mon, 27 Dec 2021 19:08:05 +0100 Subject: [PATCH 337/503] Add files via upload --- apps/teatimer/TeatimerHelp.jpg | Bin 0 -> 5125 bytes apps/teatimer/TeatimerRun.jpg | Bin 0 -> 3981 bytes apps/teatimer/TeatimerStart.jpg | Bin 0 -> 4245 bytes apps/teatimer/TeatimerUp.jpg | Bin 0 -> 3737 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/teatimer/TeatimerHelp.jpg create mode 100644 apps/teatimer/TeatimerRun.jpg create mode 100644 apps/teatimer/TeatimerStart.jpg create mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e22960c668b2e7e1b783163274d6c80cc3c90416 GIT binary patch literal 5125 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 Z!0XbiQ=eYi86xsdy&oXAAyW26{|hcX0fqno literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerRun.jpg b/apps/teatimer/TeatimerRun.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a442d12a577e17b2335a4a5d6be07c6eb597f27c GIT binary patch literal 3981 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 Mj|KVpyVpkl3!DOAqyPW_ literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80b8c3c8abdd8bce55727722ab9bcf782a5f6b65 GIT binary patch literal 3737 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 Date: Mon, 27 Dec 2021 21:08:27 +0000 Subject: [PATCH 338/503] touchtimer: add actual timer functionality --- apps/touchtimer/app.js | 134 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 6 deletions(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index 534f4d62c..c0da034b7 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -13,7 +13,7 @@ var main = () => { var button8 = new Button({ x1: 60, y1: 107, x2: 116, y2: 140 }, 8); var button9 = new Button({ x1: 118, y1: 107, x2: 174, y2: 140 }, 9); - var buttonStart = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "GO"); + var buttonOK = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "OK"); var button0 = new Button({ x1: 60, y1: 142, x2: 116, y2: 174 }, 0); var buttonDelete = new Button({ x1: 118, y1: 142, x2: 174, y2: 174 }, "<-"); @@ -40,18 +40,18 @@ var main = () => { button7, button8, button9, - buttonStart, + buttonOK, button0, buttonDelete, ]; - var buttonPauseContinue = new Button( + var buttonStartPause = new Button( { x1: 1, y1: 35, x2: 174, y2: 105 }, - "PAUSE" + "START" ); var buttonStop = new Button({ x1: 1, y1: 107, x2: 174, y2: 174 }, "STOP"); - var timerRunningButtons = [buttonPauseContinue, buttonStop]; + var timerRunningButtons = [buttonStartPause, buttonStop]; var timeStr = ""; timerNumberButtons.forEach((numberButton) => { @@ -78,7 +78,11 @@ var main = () => { drawTimer(timeStr); }); - buttonStart.setOnClick(() => { + buttonOK.setOnClick(() => { + if (timeStr.length === 0) { + return; + } + g.clear(); drawTimer(timeStr); @@ -90,7 +94,80 @@ var main = () => { }); }); + var timerIntervalId = undefined; + var buzzIntervalId = undefined; + buttonStartPause.setOnClick(() => { + if (buttonStartPause.value === "PAUSE") { + buttonStartPause.value = "START"; + buttonStartPause.draw(); + + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + if (buzzIntervalId) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + } + + return; + } + + if (buttonStartPause.value === "START") { + buttonStartPause.value = "PAUSE"; + buttonStartPause.draw(); + + var time = timeStrToTime(timeStr); + + timerIntervalId = setInterval(() => { + time = time - 1; + + timeStr = timeToTimeStr(time); + drawTimer(timeStr); + + if (time === 0) { + buttonStartPause.value = "FINISHED!"; + buttonStartPause.draw(); + + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + var buzzCount = 0; + Bangle.buzz(1000, 1); + buzzIntervalId = setInterval(() => { + if (buzzCount >= 10) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + return; + } else { + Bangle.buzz(1000, 1); + buzzCount++; + } + }, 5000); + } + }, 1000); + + return; + } + }); + buttonStop.setOnClick(() => { + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + if (buzzIntervalId) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + } + + buttonStartPause.value = "START"; + buttonStartPause.draw(); + g.clear(); timeStr = ""; drawTimer(timeStr); @@ -235,6 +312,51 @@ class Button { } } +var timeToTimeStr = (time) => { + var hours = Math.floor(time / 3600); + time = time - hours * 3600; + var minutes = Math.floor(time / 60); + time = time - minutes * 60; + var seconds = time; + + if (hours === 0) { + hours = ""; + } else { + hours = hours.toString(); + } + + if (hours.length === 0) { + if (minutes === 0) { + minutes = ""; + } else { + minutes = minutes.toString(); + } + } else { + minutes = minutes.toString().padStart(2, "0"); + } + + if (hours.length === 0 && minutes.length === 0) { + if (seconds === 0) { + seconds = ""; + } else { + seconds = seconds.toString(); + } + } else { + seconds = seconds.toString().padStart(2, "0"); + } + + return hours + minutes + seconds; +}; + +var timeStrToTime = (timeStr) => { + timeStr = timeStr.padStart(6, "0"); + return ( + parseInt(timeStr.slice(0, 2), 10) * 3600 + + parseInt(timeStr.slice(2, 4), 10) * 60 + + parseInt(timeStr.slice(4, 6), 10) + ); +}; + // start main function main(); From bf345e53b8a42456b502d1a5d43a2ed450af8b5f Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:27:33 +0000 Subject: [PATCH 339/503] touchtimer: add screenshots and describe the usage --- apps.json | 3 ++- apps/touchtimer/0_dark_timer_edit.png | Bin 0 -> 3790 bytes apps/touchtimer/0_light_timer_edit.png | Bin 0 -> 3844 bytes apps/touchtimer/1_dark_timer_ready.png | Bin 0 -> 3100 bytes apps/touchtimer/1_light_timer_ready.png | Bin 0 -> 3085 bytes apps/touchtimer/2_dark_timer_running.png | Bin 0 -> 3021 bytes apps/touchtimer/2_light_timer_running.png | Bin 0 -> 3007 bytes apps/touchtimer/3_dark_timer_finished.png | Bin 0 -> 2895 bytes apps/touchtimer/3_light_timer_finished.png | Bin 0 -> 2912 bytes apps/touchtimer/README.md | 27 ++++++++++++++++++++- 10 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 apps/touchtimer/0_dark_timer_edit.png create mode 100644 apps/touchtimer/0_light_timer_edit.png create mode 100644 apps/touchtimer/1_dark_timer_ready.png create mode 100644 apps/touchtimer/1_light_timer_ready.png create mode 100644 apps/touchtimer/2_dark_timer_running.png create mode 100644 apps/touchtimer/2_light_timer_running.png create mode 100644 apps/touchtimer/3_dark_timer_finished.png create mode 100644 apps/touchtimer/3_light_timer_finished.png diff --git a/apps.json b/apps.json index 93c5b7fcf..d457198be 100644 --- a/apps.json +++ b/apps.json @@ -5068,11 +5068,12 @@ "name": "Touch Timer", "shortName": "Touch Timer", "version": "0.01", - "description": "Quickly and easily create a timer touch-only.", + "description": "Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad.", "icon": "app.png", "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", + "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}], "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } diff --git a/apps/touchtimer/0_dark_timer_edit.png b/apps/touchtimer/0_dark_timer_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..2160ef38db0205d4f1b11da3ac7aedaf2be61981 GIT binary patch literal 3790 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%0DEqKF<0s>QUH}Jv4ncaw+5+mSBP|NI>q31yfHM-A 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 literal 0 HcmV?d00001 diff --git a/apps/touchtimer/1_light_timer_ready.png b/apps/touchtimer/1_light_timer_ready.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2ca3c9d689316ac26a112bee4c315bccc5adbc GIT binary patch literal 3085 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 oT@*^`rXZKr*~Y`-zof5BG;V)!B)-6S)@&0Km>; zcGf4iu=3v{wQXxx)O{vx0Z2PZv;xYzm1h6|6?@Fu@^lR8Yu;Sc96$~7 zV>9D(p0aU$rQp8Q!}NBCFC_w9kgz>9SC&ZOtd`;`_t$SHpQ&KK@1x*On)i7}K)2-Gs)|2zPRh2xZ=8UGr~@c6fowUEp4z!dp5eg+OSNLK7~a7zffl`Hjfx2&L2bTfM4UD*L!_km;rel6 zie;NyRptbWys_&V+lhnbpc$OM3k>*bM8Weiz&WK$LeN)Nc9lKIvkSAOaN>&u?mLTC z-DEtbK8)#Ji(H9<@ku|=!F(z@IZ4%sG-NjhkNZG1D_XS{DK8jM;Zu4`jNz3d7IXjP zL5CU(SqRH9CEPsl++T$jOYEl`@V!rb!o8s(K6q)~AZvCszPfGtzYmiNB zlEqOD@rH|RrU^IWxGT{8X!9Psjx_!CZ)U;RfR^WcGeCA}wuH=Gd5SH|;ZyQ1AdP?_btE$Yzsot0DgdZVCK z7S#UK4M z@!d~)`hCPw@S4^WE8?#FC3`wiKgKeZPG7TbH@IOv5g_63)u!u3caZGV zu!V$P8jg0CH|WQ7E}>vJ(Q?g<)%{?=3la6H zZWx=Zv0ELf}SneMoYO9){l%E3O)4;2aN^t;KH|e_U1lNmA+KJIPeN21Xm3 zeXmnygkBm@&f_Es6>iw&)n|+|SE>%a%2{{!dLLI+GkbGEvOtuoy;f^28n&?HHe9Oc zVO?o0_lG4)FI*d3U_9N)%O5{NL`snjoIODBTthsP1f(UtK}wCk`Eu$zo{&cxV_j%^3#*gKm`QC!e0SBa(vumPv0juQB9}`y}LPxEhafQsz zxS#Fo`-<=X;$A{8?`6Hx4IJ8XN44<}c?>}@k4M88Fo91tWF2LQ@m zF=rh6mss2KO*t&~r!J7{^?OZgYSNpf{Y+r9g9*8OS*O<)0Ko@0|SbKgjm3_kQNjEq3TV z3ACa{;@}zVg?NeQK#(27mDeQXG2teqw1A&1Mri- zh~X9Q>BeX}61bFRSjQKz`C7_#pMtGe7pyGi7SaJH8J7bqT3Gsz^Lm0ETd9Z3`uqNW zp literal 0 HcmV?d00001 diff --git a/apps/touchtimer/3_dark_timer_finished.png b/apps/touchtimer/3_dark_timer_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dd77b8288daf5b0d89f4224b716c0141a43460 GIT binary patch literal 2895 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 X`E_qF+2$_7A2MKvzhv{=igNq^PSH5E literal 0 HcmV?d00001 diff --git a/apps/touchtimer/3_light_timer_finished.png b/apps/touchtimer/3_light_timer_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..18ee015e3e3208e76d93529362264363238f6ab6 GIT binary patch literal 2912 zcmcJR_fwPU7RTSb2?j#Bbdec5ZR0e)sSefH!F?7B1F5~%7^SOfrJc{`ki3(51#qrY-zv_x=({eAq7 zdv`i{T&!eBK=@NZXU!nJULs$0g}KU){ckjs^aXAjaFC(!`lj}A#5W#~hgY{R`e6a8L*N*{h=MBg0lO<=A57h@UW)=#B!c;T*d85X8JlJKMW>v(i}huB{0Y^?;t&`H-#*Efn14yRbjN0joCW|9rSd^@SgxrP%^+@*WWtjYSKVu=pdX228|xY zvhL$Hi~4_I#am2^hTJF?2A(xNqm6~^^Jp)ny!9N3Fz`|fMWhJ0moS79=MK&Kt|9V8?z=)j z-chC7zp{TTsRt3wQQzfEVd`+Y42Dhb>EsF>Kcv9`U`H>TA0R;8*dPJHh{dnEB=GEk z|Fw>VQ8R7guDbLmZ?^PtPHmnfcX{|_dijv|ZcJPMY^UI6wLVM|IdzvEJQ?HEb%fiu z+serc+1xHwEVg|tYpk}6y9+k&|lQHvfQ^f_4N``r>)HV>%brfmZNt=% zmSO{oOtX0nBm$AKVryC?cKX@#j+MaaGVMok!le>lg#eZ6OVQZ7>Epx02UEL!PouoQ zl!qCz7yxzYnIIrxA8#Nik8wpdU+iHtiQ{2eYByw;owV;GkN*b7E%)b>YeVvjWl)D`fzB{)Zmvf(SCMTy?Syvwfw>EO!$D5y2|z_);7FNmQ|5MI zis)y>_ljRDZ_mkzez5T!c9u$uSB)VA;DhVc*j>xkZ)(8tjnklg;!7~UqxfyR^!2%S zk)Jm_bK1fK@sbT}y@H9h#7i{yK5LtP`N4RGEb7Y(!=WJZ&ZYPu--clE_pch!ZcDG~ zOd>XOUx9KaYsKNeikVdV+Z;x}hRcp!FsP6j!eOs1O-Mc9X^6d{1u&njGd{hQI?1{- zfJl=5MTi)e(pvVzdNyN@2NPNUR6~FWD2z`C@X^%KdNm_)HOdWlyYTf54w)Xy!NRmW(*6x$={N*e^_)I`P9|1d{+mrLP+$}b8FKV`+^ zdO~@Ey}nAY#b$hgoWxpDNSgz)UD*5mA9tR(DY7%|rfZa7)lp|P5^iOD+BU1ck9Fb5 zeYc=}>hozxvc9$`gT5?aAkY9DxhhKJlr>;mV#22-yyuzO3~?#$)Oo9dr!+XJJ||^~ zUDh`Lv@Xc}OfE{>j7_|j({e2eX>*OD%3d&+S$r&;#l*OUVth^i6)9P%-y~i%POX{H zN$O~}Mo>#Z2|h1^GC?X1Fz}(e85*yFg;ZS1GYt4N6l_K*lmalSW7dfwX$(7PXgD$n zM4Ym;9=($rnyy=D#IRvLe-Jw-Ftvc04)X$O8}4Kz2z^)~-om7V)4{jN_ zK6=OW05>nc?J>z>NoI*^r$3ArNa=wsCtQ_*%#7;Qdn#FiYe|OX7bp%ehV_fxhOrxV zdZ63AwE9j?N9ACQWsrlqeYAHPdrW!T<)I%waZR2!_vWo+onLw?tHgp1+m5ne+;qCr zaMltrohzH0uj5-!w3#G87KSRQ=Zi&U)s7~A7qLPWAbW3q>asqtea=) zyBYr;oH`>wpB?tmmlx|UikjGskP|B5xY|Mbn2)a_@Ui!Nmdut*2i(*(gH4v&YXO>~ zzkjHvs#|6vZsgRDtYr!Ba;>yUsqgIi9$Cxt&rlOPm-2L`1{8&A{`?|-%D-dd>oIiM zVO>|)P74?=6yY+TUR$Tf{=ima+nN|p=s$-y8COUX!^5?sxz94Gn;QG#6*`R#DH6cW zIYPZ|=_6Auf4iAp9v!d|K51M!@M@?|#&7--rF(9{4W1$N*?Go{BpogRz|0` z(5};C$dxOvzl-(>N-QB(Moq~AWr=YpIiZMf<;OQlE}Izp+f(W~@54vV@8tm7pChq{ zXRV+Bf>LsP&>@>VcY`GNb_iO=*kG9{Pb@ SxW!+Y0Xyq+xGGEU#Qy?`Jv?>* literal 0 HcmV?d00001 diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index 99c755639..b54ed4b1d 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -1,3 +1,28 @@ # Touch Timer -Quickly and easily create a timer touch-only. +Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad. + +## How to + +- First input the timer time via the input buttons +- If you need to correct the time, press "<-". +- If the timer time is correct, press "OK". +- If you have accidentially pressed "OK", press "STOP" to go cancel. +- Press "START" to start the timer, if the time is correct. +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 10 times, or until you press "STOP" + +## Screenshots + +### Light Theme + +![](0_light_timer_edit.png) +![](1_light_timer_ready.png) +![](2_light_timer_running.png) +![](3_light_timer_finished.png) + +### Dark Theme + +![](0_dark_timer_edit.png) +![](1_dark_timer_ready.png) +![](2_dark_timer_running.png) +![](3_dark_timer_finished.png) \ No newline at end of file From e40648ac3b93b2957b9fb14a6f3a34cfed70bfc6 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:28:44 +0000 Subject: [PATCH 340/503] touchtimer: disable debug output --- apps/touchtimer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index c0da034b7..ad8eb42ae 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,4 +1,4 @@ -var DEBUG = true; +var DEBUG = false; var main = () => { var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); From c21622015386328119c063e8c355030ad4c21b60 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:30:51 +0000 Subject: [PATCH 341/503] touchtimer: fix typo --- apps.json | 2 +- apps/touchtimer/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index d457198be..01ad2eac4 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Touch Timer", "shortName": "Touch Timer", "version": "0.01", - "description": "Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad.", + "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", "supports": ["BANGLEJS2"], diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index b54ed4b1d..c8bc2c084 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -1,6 +1,6 @@ # Touch Timer -Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad. +Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad. ## How to From 29b231bf6582b3931e5e3e7cbc1d85da71c3f46c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 28 Dec 2021 12:36:49 +0100 Subject: [PATCH 342/503] Remove wrong parenthesis --- apps/qrcode/custom.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qrcode/custom.html b/apps/qrcode/custom.html index 4920be655..bf95f261b 100644 --- a/apps/qrcode/custom.html +++ b/apps/qrcode/custom.html @@ -294,7 +294,7 @@ g.clear(1).setColor(1,1,1).setBgColor(0,0,0); g.fillRect(0,0,g.getWidth()-1,g.getHeight()-1); g.drawImage(img,(g.getWidth()-img[0])/2,(g.getHeight()-img[1])/2); ${ document.getElementById("hideDescription").checked ? '' : `g.setFontAlign(0,0).setFont("6x8").setColor(0,0,0); -g.drawString(content,g.getWidth()/2,g.getHeight()-(g.getHeight()-img[1])/4)); +g.drawString(content,g.getWidth()/2,g.getHeight()-(g.getHeight()-img[1])/4); `} g.setColor(1,1,1); `; From e4eea377d7da6f568cd79f9f5f8ca095205d5c44 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 28 Dec 2021 12:37:21 +0100 Subject: [PATCH 343/503] Allow changing qr code brightness on touch --- apps.json | 2 +- apps/qrcode/ChangeLog | 1 + apps/qrcode/custom.html | 12 +++++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..364c68943 100644 --- a/apps.json +++ b/apps.json @@ -1148,7 +1148,7 @@ { "id": "qrcode", "name": "Custom QR Code", - "version": "0.04", + "version": "0.05", "description": "Use this to upload a customised QR code to Bangle.js", "icon": "app.png", "tags": "qrcode", diff --git a/apps/qrcode/ChangeLog b/apps/qrcode/ChangeLog index edcc41cfd..6d9cc0569 100644 --- a/apps/qrcode/ChangeLog +++ b/apps/qrcode/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add posibillity to generate Wifi code. 0.03: Forces integer scaling and adds more configuration (error correction, description, display) 0.04: Allow scanning of QR codes from camera or file +0.05: Change brightness on touch diff --git a/apps/qrcode/custom.html b/apps/qrcode/custom.html index bf95f261b..7ae3eb3af 100644 --- a/apps/qrcode/custom.html +++ b/apps/qrcode/custom.html @@ -72,8 +72,10 @@

Additional options:


+ +
-
+

@@ -287,6 +289,14 @@ } var img = imageconverter.canvastoString(document.getElementsByTagName("canvas")[0],{mode:"1bit",output:"string",compression:true}); var app = `var img = ${img}; +${ document.getElementById("preventBrightnessChangeOnTouch").checked ? '' : `var backlight = 0; +Bangle.on('touch', function(button, xy) { + backlight += 0.3; + if (backlight > 1) backlight = 0; + Bangle.setLCDBrightness(backlight); +}); +`} + ${document.getElementById("boostBacklight").checked ? 'Bangle.setLCDBrightness(1);' : ''} ${document.getElementById("stayOn").checked ? 'Bangle.setLCDTimeout(0);' : ''} ${document.getElementById("hideDescription").checked ? '' : `var content = ${JSON.stringify(content)};`} From abd761bff9f4d45f08388cf876e0b3f5971b3e5c Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:43:23 +0100 Subject: [PATCH 344/503] Minor improvements --- apps/lcars/lcars.app.js | 54 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 5f328389e..29c349fe9 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -128,25 +128,25 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); - g.drawString("BAT:", 28, y); - g.drawString(bat+ "%", 70, y); + g.drawString("BAT:", 26, y); + g.drawString(bat+ "%", 68, y); } else if(key == "Steps"){ var steps = getSteps(); - g.drawString("STEP:", 28, y); - g.drawString(steps, 70, y); + g.drawString("STEP:", 26, y); + g.drawString(steps, 68, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); - g.drawString("TMP:", 28, y); - g.drawString(temperature + "C", 70, y); + g.drawString("TMP:", 26, y); + g.drawString(temperature + "C", 68, y); } else if(key == "HRM"){ - g.drawString("HRM:", 28, y); - g.drawString(hrmValue, 70, y); + g.drawString("HRM:", 26, y); + g.drawString(hrmValue, 68, y); } else { - g.drawString("NOT FOUND", 28, y); + g.drawString("NOT FOUND", 26, y); } } @@ -167,14 +167,14 @@ function drawLock(){ g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); - g.drawString("LCARS", 130, 12); + g.drawString("LCARS", 128, 13); if(connected){ - g.drawString("BT-CO", 130, 32); + g.drawString("BT-CO", 128, 33); } else { - g.drawString("BT-NC", 130, 32); + g.drawString("BT-NC", 128, 33); } if(Bangle.isLocked()){ - g.drawString("LOCK", 130, 52); + g.drawString("LOCK", 128, 53); } } @@ -196,16 +196,15 @@ function drawState(){ timeInMinutes % 4 == 1 ? iconMars : timeInMinutes % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 120, 118); + g.drawImage(iconImg, 118, 107); // Alarm within symbol g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); - g.drawString("STATUS", 123, 97); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 120+25, 118+25+1); + g.drawString(getAlarmMinutes(), 118+25, 107+25+1); } } @@ -225,11 +224,12 @@ function drawPosition0(){ drawLock(); // Write time + g.setFontAlign(0, -1, 0); g.setColor(cWhite); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 10); + g.drawString(timeStr, 70, 10); // Write date g.setColor(cWhite); @@ -237,9 +237,10 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 56); + g.drawString(dayStr, 70, 56); // Draw data + g.setFontAlign(-1, -1, 0); g.setColor(cWhite); printData(settings.dataRow1, 97); printData(settings.dataRow2, 122); @@ -296,21 +297,24 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + var gridY = parseInt(Math.max.apply(Math, data))-1; + gridY = gridY <= 0 ? 1 : gridY; require("graph").drawBar(g, data, { axes : true, minx: 1, gridx : 5, - gridy : 5, + gridy : gridY, width : 140, height : 50, x: 5, y: 115 }); + g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("HRM", 122, 9); - g.drawString("STEPS [K]", 90, 96); + g.drawString("WEEK HRM", 154, 27); + g.drawString("WEEK STEPS [K]", 154, 115); // Plot day } else { @@ -334,21 +338,23 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(24); health.readDay(new Date(), h=>data[h.hr]+=h.steps); + var gridY = parseInt(Math.max.apply(Math, data)/100)*100; require("graph").drawBar(g, data, { axes : true, minx: 1, gridx : 4, - gridy : 2000, + gridy : gridY, width : 140, height : 50, x: 5, y: 115 }); + g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("HRM [24]", 90, 9); - g.drawString("STEPS [24]", 82, 96); + g.drawString("DAY HRM", 154, 27); + g.drawString("DAY STEPS", 154, 115); } } From ee63b2630ef8c7bbea9d8cb6d60b140416d33d44 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:50:48 +0100 Subject: [PATCH 345/503] Week - k steps, dax,steps. --- apps/lcars/lcars.app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 29c349fe9..f9fc37ee6 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -297,7 +297,7 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); - var gridY = parseInt(Math.max.apply(Math, data))-1; + var gridY = parseInt(Math.max.apply(Math, data)/2); gridY = gridY <= 0 ? 1 : gridY; require("graph").drawBar(g, data, { axes : true, @@ -314,7 +314,7 @@ function drawPosition1(){ g.setFontAntonioMedium(); g.setColor(cWhite); g.drawString("WEEK HRM", 154, 27); - g.drawString("WEEK STEPS [K]", 154, 115); + g.drawString("WEEK STEPS [k]", 154, 115); // Plot day } else { @@ -338,7 +338,8 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(24); health.readDay(new Date(), h=>data[h.hr]+=h.steps); - var gridY = parseInt(Math.max.apply(Math, data)/100)*100; + var gridY = parseInt(Math.max.apply(Math, data)/1000)*1000; + gridY = gridY <= 0 ? 1000 : gridY; require("graph").drawBar(g, data, { axes : true, minx: 1, From 90d1df2ca068616fe72c3158492be745cb463bed Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:51:18 +0100 Subject: [PATCH 346/503] Typo --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f9fc37ee6..aea7c60d2 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -314,7 +314,7 @@ function drawPosition1(){ g.setFontAntonioMedium(); g.setColor(cWhite); g.drawString("WEEK HRM", 154, 27); - g.drawString("WEEK STEPS [k]", 154, 115); + g.drawString("WEEK STEPS [K]", 154, 115); // Plot day } else { From f7256c011d8cb825b1525e8453325f0c9abdaea5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:08:45 +0100 Subject: [PATCH 347/503] Show planet for one hour instead of one minute. --- apps/lcars/lcars.app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index aea7c60d2..9b2ef59c6 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -185,16 +185,17 @@ function drawState(){ g.setColor(cWhite); var bat = E.getBattery(); - var timeInMinutes = getCurrentTimeInMinutes(); + var current = new Date(); + var hours = current.getHours(); var iconImg = isAlarmEnabled() ? iconAlarm : Bangle.isCharging() ? iconCharging : bat < 30 ? iconNoBattery : Bangle.isGPSOn() ? iconSatellite : - timeInMinutes % 4 == 0 ? iconSaturn : - timeInMinutes % 4 == 1 ? iconMars : - timeInMinutes % 4 == 2 ? iconMoon : + hours % 4 == 0 ? iconSaturn : + hours % 4 == 1 ? iconMars : + hours % 4 == 2 ? iconMoon : iconEarth; g.drawImage(iconImg, 118, 107); From e75960ab116cf0278ab2833175cf79baafccb5f6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:18:35 +0100 Subject: [PATCH 348/503] Updated icon and screenshots --- apps/lcars/lcars.icon.js | 2 +- apps/lcars/screenshot.png | Bin 4813 -> 4746 bytes apps/lcars/screenshot_2.png | Bin 2802 -> 3027 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.icon.js b/apps/lcars/lcars.icon.js index c404728e0..49694cf7c 100644 --- a/apps/lcars/lcars.icon.js +++ b/apps/lcars/lcars.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgeevPnAQsc+fPngCE+/fvoCEvAbIA4/AgFzEZwRBjwjNvBUBEZ3eCIMOEZtwCIMBEZuARYU5EZecTocHEZf0CIcBEbvgaggjKTwIAEbQpoHAAiSEeoYQHJQr1CCBJKEIgcBI4xKFaIdt3AOFgfuAYMeEYLRBj1pLQ4ICuYjBAgPbtoRHhu3AYN5VoMGzVpI49502AgPPVoM27dsK48N23cgE5CgOmzVoCI4LBzCSB8EP2wjJgILBAYMAhIjBsAjJzVwg47C7YRJEYhfBEZXmEZ53CI4q2BEAiVCkwjCNYaMGboQjDkBfDCAbdB04EBgyPDC4YAD/dt2wRCHIM5njXCCAcHboOmCIQ0B5/nfYT6DFIIjBeAcOvM8+EAjitFEYJEBAANzEYOeeowjCFgUDzwjB+YrDgAgBEYWcA4Mc+YjCvAQCgftEANuDIYOBEYXPNwIAIg4OCCgXkCBEOEZDvBEAhEB4AjF/inB8+OJQOOvILBoAjGU4IFDAQYjGbQIdCAQt4EY0DEZACDEYceEZACDC4bLBEZwCO")) +require("heatshrink").decompress(atob("lmy5YCFi1ZsuWAQgGGy1YgXbtu2AQgjH4EAEZ2XCINbEZxRBvIjNzwRBh4jN2ARBgIjNwCIClojMTQcFEZdkCIgjLngRDg4jLsDREEZOzTwIAEjwjHs5oDAAiSEEYUcCA5uFeoQQJAAP2EYRECgJHGJQrRDps4BwsD5wDBrYjB+AXBtJaHBAV5spoC6dNGY8NmBBBEYMAg2atJHHvOmwEB8qtBmnTpgjImncgEtkEB02atARHBYOYSQPgh4jKgILBCIMAhIjBc4ojEzVwCII7B6dAEZpfBEZXmEZ53CI4twEAqVCkwjCNYaMGboQjDUgIjGboOnAgMGR4WgC4YAD+dNmgEBgg5BluUa4QQDg7dB0wjCJoNl2z7CAQJBDEYLwDh9tyxEBjitFEYJEBfwQjB7z1GEYQsCgfbEYNZT4ggBEYWcOIVZEYPbtAQCgfNEANODIYOBEYVlDQQAHg4OCCgW0CBEKEYySBg4gFi1Z4AjFWwM922OJQOPtoLBoBHGgPlAoQCEoAjGgIdCAQto+wjFhIgFAQwjDrYjIAQYjDEBQjFARwA==")) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 98bf50546ab06532dbee2dcb58524a138c9ed9f2..11695ba5b05a6a6885ad9bdc7203fed50853e4bb 100644 GIT binary patch delta 4740 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 From 6fab0c8c87fc7d923495f0c11a90f2dc50409154 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:21:21 +0100 Subject: [PATCH 349/503] Moved state icon into middle of lower screen. --- apps/lcars/lcars.app.js | 4 ++-- apps/lcars/screenshot.png | Bin 4746 -> 4772 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9b2ef59c6..7dcdca4ee 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -197,7 +197,7 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 118, 107); + g.drawImage(iconImg, 115, 107); // Alarm within symbol g.setFontAlign(-1, -1, 0); @@ -205,7 +205,7 @@ function drawState(){ if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 118+25, 107+25+1); + g.drawString(getAlarmMinutes(), 115+25, 107+25+1); } } diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 11695ba5b05a6a6885ad9bdc7203fed50853e4bb..22e00581be28e9800ad17851901460ef318373a3 100644 GIT binary patch delta 4767 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 Sofwz^0000 Date: Tue, 28 Dec 2021 14:24:06 +0100 Subject: [PATCH 350/503] Minor changes --- apps/lcars/lcars.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7dcdca4ee..1dbae6668 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -169,9 +169,9 @@ function drawLock(){ g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 128, 13); if(connected){ - g.drawString("BT-CO", 128, 33); + g.drawString("CONN", 128, 33); } else { - g.drawString("BT-NC", 128, 33); + g.drawString("NOCON", 128, 33); } if(Bangle.isLocked()){ g.drawString("LOCK", 128, 53); From 53e37132055cae7ccab96598910927a8949b0e51 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:24:41 +0100 Subject: [PATCH 351/503] Updated screenshot --- apps/lcars/screenshot.png | Bin 4772 -> 4798 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 22e00581be28e9800ad17851901460ef318373a3..4d4911227dc8ce48bd8db53c3947900c4e8ac87e 100644 GIT binary patch delta 4793 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 TQ(~2;00000NkvXXu0mjfRvY*a delta 4767 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 tM)Y$%a|M1{D!{zn52dV From 5e596f49451c95e296019c29eb9e78af5c483f1e Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:36:23 +0100 Subject: [PATCH 352/503] Show disconnect immideately. --- apps/lcars/lcars.app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1dbae6668..f27c26b7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -200,13 +200,13 @@ function drawState(){ g.drawImage(iconImg, 115, 107); // Alarm within symbol - g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); g.drawString(getAlarmMinutes(), 115+25, 107+25+1); } + g.setFontAlign(-1, -1, 0); } @@ -447,6 +447,9 @@ Bangle.on('lcdPower',on=>{ // health iff the connection state did not change. if(connected == NRF.getSecurityStatus().connected) { draw(); + } else { + connected = NRF.getSecurityStatus().connected + drawLock(); } } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); From 4769a1dc078dce61a1bad6a255f92f179b62e6c1 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 12 Dec 2021 19:08:51 +0100 Subject: [PATCH 353/503] lcars: Add implicit semicolons --- apps/lcars/lcars.app.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f27c26b7f..5042560d3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -42,73 +42,73 @@ var bgLeft = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) -} +}; var bgRight = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) -} +}; var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) -} +}; var iconSaturn = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA")) -} +}; var iconMoon = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA==")) -} +}; var iconMars = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA==")) -} +}; var iconSatellite = { width : 50, height : 50, bpp : 3, transparent : 2, buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) -} +}; var iconAlarm = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) -} +}; var iconCharging = { width : 50, height : 50, bpp : 3, transparent : 5, buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) -} +}; var iconNoBattery = { text: "NO BAT", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) -} +}; // Font to use: // Graphics.prototype.setFontAntonioMedium = function(scale) { // Actual height 20 (19 - 0) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); -} +}; Graphics.prototype.setFontAntonioLarge = function(scale) { // Actual height 39 (39 - 1) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); -} +}; /* * Draw watch face @@ -548,4 +548,4 @@ g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); // After drawing the watch face, we can draw the widgets -// Bangle.drawWidgets(); \ No newline at end of file +// Bangle.drawWidgets(); From 421681fec9c3e8dc5f93996b489fd52ac5375148 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 23 Dec 2021 16:06:55 +0100 Subject: [PATCH 354/503] lcars: Show "0" on timer Sometimes when my watch buzzes, I look at it and am puzzled why. Until I remember that I had a timer set. This now shows a timer of "0". --- apps/lcars/lcars.app.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 5042560d3..6e0a46844 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -201,7 +201,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); - if(isAlarmEnabled() > 0){ + if(isAlarmEnabled()){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); g.drawString(getAlarmMinutes(), 115+25, 107+25+1); @@ -404,7 +404,7 @@ function getCurrentTimeInMinutes(){ } function isAlarmEnabled(){ - return settings.alarm > 0; + return settings.alarm >= 0; } function getAlarmMinutes(){ @@ -429,11 +429,13 @@ function handleAlarm(){ .then(() => new Promise(resolve => setTimeout(resolve, t))) .then(() => Bangle.buzz(t, 1)) .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)); - - // Update alarm state to disabled - settings.alarm = -1; - Storage.writeJSON(SETTINGS_FILE, settings); + .then(() => Bangle.buzz(t, 1)) + .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) + .then(() => { + // Update alarm state to disabled + settings.alarm = -1; + Storage.writeJSON(SETTINGS_FILE, settings); + }); } From 8c416bab55afbad98b73d4a7aa594a22720f1acc Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 18:25:43 +0000 Subject: [PATCH 355/503] Tidy graphics --- apps/coretemp/coretemp.js | 37 +++++++++++++-------- apps/coretemp/widget.js | 68 ++++++++++++++++++++++++++------------- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 1ad380855..358a2daed 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -2,20 +2,32 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); + var btm = g.getHeight() - 1; - -function onCore(c) { - var px = g.getWidth() / 2; - g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; - - g.setFontVector(24).drawString(core, px, 45); - g.setFontVector(24).drawString(skin, px, 65); +var img = { + width : 146, + height : 48, + bpp : 4, + transparent : 0, + palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + buffer : + require("heatshrink") + .decompress(atob( + "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) } -Bangle.on('CoreTemp', onCore); + + function onCore(c) { + var core = "Core: " + c.core + "°" + c.unit; + var skin = "Skin: " + c.skin + "°" + c.unit; + + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(img, 0, 30); + g.setColor(0xC618); // Light gray + g.setFont("6x8", 3).drawString(core, px, 48 + 48); + g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + } Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); @@ -23,4 +35,3 @@ Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); - diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 4fe76ea38..c7d7f630c 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,47 +1,69 @@ -// Widget to show sensor status +// TODO Change to generic multiple sensor (() => { var settings = {}; - var count=0; + var count = 0; + + var img0 = { + width : 24, + height : 24, + bpp : 4, + transparent : 0, + buffer : + require("heatshrink") + .decompress(atob( + "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) + }; + var img1 = { + width : 24, + height : 24, + bpp : 3, + transparent : 0, + buffer : + require("heatshrink") + .decompress(atob( + "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) + }; // draw your widget function draw() { - if (!settings.enabled) return; + if (!settings.enabled) + return; g.reset(); - g.setFontAlign(0,0); - g.clearRect(this.x,this.y,this.x+23,this.y+23); - g.setColor((count&1)?"#00ff00":"#80ff00"); - g.fillCircle(this.x+6,this.y+6,4); - g.fillCircle(this.x+16,this.y+16,4); - g.setColor(-1); // change color back to be nice to other apps + g.setFontAlign(0, 0); + g.clearRect(this.x, this.y, this.x + 23, this.y + 23); + g.drawImage((count & 1) img1: img0, this.x, this.y); } -// Set a listener to 'twinkle' + // Set a listener to 'blink' function onTemp(temp) { - count=count+1; - WIDGETS["sensors"].draw(); + count = count + 1; + WIDGETS["coretemp"].draw(); } // Called by sensor app to update status function reload() { - settings = require("Storage").readJSON("coretemp.json",1)||{}; -// settings.fileNbr |= 0; + settings = require("Storage").readJSON("coretemp.json", 1) || {}; - Bangle.removeListener('CoreTemp',onTemp); + Bangle.removeListener('CoreTemp', onTemp); if (settings.enabled) { - WIDGETS["sensors"].width = 24; + WIDGETS["coretemp"].width = 24; Bangle.on('CoreTemp', onTemp); } else { - WIDGETS["sensors"].width = 0; + WIDGETS["coretemp"].width = 0; + count = 0; } - } // add the widget - WIDGETS["sensors"]={area:"tl",width:24,draw:draw,reload:function() { - reload(); - Bangle.drawWidgets(); // relayout all widgets - }}; + WIDGETS["coretemp"] = { + area : "tl", + width : 24, + draw : draw, + reload : function() { + reload(); + Bangle.drawWidgets(); // relayout all widgets + } + }; // load settings, set correct widget width reload(); - })() From bffd4d533409534048da4f598cb15d62212c4d3b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 18:26:45 +0000 Subject: [PATCH 356/503] Missed semi --- apps/coretemp/coretemp.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 358a2daed..2d4e99abf 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -14,20 +14,21 @@ var img = { require("heatshrink") .decompress(atob( "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) +}; + +function onCore(c) { + var core = "Core: " + c.core + "°" + c.unit; + var skin = "Skin: " + c.skin + "°" + c.unit; + + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(img, 0, 30); + g.setColor(0xC618); // Light gray + g.setFont("6x8", 3).drawString(core, px, 48 + 48); + g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); } - - function onCore(c) { - var core = "Core: " + c.core + "°" + c.unit; - var skin = "Skin: " + c.skin + "°" + c.unit; - - var px = g.getWidth() / 2; - g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(img, 0, 30); - g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); - } Bangle.on('CoreTemp', onCore); +Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); From d707f1b7c42c73d979c641f52be82628b82eb830 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 20:58:43 +0100 Subject: [PATCH 357/503] Create app.js --- apps/minimal_clock/app.js | 214 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 apps/minimal_clock/app.js diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js new file mode 100644 index 000000000..e94881d03 --- /dev/null +++ b/apps/minimal_clock/app.js @@ -0,0 +1,214 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; + + for (let i = 0, l = originalPolygon.length; i < l; i+=2) { + x = originalPolygon[i]; + y = originalPolygon[i+1]; + + transformedPolygon[i] = OriginX + x*cPhi + y*sPhi; + transformedPolygon[i+1] = OriginY + x*sPhi - y*cPhi; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + let now = new Date(); + + let Hours = now.getHours() % 12; + let Minutes = now.getMinutes(); + let Seconds = now.getSeconds(); + + let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; + let MinutesAngle = (Minutes/60) * twoPi - Pi; + let SecondsAngle = (Seconds/60) * twoPi - Pi; + + g.setColor('#FFFFFF'); + + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From 8ca99f2d831d2dd37657d6b7a901615e217ea80e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:02:09 +0100 Subject: [PATCH 358/503] Create app-screenshot.png --- apps/minimal_clock/app-screenshot.png | Bin 0 -> 1469 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/minimal_clock/app-screenshot.png diff --git a/apps/minimal_clock/app-screenshot.png b/apps/minimal_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8db4f5fb9a15b0101e26b763aab04f7fb33021b9 GIT binary patch literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfwkPz#WAEJ z?(LnxpeRQHhrk>E7x_B&EETa}x#yd6@1wa<-}ZjpNk<+(EU2)q2u{doR6gLW{`}T+ zCWdB%T?_{nAAkOd!FZHKTo`=+^Ys3`dwjcS$^0u6f4l zfzZ48x0!9S`*!bntGj2i;QK0O|N4LB@53KzANu=ak+lq8{Cu9f(N9_Ly+5C@yzX~Q z?}Moi-^qR0`fwlD6WarKO&`2xvyuHc@54NS_n$03X!HFPwO@WUcu6c%9Bd!|9{@8DBW&*i1o)Ye|Bx1|3%XGi>KQ@zWcZMLA3qDd(6*e^#7!H zthSyaU;TCRfB#>f@9yK;D0PS{;Oms6uZ0KyT3I%TPYPeKt;%cTFN+6p@*)RThyD>? zFKPd43)4O8wt~m84F9^zv@@=6`}lJHue-natyh1}x%;(%AF0abGsewj zeD~Lx@yEZgen&ewdozO_{Kx)1OJuOWSi<_L=8N@%tG{pU>gQ#8aC}#-O&05CmLCNl z?Hg84e=zS)h?||vgWh9h!k>5#n7uQ5$artr@W+C^0SE;U?pl-zx+5WLm#vCK3#@_+t*(fGB!Lu(3j86 maOYcTRSW|#vS_L057QC1PJz8uvyTJIV+K!GKbLh*2~7ZLb=Xq? literal 0 HcmV?d00001 From 8978e92bbc1e868bc8d8d66d99ff72adcc7939f3 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:38 +0100 Subject: [PATCH 359/503] Create LICENSE --- apps/minimal_clock/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/minimal_clock/LICENSE diff --git a/apps/minimal_clock/LICENSE b/apps/minimal_clock/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/minimal_clock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From ea187361498d7e3854a49d453838c4aad46f8f7d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:42 +0100 Subject: [PATCH 360/503] Create app-icon.png --- apps/minimal_clock/app-icon.png | Bin 0 -> 1312 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/minimal_clock/app-icon.png diff --git a/apps/minimal_clock/app-icon.png b/apps/minimal_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32e1a342590fa03cb75adb0b00f12491b3b0c264 GIT binary patch literal 1312 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yL;4JWnEM{Qf76xHPhFNnY z7#J8MGeaUuB7A+UlJj%*5>xV%QuQiw3xKK_7;Gx6fXv*~l0=1y+?>2(s|s5sunH?6 z8zii+qySb@l5MLL;TxdfoL`ixV5(=LXP{)qrJ$f-QP|K%!RuMVYBUn?dH= z8QOqVqKHB5vC#)vj^r4KPr;%vQo;#h7$;KjMD;p^^b><|oDu|VmT zj)>2zWo8$B(*54gnblQ!r&!<7g5B?2w%mPl2G6=*C}G(p?cv3&n=!C zJQ8jPrcFp>=)IcD*5jO!aUku0LBp|EX3WPFOL$nA7$3ytXJ@dn6jWDRFA37@IGXhJ zQTV4n)dx!R^YYw^`f_t~Pq8(w%JNRBkdc+uot&SWs~dg2;jHbC0*jbuJ)I#%8V4fN z5)v4G|N1qh#z5l8-o3Ulk&%I~|NZ;dRVMelAlB((hRC~j?-FWiWWvJ37cO7Ue(wBv z#kqdWsjW2!CeLzn@lcy=U}M9Ro}OM%S;;xmhb=EZKa_K$o%yzC|J5^fC9iH0%I%Xf zXKLQOdGo6|S&{DHi~LIal$DjE>Jt+gH{a9|>voNakH7xA)5Yn${O{EU|JheHT@YRz z^ION>%&cwp?Acu`^=sCy&AhptWk>6)IZErkFI&F+W3#!Se`$7_Qft; zO@!-ZY3~8od$x>aUv`*SSy=&tF?!;UP>l!IpQirtFpAIkGxPl8vuAnrbagwEzp`~5 ze_R!-UU1P^S;3E;o&BgnU0lo&rOOo+2mbuC6U+FOo9sNFpO^P#y2}?{w_>KC&2t!6 zem}WV^UuD`%|8!2*Vr2`K2RQHX;{IiUA3vqa+dIq`-Qho9%I*q!vnZl z7ibDG?%4Nl_jAR9&W7(SM~wQXFfKWFcJ~bJ;$MfqhB`%Od^jSMQNRRDJHXV#w5^4Q zIb%(pae|DKGxNSQhj(Y&B(zukc5?U^|JZwO%(j&EN>bwON%vb{eb#b)uHl~CZ9IMN z^R0L079`Z{)YzwVnCX}4S?+fqLa%=6WvG7krAYGcvsVAJ;Y@akdd9C$JI6db_`Fs1 fL2<+CS^t@P7i5M0`+7MGR1SH%`njxgN@xNA89@<} literal 0 HcmV?d00001 From bb34a51d7b00dc4df6fe141d4db2552aa50e2ddb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:45 +0100 Subject: [PATCH 361/503] Create app-icon.js --- apps/minimal_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/minimal_clock/app-icon.js diff --git a/apps/minimal_clock/app-icon.js b/apps/minimal_clock/app-icon.js new file mode 100644 index 000000000..dacc4c0fd --- /dev/null +++ b/apps/minimal_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcBIf4A/AH4A/AHsD+ALJjgFE/4RK/+AAgUH/gvKj/+AYMB/5CMv/AAQYALh//EwYALGQJKEABcH8CMQER4ATEcYA/AH4A/dP4A/ABgA=")) \ No newline at end of file From 01c6dade6377ff29fc7023f49c41fd8151d023fb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:47 +0100 Subject: [PATCH 362/503] Create README.md --- apps/minimal_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/minimal_clock/README.md diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md new file mode 100644 index 000000000..0ba0060d7 --- /dev/null +++ b/apps/minimal_clock/README.md @@ -0,0 +1,12 @@ +# Minimal Analog Clock # + +This app probably displays the most basic analog clock one can think of - just +some clock hands and no clock face. + +![](app-screenshot.png) + +But actually it is almost "stylish" again just because of this simplicity. + +## License ## + +[MIT License](LICENSE) From fdb575fba96f00e85c487d30265f231dc62e2216 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:50 +0100 Subject: [PATCH 363/503] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index dd5f0cc6d..67b1dbc09 100644 --- a/apps.json +++ b/apps.json @@ -5077,5 +5077,22 @@ {"name":"colorwheel.app.js","url":"app.js"}, {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "minimal_clock", + "name": "a minimal analog clock", + "shortName":"Minimal Clock", + "version":"0.01", + "description": "a minimal analog clock - just with some hands and no further clock face", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 9cc4d84c1572c1cd1f870165fff716534b7003c0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:20:23 +0100 Subject: [PATCH 364/503] Update README.md --- apps/minimal_clock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 0ba0060d7..cba486072 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,6 +1,6 @@ # Minimal Analog Clock # -This app probably displays the most basic analog clock one can think of - just +This app displays the perhaps most basic analog clock one can think of - just some clock hands and no clock face. ![](app-screenshot.png) From 51f09703c2e32366e3856c304959ffa07856dc67 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:20:54 +0100 Subject: [PATCH 365/503] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 67b1dbc09..a9b873e5e 100644 --- a/apps.json +++ b/apps.json @@ -5079,8 +5079,8 @@ ] }, { "id": "minimal_clock", - "name": "a minimal analog clock", - "shortName":"Minimal Clock", + "name": "minimal Analog Clock", + "shortName":"Minimal Analog Clock", "version":"0.01", "description": "a minimal analog clock - just with some hands and no further clock face", "icon": "app-icon.png", From 8692af197adc7983095f18373305e7c89cca9463 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 21:09:26 +0000 Subject: [PATCH 366/503] Tidy up and add icons --- apps.json | 2 +- apps/coretemp/boot.js | 5 ++-- apps/coretemp/coretemp.js | 52 +++++++++++++++++++++++++++++++++------ apps/coretemp/settings.js | 10 ++++---- apps/coretemp/widget.js | 2 +- 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/apps.json b/apps.json index 84cd2a96c..12d7db79e 100644 --- a/apps.json +++ b/apps.json @@ -4963,7 +4963,7 @@ }, { "id": "coretemp", - "name": "Core Temp Display", + "name": "CoreTemp", "version": "0.03", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 3ae9b41ac..269c8e9ff 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,5 +1,6 @@ -//If enabled run in the background continuously. - +// +// If enabled in settings run constantly in background +// (function() { var settings = {}; diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 2d4e99abf..afb905c99 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -4,7 +4,7 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); var btm = g.getHeight() - 1; -var img = { +var corelogo = { width : 146, height : 48, bpp : 4, @@ -16,23 +16,61 @@ var img = { "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; +first = true; function onCore(c) { - var core = "Core: " + c.core + "°" + c.unit; - var skin = "Skin: " + c.skin + "°" + c.unit; + var core = "Core: " + c.core + c.unit; + var skin = "Skin: " + c.skin + c.unit; var px = g.getWidth() / 2; g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(img, 0, 30); + if (first) { + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(corelogo, px - 146 / 2, 30); + first = false; + } else { + g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); + } g.setColor(0xC618); // Light gray g.setFont("6x8", 3).drawString(core, px, 48 + 48); g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); } + Bangle.on('CoreTemp', onCore); g.clear(); + Bangle.loadWidgets(); Bangle.drawWidgets(); -g.reset().setFont("6x8", 2).setFontAlign(0, 0); -g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); +// Background task will activate if settings are enabled. +function enableSensor() { + settings = require("Storage").readJSON("coretemp.json", 1) || {}; + + if (!settings.enabled) { + + settings.enabled = true; + require("Storage").write("coretemp.json", settings); + + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} + +function drawMessage() { + settings = require("Storage").readJSON("coretemp.json", 1) || {}; + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + + if (!settings.enabled) { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, + g.getHeight() / 2 - 16); + } else { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.getHeight() / 2 - 16); + } +} + +setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); + +drawMessage(); diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 5cd98ae09..3fc2dfbf2 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -24,9 +24,9 @@ } function updateSettings() { - require("Storage").write("coretemp.json", settings); - if (WIDGETS["sensors"]) - WIDGETS["sensors"].reload(); + require("Storage").write("coretemp.json", s); + if (WIDGETS["coretemp"]) + WIDGETS["coretemp"].reload(); return; } @@ -34,10 +34,10 @@ const menu = { '' : {'title' : 'CoreTemp sensor'}, '< Back' : back, 'Enabled' : { - value : !!settings.enabled, + value : !!s.enabled, format : v => v ? "Yes" : "No", onchange : v => { - settings.enabled = v; + s.enabled = v; updateSettings(); } } diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index c7d7f630c..2b5522875 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -31,7 +31,7 @@ g.reset(); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) img1: img0, this.x, this.y); + g.drawImage((count & 1) ? img1: img0, this.x, this.y); } // Set a listener to 'blink' From f2a02642fd733dd10cd884951dd97b122616312f Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 21:55:35 +0000 Subject: [PATCH 367/503] Enable coretemp in Recorder --- apps/recorder/README.md | 1 + apps/recorder/interface.html | 17 ++++++++++++----- apps/recorder/widget.js | 15 +++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/apps/recorder/README.md b/apps/recorder/README.md index ba53a99f2..4a4561f1c 100644 --- a/apps/recorder/README.md +++ b/apps/recorder/README.md @@ -17,6 +17,7 @@ You can record * **GPS** GPS Latitude, Longitude and Altitude * **Steps** Steps counted by the step counter * **HR** Heart rate +* **Core** CoreTemp body temperature **Note:** It is possible for other apps to record information using this app as well. They need to define a `foobar.recorder.js` file - see the `getRecorders` diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 81ce71e5d..42aa4e16d 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -16,13 +16,17 @@ function saveKML(track,title) { ${track[0].Heartrate!==undefined ? ` Heart Rate - `:``} + `:``} ${track[0].Steps!==undefined ? ` - Step Count`:``} -${track[0].Core!==undefined ? ` + Step Count + `:``} +${track[0].Core!==undefined ? ` Core Temp + `:``} +${track[0].Skin!==undefined ? ` + Skin Temp `:``} - + Tracks @@ -40,9 +44,12 @@ ${track.map(pt=>` ${0|pt.Heartrate}\n`).join("") ${track[0].Steps!==undefined ? ` ${track.map(pt=>` ${0|pt.Steps}\n`).join("")} `:``} -${track[0].Core!==undefined ? ` +${track[0].Core!==undefined ? ` ${track.map(pt=>` ${0|pt.Core}\n`).join("")} `:``} +${track[0].Skin!==undefined ? ` +${track.map(pt=>` ${0|pt.Skin}\n`).join("")} + `:``} diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 0c86ff09a..4d8cdddb1 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -48,7 +48,7 @@ Bangle.removeListener('GPS', onGPS); Bangle.setGPSPower(0,"recorder"); }, - draw : (x,y) => g.setColor(hasFix?"#f00":"#888").drawImage(atob("DAyBAAACADgDuBOAeA4AzAHADgAAAA=="),x,y) + draw : (x,y) => g.setColor(hasFix?"#0ff":"#888").drawImage(atob("DAyBAAACADgDuBOAeA4AzAHADgAAAA=="),x,y) }; }, hrm:function() { @@ -84,30 +84,29 @@ }, temp:function() { - var temp = 0; + var core = 0, skin = 0; var hasCore = false; function onCore(c) { - temp=c.core; + core=c.core; + skin=c.skin; hasCore = true; } return { name : "Core", - fields : ["Core"], + fields : ["Core","Skin"], getValues : () => { - var r = [temp]; + var r = [core,skin]; return r; }, start : () => { hasCore = false; Bangle.on('CoreTemp', onCore); -// Bangle.setHRMPower(1,"recorder"); }, stop : () => { hasCore = false; Bangle.removeListener('CoreTemp', onCore); -// Bangle.setHRMPower(0,"recorder"); }, - draw : (x,y) => g.reset().drawImage(atob("DAyBAAADDHnnnnnnnnnnjDmDnDnAAA=="),x,y) + draw : (x,y) => g.setColor(hasCore?"#0f0":"#888").drawImage(atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="),x,y) }; }, steps:function() { From e5a20256e51d46107fa7cc336c544c58891857ff Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:10:26 -0800 Subject: [PATCH 368/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index dc635540f..c31c4306f 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "promenu", "name": "Pro Menu", "version": "0.01", - "description": "Replace Bangle.js 1's built in show message.", + "description": "Replace Bangle.js 1's built in menu function.", "icon": "icons8-menu-48 (1).png", "type": "boot", "tags": "system", From ac53411af27a96c18eeeb6d5a9fe2681484c49d1 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:28:55 -0800 Subject: [PATCH 369/503] Update boot.js --- apps/promenu/boot.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index cbaa91815..e05896a47 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -1,6 +1,3 @@ -Bangle.loadWidgets(); -Bangle.drawWidgets(); - E.showMenu = function(items) { function RectRnd(x1,y1,x2,y2,r) { pp = []; @@ -30,7 +27,7 @@ E.showMenu = function(items) { var options = items[""]; if (options) menuItems.splice(menuItems.indexOf(""),1); if (!(options instanceof Object)) options = {}; - options.fontHeight = options.fontHeight||27; + options.fontHeight = options.fontHeight||35; if (options.selected === undefined) options.selected = 0; if (!options.fontHeight) @@ -50,11 +47,11 @@ E.showMenu = function(items) { var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled l.lastIdx = idx; - var iy = y; + var iy = y-5; g.reset().setFont('6x8',2).setFontAlign(0,-1,0); if (options.predraw) options.predraw(g); if (rowmin===undefined && options.title) { - g.drawString(options.title,(x+x2)/2,y-options.fontHeight); + g.drawString(options.title,(x+x2)/2,y-options.fontHeight+5); g.drawLine(x,y-7,x2,y-7); } if (rowmin!==undefined) { @@ -73,12 +70,18 @@ E.showMenu = function(items) { fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); - if(loc.translate(name).length >= 15){ - g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); - }else if(loc.translate(name).length >= 15 && "object" == typeof item){ - g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); + if(loc.translate(name).length >= 10 && "object" == typeof item){ + var v = item.value; + if (item.format) v=item.format(v); + v = loc.translate(""+v); + g.drawString(loc.translate(name).substring(0, 13-v.length)+"...",x+8,iy+7); + console.log("gippo"); }else{ - g.drawString(loc.translate(name),x+8,iy+4); + if(loc.translate(name).length >= 15){ + g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+7); + }else{ + g.drawString(loc.translate(name),x+8,iy+7); + } } if ("object" == typeof item) { var xo = x2; @@ -90,7 +93,7 @@ E.showMenu = function(items) { g.setColor(g.theme.fgH).drawImage("\x0c\x05\x81\x00 \x07\x00\xF9\xF0\x0E\x00@",xo,iy+(options.fontHeight-10)/2,{scale:2}); } g.setFontAlign(1,-1); - g.drawString(v,xo-6,iy+4); + g.drawString(v,xo-4,iy+8.5); } g.setColor(g.theme.fg); iy += options.fontHeight; From 2ee0106e6439cdd5885f7e040918290f4282a9ed Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:44:59 -0800 Subject: [PATCH 370/503] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index e05896a47..c9028104c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From 919e36444c2876510ec3b04054e3ae4c2640eb52 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:52:58 -0800 Subject: [PATCH 371/503] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index c9028104c..13d134ce5 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From a82a8586c7f50dedee0700bd91934fa134ca5fa8 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:52:47 -0800 Subject: [PATCH 372/503] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 13d134ce5..577d7841c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+30); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From 550e88db4fb65701ce82a52e7e07efaef7c30869 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:59:31 -0800 Subject: [PATCH 373/503] Update boot.js --- apps/promenu/boot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 577d7841c..bdef661cf 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -171,3 +171,4 @@ E.showMenu = function(items) { }); return l; }; + From 5ef3d5d93b01b97bb58d202b62abbdb94dfd3525 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:59:50 -0800 Subject: [PATCH 374/503] Update boot.js --- apps/promenu/boot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index bdef661cf..577d7841c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -171,4 +171,3 @@ E.showMenu = function(items) { }); return l; }; - From 3a0099dff0ed8f6795fce59762a2302cef89678e Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:04:41 -0800 Subject: [PATCH 375/503] Add files via upload --- apps/promenu/pro-menu-screenshot.png | Bin 0 -> 3418 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/promenu/pro-menu-screenshot.png diff --git a/apps/promenu/pro-menu-screenshot.png b/apps/promenu/pro-menu-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae318eb8489b3b39b0b7392637dc89501e5f6c0 GIT binary patch literal 3418 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 DK6xs| literal 0 HcmV?d00001 From 91e41b71235ad6f5159796e7ef962131e389ad49 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:06:08 -0800 Subject: [PATCH 376/503] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c31c4306f..3c9f4678b 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "type": "boot", "tags": "system", "supports": ["BANGLEJS"], + "screenshots": [{"url":"pro-menu-screenshot.png"}], "storage": [ {"name":"promenu.boot.js","url":"boot.js"}, {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} From 89d0c1173a1274c59a77944f5dd0c64079fc9e86 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 20:23:15 -0800 Subject: [PATCH 377/503] Update boot.js --- apps/promenu/boot.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 577d7841c..9eac59bfa 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,14 +67,14 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+30); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+24); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); - if(loc.translate(name).length >= 10 && "object" == typeof item){ + if(loc.translate(name).length >= 11 && "object" == typeof item){ var v = item.value; if (item.format) v=item.format(v); v = loc.translate(""+v); - g.drawString(loc.translate(name).substring(0, 13-v.length)+"...",x+8,iy+7); + g.drawString(loc.translate(name).substring(0, 15-v.length)+"...",x+8,iy+7); console.log("gippo"); }else{ if(loc.translate(name).length >= 15){ @@ -170,4 +170,4 @@ E.showMenu = function(items) { else l.select(); }); return l; -}; +}: From 39b3967183e21e867416cbefb04b78b46e64952b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:36:13 +0100 Subject: [PATCH 378/503] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index a9b873e5e..66cadc83d 100644 --- a/apps.json +++ b/apps.json @@ -5079,8 +5079,8 @@ ] }, { "id": "minimal_clock", - "name": "minimal Analog Clock", - "shortName":"Minimal Analog Clock", + "name": "Minimal Analog Clock", + "shortName":"Minimal Clock", "version":"0.01", "description": "a minimal analog clock - just with some hands and no further clock face", "icon": "app-icon.png", From 238ee425a12f58a39cc4209379f534441ea3647b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:44:58 +0100 Subject: [PATCH 379/503] Update README.md --- apps/minimal_clock/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index cba486072..918206a8f 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -7,6 +7,9 @@ some clock hands and no clock face. But actually it is almost "stylish" again just because of this simplicity. +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + ## License ## [MIT License](LICENSE) From 26dbd5fd5a06dc7fc3ef2e71f9618483ece3c74f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:39 +0100 Subject: [PATCH 380/503] Create app.js --- apps/simple_clock/app.js | 234 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 apps/simple_clock/app.js diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js new file mode 100644 index 000000000..17d876d35 --- /dev/null +++ b/apps/simple_clock/app.js @@ -0,0 +1,234 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** drawClockFace ****/ + + function drawClockFace () { + g.setColor(1,1,1); + g.setFont('Vector', 22); + + g.setFontAlign(0,-1); + g.drawString('12', CenterX,CenterY-outerRadius); + + g.setFontAlign(1,0); + g.drawString('3', CenterX+outerRadius,CenterY); + + g.setFontAlign(0,1); + g.drawString('6', CenterX,CenterY+outerRadius); + + g.setFontAlign(-1,0); + g.drawString('9', CenterX-outerRadius,CenterY); + } + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; + + for (let i = 0, l = originalPolygon.length; i < l; i+=2) { + x = originalPolygon[i]; + y = originalPolygon[i+1]; + + transformedPolygon[i] = OriginX + x*cPhi + y*sPhi; + transformedPolygon[i+1] = OriginY + x*sPhi - y*cPhi; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + let now = new Date(); + + let Hours = now.getHours() % 12; + let Minutes = now.getMinutes(); + let Seconds = now.getSeconds(); + + let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; + let MinutesAngle = (Minutes/60) * twoPi - Pi; + let SecondsAngle = (Seconds/60) * twoPi - Pi; + + g.setColor('#FFFFFF'); + + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockFace(); + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From cbe94794050e64e2936da9a2da1f17f70ec2a5ee Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:42 +0100 Subject: [PATCH 381/503] Create app-screenshot.png --- apps/simple_clock/app-screenshot.png | Bin 0 -> 1984 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/simple_clock/app-screenshot.png diff --git a/apps/simple_clock/app-screenshot.png b/apps/simple_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ec99c9fc64f2084080bdf0d0c460601962db00e8 GIT binary patch literal 1984 zcma)7YdDna8vf?<;TxfuaY&5TWMYg%Bs8LFScYtxN+oNL^r;-KwT2`LnP$F0MN>9~ z$SIYLg_%|-S2=t+M2V52QI;laQ4`7zu^jiTtJROSf9?0W-uJoR>wT{G`SIM(eW&f@ zc9UrpS zR_|CA#LjfvKA>+usQgFzczirNt22UN(fxT=wH6c_s1M$a5Z}{vbKDMu#qe%DmZIWy z+X&G}v&=$>?Y@`MNwwGY+YX@rj{5G3H$uLg4}d#bb;S@YvWN0ocAuwxZr` zN5ioz9Vt}lwO()1U5I&cRhp@e9M49mTjN9x?;=CrF+x%Vq|=z!X}kVlFzj*e-nLo$ zs8y%2M>$OP&zFl}9uIRj0?#e{($Y~$Wr~&034y$j)A6gFTE^d4=%B3uUcc|QYfaXgUZSivBN@2jln+VyF4f4i%>B<8J zwbK>*_y7FqhlIz}mTd4Cube+*L!Z#A*mtmFX7y5iRb)e9*+}o*MP@HiF8AH*=_ISI z9&XMtkh`YtCHB@0cRGSBglgIJXr1&nHb{31Tk&$x0Hg)^bGcU=GEOC+c};wEam@v+ z$^4FG?B_|CGO@|`Q{3A+!<}>w03|YpcFY7pUW$(-FJ~cUl1QeSSxrA?Bhbe~!9A7m zf<_j-;BX&1lwgF~`B#Unh6dk0(XYv@F0}%w(W(1#dp#9uFZ|wikhN`7Fqlj#Kj8ot z#|r5KT-ld7Sd2ybYFuC;(3(Kmmp(%6!?TAxxur!!)x(y>6_WFqMv7mE+I7xamXz5PqxX=sHtUBjGl;e%l3bFKN6)-~o z4gvvj3wXO!A2P(uq(HT$I?9%Avl01nzDJ0b;5kLsa{>d@D7VGhv^E>d_7H4&eSRO4 zFdI%I)K2T47!dS6Q%hUkq>h@3tgagP3rxcrG93FJSC8>q3aCW}wi zo});_uB2HP`o~1qE7D%w>wZXwNr6F`jDDu=x1atwFx}UIgE)>_s4OHv`=&mcF?h5l zrvLref0`-F0}uH5*R={5Ps^<1ocY!kvRGldvl#P1Bz5t{w}-ix+!ZO#4tzaIx;Y^b zy0`t%oCQnYmm-C0rXNM#*>uER9J3khc)w&3lLUj>Wz=W_rR~huz5@>Yzetj$G!f=r zO2^E$l}X_BE;=Z?#P0wxD8?9E!OCm+JJ|}6%$N8o1{p0Bs>t~jButJ#0ptsqF6MXO zD}8bK%28q5E=$nFeIx%H+sh=x7p)1s%d{(Bz)J=qgJZjXa> zsn=OMKzQIH^QSYa9HX`Bi6oYyXzB-7KLBlp>D?CraOS$~RR{=^y|$r65TTaF@6%OD zwY`Vd)H)%yMS1J^WdJ-w^e>^|{H+(iU@JJExA-JJ_k^`oTN;GX%n1zCF6*yeL|r+J;R&rI*hb_^ikFbX-$3m_spZKL z32HMzrkRr`F^Gete@mGxKwYRb)(E^y^QL*k=+gbdUmG3t7+2eD-MKR~UPwO)F6f@i zDXE^ve&)MJ3kw^({|5eGoyjvv-#0jOpK$n947R@a56IF%d&+mRKU dasN-zC4f3q{+;iQuu_#J13qkyXN?CU`Y&LlTI2u# literal 0 HcmV?d00001 From 56f564c156dd752c7901fcd579ba7103e90039a1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:45 +0100 Subject: [PATCH 382/503] Create app-icon.png --- apps/simple_clock/app-icon.png | Bin 0 -> 2248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/simple_clock/app-icon.png diff --git a/apps/simple_clock/app-icon.png b/apps/simple_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b1dcc461e3e5e94885a58175df3368fbd3ec1a37 GIT binary patch literal 2248 zcmY*bc{tSH9{$>ju`f@fpJJj&mO<885R;{Ai6(2vK7(0|kwICqWXm>|!7n8JqR75R zAxcPS$TC^749OCeCDk3(?cRHy=WOqJKkxhboag*;;?G+c^Mn2Z0RX^nYJ#$6%_{qy z`v7aSW#75MnmE1Bn4bZFsubQmS1#5b;%;JX4gevt01y!k0J|(GVi5oWS%L2_0|1N$ z0AS+Z%~lB30T0o{J^%oCMfW=!ko&hd0I=C((RO4zb2FGb0jKQhL2&a_rr?MyHUJQ;350Eu5N@tGE!Q4-{?>Kl_weN^ToF`yinE=Kqt-uS$QStWtGB2Dz$k_wHfiY9m z88n7#*xnSAX)C6C*sSleI`x^n&+$TQbalzaPE7~Ccusl@T)w0;VLTJvj1g}34Lmj! z)12UO+f55pe}LY3c98S-Gfrk{sWxhY_CmY!^%{I9U1TDqbT_QF8#x`xo0^$N;JEv zsH~ZI`@PCaA_}Re7mh*}21c<7@=G)(B!H0Q#ngw+t>f<{wD5FMIg7Qrx*3!}fiI5P?zus8#Jnu7nqhhi(N_Zk=dM-`x{Fr0zLLpB#cAp6?5v)FMt`9*^J6vM9XI@ryk|uA_ge&i+tn~WaE=G- zQGIVkDvhw-)8s6W!SgZMGt9s%!{-B2a8a-rq!6$FLn?_~xDX(Q8%o!lD-KVqPSfQ) zp{RedTNACj^%uzio^B_AiU|G9v+ruSv}8)>o^Wv9t$f?n)zx9EuAwpPJQNwp#*s>; z%Cxq&+T_Cm?^g;`T$t80v9wI#gFs`;nS;Tx=)_OF*1|*UUlR?I<|~=Qhd&j4yDuPxSgS=p6yJ>?P zN+JTwCrd)gW>0};JF}>N@+5sYd?Xh6usm6 zM;4geWeB>t?TF+$INQtD4G*VJ4IWz>b+yjTepEF`>g27b0)zweUsfhMj>-+TMW;gn zq>)HN3S_a@{b1QjS0Xq|@7gY%wDr_du2xJeA*nR_>(*MYW$4y9p5$UWy}Mv#WyAXd z)$Cw|alQd#52Lg5u{&LBl_vk8J55HDVc#{-RIhDH z0axmU?b!)8E`l{QH08qit~SP=KE-=Tao}v?A^y#{J$tX?Cpo8dO>ARVK2I2l0#dbp zjC^D$@jYFU`+3Th8%DFt=xOmI*x93Oy(VnhG}Q;M=Pi-@GSO!VcP#xatQ!ub$Wpng-%y{{u4;V2jGqwcZ}vO~>* z%ZjYr8s}FfN-w5=5~apgU7`E0UVZ3L*HfEf-2H6B_f~+RQC@*b0l`SrDmh?dJ7Lpl zy4S4eFrQXye3>W?kACT9(06Sn*P_Fi5ogy2PLLh5o7kbvsPXDu8m!nA5-S02M;zXp zRuy~v&dJGXdqevOAv&4o{t|TQp1jn5 z3(gODo55XyDVo+8kU`1y1=rzlI5l;356R`-&&x{cbK%^6yy@(r-P{T7{MfN-Pqk~i z6p_A-gt_Z+q#>>eQ2|=&{z&h7~@u2NEKf{B<49zh>DQ+L>KHI%z^) zJ~&)?T}qcm5W>Bi8W4XtRSFq`*20Z@OjEZjxfB46L*K#ai3)B5|2&DRO6I47T&)Vk z->4xxG2KwU7e&Q9sfukgSE+6>9bi+hZ+F1cdfpww!k;Xxv-bZBre`fs4-GC~|2JlE B2#Npz literal 0 HcmV?d00001 From 9a13eb99a3270660612b54f592da587fbfaf6794 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:47 +0100 Subject: [PATCH 383/503] Create app-icon.js --- apps/simple_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/simple_clock/app-icon.js diff --git a/apps/simple_clock/app-icon.js b/apps/simple_clock/app-icon.js new file mode 100644 index 000000000..9bc0ebfe1 --- /dev/null +++ b/apps/simple_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcBIf4AOgPAjgROh/A/+AEZ8DCKH8Gp/4Gp0QCKAARgQRigFACMUICMT7SEcUAkAvK/EAv//BpH8eoYOBAQP//0ECIrvDCIQABj4TB8AREj4RCgIyFn4RJh5HBCJQ1DAA0/UKBuJQZIRgL4wRL4ARhAH4AIg4RQdIwRcnAjiLKIA/ACI=")) \ No newline at end of file From e1805a156305a0b286104240cc3851d4ffaa1299 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:50 +0100 Subject: [PATCH 384/503] Create README.md --- apps/simple_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/simple_clock/README.md diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md new file mode 100644 index 000000000..d33bde0b6 --- /dev/null +++ b/apps/simple_clock/README.md @@ -0,0 +1,12 @@ +# Simple Analog Clock # + +This app displays a simple, yet stylish, analog clock. + +![](app-screenshot.png) + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From 63bacfe880a775451ab52e5951fb365c59fea1c6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:52 +0100 Subject: [PATCH 385/503] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index 66cadc83d..544af0c71 100644 --- a/apps.json +++ b/apps.json @@ -5094,5 +5094,22 @@ {"name":"minimal_clock.app.js","url":"app.js"}, {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "simple_clock", + "name": "Simple Analog Clock", + "shortName":"Simple Clock", + "version":"0.01", + "description": "a simple, yet stylish, analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 71b978750d02d8bd129d3f0817e8829c92e5099b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:25 +0100 Subject: [PATCH 386/503] Create app.js --- apps/colorful_clock/app.js | 251 +++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 apps/colorful_clock/app.js diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js new file mode 100644 index 000000000..a1b495c3c --- /dev/null +++ b/apps/colorful_clock/app.js @@ -0,0 +1,251 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let innerRadius = Math.min(CenterX,CenterY) * 0.8 - 14; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** drawClockFace ****/ + + function drawClockFace () { + for (let i = 0; i < 60; i++) { + let Phi = i * twoPi/60; + + let x = CenterX + outerRadius * sin(Phi); + let y = CenterY - outerRadius * cos(Phi); + + let Color = E.HSBtoRGB(i/60,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + + g.fillCircle(x,y, 1); + } + + g.setFont('Vector', 20); + g.setFontAlign(0,0); + + for (let i = 0; i < 12; i++) { + let Phi = i * twoPi/12; + + let Radius = innerRadius; + if (i >= 10) { Radius -= 4; } + + let x = CenterX + Radius * sin(Phi); + let y = CenterY - Radius * cos(Phi); + + let Color = E.HSBtoRGB(i/12,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + + g.drawString(i == 0 ? '12' : '' + i, x,y); + } + } + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; + + for (let i = 0, l = originalPolygon.length; i < l; i+=2) { + x = originalPolygon[i]; + y = originalPolygon[i+1]; + + transformedPolygon[i] = OriginX + x*cPhi + y*sPhi; + transformedPolygon[i+1] = OriginY + x*sPhi - y*cPhi; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + let now = new Date(); + + let Hours = now.getHours() % 12; + let Minutes = now.getMinutes(); + let Seconds = now.getSeconds(); + + let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; + let MinutesAngle = (Minutes/60) * twoPi - Pi; + let SecondsAngle = (Seconds/60) * twoPi - Pi; + + g.setColor('#FFFFFF'); + + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockFace(); + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From 976238c4acf5c8493c2242afdb6496fc8f9b09bb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:29 +0100 Subject: [PATCH 387/503] Create app-screenshot.png --- apps/colorful_clock/app-screenshot.png | Bin 0 -> 3221 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorful_clock/app-screenshot.png diff --git a/apps/colorful_clock/app-screenshot.png b/apps/colorful_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc1d854897bb70dfdfc196d3f2867addb315f16 GIT binary patch literal 3221 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 Date: Wed, 29 Dec 2021 07:04:32 +0100 Subject: [PATCH 388/503] Create app-icon.png --- apps/colorful_clock/app-icon.png | Bin 0 -> 4269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorful_clock/app-icon.png diff --git a/apps/colorful_clock/app-icon.png b/apps/colorful_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d00374a528dbd6d774a76477f26005648b3da0 GIT binary patch literal 4269 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 E4_0sLVE_OC literal 0 HcmV?d00001 From 1b6d7f2270daf7f6d28d4662fab0a1c1f23af8b4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:34 +0100 Subject: [PATCH 389/503] Create app-icon.js --- apps/colorful_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorful_clock/app-icon.js diff --git a/apps/colorful_clock/app-icon.js b/apps/colorful_clock/app-icon.js new file mode 100644 index 000000000..31af1f0e2 --- /dev/null +++ b/apps/colorful_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgZC/AB0BkmCCBsShEAiFBkARLwEBkGSgEECBQdBCIMSAwMYCBEKCgeQgE2gFgCA0C6Moiw1Dk0AhoRGikACIIHDgzECCI5ECg/gEYOACI+ggMti2ACIUkCIImCABARCAAMNCYIADgu0hdACI1twHACQm0rdoCI0BEYsoilRCI9sUgkBoG2rY1JgYjDCINLCI4fCa5ARHAAggCfYIjLgUB0AECCIy7BFwUCR4IKChIRFm1ACJAjGgwRL+AFDiwREI4YABn41FI4hxFn6IJPoh1B/AQFUI4ABh4RGUIsEyARC4ALEwAjECIl/CIkECIsICId+EQkkwEIA4gRDAAojBLwwHFexAADhaFDgETBw6UChdgA4cbCIKuGggCBCIMDCIkQCI8BEwMbCgMSAQIRGgGQQoQRCEYJrGAAMGIgZKDmBzIjARFTwpuHAARoGAAsMwQVCzARLAAPbtq5KAH4AEA")) \ No newline at end of file From 9a2b423c784777d069a57249c2d1df3c0e8bf614 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:37 +0100 Subject: [PATCH 390/503] Create README.md --- apps/colorful_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/colorful_clock/README.md diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md new file mode 100644 index 000000000..eb90e3e56 --- /dev/null +++ b/apps/colorful_clock/README.md @@ -0,0 +1,12 @@ +# Colorful Analog Clock # + +This app displays an analog clock with a colorful face. + +![](app-screenshot.png) + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From f7e9b3ad2505d7c0d32b9e6fa26c215b87a8bb72 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:09:24 +0100 Subject: [PATCH 391/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 544af0c71..fbb8a17a4 100644 --- a/apps.json +++ b/apps.json @@ -5082,7 +5082,7 @@ "name": "Minimal Analog Clock", "shortName":"Minimal Clock", "version":"0.01", - "description": "a minimal analog clock - just with some hands and no further clock face", + "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", "tags": "clock", From afadf0aa98545e3ce0327351e5c65a650d1dfa73 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:18:07 +0100 Subject: [PATCH 392/503] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index fbb8a17a4..dc2ef5529 100644 --- a/apps.json +++ b/apps.json @@ -5111,5 +5111,22 @@ {"name":"minimal_clock.app.js","url":"app.js"}, {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "colorful_clock", + "name": "Colorful Analog Clock", + "shortName":"Colorful Clock", + "version":"0.01", + "description": "a colorful analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 978814b813b26965fb51a38ac98817d81f84ac89 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:48:46 +0100 Subject: [PATCH 393/503] Update apps.json --- apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index dc2ef5529..8e4d7a14e 100644 --- a/apps.json +++ b/apps.json @@ -5108,8 +5108,8 @@ "screenshots": [{"url":"app-screenshot.png"}], "readme": "README.md", "storage": [ - {"name":"minimal_clock.app.js","url":"app.js"}, - {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + {"name":"simple_clock.app.js","url":"app.js"}, + {"name":"simple_clock.img","url":"app-icon.js","evaluate":true} ] }, { "id": "colorful_clock", @@ -5125,8 +5125,8 @@ "screenshots": [{"url":"app-screenshot.png"}], "readme": "README.md", "storage": [ - {"name":"minimal_clock.app.js","url":"app.js"}, - {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + {"name":"colorful_clock.app.js","url":"app.js"}, + {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true} ] } ] From 4454b97f5587f3541742c3a8724e54532166d3c5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:47 +0100 Subject: [PATCH 394/503] Update app.js --- apps/minimal_clock/app.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index e94881d03..057b286d4 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -163,7 +163,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -186,12 +186,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockHands(); From 4504eb1f11625de0c5cdf038b84fb6e350013e20 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:49 +0100 Subject: [PATCH 395/503] Update README.md --- apps/minimal_clock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 918206a8f..913a2aced 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,12 +1,12 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. +some clock hands and no clock face. It considers the currently configured +"theme" (and may therefore look different on your watch than shown in the +screenshot depending on which theme you prefer). ![](app-screenshot.png) -But actually it is almost "stylish" again just because of this simplicity. - This clock also acts as an example for the building blocks found in the author's [GitHub repository](https://github.com/rozek/banglejs-2-activities) From c0a2bc24bb3114b82e344a084f47226ca4b6b9d6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:57 +0100 Subject: [PATCH 396/503] Update app.js --- apps/simple_clock/app.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js index 17d876d35..6cb0f08ce 100644 --- a/apps/simple_clock/app.js +++ b/apps/simple_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -137,7 +137,7 @@ /**** drawClockFace ****/ function drawClockFace () { - g.setColor(1,1,1); + g.setColor(g.theme.fg); g.setFont('Vector', 22); g.setFontAlign(0,-1); @@ -182,7 +182,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -205,12 +205,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockFace(); From 56205f8ed5270909b21331d35aed9afa3afce299 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:00 +0100 Subject: [PATCH 397/503] Update README.md --- apps/simple_clock/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md index d33bde0b6..b52476372 100644 --- a/apps/simple_clock/README.md +++ b/apps/simple_clock/README.md @@ -1,6 +1,8 @@ # Simple Analog Clock # -This app displays a simple, yet stylish, analog clock. +This app displays a simple, yet stylish, analog clock. It considers the +currently configured "theme" (and may therefore look different on your watch +than shown in the screenshot depending on which theme you prefer). ![](app-screenshot.png) From 9107c599c8d45929f0fc62bf8176b3fb304f8772 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:04 +0100 Subject: [PATCH 398/503] Update app.js --- apps/colorful_clock/app.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js index a1b495c3c..10d579a22 100644 --- a/apps/colorful_clock/app.js +++ b/apps/colorful_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -199,7 +199,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -222,12 +222,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockFace(); From f164c061f53bf5b23fe63d241ac77ea3f01be5f5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:06 +0100 Subject: [PATCH 399/503] Update README.md --- apps/colorful_clock/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md index eb90e3e56..429cc51dd 100644 --- a/apps/colorful_clock/README.md +++ b/apps/colorful_clock/README.md @@ -1,6 +1,8 @@ # Colorful Analog Clock # -This app displays an analog clock with a colorful face. +This app displays an analog clock with a colorful face. It considers the +currently configured "theme" (and may therefore look different on your watch +than shown in the screenshot depending on which theme you prefer). ![](app-screenshot.png) From b8959f7335f56fe1daae00881fcc29fe52e76de1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 29 Dec 2021 09:25:06 +0100 Subject: [PATCH 400/503] Wrong icon. --- apps/lcars/lcars.app.js | 12 ++++++------ apps/lcars/lcars.icon.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f27c26b7f..d2295b1f8 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -129,21 +129,21 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); g.drawString("BAT:", 26, y); - g.drawString(bat+ "%", 68, y); + g.drawString(bat+ "%", 65, y); } else if(key == "Steps"){ var steps = getSteps(); g.drawString("STEP:", 26, y); - g.drawString(steps, 68, y); + g.drawString(steps, 65, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); g.drawString("TMP:", 26, y); - g.drawString(temperature + "C", 68, y); + g.drawString(temperature + "C", 65, y); } else if(key == "HRM"){ g.drawString("HRM:", 26, y); - g.drawString(hrmValue, 68, y); + g.drawString(hrmValue, 65, y); } else { g.drawString("NOT FOUND", 26, y); @@ -197,14 +197,14 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 115, 107); + g.drawImage(iconImg, 117, 107); // Alarm within symbol g.setFontAntonioMedium(); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 115+25, 107+25+1); + g.drawString(getAlarmMinutes(), 117+25, 107+25+1); } g.setFontAlign(-1, -1, 0); } diff --git a/apps/lcars/lcars.icon.js b/apps/lcars/lcars.icon.js index 49694cf7c..22e98a39a 100644 --- a/apps/lcars/lcars.icon.js +++ b/apps/lcars/lcars.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("lmy5YCFi1ZsuWAQgGGy1YgXbtu2AQgjH4EAEZ2XCINbEZxRBvIjNzwRBh4jN2ARBgIjNwCIClojMTQcFEZdkCIgjLngRDg4jLsDREEZOzTwIAEjwjHs5oDAAiSEEYUcCA5uFeoQQJAAP2EYRECgJHGJQrRDps4BwsD5wDBrYjB+AXBtJaHBAV5spoC6dNGY8NmBBBEYMAg2atJHHvOmwEB8qtBmnTpgjImncgEtkEB02atARHBYOYSQPgh4jKgILBCIMAhIjBc4ojEzVwCII7B6dAEZpfBEZXmEZ53CI4twEAqVCkwjCNYaMGboQjDUgIjGboOnAgMGR4WgC4YAD+dNmgEBgg5BluUa4QQDg7dB0wjCJoNl2z7CAQJBDEYLwDh9tyxEBjitFEYJEBfwQjB7z1GEYQsCgfbEYNZT4ggBEYWcOIVZEYPbtAQCgfNEANODIYOBEYVlDQQAHg4OCCgW0CBEKEYySBg4gFi1Z4AjFWwM922OJQOPtoLBoBHGgPlAoQCEoAjGgIdCAQto+wjFhIgFAQwjDrYjIAQYjDEBQjFARwA==")) +require("heatshrink").decompress(atob("mEwgeevPnAQsc+fPngCE+/fvoCEvAbIA4/AgFzEZwRBjwjNvBUBEZ3eCIMOEZtwCIMBEZuARYU5EZecTocHEZf0CIcBEbvgaggjKTwIAEbQpoHAAiSEeoYQHJQr1CCBJKEIgcBI4xKFaIdt3AOFgfuAYMeEYLRBj1pLQ4ICuYjBAgPbtoRHhu3AYN5VoMGzVpI49502AgPPVoM27dsK48N23cgE5CgOmzVoCI4LBzCSB8EP2wjJgILBAYMAhIjBsAjJzVwg47C7YRJEYhfBEZXmEZ53CI4q2BEAiVCkwjCNYaMGboQjDkBfDCAbdB04EBgyPDC4YAD/dt2wRCHIM5njXCCAcHboOmCIQ0B5/nfYT6DFIIjBeAcOvM8+EAjitFEYJEBAANzEYOeeowjCFgUDzwjB+YrDgAgBEYWcA4Mc+YjCvAQCgftEANuDIYOBEYXPNwIAIg4OCCgXkCBEOEZDvBEAhEB4AjF/inB8+OJQOOvILBoAjGU4IFDAQYjGbQIdCAQt4EY0DEZACDEYceEZACDC4bLBEZwCO")) \ No newline at end of file From 92dde29d4540002fd4008a88275d2b38fc82d17c Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 29 Dec 2021 09:26:49 +0100 Subject: [PATCH 401/503] Left align date and time --- apps/lcars/lcars.app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d2295b1f8..af4ff26e7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -225,12 +225,12 @@ function drawPosition0(){ drawLock(); // Write time - g.setFontAlign(0, -1, 0); + g.setFontAlign(-1, -1, 0); g.setColor(cWhite); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 70, 10); + g.drawString(timeStr, 28, 10); // Write date g.setColor(cWhite); @@ -238,7 +238,7 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 70, 56); + g.drawString(dayStr, 29, 56); // Draw data g.setFontAlign(-1, -1, 0); From cf52d8d8111f61bf1bbd37dd3ce455fa9197b133 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:03 +0100 Subject: [PATCH 402/503] Update README.md --- apps/simple_clock/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md index b52476372..d44c495c6 100644 --- a/apps/simple_clock/README.md +++ b/apps/simple_clock/README.md @@ -1,8 +1,8 @@ # Simple Analog Clock # This app displays a simple, yet stylish, analog clock. It considers the -currently configured "theme" (and may therefore look different on your watch -than shown in the screenshot depending on which theme you prefer). +currently configured "theme" (and may therefore look different than shown in +the screenshot on your watch depending on which theme you prefer). ![](app-screenshot.png) From 780286c475aacf5c8eb61b2a030e299ebeab81c0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:05 +0100 Subject: [PATCH 403/503] Update README.md --- apps/minimal_clock/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 913a2aced..5dd27fdf4 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,9 +1,10 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. It considers the currently configured -"theme" (and may therefore look different on your watch than shown in the -screenshot depending on which theme you prefer). +some clock hands and no clock face. It considers currently configured "theme" +(and may therefore look different than shown in the screenshot on your watch +depending on which theme you prefer). + ![](app-screenshot.png) From 2844ccde4cbe9c4452c9f85fd97c436226833416 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:08 +0100 Subject: [PATCH 404/503] Update README.md --- apps/colorful_clock/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md index 429cc51dd..1ba72a4b0 100644 --- a/apps/colorful_clock/README.md +++ b/apps/colorful_clock/README.md @@ -1,8 +1,8 @@ # Colorful Analog Clock # This app displays an analog clock with a colorful face. It considers the -currently configured "theme" (and may therefore look different on your watch -than shown in the screenshot depending on which theme you prefer). +currently configured "theme" (and may therefore look different than shown in +the screenshot on your watch depending on which theme you prefer). ![](app-screenshot.png) From 9e8a3b6c92dcb65faa5d297e2aeda320cd92b675 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:04:50 +0000 Subject: [PATCH 405/503] Cleanup widget --- apps/coretemp/README.md | 13 ++++---- apps/coretemp/coretemp.js | 67 ++++++++++++++++++--------------------- apps/coretemp/widget.js | 44 ++++++++++++------------- 3 files changed, 57 insertions(+), 67 deletions(-) diff --git a/apps/coretemp/README.md b/apps/coretemp/README.md index fac25df21..87be44bb6 100644 --- a/apps/coretemp/README.md +++ b/apps/coretemp/README.md @@ -1,19 +1,18 @@ # CoreTemp display -Basic bare-bones example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current body core temperature readings. +Basic example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current skin and body core temperature readings. ## Usage -On startup connects to a CoreTemp device (1809/2A1C) and emits a "Core, temp" value for each reading. -The app simply displays these readings on screen. +Background task connects to any CoreTemp device (2100/2101) and emits a CoreTemp signal value for each reading. +Application contains three components, one is a background task that monitors the sensor and emits a 'CoreTemp' signal on activity if activated in settings. +The widget shows when the sensor is enabled with a mini value and blinks on use. +The app listens for 'CoreTemp' signals and shows the current skin and core temperatures in large numbers. ## TODO * Integrate with other tracking/sports apps to log data. -* Add device selection -* Provide enable/disable option -* Check status, add Retry/reconnect -* Also provide skin temp reading +* Add specific device selection ## Creator diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index afb905c99..8b618d356 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -4,6 +4,8 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); var btm = g.getHeight() - 1; +var px = g.getWidth() / 2; + var corelogo = { width : 146, height : 48, @@ -16,61 +18,52 @@ var corelogo = { "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; -first = true; function onCore(c) { - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; - - var px = g.getWidth() / 2; g.setFontAlign(0, 0); - if (first) { - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(corelogo, px - 146 / 2, 30); - first = false; - } else { - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); - } + g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + g.setFont("6x8", 3).drawString("Core: " + c.core + c.unit, px, 48 + 48); + g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } -Bangle.on('CoreTemp', onCore); - -g.clear(); - -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// Background task will activate if settings are enabled. +// Background task will activate once settings are enabled. function enableSensor() { settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { - settings.enabled = true; require("Storage").write("coretemp.json", settings); + drawBackground(); Bangle.loadWidgets(); Bangle.drawWidgets(); } } -function drawMessage() { - settings = require("Storage").readJSON("coretemp.json", 1) || {}; - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); +function drawBackground() { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); - if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } else { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(corelogo, px - 146 / 2, 30); + + g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.getHeight() / 2 + 16); +} + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.on('CoreTemp', onCore); + +settings = require("Storage").readJSON("coretemp.json", 1) || {}; +g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + +if (!settings.enabled) { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Sensor disabled,\nBTN2 to enable.", g.getWidth() / 2, + g.getHeight() / 2 - 16); +} else { + drawBackground(); } setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); - -drawMessage(); diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 2b5522875..c534b2b11 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,42 +1,40 @@ -// TODO Change to generic multiple sensor +// TODO Change to a generic multiple sensor widget? + (() => { var settings = {}; var count = 0; - - var img0 = { - width : 24, - height : 24, - bpp : 4, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) - }; - var img1 = { - width : 24, - height : 24, - bpp : 3, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) - }; + var core = 0; // draw your widget function draw() { if (!settings.enabled) return; g.reset(); + g.setFont("6x8", 1).setFontAlign(0, 0); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) ? img1: img0, this.x, this.y); + + if (count & 1) { + g.setColor("#0f0"); // green + } else { + g.setColor(g.theme.dark ? "#333" : "#CCC"); // off = grey + } + + g.drawImage( + atob( + "GBgBAAHwAHP4A+f8B+4cH+4MH84cPwYcfAf4eAP4+AHi+AAO8AAe8AAe8AAe+AAG+AA4eAA8fAB8PgD4P8b4H/7wB/9gA/8AAP4A"), + this.x, this.y); + + g.setColor(g.theme.fg); + g.drawString(core, this.x + 24 / 2, this.y + 19); + + g.setColor(-1); } // Set a listener to 'blink' function onTemp(temp) { count = count + 1; + core = temp.core; WIDGETS["coretemp"].draw(); } From 5b36291f632419e3174bee667fc16881612894b3 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:09:35 +0000 Subject: [PATCH 406/503] Update apps.json Correct version num --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 12d7db79e..987ac9826 100644 --- a/apps.json +++ b/apps.json @@ -4964,7 +4964,7 @@ { "id": "coretemp", "name": "CoreTemp", - "version": "0.03", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", From 73f222535418da8c77cda97dce690965263a06be Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:12:44 +0000 Subject: [PATCH 407/503] Update changelogs --- apps/coretemp/ChangeLog | 1 + apps/recorder/ChangeLog | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index 115067b80..ea6911f1a 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1,2 @@ 0.01: New app +0.02: Cleanup interface and add settings, widget, add skin temp reporting. diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 40240de64..bedc63141 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -3,3 +3,4 @@ Fix interface.html 0.03: Fix theme and maps/graphing if no GPS 0.04: Multiple bugfixes +0.05: Add recording for coresensor From 19126205b95d3b0c4bfd40239a3e0f65e0c536c7 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 15:38:59 +0000 Subject: [PATCH 408/503] Tidy tooltip, display invalid core as n/a --- apps/coretemp/boot.js | 25 +++++++++++++++++-------- apps/coretemp/coretemp.js | 4 ++-- apps/coretemp/widget.js | 7 +++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 269c8e9ff..56f7b371d 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -28,8 +28,16 @@ class CoreSensor { this.unit = "C"; } - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + if (flags & 1) { + this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + } else { + this.skin = 0; + } + if (flags & 2) { + this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + } else { + this.core = 0; + } Bangle.emit('CoreTemp', {core : this.core, skin : this.skin, unit : this.unit}); @@ -79,8 +87,8 @@ function connection_setup() { }) .then(function() { console.log("Done!"); -// getSensorBatteryLevel(gatt); -// g.reset().clearRect(Bangle.appRect).flip(); + // getSensorBatteryLevel(gatt); + // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { console.log(e.toString(), "ERROR"); @@ -89,16 +97,17 @@ function connection_setup() { } function connection_end() { - if (gatt != undefined) gatt.disconnect(); + if (gatt != undefined) + gatt.disconnect(); } -settings = require("Storage").readJSON("coretemp.json",1)||{}; +settings = require("Storage").readJSON("coretemp.json", 1) || {}; console.log("Settings:"); console.log(settings); if (settings.enabled) { - connection_setup(); - NRF.on('disconnect', connection_setup); + connection_setup(); + NRF.on('disconnect', connection_setup); } E.on('kill', () => { connection_end(); }); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 8b618d356..ed7598553 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -20,9 +20,9 @@ var corelogo = { function onCore(c) { g.setFontAlign(0, 0); - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString("Core: " + c.core + c.unit, px, 48 + 48); + g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index c534b2b11..446325118 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -21,12 +21,11 @@ } g.drawImage( - atob( - "GBgBAAHwAHP4A+f8B+4cH+4MH84cPwYcfAf4eAP4+AHi+AAO8AAe8AAe8AAe+AAG+AA4eAA8fAB8PgD4P8b4H/7wB/9gA/8AAP4A"), - this.x, this.y); + atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="), + this.x+(24-12)/2,this.y+1); g.setColor(g.theme.fg); - g.drawString(core, this.x + 24 / 2, this.y + 19); + g.drawString(parseInt(core)+"\n."+parseInt((core*100)%100), this.x + 24 / 2, this.y + 18); g.setColor(-1); } From ab37e5e7d5dad4d2ac056788e572293112d73a89 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:51:12 -0800 Subject: [PATCH 409/503] Update boot.js --- apps/promenu/boot.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 9eac59bfa..62995edfa 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,13 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+24); + if(g.theme.dark){ + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); + console.log("yippe!o"); + }else{ + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); + console.log("yippe!"); + } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 11 && "object" == typeof item){ @@ -170,4 +176,21 @@ E.showMenu = function(items) { else l.select(); }); return l; -}: +}; + +E.showMenu({ + "" : { "title" : "Sample Pro Menu" }, + "< Back" : () => back(), + 'On or off?': { + value:100, // !! converts undefined to false + format: v => v?"On":"Off", + onchange: v => { + } + }, + 'How Many?': { + min: 0, max: 10, + format: v => v?"On":"Off", + onchange: v => { + } + }, + }); From 9b1e10126710ee810540ca78d353942459beef8a Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:51:57 -0800 Subject: [PATCH 410/503] Update boot.js --- apps/promenu/boot.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 62995edfa..aeb9308e5 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -69,10 +69,8 @@ E.showMenu = function(items) { var hl = (idx==options.selected && !l.selectEdit); if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); - console.log("yippe!o"); }else{ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); - console.log("yippe!"); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); @@ -81,7 +79,6 @@ E.showMenu = function(items) { if (item.format) v=item.format(v); v = loc.translate(""+v); g.drawString(loc.translate(name).substring(0, 15-v.length)+"...",x+8,iy+7); - console.log("gippo"); }else{ if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+7); @@ -177,20 +174,3 @@ E.showMenu = function(items) { }); return l; }; - -E.showMenu({ - "" : { "title" : "Sample Pro Menu" }, - "< Back" : () => back(), - 'On or off?': { - value:100, // !! converts undefined to false - format: v => v?"On":"Off", - onchange: v => { - } - }, - 'How Many?': { - min: 0, max: 10, - format: v => v?"On":"Off", - onchange: v => { - } - }, - }); From 58c66c281dcf0369f7bc998656cce635091b3843 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:54:26 -0800 Subject: [PATCH 411/503] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index aeb9308e5..89a8823a8 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -70,7 +70,7 @@ E.showMenu = function(items) { if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); }else{ - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); From b0bb834a5f620d65548fd1111922a00513a244f3 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 08:10:01 -0800 Subject: [PATCH 412/503] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 89a8823a8..002734113 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -70,7 +70,7 @@ E.showMenu = function(items) { if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); }else{ - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg-10); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); From 1f7881e1c2af8098aa6ffbe72a0c4704da7c096b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 16:20:29 +0000 Subject: [PATCH 413/503] Add screenshot, change colours for theme. --- apps/coretemp/boot.js | 16 ++++++++-------- apps/coretemp/coretemp.js | 2 +- apps/coretemp/screenshot.png | Bin 0 -> 3919 bytes 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 apps/coretemp/screenshot.png diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 56f7b371d..8ef264640 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -2,7 +2,7 @@ // If enabled in settings run constantly in background // (function() { - +var log = function() {};//print var settings = {}; var device; var gatt; @@ -63,11 +63,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - console.log("Scanning for CoreTemp sensor..."); + log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - console.log("Found device"); + log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -86,13 +86,13 @@ function connection_setup() { return characteristic.startNotifications(); }) .then(function() { - console.log("Done!"); + log("Done!"); // getSensorBatteryLevel(gatt); // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - console.log(e.toString(), "ERROR"); - console.log(e); + log(e.toString(), "ERROR"); + log(e); }); } @@ -102,8 +102,8 @@ function connection_end() { } settings = require("Storage").readJSON("coretemp.json", 1) || {}; -console.log("Settings:"); -console.log(settings); +log("Settings:"); +log(settings); if (settings.enabled) { connection_setup(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index ed7598553..b3ef7a91e 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -21,7 +21,7 @@ var corelogo = { function onCore(c) { g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); - g.setColor(0xC618); // Light gray + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } diff --git a/apps/coretemp/screenshot.png b/apps/coretemp/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..054c16eef71671eb43943d0970b0cfe5564bc0da GIT binary patch literal 3919 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 V_nuPMI`|Yr%uQ@A)f!*@^WX5P5GViu literal 0 HcmV?d00001 From 860bd58b0a8f8abaec7a96e055c66a77547adf0f Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 16:24:22 +0000 Subject: [PATCH 414/503] Update apps.json Add screenshot --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 987ac9826..bc1fc0ed5 100644 --- a/apps.json +++ b/apps.json @@ -4978,7 +4978,8 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, {"name":"coretemp.boot.js","url":"boot.js"} ], - "data": [{"name":"coretemp.json","url":"app-settings.json"}] + "data": [{"name":"coretemp.json","url":"app-settings.json"}], + "screenshots": [{"url":"screenshot.png"}] }, { "id": "showimg", From 9697fd168f0ae86d63563bb77ae19ac5fbe28277 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 22:40:35 +0000 Subject: [PATCH 415/503] Fix B2 drawing compatibility --- apps/coretemp/coretemp.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index b3ef7a91e..10ce35f64 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -19,11 +19,15 @@ var corelogo = { }; function onCore(c) { + + sz = (process.env.HWVERSION == 1) ? 3 : 2; + g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray - g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); - g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); + g.setFont("6x8", sz).drawString( + "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); + g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } // Background task will activate once settings are enabled. @@ -43,10 +47,12 @@ function enableSensor() { function drawBackground() { g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.setBgColor('#000'); // Put logo on black bg + g.clearRect(0, 28, g.getWidth(), 32 + 48); g.drawImage(corelogo, px - 146 / 2, 30); + g.setBgColor(-1); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.drawString("Please wait...\nWaiting for\ndata", g.getWidth() / 2, g.getHeight() / 2 + 16); } @@ -66,4 +72,4 @@ if (!settings.enabled) { drawBackground(); } -setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); +setWatch(() => { enableSensor(); }, BTN1, {repeat : false}); From 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 05:39:09 +0000 Subject: [PATCH 416/503] Let screen sleep --- apps/coretemp/coretemp.js | 45 ++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 10ce35f64..174e71e6e 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,17 +1,17 @@ // Simply listen for core events and show data -Bangle.setLCDPower(1); -Bangle.setLCDTimeout(0); - var btm = g.getHeight() - 1; var px = g.getWidth() / 2; +// Dark or light logo +var col = (process.env.HWVERSION == 1) ? 65535 : 0; + var corelogo = { width : 146, height : 48, bpp : 4, transparent : 0, - palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + palette : new Uint16Array([ col, col, 2854, 1419 ]), buffer : require("heatshrink") .decompress(atob( @@ -19,12 +19,12 @@ var corelogo = { }; function onCore(c) { - + // Large or small font sz = (process.env.HWVERSION == 1) ? 3 : 2; g.setFontAlign(0, 0); - g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); - g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray g.setFont("6x8", sz).drawString( "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); @@ -38,38 +38,29 @@ function enableSensor() { settings.enabled = true; require("Storage").write("coretemp.json", settings); - drawBackground(); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + drawBackground("Waiting for\ndata..."); } } -function drawBackground() { +function drawBackground(message) { + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); - - g.setBgColor('#000'); // Put logo on black bg - g.clearRect(0, 28, g.getWidth(), 32 + 48); g.drawImage(corelogo, px - 146 / 2, 30); - g.setBgColor(-1); - - g.drawString("Please wait...\nWaiting for\ndata", g.getWidth() / 2, - g.getHeight() / 2 + 16); + g.drawString(message, g.getWidth() / 2, g.getHeight() / 2 + 16); } -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); Bangle.on('CoreTemp', onCore); settings = require("Storage").readJSON("coretemp.json", 1) || {}; -g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Sensor disabled,\nBTN2 to enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); + drawBackground("Sensor disabled\nBTN" + + ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); } else { - drawBackground(); + drawBackground("Waiting for\ndata..."); } -setWatch(() => { enableSensor(); }, BTN1, {repeat : false}); +setWatch(() => { enableSensor(); }, (process.env.HWVERSION == 1) ? BTN2 : BTN1, + {repeat : false}); From 2d387c8e07411208a697499fed93c8d4542dfac2 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:04:50 +0000 Subject: [PATCH 417/503] Cleanup app and widget and fix B2 drawing compatibility Add screenshot --- apps.json | 5 ++- apps/coretemp/ChangeLog | 1 + apps/coretemp/README.md | 13 +++--- apps/coretemp/boot.js | 41 +++++++++++------- apps/coretemp/coretemp.js | 78 +++++++++++++++-------------------- apps/coretemp/screenshot.png | Bin 0 -> 3919 bytes apps/coretemp/widget.js | 43 +++++++++---------- apps/recorder/ChangeLog | 1 + 8 files changed, 90 insertions(+), 92 deletions(-) create mode 100644 apps/coretemp/screenshot.png diff --git a/apps.json b/apps.json index 12d7db79e..bc1fc0ed5 100644 --- a/apps.json +++ b/apps.json @@ -4964,7 +4964,7 @@ { "id": "coretemp", "name": "CoreTemp", - "version": "0.03", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", @@ -4978,7 +4978,8 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, {"name":"coretemp.boot.js","url":"boot.js"} ], - "data": [{"name":"coretemp.json","url":"app-settings.json"}] + "data": [{"name":"coretemp.json","url":"app-settings.json"}], + "screenshots": [{"url":"screenshot.png"}] }, { "id": "showimg", diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index 115067b80..ea6911f1a 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1,2 @@ 0.01: New app +0.02: Cleanup interface and add settings, widget, add skin temp reporting. diff --git a/apps/coretemp/README.md b/apps/coretemp/README.md index fac25df21..87be44bb6 100644 --- a/apps/coretemp/README.md +++ b/apps/coretemp/README.md @@ -1,19 +1,18 @@ # CoreTemp display -Basic bare-bones example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current body core temperature readings. +Basic example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current skin and body core temperature readings. ## Usage -On startup connects to a CoreTemp device (1809/2A1C) and emits a "Core, temp" value for each reading. -The app simply displays these readings on screen. +Background task connects to any CoreTemp device (2100/2101) and emits a CoreTemp signal value for each reading. +Application contains three components, one is a background task that monitors the sensor and emits a 'CoreTemp' signal on activity if activated in settings. +The widget shows when the sensor is enabled with a mini value and blinks on use. +The app listens for 'CoreTemp' signals and shows the current skin and core temperatures in large numbers. ## TODO * Integrate with other tracking/sports apps to log data. -* Add device selection -* Provide enable/disable option -* Check status, add Retry/reconnect -* Also provide skin temp reading +* Add specific device selection ## Creator diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 269c8e9ff..8ef264640 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -2,7 +2,7 @@ // If enabled in settings run constantly in background // (function() { - +var log = function() {};//print var settings = {}; var device; var gatt; @@ -28,8 +28,16 @@ class CoreSensor { this.unit = "C"; } - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + if (flags & 1) { + this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + } else { + this.skin = 0; + } + if (flags & 2) { + this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + } else { + this.core = 0; + } Bangle.emit('CoreTemp', {core : this.core, skin : this.skin, unit : this.unit}); @@ -55,11 +63,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - console.log("Scanning for CoreTemp sensor..."); + log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - console.log("Found device"); + log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -78,27 +86,28 @@ function connection_setup() { return characteristic.startNotifications(); }) .then(function() { - console.log("Done!"); -// getSensorBatteryLevel(gatt); -// g.reset().clearRect(Bangle.appRect).flip(); + log("Done!"); + // getSensorBatteryLevel(gatt); + // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - console.log(e.toString(), "ERROR"); - console.log(e); + log(e.toString(), "ERROR"); + log(e); }); } function connection_end() { - if (gatt != undefined) gatt.disconnect(); + if (gatt != undefined) + gatt.disconnect(); } -settings = require("Storage").readJSON("coretemp.json",1)||{}; -console.log("Settings:"); -console.log(settings); +settings = require("Storage").readJSON("coretemp.json", 1) || {}; +log("Settings:"); +log(settings); if (settings.enabled) { - connection_setup(); - NRF.on('disconnect', connection_setup); + connection_setup(); + NRF.on('disconnect', connection_setup); } E.on('kill', () => { connection_end(); }); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index afb905c99..7cbbe3577 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,76 +1,66 @@ // Simply listen for core events and show data -Bangle.setLCDPower(1); -Bangle.setLCDTimeout(0); - var btm = g.getHeight() - 1; +var px = g.getWidth() / 2; + +// Dark or light logo +var col = (process.env.HWVERSION == 1) ? 65535 : 0; + var corelogo = { width : 146, height : 48, bpp : 4, transparent : 0, - palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + palette : new Uint16Array([ col, col, 2854, 1419 ]), buffer : require("heatshrink") .decompress(atob( "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; -first = true; function onCore(c) { - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; + // Large or small font + var sz = ((process.env.HWVERSION == 1) ? 3 : 2); - var px = g.getWidth() / 2; g.setFontAlign(0, 0); - if (first) { - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(corelogo, px - 146 / 2, 30); - first = false; - } else { - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); - } - g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray + g.setFont("6x8", sz).drawString( + "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); + g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } -Bangle.on('CoreTemp', onCore); - -g.clear(); - -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// Background task will activate if settings are enabled. +// Background task will activate once settings are enabled. function enableSensor() { settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { - settings.enabled = true; require("Storage").write("coretemp.json", settings); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + drawBackground("Waiting for\ndata..."); } } -function drawMessage() { - settings = require("Storage").readJSON("coretemp.json", 1) || {}; - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - - if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } else { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } +function drawBackground(message) { + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawImage(corelogo, px - 146 / 2, 30); + g.drawString(message, g.getWidth() / 2, g.getHeight() / 2 + 16); } -setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); +Bangle.on('CoreTemp', onCore); -drawMessage(); +settings = require("Storage").readJSON("coretemp.json", 1) || {}; + +if (!settings.enabled) { + drawBackground("Sensor off\nBTN" + + ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); +} else { + drawBackground("Waiting for\ndata..."); +} + +setWatch(() => { enableSensor(); }, (process.env.HWVERSION == 1) ? BTN2 : BTN1, + {repeat : false}); diff --git a/apps/coretemp/screenshot.png b/apps/coretemp/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..054c16eef71671eb43943d0970b0cfe5564bc0da GIT binary patch literal 3919 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 V_nuPMI`|Yr%uQ@A)f!*@^WX5P5GViu literal 0 HcmV?d00001 diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 2b5522875..446325118 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,42 +1,39 @@ -// TODO Change to generic multiple sensor +// TODO Change to a generic multiple sensor widget? + (() => { var settings = {}; var count = 0; - - var img0 = { - width : 24, - height : 24, - bpp : 4, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) - }; - var img1 = { - width : 24, - height : 24, - bpp : 3, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) - }; + var core = 0; // draw your widget function draw() { if (!settings.enabled) return; g.reset(); + g.setFont("6x8", 1).setFontAlign(0, 0); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) ? img1: img0, this.x, this.y); + + if (count & 1) { + g.setColor("#0f0"); // green + } else { + g.setColor(g.theme.dark ? "#333" : "#CCC"); // off = grey + } + + g.drawImage( + atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="), + this.x+(24-12)/2,this.y+1); + + g.setColor(g.theme.fg); + g.drawString(parseInt(core)+"\n."+parseInt((core*100)%100), this.x + 24 / 2, this.y + 18); + + g.setColor(-1); } // Set a listener to 'blink' function onTemp(temp) { count = count + 1; + core = temp.core; WIDGETS["coretemp"].draw(); } diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 40240de64..bedc63141 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -3,3 +3,4 @@ Fix interface.html 0.03: Fix theme and maps/graphing if no GPS 0.04: Multiple bugfixes +0.05: Add recording for coresensor From 3b7f47d17beb7d2af9ce59cb685af9d3097a3d94 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 06:08:22 +0000 Subject: [PATCH 418/503] Fix merge conflict --- apps/coretemp/coretemp.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index e628a25ca..7cbbe3577 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -20,11 +20,7 @@ var corelogo = { function onCore(c) { // Large or small font -<<<<<<< HEAD var sz = ((process.env.HWVERSION == 1) ? 3 : 2); -======= - sz = (process.env.HWVERSION == 1) ? 3 : 2; ->>>>>>> 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); @@ -60,11 +56,7 @@ Bangle.on('CoreTemp', onCore); settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { -<<<<<<< HEAD drawBackground("Sensor off\nBTN" + -======= - drawBackground("Sensor disabled\nBTN" + ->>>>>>> 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); } else { drawBackground("Waiting for\ndata..."); From 18efaed6477e8c7eb8eed31a8489063a3a3223d1 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 06:53:53 +0000 Subject: [PATCH 419/503] Connection seems more reliable on B2 with "active:true" request. --- apps/coretemp/boot.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 8ef264640..27d437cb1 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -64,7 +64,7 @@ function getSensorBatteryLevel(gatt) { function connection_setup() { log("Scanning for CoreTemp sensor..."); - NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + NRF.requestDevice({active:true,timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; log("Found device"); @@ -88,7 +88,6 @@ function connection_setup() { .then(function() { log("Done!"); // getSensorBatteryLevel(gatt); - // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { log(e.toString(), "ERROR"); @@ -112,6 +111,4 @@ if (settings.enabled) { E.on('kill', () => { connection_end(); }); -// Bangle.loadWidgets(); -// Bangle.drawWidgets(); })(); From 74114e8efd54a78df519b46e6e18b1833e641a34 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:01 +0100 Subject: [PATCH 420/503] Create app.js --- apps/themesetter/app.js | 504 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 504 insertions(+) create mode 100644 apps/themesetter/app.js diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js new file mode 100644 index 000000000..d8536cf22 --- /dev/null +++ b/apps/themesetter/app.js @@ -0,0 +1,504 @@ + let Layout = require('Layout'); + + let ScreenWidth = g.getWidth(), halfWidth = ScreenWidth/2; + let ScreenHeight = g.getHeight(); + + let normalizedColorSet = { + black:g.toColor(0,0,0), white: g.toColor(1,1,1), + red: g.toColor(1,0,0), yellow: g.toColor(1,1,0), + green:g.toColor(0,1,0), magenta:g.toColor(1,0,1), + blue: g.toColor(0,0,1), cyan: g.toColor(0,1,1) + }; + + let activeTheme = g.theme; // currently active theme + let pendingTheme = Object.assign({},activeTheme); + let chosenDetail = null; // one of 'fg','bg','fg2','bg2','fgH','bgH' + +/**** Label ****/ + + function Label (Text, Options) { + function renderLabel (Details) { + let halfWidth = Details.w/2, xAlignment = Details.halign || 0; + let halfHeight = Details.h/2, yAlignment = Details.valign || 0; + let Padding = Details.pad || 0; + + g.setColor(Details.col || g.theme.fg || '#000000'); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(xAlignment,yAlignment); + + let x = Details.x + halfWidth + xAlignment*(halfWidth+Padding); + let y = Details.y + halfHeight + yAlignment*(halfHeight+Padding); + + g.drawString(Details.label, x,y); + if (Details.bold) { + g.drawString(Details.label, x+1,y); + g.drawString(Details.label, x,y+1); + g.drawString(Details.label, x+1,y+1); + } + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderLabel, label:Text || '' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*(Options.pad || 0); + return Result; + } + +/**** drawRoundedRect ****/ + + const roundedRectSines = [ + 0, Math.sin(15*Math.PI/180), Math.sin(30*Math.PI/180), + Math.sin(45*Math.PI/180), Math.sin(60*Math.PI/180), + Math.sin(75*Math.PI/180), 1 + ]; + const roundedRectPoly = Array(56); + + function prepareRoundedRect (x1,y1, x2,y2, r) { + r = Math.min(r || 0, Math.abs(x1-x2), Math.abs(y1-y2)); + + for (let i = 0, j = 0; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x1 + r - r*roundedRectSines[6-i]; + roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[i]; + } + + for (let i = 0, j = 14; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x2 - r + r*roundedRectSines[i]; + roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[6-i]; + } + + for (let i = 0, j = 28; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x2 - r + r*roundedRectSines[6-i]; + roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[i]; + } + + for (let i = 0, j = 42; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x1 + r - r*roundedRectSines[i]; + roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[6-i]; + } + } + + g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { + prepareRoundedRect(x1,y1, x2,y2, r); + this.drawPoly(roundedRectPoly,true); + }; + + g.fillRoundedRect = function fillRoundedRect (x1,y1, x2,y2, r) { + prepareRoundedRect(x1,y1, x2,y2, r); + this.fillPoly(roundedRectPoly,true); + }; + + +/**** Button ****/ + + function Button (Text, Options) { + function renderButton (Details) { + let x = Details.x, Width = Details.w, halfWidth = Width/2; + let y = Details.y, Height = Details.h, halfHeight = Height/2; + let Padding = Details.pad || 0; + + g.setColor(Details.col || g.theme.fg || '#000000'); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(0,0); + + g.drawRoundedRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1,8); + g.drawString(Details.label, x+halfWidth,y+halfHeight); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight); + g.drawString(Details.label, x+halfWidth,y+halfHeight+1); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight+1); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderButton, label:Text || 'Tap' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*10 + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*5 + 2*(Options.pad || 0); + return Result; + } + +/**** ColorDemo ****/ + + function ColorDemo (Text, Options) { + function renderDemo (Details) { + let x = Details.x, Width = Details.w, halfWidth = Width/2; + let y = Details.y, Height = Details.h, halfHeight = Height/2; + let Padding = Details.pad || 0; + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(0,0); + + g.setColor(Details.bg); // do not use "bgCol"! + g.fillRect(x+Padding, y+Padding, x+Width-Padding, y+Height-Padding); + + g.setColor(Details.fg); + g.drawString(Details.label, x+halfWidth,y+halfHeight); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderDemo, label:Text || 'Test' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*2 + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*2 + 2*(Options.pad || 0); + return Result; + } + + +/**** ColorView ****/ + + function ColorView (Color, Options) { + function renderColorView (Details) { + let x = Details.x, Width = Details.w; + let y = Details.y, Height = Details.h; + let Padding = Details.pad || 0; + + g.setColor('#000000'); + g.drawRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1); + + g.setColor(Details.col); + g.fillRect(x+Padding+2, y+Padding+2, x+Width-Padding-3, y+Height-Padding-3); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderColorView, col:Color + }); + Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); + Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + return Result; + } + + +/**** ColorSelectionView ****/ + + function ColorSelectionView (Color, Options) { + function renderColorView (Details) { + let x = Details.x, Width = Details.w; + let y = Details.y, Height = Details.h; + let Padding = Details.pad || 0; + + if (Details.selected) { + g.setColor(Details.selected ? '#FF0000' : '#000000'); + g.fillRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1); + + g.setColor('#FFFFFF'); + g.drawRect(x+Padding+4,y+Padding+4, x+Width-Padding-5,y+Height-Padding-5); + } else { + g.setColor('#000000'); + g.drawRect(x+Padding+3,y+Padding+3, x+Width-Padding-4,y+Height-Padding-4); + } + + g.setColor(Details.col); + g.fillRect(x+Padding+5, y+Padding+5, x+Width-Padding-6, y+Height-Padding-6); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderColorView, col:Color + }); + Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); + Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + return Result; + } + + +/**** EventConsumerAtPoint ****/ + + function EventConsumerAtPoint (HandlerName, x,y) { + let Layout = (activeLayout || {}).l; + if (Layout == null) { return; } + + function ConsumerIn (Control) { + if ( + (x < Control.x) || (x >= Control.x + Control.w) || + (y < Control.y) || (y >= Control.y + Control.h) + ) { return undefined; } + + if (typeof Control[HandlerName] === 'function') { return Control; } + + if (Control.c != null) { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + let Consumer = ConsumerIn(ControlList[i]); + if (Consumer != null) { return Consumer; } + } + } + + return undefined; + } + + return ConsumerIn(Layout); + } + +/**** dispatchTouchEvent ****/ + + function dispatchTouchEvent () { + function handleTouchEvent (Button, xy) { + let Control = EventConsumerAtPoint('onTouch', xy.x,xy.y); + if (Control != null) { + Control.onTouch(Control, Button, xy); + } + } + Bangle.on('touch',handleTouchEvent); + } + dispatchTouchEvent(); + +/**** dispatchStrokeEvent ****/ + + function dispatchStrokeEvent () { + function handleStrokeEvent (Coordinates) { + let Control = EventConsumerAtPoint('onStroke', Coordinates.xy[0],Coordinates.xy[1]); + if (Control != null) { + Control.onStroke(Control, Coordinates); + } + } + Bangle.on('stroke',handleStrokeEvent); + } + dispatchStrokeEvent(); + + let ScreenSet = {}; + + g.setFont12x20(); // does not seem to be respected in layout! + let leftColumnWidth = Math.max( + g.stringWidth('Normal '), g.stringWidth('Accented '), g.stringWidth('Hilighted ') + ); + + ScreenSet['MainScreen'] = new Layout({ + type:'v', c:[ + Label('Current Theme', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), + ] }, + { type:'h', c:[ + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), + ] }, + { type:'h', c:[ + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Configure', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + onTouch:() => gotoScreen('DetailSelectionScreen') }) + ], filly:1 } + ] + }); + + let LabelWidth = Math.max( + g.stringWidth('Fg '), g.stringWidth('Fg2 '), g.stringWidth('FgH '), + g.stringWidth('Bg '), g.stringWidth('Bg2 '), g.stringWidth('BgH ') + ); + let LabelHeight = g.stringMetrics('FgH').height; + + ScreenSet['DetailSelectionScreen'] = new Layout({ + type:'v', c:[ + Label('Configure Detail', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fg') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', + onTouch:() => configureDetail('fg') }), + { width:20 }, + Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bg') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', + onTouch:() => configureDetail('bg') }), + ] }, + { type:'h', c:[ + Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fg2') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', + onTouch:() => configureDetail('fg2') }), + { width:20 }, + Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bg2') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', + onTouch:() => configureDetail('bg2') }), + ] }, + { type:'h', c:[ + Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fgH') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', + onTouch:() => configureDetail('fgH') }), + { width:20 }, + Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bgH') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', + onTouch:() => configureDetail('bgH') }), + ] }, + { type:'h', c:[ + Button('Save', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, + onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), + Button('Cancel', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, + onTouch:() => gotoScreen('MainScreen') }) + ], filly:1 }, + ] + }); + + ScreenSet['ColorSelectionScreen'] = new Layout({ + type:'v', c:[ + Label('Choose Color', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', + onTouch:() => selectColor(0,0,0) }), + ColorSelectionView('#FF0000',{ width:40, height:40, pad:2, id:'red', + onTouch:() => selectColor(1,0,0) }), + ColorSelectionView('#00FF00',{ width:40, height:40, pad:2, id:'green', + onTouch:() => selectColor(0,1,0) }), + ColorSelectionView('#0000FF',{ width:40, height:40, pad:2, id:'blue', + onTouch:() => selectColor(0,0,1) }), + ] }, + { type:'h', c:[ + ColorSelectionView('#FFFFFF',{ width:40, height:40, pad:2, id:'white', + onTouch:() => selectColor(1,1,1) }), + ColorSelectionView('#FFFF00',{ width:40, height:40, pad:2, id:'yellow', + onTouch:() => selectColor(1,1,0) }), + ColorSelectionView('#FF00FF',{ width:40, height:40, pad:2, id:'magenta', + onTouch:() => selectColor(1,0,1) }), + ColorSelectionView('#00FFFF',{ width:40, height:40, pad:2, id:'cyan', + onTouch:() => selectColor(0,1,1) }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, + onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button('Preview', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, + onTouch:() => gotoScreen('ThemePreviewScreen') }) + ], filly:1 }, + ] + }); + + ScreenSet['ThemePreviewScreen'] = new Layout({ + type:'v', c:[ + Label('Theme Preview', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), + ] }, + { type:'h', c:[ + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), + ] }, + { type:'h', c:[ + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + onTouch:() => gotoScreen('ColorSelectionScreen') }) + ], filly:1 } + ] + }); + + +/**** applyChanges ****/ + + function applyChanges () { + let pendingBg = pendingTheme.bg; + let R = ((pendingBg >> 11) & 0b11111) / 0b11111; + let G = ((pendingBg >> 5) & 0b111111) / 0b111111; + let B = (pendingBg & 0b11111) / 0b11111; + pendingTheme.dark = (0.2126*R + 0.7152*G + 0.0722*B < 0.5); + + activeTheme = Object.assign(activeTheme,pendingTheme); + + let globalSettings = Object.assign( + require('Storage').readJSON('setting.json', true) || {}, + { theme:activeTheme } + ); + require('Storage').writeJSON('setting.json', globalSettings); + } + +/**** configureDetail ****/ + + function configureDetail (Detail) { + chosenDetail = Detail; + gotoScreen('ColorSelectionScreen'); + } + +/**** updateColorSelection ****/ + + function updateColorSelection () { + let selectedColor = pendingTheme[chosenDetail]; + + for (let Key in normalizedColorSet) { + if (normalizedColorSet.hasOwnProperty(Key)) { + activeLayout[Key].selected = (selectedColor === normalizedColorSet[Key]); + } + } + } + +/**** selectColor ****/ + + function selectColor (R,G,B) { + let selectedColor = g.toColor(R,G,B); + pendingTheme[chosenDetail] = selectedColor; + + updateColorSelection(); + g.clear(); + activeLayout.render(); + } + +/**** gotoScreen ****/ + + let activeLayout; + + function gotoScreen (ScreenName) { + activeLayout = ScreenSet[ScreenName]; + + switch (ScreenName) { + case 'MainScreen': + activeLayout['NormalDemo'].fg = activeTheme.fg; + activeLayout['NormalDemo'].bg = activeTheme.bg; + activeLayout['AccentedDemo'].fg = activeTheme.fg2; + activeLayout['AccentedDemo'].bg = activeTheme.bg2; + activeLayout['HilitedDemo'].fg = activeTheme.fgH; + activeLayout['HilitedDemo'].bg = activeTheme.bgH; + break; + case 'DetailSelectionScreen': + activeLayout['fgView'].col = pendingTheme.fg; + activeLayout['bgView'].col = pendingTheme.bg; + activeLayout['fg2View'].col = pendingTheme.fg2; + activeLayout['bg2View'].col = pendingTheme.bg2; + activeLayout['fgHView'].col = pendingTheme.fgH; + activeLayout['bgHView'].col = pendingTheme.bgH; + break; + case 'ColorSelectionScreen': + updateColorSelection(); + break; + case 'ThemePreviewScreen': + activeLayout['NormalTest'].fg = pendingTheme.fg; + activeLayout['NormalTest'].bg = pendingTheme.bg; + activeLayout['AccentedTest'].fg = pendingTheme.fg2; + activeLayout['AccentedTest'].bg = pendingTheme.bg2; + activeLayout['HilitedTest'].fg = pendingTheme.fgH; + activeLayout['HilitedTest'].bg = pendingTheme.bgH; + } + + g.setColor('#000000'); g.setBgColor('#FFFFFF'); // assert legibility + g.clear(); + + activeLayout.render(); + } + gotoScreen('MainScreen'); + From 0e75c7e4f38dbf9df2756e5ed1c5e44b27d2684d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:08 +0100 Subject: [PATCH 421/503] Create app-icon.png --- apps/themesetter/app-icon.png | Bin 0 -> 429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/app-icon.png diff --git a/apps/themesetter/app-icon.png b/apps/themesetter/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..19fb4ee6a5e2070dba6c4c630573c2d6cddc3c9d GIT binary patch literal 429 zcmV;e0aE^nP)>W!qQoOKl{Jm=Od9Ql}lvkM?NxK6cJv@oo85| zGjvsCXw4dw574j1WnuDuW2`N6aYfAa5Lc_R_$yL?ikaD+rcL6y&ViBc)WiS`xlQXr zbzt}*27}do4$P$S0j8Bu-M-2}@^7FQ#Ue~rWKcf9wR(i;;i|~MSgmpqf-S!BleqB# z>i!{Pux!|mEwKn4+~VEng034=Y8GuA<5~D$`5R}^>?W{*1Ki_FSo{^|*oovAWEVGh z6PEtO9ro0y-EZLtk0zJM0}inn$#IO9e_A3RYFHv|gA#etpc47z)IcyK{(=*1N3$zH zS6IGN Date: Thu, 30 Dec 2021 11:01:11 +0100 Subject: [PATCH 422/503] Create app-icon.js --- apps/themesetter/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/themesetter/app-icon.js diff --git a/apps/themesetter/app-icon.js b/apps/themesetter/app-icon.js new file mode 100644 index 000000000..d4520486b --- /dev/null +++ b/apps/themesetter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwMB/4AQ8AZCCwIFL8YVC+IFQ+EHAp/x44FLHYgFMLwgFW/0HAof4h4FD4EfCAcACAgWECCHgn4WEHwgF7AEI=")) \ No newline at end of file From 081443a794a00b1cb43f6c7b9dc2bd2d608388bf Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:16 +0100 Subject: [PATCH 423/503] Create app-screenshot.png --- apps/themesetter/app-screenshot.png | Bin 0 -> 3232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/app-screenshot.png diff --git a/apps/themesetter/app-screenshot.png b/apps/themesetter/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5 GIT binary patch literal 3232 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 UG4J$vSYHm{hLI(v#sHV_9}TwiaR2}S literal 0 HcmV?d00001 From 05a8fdb94b2d77c493f862eae340925dd047d2a4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:20 +0100 Subject: [PATCH 424/503] Create ThemeSetter-MainScreen.png --- apps/themesetter/ThemeSetter-MainScreen.png | Bin 0 -> 3232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-MainScreen.png diff --git a/apps/themesetter/ThemeSetter-MainScreen.png b/apps/themesetter/ThemeSetter-MainScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5 GIT binary patch literal 3232 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 UG4J$vSYHm{hLI(v#sHV_9}TwiaR2}S literal 0 HcmV?d00001 From 91dced7ebaf8d3547b06b67193dbf337ea63a455 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:28 +0100 Subject: [PATCH 425/503] Create ThemeSetter-DetailSelectionScreen.png --- .../ThemeSetter-DetailSelectionScreen.png | Bin 0 -> 3307 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-DetailSelectionScreen.png diff --git a/apps/themesetter/ThemeSetter-DetailSelectionScreen.png b/apps/themesetter/ThemeSetter-DetailSelectionScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..79a983652ac26cd24ddae635aadf90ac81133b3f GIT binary patch literal 3307 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 Date: Thu, 30 Dec 2021 11:01:31 +0100 Subject: [PATCH 426/503] Create ThemeSetter-ColorSelectionScreen.png --- .../ThemeSetter-ColorSelectionScreen.png | Bin 0 -> 2691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-ColorSelectionScreen.png diff --git a/apps/themesetter/ThemeSetter-ColorSelectionScreen.png b/apps/themesetter/ThemeSetter-ColorSelectionScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed4d857edd97d62bf8618e82a6e6f572d2e7f57 GIT binary patch literal 2691 zcmb_eXHb*r77pJANW!8d2q>U*+^C_7hK}@5U05WP0P8A6T3BGI20mR2(p*B5zO)?{ zNJ8)Mxu{WrNbd^>C}5L!oa_Q`)y9x4CXP_7rKk~ZnqdI^}LA9tRLM>`?$yPqH ztvUk8?#O+z0k8zsqUE=0``C-vlfohP2r!glB$*Boseu40p8Kh8?;Vgpqy1DRC)Y=8 ziD^l{<-bR63{Ks(vCF|2oa20(d3H8Rg4`zz9*L7xx0;A6Cvpq*vVqOv@juw~5~egp z1!%zx(kGp3DCLbcW;nZ8O5XWtZ|R;7JL`fQVB4c$QdqDD7f;a-;pQqob!U3Kmq}%w zTAB79@w+!VgNipIrxM@rYLksf(F2ncw_CqM1s@JgndA1_h1SDl`LRoZ?4d?|Z?<*6 zZ&!C0lwEFU%l{mOj=dqrurC>!Yu>HQYPK)p*Q-8lGT?Bt$MtMS=ZG!h(aOFNq3eG> zuwBD<(F|2dm;eLPwe@uyTf~jzN01co?G#}RkB+heD=tr+`<1jH9)J&Xw;0+;sNnx< z`D1{wek>*bbza~vlx4UC=7E#nHL#qYd(*?GZJ4KO$J}#^x113Sa1hZ~PxtQ$Mm9t4 zL)UCh^+{i}$ivew1^aQTbYG-gLd{N@%2SWj(w?cBjn=9yUTEpKAmx!AMhI349P}!2 z3rVFU>$dYN{xmg@smbKAjc$*f*>it6ClF}Vzcf|tezf|1TSnn{9lb9Qxj4I?$nO+W2uanU~?A{ad3qO$Mw!mKozshw77CC!Vpt zbrCmN_<+$!c!&TVYz?*LAplp`#CgGjQ3(^@8WN%F7i!GLtFIgj&wCcnk5X%U+K7ra)F>mLIQ)Rr7Rs zyhXY#=cZ_O^QZo9$u6C*1sOKYOS(v3P`D>?xwrD;&gO%F8ZQ6y>d|%jkG`%AZ1%j| zuqLy`w+$YQ`G%lv0qt7heA!eic}*BNe`P;Uft8-$Ed_AhblnwMU*%Pa0Qpom86{R$ zZj&M4k@RF*iG|K7(**QO);i=_MOjQ0;II`Rr@+ExcANq_h63~yS@)gFMFFeTq}y1s z`H7%J=t| zUPk?N%o8N%MKUz?GeypES<%5ovRUk$9cZacMHJ0SfHy7cBvGU|*NA7m&*ICx_ zN@n+7%|B$G*q;iB{ilQyQ8+ukU6BPim80QmUcuG)p11|Vjl1rLl*B%lmZzo^kIH~5 zrcWoZMAX%G!t-#23<3SkY8q9>-sL2Y{7*t8uVLh0=02hoCNjulkaL8Ek6^jAI5KUJ zeyGUm|7H|`yZek2s>HHZtOHk;l9Kwc4}7~6ORs*lJ%TrDu>TMg^LeElZ`RA26Emu7 zIQZ-LMeB=+kScO7HN_tDR4X1SHpx!)$`>5X8bPXHd&qU zNuJw!NoKbj2o=hBHwt%DdZS-22?00)uQYVv&2eA9!2#YJbQ3K*QFvFp<|M} zzjii5fPt;rTx9@dfL8APkE`Zj)c!XV(K9jQtA4*O==)yyYaJ7xm?iYs_VYBMv!Ijj zmH&RTj85d^$RD;s5KZjrca_1v74A}|cUpA>RU`TC23OMeNX$b&T6&Qy%@`>Z;&}&a zw#QjXhQca)ELW2rLE%2dx-^jj0oU+*g*WaBpc$+vZAmdc^k$ z($vm1m`IfPi4+XHRNQbYU7FYCPPluJ0Po|U@;Gi{8_HA(CFF+K41V~I5txjmnRb{y=Jh+77K(&5o(4JR?nH?wplOEPSmyX&-WFpT z?c-G{hacM;XInRVdM0QFQi_L)4tg(FxEat&S4nfQ<8VKr9|Km5Hg09ky~J_DgDaY? zLXk;TOCViyX z@3?`@m{%!pJe1TrH(uIw`(&_wXSj{dtRkr6ff}F%B0Hk`D$ZKo?>q&>abzW*FhbMj zPT3zEW$RiU?hnN>;&Xx(E^cbA;~OID#_6LOv%}p^hX*wTbMD3q|CvGkbz5#oMcn35 zq2tm-Q}l<48F5>w`FB!bPSZ9?rwKQ%9a!SX?(|G57G&-WmdgWCMH={uofM?e+`f}u zjMqE?et0d-VDI9#`gL*$tXi_LQ#6Td}* zL$|8C+KajhC$IRdN&nC&N*`8tm*O@DCC~Vm-OYCRzKfr$6KqwbR@hA#jKY$Y>Ml_T zhd0)zTy9N>WNXil&iH4S_BeSYL(GWT>NG)+PEw+(EmT76HQ)DD7k4#yr@K@%;#bB* zz?HhsI!=yW$fB?KuXC7VZ{8jlzP9#JPV2Q?AogycGCEPRcjr5s{rQ7$!{YApS;tzl za+ Date: Thu, 30 Dec 2021 11:01:34 +0100 Subject: [PATCH 427/503] Create ThemeSetter-ThemePreviewScreen.png --- .../ThemeSetter-ThemePreviewScreen.png | Bin 0 -> 3125 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-ThemePreviewScreen.png diff --git a/apps/themesetter/ThemeSetter-ThemePreviewScreen.png b/apps/themesetter/ThemeSetter-ThemePreviewScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..1d21935b2685f8154a50e59cce21fa1a9369d5ba GIT binary patch literal 3125 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 Date: Thu, 30 Dec 2021 11:01:38 +0100 Subject: [PATCH 428/503] Create README.md --- apps/themesetter/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 apps/themesetter/README.md diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md new file mode 100644 index 000000000..e3af29fd3 --- /dev/null +++ b/apps/themesetter/README.md @@ -0,0 +1,18 @@ +# Theme Setter # + +This little tool allows you to configure the global theme of all Bangle.js apps +(provided that they do not override the global settings) in a more comfortable +way than through the settings menu. + +![](ThemeSetter-MainScreen.png) +![](ThemeSetter-DetailSelectionScreen.png) +![](ThemeSetter-ColorSelectionScreen.png) +![](ThemeSetter-ThemePreviewScreen.png) + +This app also acts as an example for a non-trivial Bangle.js application +using the "layout" library, custom controls and generic event dispatching. +See [GitHub](https://github.com/rozek/banglejs-2-activities) for details. + +## License ## + +[MIT License](LICENSE) From d4750f5cc36a46083a00150fc4efa12c7e285dbd Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:02:47 +0100 Subject: [PATCH 429/503] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index 8e4d7a14e..94300c717 100644 --- a/apps.json +++ b/apps.json @@ -5128,5 +5128,22 @@ {"name":"colorful_clock.app.js","url":"app.js"}, {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "themesetter", + "name": "Theme Setter", + "shortName":"Theme Setter", + "version":"0.01", + "description": "a comfortable way to configure theme colors", + "icon": "app-icon.png", + "type": "tool", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"themesetter.app.js","url":"app.js"}, + {"name":"themesetter.img","url":"app-icon.js","evaluate":true} + ] } ] From a131db6da489ad1b425710a8b2dcd9c16ec66911 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:12:26 +0100 Subject: [PATCH 430/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 94300c717..8961300ee 100644 --- a/apps.json +++ b/apps.json @@ -5135,7 +5135,7 @@ "version":"0.01", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", - "type": "tool", + "type": "app", "tags": "tool", "supports" : ["BANGLEJS2"], "allow_emulator": true, From b47ea2d9e1b05ce919e9d068ed8fcab0c90c5f11 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:24:39 +0100 Subject: [PATCH 431/503] Update README.md --- apps/themesetter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md index e3af29fd3..17eb7fc95 100644 --- a/apps/themesetter/README.md +++ b/apps/themesetter/README.md @@ -1,8 +1,8 @@ # Theme Setter # This little tool allows you to configure the global theme of all Bangle.js apps -(provided that they do not override the global settings) in a more comfortable -way than through the settings menu. +(provided that they do not override global settings) in a more comfortable way +than through the settings menu. ![](ThemeSetter-MainScreen.png) ![](ThemeSetter-DetailSelectionScreen.png) From 82eecf69129f0953b73cdce99845450298b3d13f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 17:32:01 +0100 Subject: [PATCH 432/503] Update app-icon.png --- apps/themesetter/app-icon.png | Bin 429 -> 940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/themesetter/app-icon.png b/apps/themesetter/app-icon.png index 19fb4ee6a5e2070dba6c4c630573c2d6cddc3c9d..078920a27e0efc2a004e472675f041ef76ce3ed3 100644 GIT binary patch literal 940 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hz9|8>y;bpKhp88yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{{zaLoK$}74+Zoz`RicPN?Xl4Z zS&rlwh)=O`ND*`lTnDqqp9Df|{cksS|2J5T`ncYVhF+4GSI)USn z%yGk9{&)RLW;C8~c0A&u?B-wd`OM7hEbcElW>@)|t7?p9E?{TzomG^_Y5OO z7mWhP4W}N=vuyklVlnNgnW?c#k%mU(m18GD+0+kBTDo)kQJVk`6A7N6ghe8U9~!V} z#C$V!eCD^%cEdZT_A{xWyNaJRu&nlZ*|?=SbNz?f_yS8&{ihpmzpdIEw>65@cV!5Z z^ABOM;I<<#OQQ6qpG^~%X)K5>H=C`vvQR z{`=p${b8#Oy-z(Y+J5_P-uCam|H`UfILSQs{PU|>SM#<@vQItsdC%9X+MO|rWM+8s zyr|l%HI@7znA?9jY{^<-vNp_ny@^7ClW>OJ{9u2BDQ=55M(Fe% zS3bS4WCf?odLuXI_0~&|%x^L+uYPmsz#^6l`#JJ{>woup62+~u`Jz>d>?BJC>-9IC z-!ymrt5x*=^0v}nh*Ew%-)_iLa-_iu%_9;agtkDWHW3MUBbgqxOXJ#h< Svwb%xUwOLvxvX3~ogdh?d5E^EnO3wf^tUyZ(f`STBKtV^%3ar2a&;UCi0YwT2p-@CfiE~Mu z#O7>tujIngS$;qJzu)I0ktmf*WavjeGF%i9Udf$jSf4X=Rexk?%^H*s(67d2Ve)=s ztSxhKMa=aOSF5u4D^h@pnc1DDP2#%FfsyXi!~hJrP3uB+VE7>hgVlWw%%t%Frj=0L zzRE%JZ=e^&B1~3fP(Hx5dW7iVs>r}tt#T29Exz%SxbXq%{vl(qY}k)2u?QX9;@#+i zt{YQo7Hu5kS%3In`5R}^>?W{*1Ki_FSo{^|*oovAWEVGh6PEtO9ro0y-EZLtk0zJM z0}inn$#IO9e_A3RYFHv|gA#etpc47z)IcyK{(=*1N3$zHS6IGN Date: Thu, 30 Dec 2021 17:33:13 +0100 Subject: [PATCH 433/503] Update app-icon.js --- apps/themesetter/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/themesetter/app-icon.js b/apps/themesetter/app-icon.js index d4520486b..31fc30449 100644 --- a/apps/themesetter/app-icon.js +++ b/apps/themesetter/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/4AQ8AZCCwIFL8YVC+IFQ+EHAp/x44FLHYgFMLwgFW/0HAof4h4FD4EfCAcACAgWECCHgn4WEHwgF7AEI=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgP/ACHgDAQWBApfjCoXxAqHwg4FP+PHApY7EApheEAq3+g4FD/EPAofAj4QDgAQECwgQQ8E/Cwg+EAvYAhA==")) \ No newline at end of file From 9f84adcd9f3f75c499425532f6ecc80a871b37cc Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:04:20 +0100 Subject: [PATCH 434/503] Update app.js --- apps/themesetter/app.js | 64 ++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index d8536cf22..3c68e2581 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -52,49 +52,39 @@ return Result; } -/**** drawRoundedRect ****/ + if (g.drawRoundedRect == null) { + g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { + let x,y; + if (x1 > x2) { x = x1; x1 = x2; x2 = x; } + if (y1 > y2) { y = y1; y1 = y2; y2 = y; } - const roundedRectSines = [ - 0, Math.sin(15*Math.PI/180), Math.sin(30*Math.PI/180), - Math.sin(45*Math.PI/180), Math.sin(60*Math.PI/180), - Math.sin(75*Math.PI/180), 1 - ]; - const roundedRectPoly = Array(56); + r = Math.min(r || 0, (x2-x1)/2, (y2-y1)/2); - function prepareRoundedRect (x1,y1, x2,y2, r) { - r = Math.min(r || 0, Math.abs(x1-x2), Math.abs(y1-y2)); + let cx1 = x1+r, cx2 = x2-r; + let cy1 = y1+r, cy2 = y2-r; - for (let i = 0, j = 0; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x1 + r - r*roundedRectSines[6-i]; - roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[i]; - } + this.drawLine(cx1,y1, cx2,y1); + this.drawLine(cx1,y2, cx2,y2); + this.drawLine(x1,cy1, x1,cy2); + this.drawLine(x2,cy1, x2,cy2); - for (let i = 0, j = 14; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x2 - r + r*roundedRectSines[i]; - roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[6-i]; - } + x = r; y = 0; - for (let i = 0, j = 28; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x2 - r + r*roundedRectSines[6-i]; - roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[i]; - } + let dx,dy, Error = 0; + while (y <= x) { + dy = 1 + 2*y; y++; Error -= dy; + if (Error < 0) { + dx = 1 - 2*x; x--; Error -= dx; + } - for (let i = 0, j = 42; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x1 + r - r*roundedRectSines[i]; - roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[6-i]; - } + this.setPixel(cx1 - x, cy1 - y); this.setPixel(cx1 - y, cy1 - x); + this.setPixel(cx2 + x, cy1 - y); this.setPixel(cx2 + y, cy1 - x); + this.setPixel(cx2 + x, cy2 + y); this.setPixel(cx2 + y, cy2 + x); + this.setPixel(cx1 - x, cy2 + y); this.setPixel(cx1 - y, cy2 + x); + } + }; } - g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { - prepareRoundedRect(x1,y1, x2,y2, r); - this.drawPoly(roundedRectPoly,true); - }; - - g.fillRoundedRect = function fillRoundedRect (x1,y1, x2,y2, r) { - prepareRoundedRect(x1,y1, x2,y2, r); - this.fillPoly(roundedRectPoly,true); - }; - /**** Button ****/ @@ -297,7 +287,9 @@ ] }, { height:4 }, { type:'h', c:[ - Button('Configure', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + Button('Exit', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, + onTouch:() => load() }), + Button('Config', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, onTouch:() => gotoScreen('DetailSelectionScreen') }) ], filly:1 } ] From a8499c4489d426a22cd8bcf49ce929324e7909f6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:04:22 +0100 Subject: [PATCH 435/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8961300ee..6808e7a4a 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.01", + "version":"0.02", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From 3d45170cda29a732b64dced240bdd42ee396cd5e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:05:34 +0100 Subject: [PATCH 436/503] Update ThemeSetter-MainScreen.png --- apps/themesetter/ThemeSetter-MainScreen.png | Bin 3232 -> 3403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/themesetter/ThemeSetter-MainScreen.png b/apps/themesetter/ThemeSetter-MainScreen.png index e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5..3a0fc215c6b44e3c4fb7a49276605a4efcbff197 100644 GIT binary patch delta 3287 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 V;ShCn0CoTX002ovPDHLkV1lH!9J&Ai delta 3136 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 W0)^q&cl!JQ`&~D-!qgbz68{4f&DoIv From e81fc99096fe7a4b551685de13d59c6ff1abbf21 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:30:03 +0100 Subject: [PATCH 437/503] Update app.js --- apps/themesetter/app.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index 3c68e2581..69a2b09a5 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -272,17 +272,17 @@ ScreenSet['MainScreen'] = new Layout({ type:'v', c:[ - Label('Current Theme', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Current Theme', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), ] }, { height:4 }, @@ -303,36 +303,36 @@ ScreenSet['DetailSelectionScreen'] = new Layout({ type:'v', c:[ - Label('Configure Detail', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Configure Detail', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fg') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', onTouch:() => configureDetail('fg') }), { width:20 }, - Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bg') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', onTouch:() => configureDetail('bg') }), ] }, { type:'h', c:[ - Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fg2') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', onTouch:() => configureDetail('fg2') }), { width:20 }, - Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bg2') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', onTouch:() => configureDetail('bg2') }), ] }, { type:'h', c:[ - Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fgH') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', onTouch:() => configureDetail('fgH') }), { width:20 }, - Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bgH') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', onTouch:() => configureDetail('bgH') }), @@ -348,7 +348,7 @@ ScreenSet['ColorSelectionScreen'] = new Layout({ type:'v', c:[ - Label('Choose Color', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Choose Color', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', onTouch:() => selectColor(0,0,0) }), @@ -381,17 +381,17 @@ ScreenSet['ThemePreviewScreen'] = new Layout({ type:'v', c:[ - Label('Theme Preview', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Theme Preview', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), ] }, { height:4 }, From 6468cf1990285329da772533a0d420033b1c708d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:30:05 +0100 Subject: [PATCH 438/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6808e7a4a..bd804b0b0 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.02", + "version":"0.03", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From 52e0cafdd690663ee44ea9ce088879bbc6b1ad29 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 07:54:04 +0100 Subject: [PATCH 439/503] Update app.js --- apps/themesetter/app.js | 162 ++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 80 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index 69a2b09a5..aa3c608cf 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -38,17 +38,19 @@ } } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderLabel, label:Text || '' }); let TextMetrics; - if (! Options.width || ! Options.height) { - if (Options.font != null) { g.setFont(Options.font); } + if (! Result.width || ! Result.height) { + if (Result.font != null) { g.setFont(Result.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*(Result.pad || 0); return Result; } @@ -106,17 +108,19 @@ g.drawString(Details.label, x+halfWidth+1,y+halfHeight+1); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderButton, label:Text || 'Tap' }); let TextMetrics; - if (! Options.width || ! Options.height) { + if (! Result.width || ! Result.height) { if (Options.font != null) { g.setFont(Options.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*10 + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*5 + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*10 + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*5 + 2*(Result.pad || 0); return Result; } @@ -138,17 +142,19 @@ g.drawString(Details.label, x+halfWidth,y+halfHeight); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderDemo, label:Text || 'Test' }); let TextMetrics; - if (! Options.width || ! Options.height) { - if (Options.font != null) { g.setFont(Options.font); } + if (! Result.width || ! Result.height) { + if (Result.font != null) { g.setFont(Result.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*2 + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*2 + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*2 + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*2 + 2*(Result.pad || 0); return Result; } @@ -168,11 +174,13 @@ g.fillRect(x+Padding+2, y+Padding+2, x+Width-Padding-3, y+Height-Padding-3); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderColorView, col:Color }); - Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); - Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + Result.width = Math.max(10, Result.width || 10) + 2*(Result.pad || 0); + Result.height = Math.max(10, Result.height || 10) + 2*(Result.pad || 0); return Result; } @@ -200,11 +208,13 @@ g.fillRect(x+Padding+5, y+Padding+5, x+Width-Padding-6, y+Height-Padding-6); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderColorView, col:Color }); - Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); - Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + Result.width = Math.max(10, Result.width || 10) + 2*(Result.pad || 0); + Result.height = Math.max(10, Result.height || 10) + 2*(Result.pad || 0); return Result; } @@ -270,27 +280,31 @@ g.stringWidth('Normal '), g.stringWidth('Accented '), g.stringWidth('Hilighted ') ); + let StdFont = { font:'12x20' }; + let legible = Object.assign({ col:'#000000', bgCol:'#FFFFFF' }, StdFont); + let leftAligned = Object.assign({ halign:-1, valign:0 }, legible); + let MainLabel = Object.assign({ pad:4, width:leftColumnWidth }, leftAligned); + let halfWidthButton = Object.assign({ pad:4, width:halfWidth }, legible); + ScreenSet['MainScreen'] = new Layout({ type:'v', c:[ - Label('Current Theme', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), + Label('Current Theme', { common:legible, pad:8, bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), + Label('Normal', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'NormalDemo' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), + Label('Accented', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'AccentedDemo' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), + Label('Hilighted', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'HilitedDemo' }), ] }, { height:4 }, { type:'h', c:[ - Button('Exit', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, - onTouch:() => load() }), - Button('Config', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, - onTouch:() => gotoScreen('DetailSelectionScreen') }) + Button('Exit', { common:halfWidthButton, onTouch:() => load() }), + Button('Config', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }) ], filly:1 } ] }); @@ -301,103 +315,91 @@ ); let LabelHeight = g.stringMetrics('FgH').height; + let DetailLabel = Object.assign({ pad:4, width:LabelWidth }, leftAligned); + let DetailView = { width:30, height:LabelHeight, pad:2 }; + ScreenSet['DetailSelectionScreen'] = new Layout({ type:'v', c:[ Label('Configure Detail', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fg') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', - onTouch:() => configureDetail('fg') }), + Label('fg', { common:DetailLabel, onTouch:() => configureDetail('fg') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fg'), id:'fgView' }), { width:20 }, - Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bg') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', - onTouch:() => configureDetail('bg') }), + Label('bg', { common:DetailLabel, onTouch:() => configureDetail('bg') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bg'), id:'bgView' }), ] }, { type:'h', c:[ - Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fg2') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', - onTouch:() => configureDetail('fg2') }), + Label('fg2', { common:DetailLabel, onTouch:() => configureDetail('fg2') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fg2'), id:'fg2View' }), { width:20 }, - Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bg2') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', - onTouch:() => configureDetail('bg2') }), + Label('bg2', { common:DetailLabel, onTouch:() => configureDetail('bg2') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bg2'), id:'bg2View' }), ] }, { type:'h', c:[ - Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fgH') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', - onTouch:() => configureDetail('fgH') }), + Label('fgH', { common:DetailLabel, onTouch:() => configureDetail('fgH') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fgH'), id:'fgHView' }), { width:20 }, - Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bgH') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', - onTouch:() => configureDetail('bgH') }), + Label('bgH', { common:DetailLabel, onTouch:() => configureDetail('bgH') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bgH'), id:'bgHView' }), ] }, { type:'h', c:[ - Button('Save', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, - onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), - Button('Cancel', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, - onTouch:() => gotoScreen('MainScreen') }) + Button('Save', { common:halfWidthButton, onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), + Button('Cancel', { common:halfWidthButton, onTouch:() => gotoScreen('MainScreen') }) ], filly:1 }, ] }); + let StdSelectionView = { width:40, height:40, pad:2 }; + ScreenSet['ColorSelectionScreen'] = new Layout({ type:'v', c:[ Label('Choose Color', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', + ColorSelectionView('#000000',{ common:StdSelectionView, id:'black', onTouch:() => selectColor(0,0,0) }), - ColorSelectionView('#FF0000',{ width:40, height:40, pad:2, id:'red', + ColorSelectionView('#FF0000',{ common:StdSelectionView, id:'red', onTouch:() => selectColor(1,0,0) }), - ColorSelectionView('#00FF00',{ width:40, height:40, pad:2, id:'green', + ColorSelectionView('#00FF00',{ common:StdSelectionView, id:'green', onTouch:() => selectColor(0,1,0) }), - ColorSelectionView('#0000FF',{ width:40, height:40, pad:2, id:'blue', + ColorSelectionView('#0000FF',{ common:StdSelectionView, id:'blue', onTouch:() => selectColor(0,0,1) }), ] }, { type:'h', c:[ - ColorSelectionView('#FFFFFF',{ width:40, height:40, pad:2, id:'white', + ColorSelectionView('#FFFFFF',{ common:StdSelectionView, id:'white', onTouch:() => selectColor(1,1,1) }), - ColorSelectionView('#FFFF00',{ width:40, height:40, pad:2, id:'yellow', + ColorSelectionView('#FFFF00',{ common:StdSelectionView, id:'yellow', onTouch:() => selectColor(1,1,0) }), - ColorSelectionView('#FF00FF',{ width:40, height:40, pad:2, id:'magenta', + ColorSelectionView('#FF00FF',{ common:StdSelectionView, id:'magenta', onTouch:() => selectColor(1,0,1) }), - ColorSelectionView('#00FFFF',{ width:40, height:40, pad:2, id:'cyan', + ColorSelectionView('#00FFFF',{ common:StdSelectionView, id:'cyan', onTouch:() => selectColor(0,1,1) }), ] }, { height:4 }, { type:'h', c:[ - Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, - onTouch:() => gotoScreen('DetailSelectionScreen') }), - Button('Preview', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, - onTouch:() => gotoScreen('ThemePreviewScreen') }) + Button('Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button('Preview', { common:halfWidthButton, onTouch:() => gotoScreen('ThemePreviewScreen') }) ], filly:1 }, ] }); ScreenSet['ThemePreviewScreen'] = new Layout({ type:'v', c:[ - Label('Theme Preview', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), + Label('Theme Preview', { common:legible, bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), + Label('Normal', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'NormalTest' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), + Label('Accented', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'AccentedTest' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), + Label('Hilighted', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'HilitedTest' }), ] }, { height:4 }, { type:'h', c:[ - Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, - onTouch:() => gotoScreen('ColorSelectionScreen') }) + Button('Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) ], filly:1 } ] }); From dd615555321da037acd23873045da6b4c484046e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 07:54:08 +0100 Subject: [PATCH 440/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index bd804b0b0..97a0f04fe 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.03", + "version":"0.04", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From df3e5d479cb8d8457fb8900bf85778eb77a1af4e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 09:39:00 +0100 Subject: [PATCH 441/503] Update README.md --- apps/themesetter/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md index 17eb7fc95..518d05c01 100644 --- a/apps/themesetter/README.md +++ b/apps/themesetter/README.md @@ -16,3 +16,7 @@ See [GitHub](https://github.com/rozek/banglejs-2-activities) for details. ## License ## [MIT License](LICENSE) + +## Credits ## + +The icon for this app was taken from [icons8.com](https://icons8.com/). \ No newline at end of file From d483f8573d8bce47dc7916d3e7b35e4582a97e9c Mon Sep 17 00:00:00 2001 From: fparri Date: Fri, 31 Dec 2021 22:22:10 +0100 Subject: [PATCH 442/503] Fixed Italian localization I am providing small fixes for the Italian localization. 1. using : to separate hours from minutes, instead of . 2. datePattern: changed to the more usual way of representing dates in Italian. 3. datePattern: fixed so that clocks such as Anton Clock work fine 4. day: removed an extra space before. --- apps/locale/locales.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index b607998a0..599ae1491 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -80,7 +80,7 @@ timePattern / datePattern: %S second (00..60) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case -*/ +*/ var locales = { "en_GB": { // this is default @@ -457,12 +457,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "it_IT": { @@ -475,12 +475,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "wae_CH": { From d356d6e482e8a5c12ebc2bb1de8556d1fdb6debf Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:08:55 -1000 Subject: [PATCH 444/503] Create app.js --- apps/slash/app.js | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 apps/slash/app.js diff --git a/apps/slash/app.js b/apps/slash/app.js new file mode 100644 index 000000000..22bce1191 --- /dev/null +++ b/apps/slash/app.js @@ -0,0 +1,104 @@ +// Get 12 hour status, from barclock +const is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; + +// Used from waveclk to schedule updates every minute +var drawTimeout; + +// Schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +// From forum conversation 348275 +function fillLine(x1, y1, x2, y2, lineWidth) { + var dx, dy, d; + if (!lineWidth) { + g.drawLine(x1, y1, x2, y2); + } else { + lineWidth = (lineWidth - 1) / 2; + dx = x2 - x1; + dy = y2 - y1; + d = Math.sqrt(dx * dx + dy * dy); + dx = Math.round(dx * lineWidth / d, 0); + dy = Math.round(dy * lineWidth / d, 0); + g.fillPoly([x1 + dx, y1 - dy, x1 - dx, y1 + dy, x2 - dx, y2 + dy, x2 + dx, y2 - dy], true); + } +} + +// Mainly to convert day number to day of the week +function convertDate(date) { + var dayNum = date.getDay(); + var month = date.getMonth(); + var dayOfMonth = date.getDate(); + var dayChar; + + month += 1; + + switch (dayNum) { + case 0 : dayChar = "Sun"; break; + case 1 : dayChar = "Mon"; break; + case 2 : dayChar = "Tue"; break; + case 3 : dayChar = "Wed"; break; + case 4 : dayChar = "Thur"; break; + case 5 : dayChar = "Fri"; break; + case 6 : dayChar = "Sat"; break; + } + + return dayChar + " " + month + "/" + dayOfMonth; +} + +function draw() { + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(); + var hour = (" "+h).substr(-2); + var minutes = ("0"+m).substr(-2); + g.reset(); + + // Convert to 12hr time mode + if (is12Hour && hour > 12) { + hour = hour - 12; + hour = "0" + hour; + } else if (hour == 0) { + hour = 12; + } + + // Draw the time, vector font + g.setFont("Vector", 50); + g.setFontAlign(1,1); // Align right bottom + g.drawString(hour, 85, 80, true); + g.drawString(minutes, 155, 140, true); + + // Draw slash, width 6 + fillLine(57, 120, 112, 40, 6); + + // Convert date then draw + g.setFont("Vector", 20); + g.setFontAlign(0,1); // Align center bottom + var convertedDate = convertDate(d); + g.drawString(convertedDate, g.getWidth()/2, 170, true); + + Bangle.drawWidgets(); + queueDraw(); +} + +// Clear screen and draw +g.clear(); +draw(); + +// From waveclk +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // Draw immediately, queue redraw + } else { // Stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From 5113348ecbfa408f6fbc2563a0439ed2678b9704 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:26:58 -1000 Subject: [PATCH 445/503] Create app-icon.js --- apps/slash/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slash/app-icon.js diff --git a/apps/slash/app-icon.js b/apps/slash/app-icon.js new file mode 100644 index 000000000..a0737974a --- /dev/null +++ b/apps/slash/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwgEBgUiACUgC4IWTAAIuVGAQWVAH4A/AH4AmmQWVl//C6s//4wPkfzAof/F4U/DRgpFC4Uj/4hEFw4RBC4QTDBIouJEoYrEBQouLRwXyBZAuKAwQXCGBQiHPgowJEI6mDGBYXXHIy6GPBQhFRwJ9GVBAiFUwjYNEYiOFa5YkFC4guMFYqOEPgwwIBoSmFn4uLJYopMABKOEACUjCyoA/AH4A/AE0CCysggAXVgEAGCguB")) From d7b9e261b774cbfbe10fe1f1dc5657bb5b4ac819 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:35:03 -1000 Subject: [PATCH 446/503] Add slash.png --- apps/slash/slash.png | Bin 0 -> 1068 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slash/slash.png diff --git a/apps/slash/slash.png b/apps/slash/slash.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfc8693d9d4ca64c0a43114962d199b88e7f526 GIT binary patch literal 1068 zcmV+{1k?M8P) zvIWHhz&4pGBUAzDw_1sDNIzY_VYezx6xEkDdJw493M!>$z-np+tfpq59GV+l=zDh` znj7CXy|-w3#{!xgT{!XiVF&_+^nr{sS0)f&S~ji!E58Eoz0(O{{c$4-0y=zNQ~T?_ z0#1h=pB~(gPG1Xti_YWnnB#{k2p>b{riVKu@3@4!aFK9qs7d8{m#_a&1S$o7?hrCMzNGIFYY=y8`Ix*ywe1XaG)! z{nZ%AiT8WTfA{O&=~LB_*a9-y?8XMB9`E7+R^i_xpm3usVRau=d}HYD*{? mK!OnjnIL~Me){-*0C)kZL%4jR3{M;Y0000 Date: Fri, 31 Dec 2021 16:36:21 -1000 Subject: [PATCH 447/503] Create ChangeLog --- apps/slash/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slash/ChangeLog diff --git a/apps/slash/ChangeLog b/apps/slash/ChangeLog new file mode 100644 index 000000000..f3fae1785 --- /dev/null +++ b/apps/slash/ChangeLog @@ -0,0 +1 @@ +0.01: First version for upload From e81125d1cc5f40f8e0f0921c38fc29af77eaaba1 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:52:18 -1000 Subject: [PATCH 448/503] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..8a1ff94ab 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "slash", + "name": "Slash Watch", + "shortName":"Slash", + "icon": "app.png", + "version":"0.01", + "description": "Slash Watch based on Pebble watch face by Nikki.", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"slash.app.js","url":"app.js"}, + {"name":"slash.img","url":"app-icon.js","evaluate":true} + ] } ] From 4f9b3de702a9fb4a67c73f626156ab30c6d5f3ad Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:05:19 -1000 Subject: [PATCH 449/503] Change icon to slash.png --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a1ff94ab..11827a5f0 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "slash", "name": "Slash Watch", "shortName":"Slash", - "icon": "app.png", + "icon": "slash.png", "version":"0.01", "description": "Slash Watch based on Pebble watch face by Nikki.", "tags": "clock", From e77ea1f200295e506e8a10e9a8b690e5cd299150 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:16:43 -1000 Subject: [PATCH 450/503] Create README.md --- apps/slash/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/slash/README.md diff --git a/apps/slash/README.md b/apps/slash/README.md new file mode 100644 index 000000000..5fcd72bb8 --- /dev/null +++ b/apps/slash/README.md @@ -0,0 +1,11 @@ +# Slash Watch + +![](slash.png) + +Slash Watch, a recreation of the Slash watch face for Pebble watches by Nikki. +Simple watchface with a slash through the hours and minutes. Date shown at the bottom. + +This watch face was made using Espruino documentation, Espruino forum threads, the 93 Dub watch face, the barclock watch face, and the waveclk app. + +Contributors: +* Ray Holder (93 Dub watchface helped create this one) From 7272389b5b373086a76bf7861af3bfa1d8e223b2 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:23:05 -1000 Subject: [PATCH 451/503] Add files via upload --- apps/slash/screenshot.png | Bin 0 -> 2343 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slash/screenshot.png diff --git a/apps/slash/screenshot.png b/apps/slash/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..41008d76c0619806bb2386524bcd25d46e2192f5 GIT binary patch literal 2343 zcmc&$c{r4f79Vf#Fr!a*#?V9*ra_YLN?DU_7{*pwjHNMGi!Tyl%)FtzZqX=YE&C@T zvhT7@g=85fMPD&Z_9at|y)4(g_wW1nJc(l?AQtFEHb<0l6=o0!)E66)*%=mXKJ!!Xm^BJ9w6(?iYs@ZbjAuRi zHk?x$roh~xLCHI;#(zDuO}Ex1;2dxt>Uecv(uO?(#{T1|7`SibL^PSMuxHyQ*Ts!u z_efabOa;98To%{?^FRzM=$HCFIDr2DO1*|({lUrrdNzggMuBm)`KNx=p+kv%S&r46 zX~R5&y-VvQl!JIGp-=7$s<3*EaJ@PCp#AUpcJvZ`d53)s#cRd}M{BB7Q%u>Mb5Ndb zb=Sljzh33{J#z-2mE<}p2irpsM!Mik3W%f{j5VH`FilBHE&!cq=(ix8J*1!Gz+UQ_ ztCK8-za>+pS5rUj4MDQr@k@fGUOmlF9LtkbAa=Sa^ex^T!JYMBTv%b;s%$F+$hw0X zKX^aGauWfR~ z;K0j2X>m`30ozfl%~EqF9Phlj_K_l>Kx%gMEW_WV>s|RmKqu@H)EctNSTF)g>gD!p z1sR(wl{xS~AqTtC8F37mJdt1)-_~U?$Zia_l^^n=av~()F{Q{XbA}(@n@06l(ZAMECH- z;1N)Gb63wIqfW@YFsl}jS@3NHw+9-Uus1Qc2FUIaQ-9MXh)PcsOip74?zpM>w-N1R z9?k6Kt(jDgB;1<3r}a6D6N zvHcuK6BNnrf$&N@-A*I9heFO>1i5o~V5(wc;n9?U8C#QR)KFcAisP_-NqkbhNe)&& zUOT&%_|j6~UT^o=y~Qm^)gSO0w-3MZI#BSudpen&YjNJ>5$8p5YRd~#XqUT$3^Yd# z6nCKa@|49iaP{IE19g!LCw6)X5W>#A2%a1OX9{R_0YRwn>EB?EgMX`^%If(j%Lt!O zSQfmW9ED_=xnVz`rJ+ngM4fUuP8~3Mf%LPWOPm~MnA(1f;8>M+`hY1-3UEv~bn)_k zG^y~^7ICVjEtZOwhm!w{eyCh7&06ApnZ1Xt+EQQS4tE8wYgy2d6B&v<5SJ43fRb*aGE`Ju_6z$#-9KnY&FCL#!ouFP&xsbN8<|po$Aj*y zmhClBb(;{4*G)d~riCfOj;PDszwG9)*5372<;hKHt4=ZTWrT7k!E}d>^!W)lh@v!+ zJRUu%G?7Rn3wD?@9X(&)_}7tbr{a6G=o&GbJ(uDvaJ35^wiZd~{%WO$axYQAwvYLy$NrnjALX<*S zI#g6;{b#V~@|%#Q8Cpm6%Ccysej(Y$ zv*tNxW2B($+^{735eFW%ynO=?J-aLgkg0f?9nicI_5)XwK_03qTmEqJ7zEuY=uqbpJ9?|n6{BqX23yozZc((JH-GOl+^cVDs@WnLm3gkexX>^Rx<7e! zTFrM(^LOA@0-NiT37os@gIAVn%%=0Vqus zPctt7HQZqIPF32Jj>YaY+`bUpksRH41aR*zwLcXBFonBn*dT^VYK!24nEF8GQ~Lwq z92J$_L8{@L%ti}e6)|u(w&G76F;FQ-|#EV!Ugvz?AbS>Wx%K4G`eI8ud!ua%|5VU-I|v6 zmQC?C;lrZRcU>S&#-Gv1 zptugY4N``3VlK(9%;qO~e{3yH9sM|0KFOth-bCeOCZvc{2PsnhZKBS`BVkzTtm}(8 zdF@zksQj0biZU%{oUM+S@!Kn99*G`-ib!9*0y>Z$ztL>w-DH)OE1g&G`lV*AWNmlF z9bYn?(Dh93VOdUXHaNI+$jjs4!^zxn<6XUuM+qU;U5 zd*z){`~A@75>7nc;9$x!c{9(at5_D+nUOZiL;wW@RWnsFkeg@wH3&du#6AL3L5zN) zR>i>f2pD=wUz9c#*gbD^Pz&eG+_iaNgZOVDXG`yws%zY Date: Fri, 31 Dec 2021 17:24:16 -1000 Subject: [PATCH 452/503] Update README.md --- apps/slash/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/slash/README.md b/apps/slash/README.md index 5fcd72bb8..9bef104cc 100644 --- a/apps/slash/README.md +++ b/apps/slash/README.md @@ -1,9 +1,9 @@ # Slash Watch -![](slash.png) +![](screenshot.png) Slash Watch, a recreation of the Slash watch face for Pebble watches by Nikki. -Simple watchface with a slash through the hours and minutes. Date shown at the bottom. +Simple watchface with a slash through the hours and minutes. Date shown at the bottom. Theme will change (light/dark) based on watch theme. This watch face was made using Espruino documentation, Espruino forum threads, the 93 Dub watch face, the barclock watch face, and the waveclk app. From 364512266bc7421a1b64285212841efd42945012 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:29:48 -1000 Subject: [PATCH 453/503] Update apps.json --- apps.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 11827a5f0..29a9a208e 100644 --- a/apps.json +++ b/apps.json @@ -5068,10 +5068,14 @@ "name": "Slash Watch", "shortName":"Slash", "icon": "slash.png", + "screenshots": [{"url":"screenshot.png"}], "version":"0.01", "description": "Slash Watch based on Pebble watch face by Nikki.", "tags": "clock", - "supports" : ["BANGLEJS2"], + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"slash.app.js","url":"app.js"}, {"name":"slash.img","url":"app-icon.js","evaluate":true} From 03f5daba90a107dc90b3b2bc228daf5bc472ce07 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 18:07:48 -1000 Subject: [PATCH 454/503] Fix extra 0 added for hour conversion --- apps/slash/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/slash/app.js b/apps/slash/app.js index 22bce1191..53ff2640a 100644 --- a/apps/slash/app.js +++ b/apps/slash/app.js @@ -61,7 +61,9 @@ function draw() { // Convert to 12hr time mode if (is12Hour && hour > 12) { hour = hour - 12; - hour = "0" + hour; + if (hour < 10) { + hour = "0" + hour; + } } else if (hour == 0) { hour = 12; } From f996d91ad3a0efefde19d3692a7a7fc8fc76c0bf Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:12:57 +0100 Subject: [PATCH 455/503] Update app.js --- apps/minimal_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index 057b286d4..3f6447fd5 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -173,7 +173,7 @@ let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); - g.setColor('#FF0000'); + g.setColor(g.theme.fg2); g.drawLine( CenterX + SecondHandOffset*sPhi, CenterY - SecondHandOffset*cPhi, From 7b43fe720fd106e0989b2d834852fe3534165f75 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:00 +0100 Subject: [PATCH 456/503] Update app.js --- apps/simple_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js index 6cb0f08ce..3c1843cb0 100644 --- a/apps/simple_clock/app.js +++ b/apps/simple_clock/app.js @@ -192,7 +192,7 @@ let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); - g.setColor('#FF0000'); + g.setColor(g.theme.fg2); g.drawLine( CenterX + SecondHandOffset*sPhi, CenterY - SecondHandOffset*cPhi, From 0ce0d8a8d9a656e85827cf55f5abfb4e1ac043e3 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:02 +0100 Subject: [PATCH 457/503] Update app.js --- apps/colorful_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js index 10d579a22..afc6b321f 100644 --- a/apps/colorful_clock/app.js +++ b/apps/colorful_clock/app.js @@ -209,7 +209,7 @@ let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); - g.setColor('#FF0000'); + g.setColor(g.theme.fg2); g.drawLine( CenterX + SecondHandOffset*sPhi, CenterY - SecondHandOffset*cPhi, From bfb7d5a1fedde9e71bacad760b69835129ba8606 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:05 +0100 Subject: [PATCH 458/503] Update apps.json --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 97a0f04fe..c3a31238b 100644 --- a/apps.json +++ b/apps.json @@ -5081,7 +5081,7 @@ { "id": "minimal_clock", "name": "Minimal Analog Clock", "shortName":"Minimal Clock", - "version":"0.01", + "version":"0.02", "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", @@ -5098,7 +5098,7 @@ { "id": "simple_clock", "name": "Simple Analog Clock", "shortName":"Simple Clock", - "version":"0.01", + "version":"0.02", "description": "a simple, yet stylish, analog clock", "icon": "app-icon.png", "type": "clock", @@ -5115,7 +5115,7 @@ { "id": "colorful_clock", "name": "Colorful Analog Clock", "shortName":"Colorful Clock", - "version":"0.01", + "version":"0.02", "description": "a colorful analog clock", "icon": "app-icon.png", "type": "clock", From 307799666727f70f01c29c2237a1fa607da8bd69 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:09 +0100 Subject: [PATCH 459/503] Update README.md --- apps/minimal_clock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 5dd27fdf4..b20a8d480 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,9 +1,9 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. It considers currently configured "theme" -(and may therefore look different than shown in the screenshot on your watch -depending on which theme you prefer). +some clock hands and no clock face. It considers the currently configured +"theme" (and may therefore look different than shown in the screenshot on your +watch depending on which theme you prefer). ![](app-screenshot.png) From dbd776cde9ce7e877e698c8a09eb16bf45eda34b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:17 +0100 Subject: [PATCH 460/503] Update app.js --- apps/minimal_clock/app.js | 52 +++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index 3f6447fd5..d78790347 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -106,37 +106,50 @@ }; let HourHandLength = outerRadius * 0.5; - let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + let HourHandWidth = 2*5, halfHourHandWidth = HourHandWidth/2; let MinuteHandLength = outerRadius * 0.7; - let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + let MinuteHandWidth = 2*3, halfMinuteHandWidth = MinuteHandWidth/2; let SecondHandLength = outerRadius * 0.9; - let SecondHandOffset = 6; + let SecondHandOffset = halfHourHandWidth + 10; - let twoPi = 2*Math.PI; + let outerBoltRadius = halfHourHandWidth + 2, innerBoltRadius = outerBoltRadius - 4; + let HandOffset = outerBoltRadius + 4; + + let twoPi = 2*Math.PI, deg2rad = Math.PI/180; let Pi = Math.PI; let halfPi = Math.PI/2; let sin = Math.sin, cos = Math.cos; - let HourHandPolygon = [ - -halfHourHandWidth,halfHourHandWidth, - -halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth, + let sine = [0, sin(30*deg2rad), sin(60*deg2rad), 1]; + + let HandPolygon = [ + -sine[3],-sine[0], -sine[2],-sine[1], -sine[1],-sine[2], -sine[0],-sine[3], + sine[0],-sine[3], sine[1],-sine[2], sine[2],-sine[1], sine[3],-sine[0], + sine[3], sine[0], sine[2], sine[1], sine[1], sine[2], sine[0], sine[3], + -sine[0], sine[3], -sine[1], sine[2], -sine[2], sine[1], -sine[3], sine[0], ]; - let MinuteHandPolygon = [ - -halfMinuteHandWidth,halfMinuteHandWidth, - -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth, - ]; + let HourHandPolygon = new Array(HandPolygon.length); + for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + HourHandPolygon[i] = halfHourHandWidth*HandPolygon[i]; + HourHandPolygon[i+1] = halfHourHandWidth*HandPolygon[i+1]; + if (i < l/2) { HourHandPolygon[i+1] -= HourHandLength; } + if (i > l/2) { HourHandPolygon[i+1] += HandOffset; } + } + let MinuteHandPolygon = new Array(HandPolygon.length); + for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + MinuteHandPolygon[i] = halfMinuteHandWidth*HandPolygon[i]; + MinuteHandPolygon[i+1] = halfMinuteHandWidth*HandPolygon[i+1]; + if (i < l/2) { MinuteHandPolygon[i+1] -= MinuteHandLength; } + if (i > l/2) { MinuteHandPolygon[i+1] += HandOffset; } + } /**** transforme polygon ****/ - let transformedPolygon = new Array(HourHandPolygon.length); + let transformedPolygon = new Array(HandPolygon.length); function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { let sPhi = sin(Phi), cPhi = cos(Phi), x,y; @@ -180,6 +193,13 @@ CenterX - SecondHandLength*sPhi, CenterY + SecondHandLength*cPhi ); + + g.setColor(g.theme.fg); + g.fillCircle(CenterX,CenterY, outerBoltRadius); + + g.setColor(g.theme.bg); + g.drawCircle(CenterX,CenterY, outerBoltRadius); + g.fillCircle(CenterX,CenterY, innerBoltRadius); } /**** refreshDisplay ****/ From ebc38c13ef8823dcef02b74768a5b9ed7ed40360 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:22 +0100 Subject: [PATCH 461/503] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c3a31238b..d53c9db48 100644 --- a/apps.json +++ b/apps.json @@ -5081,7 +5081,7 @@ { "id": "minimal_clock", "name": "Minimal Analog Clock", "shortName":"Minimal Clock", - "version":"0.02", + "version":"0.03", "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", From 9d48048fb16c5499ba81fe441d63103f78482328 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:00 +0100 Subject: [PATCH 462/503] Update app-icon.js --- apps/minimal_clock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/app-icon.js b/apps/minimal_clock/app-icon.js index dacc4c0fd..53ffd52d7 100644 --- a/apps/minimal_clock/app-icon.js +++ b/apps/minimal_clock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwcBIf4A/AH4A/AHsD+ALJjgFE/4RK/+AAgUH/gvKj/+AYMB/5CMv/AAQYALh//EwYALGQJKEABcH8CMQER4ATEcYA/AH4A/dP4A/ABgA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgJC/AEBhCjgCBgeAgF8AoXggHwCIXwgfADAX8h4TBAAM+jwkDj/4AocPDwIACgdgBYgoCAAMEuB+/AH4=")) \ No newline at end of file From 86191226fc2bc3b88462fc7198905c0ce97546d9 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:38 +0100 Subject: [PATCH 463/503] Update app-screenshot.png --- apps/minimal_clock/app-screenshot.png | Bin 1469 -> 1672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/minimal_clock/app-screenshot.png b/apps/minimal_clock/app-screenshot.png index 8db4f5fb9a15b0101e26b763aab04f7fb33021b9..1ec4901ace47b0a89ac68ebef50ce1715911a228 100644 GIT binary patch literal 1672 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfz8R&#WAEJ z?(OZ1MXMY{TmnD;m!BIQmC6(|L2?N%dzhTAMBnc1x(Yvc-OamiUe6(-`oZ>e&t*jg-!`J|JZUwcTStJ?9`hpS?s(uJZGLi_Tm!LeOJq@&2Mx+ z-aPWxQh)#5yvNdY)sufesM@O-`lIU(bG-g^FZoxe%|FakwcEU7dCr61vtRM%u6w9u zdg0EWy*yg`?+2THFg|mS;k;7e``_zy-epSvSS1u6c<;FDkC}RpzWuOTd+k`b==U$Y zHX<9%pKu9%-?!X&j^3GPMc>%&eV&qZy7uw!;Ld8hPLDeqk1e-vol%!n&04X&_q)iB z@^72By?b%(d8kyy`{1r?X7`*E9_js`Q@oSyUi6c#)2iJQ9Z7yPS*zcwJ^S$W-s1}I|G%_stw=0cpK$o|gPpbY z(L3J@<~-Wfdo60u=G$AlYQ)#3-k$gNp41;E>+A=|CR{&~GxgK+M~_?INNqQqqHWWA ztuLwebhwZ|Yn&B(obZf2uPu4DUpP>^M=sjmHE-hg${7#$9sb*~Taklz5AUszN98Q{ z>>6$5#m|P<%t$}~V*d7H%g*j9>DkG4ZQpHS#Sdj=i*4@mHNXCz{T`NB&Xn(ydAjw^CDuD7EXzgSE)>`?_v#zjj;*(oyic#cYpzxpZNQTE z_{-+d^Lrnx{baXp-CQpdRp$q4KKrG&{!udDd)92PM|5=a0f^35nn#LPz6?%3d_9_f zdE;#l!5zJqGgj~9-mx@w*?H#eTh_DX@wXm$yT&Zn^1DNI_YtWbyylI!EpqR@x>}#2 z)9G`s><&v_`qs?TTkAEY;yws&mp5$uJ+t)fMWur4O=fa}3I!1yOzDim7N@_vJ&!Y&k!57=cj~W$V)bj3TN^ bJ&>R8lP3S|PQfc+)xzNE>gTe~DWM4faElWQ literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfwkPz#WAEJ z?(LnxpeRQHhrk>E7x_B&EETa}x#yd6@1wa<-}ZjpNk<+(EU2)q2u{doR6gLW{`}T+ zCWdB%T?_{nAAkOd!FZHKTo`=+^Ys3`dwjcS$^0u6f4l zfzZ48x0!9S`*!bntGj2i;QK0O|N4LB@53KzANu=ak+lq8{Cu9f(N9_Ly+5C@yzX~Q z?}Moi-^qR0`fwlD6WarKO&`2xvyuHc@54NS_n$03X!HFPwO@WUcu6c%9Bd!|9{@8DBW&*i1o)Ye|Bx1|3%XGi>KQ@zWcZMLA3qDd(6*e^#7!H zthSyaU;TCRfB#>f@9yK;D0PS{;Oms6uZ0KyT3I%TPYPeKt;%cTFN+6p@*)RThyD>? zFKPd43)4O8wt~m84F9^zv@@=6`}lJHue-natyh1}x%;(%AF0abGsewj zeD~Lx@yEZgen&ewdozO_{Kx)1OJuOWSi<_L=8N@%tG{pU>gQ#8aC}#-O&05CmLCNl z?Hg84e=zS)h?||vgWh9h!k>5#n7uQ5$artr@W+C^0SE;U?pl-zx+5WLm#vCK3#@_+t*(fGB!Lu(3j86 maOYcTRSW|#vS_L057QC1PJz8uvyTJIV+K!GKbLh*2~7ZLb=Xq? From 40f56ea96f7fb068b4461cda3694b5f9a112b40e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:40 +0100 Subject: [PATCH 464/503] Update app-icon.png --- apps/minimal_clock/app-icon.png | Bin 1312 -> 1581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/minimal_clock/app-icon.png b/apps/minimal_clock/app-icon.png index 32e1a342590fa03cb75adb0b00f12491b3b0c264..69788442a39c7ba8ccb99355a5ee68877e3873d7 100644 GIT binary patch delta 1124 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 fCE#;_tD64 Date: Sat, 1 Jan 2022 09:24:43 +0100 Subject: [PATCH 465/503] Update README.md --- apps/minimal_clock/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index b20a8d480..7e8700c0d 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -5,7 +5,6 @@ some clock hands and no clock face. It considers the currently configured "theme" (and may therefore look different than shown in the screenshot on your watch depending on which theme you prefer). - ![](app-screenshot.png) This clock also acts as an example for the building blocks found in the author's From 5ae87ae125e19b4379a492efc968b07d8ae21439 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 11:56:40 +0100 Subject: [PATCH 466/503] Use weather condition code for icon selection --- apps.json | 2 +- apps/weatherClock/ChangeLog | 1 + apps/weatherClock/app.js | 30 +++++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..64732f580 100644 --- a/apps.json +++ b/apps.json @@ -4778,7 +4778,7 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.04", + "version": "0.05", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "screenshots": [{"url":"screens/screen1.png"}], diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 72b53ebbf..a6a12c297 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -2,3 +2,4 @@ 0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2 +0.05: Use weather condition code for icon selection diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 799f9abc6..1a7f53f05 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -53,6 +53,29 @@ function chooseIcon(condition) { return cloudIcon; } +/* +* Choose weather icon to display based on weather conditition code +* https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 +*/ +function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return stormIcon; + case 3: return rainIcon; + case 5: return rainIcon; + case 6: return snowIcon; + case 7: return cloudIcon; + case 8: + switch (code) { + case 800: return sunIcon; + case 801: return partSunIcon; + default: return cloudIcon; + } + break; + default: return cloudIcon; + } +} + /** Get weather stored in json file by weather app. */ @@ -105,7 +128,12 @@ function draw() { var currentWeather = weatherJson.weather; const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); clockLayout.temp.label = temp[1] + " " + temp[2]; - clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + const code = currentWeather.code || -1; + if (code > 0) { + clockLayout.weatherIcon.src = chooseIconByCode(code); + } else { + clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); } From be8f5ebb67dedbf4d4d9abd2099730f2852280a0 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 13:53:28 +0100 Subject: [PATCH 467/503] Redraw battery on charging event --- apps/circlesclock/app.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index c409c1e32..a23894ba1 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -226,6 +226,10 @@ Bangle.on('HRM', function(hrm) { //} }); +Bangle.on('charging', function(charging) { + drawBattery(); +}); + g.clear(); Bangle.loadWidgets(); /* From 9b29f5d2c72737d06b0d6b48505ff01bd69c93ab Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 14:13:53 +0100 Subject: [PATCH 468/503] Improve heart rate circle drawing calculation --- apps/circlesclock/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index a23894ba1..026b47cc6 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -102,7 +102,8 @@ function drawHeartRate() { g.fillCircle(w2, h3, radiusOuter); if (hrtValue != undefined && hrtValue > 0) { - const percent = hrtValue / settings.maxHR; + const minHR = 40; + const percent = (hrtValue - minHR) / (settings.maxHR - minHR); drawGauge(w2, h3, percent, colorRed); } @@ -166,6 +167,7 @@ function drawGauge(cx, cy, percent, color) { var i = 0; var r = radiusInner + 3; + if (percent <= 0) return; if (percent > 1) percent = 1; var startrot = -offset; From 00fdeca185acaaaa00a238b4ca7a2b4e795ab9fb Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 1 Jan 2022 19:47:43 +0100 Subject: [PATCH 469/503] Initial import of the tinydraw application --- apps.json | 19 ++++ apps/tinydraw/ChangeLog | 1 + apps/tinydraw/README.md | 12 +++ apps/tinydraw/add_to_apps.json | 14 +++ apps/tinydraw/app-icon.js | 1 + apps/tinydraw/app.js | 159 +++++++++++++++++++++++++++++++++ apps/tinydraw/app.png | Bin 0 -> 1650 bytes apps/tinydraw/screenshot.png | Bin 0 -> 4787 bytes 8 files changed, 206 insertions(+) create mode 100644 apps/tinydraw/ChangeLog create mode 100644 apps/tinydraw/README.md create mode 100644 apps/tinydraw/add_to_apps.json create mode 100644 apps/tinydraw/app-icon.js create mode 100644 apps/tinydraw/app.js create mode 100644 apps/tinydraw/app.png create mode 100644 apps/tinydraw/screenshot.png diff --git a/apps.json b/apps.json index e5e9f8f02..b822f2f0b 100644 --- a/apps.json +++ b/apps.json @@ -4838,6 +4838,25 @@ {"name": "flow.img", "url": "app-icon.js","evaluate": true } ] }, + { "id": "tinydraw", + "name": "TinyDraw", + "shortName":"TinyDraw", + "version":"0.01", + "type": "app", + "description": "Draw stuff in your wrist", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tinydraw.app.js","url":"app.js"}, + {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } + ] + }, { "id": "scribble", "name": "Scribble", "shortName":"Scribble", diff --git a/apps/tinydraw/ChangeLog b/apps/tinydraw/ChangeLog new file mode 100644 index 000000000..af7f83942 --- /dev/null +++ b/apps/tinydraw/ChangeLog @@ -0,0 +1 @@ +0.01: Initial release diff --git a/apps/tinydraw/README.md b/apps/tinydraw/README.md new file mode 100644 index 000000000..555730262 --- /dev/null +++ b/apps/tinydraw/README.md @@ -0,0 +1,12 @@ +TinyDraw +======== + +This is a simple drawing application to make +simple sketches in your watch! + +It is my first BangleJS application, I plan +to continue improving this app over time, but +if you want to contribute, i would be happy +to apply any patch! + +--pancake diff --git a/apps/tinydraw/add_to_apps.json b/apps/tinydraw/add_to_apps.json new file mode 100644 index 000000000..21a90049e --- /dev/null +++ b/apps/tinydraw/add_to_apps.json @@ -0,0 +1,14 @@ +{ "id": "tinydraw", + "name": "TinyDraw", + "shortName":"TinyDraw", + "version":"0.01", + "description": "Draw stuff in your wrist!", + "icon": "app.png", + "tags": "keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tinydraw.app.js","url":"app.js"}, + {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/tinydraw/app-icon.js b/apps/tinydraw/app-icon.js new file mode 100644 index 000000000..1f0eaae27 --- /dev/null +++ b/apps/tinydraw/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/ACEF7vd6oXTroXB7tQC6QWC7vQC6Xf//9C6n4xGPC4VM5nMoAXNxH/xH96EECwPM4gXNx///AXBhgXC5gXRqAXOt3u91gC4S/BC5sGCwPu8wXCuAXOhwXC9wXcR5oXJX5oXHxGIuF3DYQXRDIWHC5SPH/7yBAIN3u6/QC4JME+AXIg5WCC44CBJRN4KwQXHAgOAC5BWCC6gOCC6xUBC6cIUIQbCAAwXJvAMBQ4QXRg6fEC6SQBLQQXRJAYAJC5UIFpIXMMAQXUVIYXVGBQXLh4XKw4XKgCpCAA34F5apK/FwC5ZIJxAWLSJP4LxhhJxBGMMIeIJQX4xH3Cxz0CxAACu4WQAH4A/AAwA==")) diff --git a/apps/tinydraw/app.js b/apps/tinydraw/app.js new file mode 100644 index 000000000..e4c612219 --- /dev/null +++ b/apps/tinydraw/app.js @@ -0,0 +1,159 @@ +(function () { + var pen = 'circle'; + var discard = null; + var kule = [255, 255, 255]; + var oldLock = false; + + setInterval(() => { + if (Bangle.isLocked()) { + if (oldLock) { + return; + } + g.setColor('#fff'); + g.fillRect(0, 0, g.getWidth(), 20); + g.setFont('6x8', 2); + g.setColor('#000'); + g.drawString('PLEASE UNLOCK', 10, 2); + oldLock = true; + } else { + oldLock = false; + drawUtil(); + } + }, 1000); + + function nextColor () { + kule[0] = Math.random(); + kule[1] = Math.random(); + kule[2] = Math.random(); + } + + function nextPen () { + switch (pen) { + case 'circle': pen = 'pixel'; break; + case 'pixel': pen = 'crayon'; break; + case 'crayon': pen = 'square'; break; + case 'square': pen = 'circle'; break; + default: pen = 'pixel'; break; + } + console.log('set time'); + drawUtil(); + + discard = setTimeout(function () { console.log('timeout'); discard = null; }, 500); + } + + function drawUtil () { + if (Bangle.isLocked()) { + // do something to tell the user to unlock the screen + } + // titlebar + g.setColor(kule[0], kule[1], kule[2]); + g.fillRect(0, 0, g.getWidth(), 20); + // clear button + g.setColor('#000'); // black + g.fillCircle(10, 10, 8, 8); + g.setColor('#fff'); + g.drawLine(8, 8, 13, 13); + g.drawLine(13, 8, 8, 13); + // tool button + g.setColor('#fff'); + g.fillCircle(g.getWidth() - 10, 10, 8); + g.setColor('#000'); + + var w = g.getWidth(); + switch (pen) { + case 'circle': + g.fillCircle(w - 10, 10, 5); + break; + case 'square': + g.fillRect(w - 5, 5, w - 15, 15); + break; + case 'pixel': + g.setPixel(10, 10); + g.fillCircle(w - 10, 10, 2); + break; + case 'crayon': + var tap = { x: 10, y: 15, dy: -5, dx: 5 }; + g.drawLine(w - tap.x, tap.y, w - tap.x + tap.dx, tap.y + tap.dy); + g.drawLine(w - tap.x + 1, tap.y + 2, w - tap.x + tap.dx, tap.y + tap.dy - 2); + g.drawLine(w - tap.x + 2, tap.y + 2, w - tap.x + tap.dx, tap.y + tap.dy + 2); + break; + } + } + var tapTimer = null; + Bangle.on('drag', function (tap) { + if (tap.b === 0) { + if (tapTimer !== null) { + clearTimeout(tapTimer); + tapTimer = null; + } + } + // tap and hold the clear button + if (tap.x < 32 && tap.y < 32) { + if (tap.b === 1) { + if (tapTimer === null) { + tapTimer = setTimeout(function () { + g.clear(); + drawUtil(); + tapTimer = null; + }, 800); + } + if (discard) { + clearTimeout(discard); discard = null; + return; + } + } + return; + } + if (tap.x > g.getWidth() - 32 && tap.y < 32) { + if (tap.b === 1) { + if (tapTimer === null) { + tapTimer = setTimeout(function () { + g.clear(); + drawUtil(); + tapTimer = null; + }, 800); + } + if (discard) { + clearTimeout(discard); + discard = null; + return; + } + nextPen(); + } + drawUtil(); + return; + } else if (tap.y < 32) { + nextColor(); + drawUtil(); + return; + } + + g.setColor(kule[0], kule[1], kule[2]); + + switch (pen) { + case 'pixel': + g.setPixel(tap.x, tap.y); + g.drawLine(tap.x, tap.y, tap.x + tap.dx, tap.y + tap.dy); + break; + case 'crayon': + g.drawLine(tap.x, tap.y, tap.x + tap.dx, tap.y + tap.dy); + g.drawLine(tap.x + 1, tap.y + 2, tap.x + tap.dx, tap.y + tap.dy - 2); + g.drawLine(tap.x + 2, tap.y + 2, tap.x + tap.dx, tap.y + tap.dy + 2); + break; + case 'circle': + var XS = tap.dx / 10; + var YS = tap.dy / 10; + for (i = 0; i < 10; i++) { + g.fillCircle(tap.x + (i * XS), tap.y + (i * YS), 4, 4); + } + break; + case 'square': + g.fillRect(tap.x - 10, tap.y - 10, tap.x + 10, tap.y + 10); + break; + } + drawUtil(); + }); + + g.clear(); + drawUtil(); +})(); diff --git a/apps/tinydraw/app.png b/apps/tinydraw/app.png new file mode 100644 index 0000000000000000000000000000000000000000..01eda0a60ed4eaa25874cbe5cb0788819c796af4 GIT binary patch literal 1650 zcmV-&295cNP)F7=ErT_RA|01Z$N!$o!zp1#2-;FiT`^S%e=%SvCkHGsc9ds39S#_{(G{(X7f8 zSR^Krm`q|MsRh#!OteD0>W9s%HnrdDz1tlr0mAtF)IQyAez8OGKA(Wfc;#G?|=Uaot>R;l8RyQPlXk% zEfxR}Es2>>|6tLea@0Lm>u`*!T`o_QOeXTOth7xk5g)o%EjP~A{<8TBDE{*RSe8Y5 zdppc#Gftj7iDOp^fOszez~+8E!FikA**rM-dZ)|fi2?wZ%M&#?_`+YB&hW595fvq@1+Z&D zM*sj=_HCGp#bN*e4<5ZkUH<2mC;36n;TTm<*Un7*oJOFG>f!;M0B``nMgS%Nw*XxH zg(>`Rs_%?LZ7$=Br$3Ef2ZCWU6=vdRJpuveYXE2h&Li;D0H_J@lOpOHN5;F0m`o<} zPG@f>el8(&0zl3bTuy+W3^o9(-w!ou+w`G0JwF!#2j<8}1CYI2D3yp0#m2Ih$v%jU zWi3*P_)xe7Y@7%G-fVNNT5gP9xni$e9`i65E;5-9K& z`ZU(8S%b4@&!V%lvqh~|WB2aeZww2CXl!gO-nVbxZ;=#m5x|xy61gG3Pb%QtxpOEj zEd|3cP%4$k%*@1&9Xs&o(Ic=d3$0d*oSdA>`}gl#O(xS{V`F1bsZ_f&GBW-M>t?Bp z>f+0&uDp!uy344J0?+bsQz+fNdzXTE`SK+JpvK0=P+4DJ9|55H`ub3r(P$(91b~D> zA&JFe0zj3Ol^4Ul+bFj+6doX=*W>Hchb_*U^E(G zHk(mYRD`^|yz<$0giI!z{75KxdlnK3XW#KN3TSO@#nGcjk(`{2#Kc5sG#U_5t45>A zosFTmxOgxO6ZY`_pxx-ez(DB#`t|E^>C&b2%a<=7udA!emrA7o0H4nXp69_Z3}iAH zL?RJ*o`=up0|2<)qYwxLp?bj{7l}lXy|ySRDanqBiJ^gk0U{#eIF77VE2XEWlR}{& zg+f7ky`DTC4{;nvZnv8{Iy%Vdbdt~KBcIPl9*>7QIy%Vhc9YlZC9l^@9*>8NMk9@l zjfHZ+Y&Oq22WCW1Pmhve80VQYXNc!{;(4Apjw6G?Kmvh)SeB)xrY7=wy&;Ero+rQG zAF3aG5B|o#^E@9}0RT`{RiyzyPoF*w8RIyP3JVMA-C1Zph?s!k;oxCI3EHpc*v!C(j(F&T)0pUfNtNuJul~9ym&!LNlBEOn@d<|6c-oo0YKNUU!Sl_e<<49 z+exKTQA$b*_4f9DhmV0%r%q{t$HSJE7P8yzGsb&YR~MZ>f1UtPdU`r_b#?uSkBO$H zrrgxjR02TDmoKNn!on#9Y}l|NbUdx7s35D=nmt#$OeDl;wc6|l4<6`-hKAnbBoYa> wZ{Ln>+qR{orKOD|BqUg{ge5Ft37;(f2V~L;L7FfU%>V!Z07*qoM6N<$g7T*d=>Px# literal 0 HcmV?d00001 diff --git a/apps/tinydraw/screenshot.png b/apps/tinydraw/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..27d5cc56cd4017f25f42bf9405e2575771e4b4b1 GIT binary patch literal 4787 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 N002ovPDHLkV1i{CF?av~ literal 0 HcmV?d00001 From f7be3effa437251ba5e7fe8f3b5ccb4f2ffa09e7 Mon Sep 17 00:00:00 2001 From: pancake Date: Sun, 2 Jan 2022 01:45:11 +0100 Subject: [PATCH 470/503] Fix readme --- apps/tinydraw/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/tinydraw/README.md b/apps/tinydraw/README.md index 555730262..a4acd9a72 100644 --- a/apps/tinydraw/README.md +++ b/apps/tinydraw/README.md @@ -1,12 +1,14 @@ TinyDraw ======== -This is a simple drawing application to make -simple sketches in your watch! +This is a simple drawing application to make sketches +using different brushes and colors for your BangleJS2 watch! + +* Brush types: dot, brush, circle, square It is my first BangleJS application, I plan to continue improving this app over time, but -if you want to contribute, i would be happy -to apply any patch! +if you want to contribute or provide feedback +don't hesitate to contact me! --pancake From 3db8bd43c8e18e817992efa51c33e74f5caac054 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 2 Jan 2022 20:42:09 +0000 Subject: [PATCH 471/503] touchtimer: calculate time based on actual input, and only convert to 60m/60s afterwards. Clean up code. --- apps/touchtimer/README.md | 2 +- apps/touchtimer/app.js | 246 +++++++++++++++++++++++++------------- 2 files changed, 164 insertions(+), 84 deletions(-) diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index c8bc2c084..c97e69afc 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -9,7 +9,7 @@ Quickly and easily create a timer with touch-only input. The time can be easily - If the timer time is correct, press "OK". - If you have accidentially pressed "OK", press "STOP" to go cancel. - Press "START" to start the timer, if the time is correct. -- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 10 times, or until you press "STOP" +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 5 times, or until you press "STOP" ## Screenshots diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index ad8eb42ae..c3200327d 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -53,38 +53,29 @@ var main = () => { var timerRunningButtons = [buttonStartPause, buttonStop]; - var timeStr = ""; + var timerEdit = new TimerEdit(); timerNumberButtons.forEach((numberButton) => { - numberButton.setOnClick((value) => { + numberButton.setOnClick((number) => { log("number button clicked"); - log(value); - log(timeStr); - if (value === 0 && timeStr.length === 0) { - return; - } - - if (timeStr.length <= 6) { - timeStr = timeStr + value; - } - log(timeStr); - drawTimer(timeStr); + log(number); + timerEdit.appendNumber(number); + timerEdit.draw(); }); }); buttonDelete.setOnClick(() => { log("delete button clicked"); - timeStr = timeStr.slice(0, -1); - log(timeStr); - drawTimer(timeStr); + timerEdit.removeNumber(); + timerEdit.draw(); }); buttonOK.setOnClick(() => { - if (timeStr.length === 0) { + if (timerEdit.timeStr.length === 0) { return; } g.clear(); - drawTimer(timeStr); + timerEdit.draw(); timerInputButtons.forEach((button) => button.disable()); @@ -96,8 +87,13 @@ var main = () => { var timerIntervalId = undefined; var buzzIntervalId = undefined; + var timerCountDown = undefined; buttonStartPause.setOnClick(() => { if (buttonStartPause.value === "PAUSE") { + if (timerCountDown) { + timerCountDown.pause(); + } + buttonStartPause.value = "START"; buttonStartPause.draw(); @@ -115,18 +111,19 @@ var main = () => { } if (buttonStartPause.value === "START") { + if (!timerCountDown) { + timerCountDown = new TimerCountDown(timerEdit.timeStr); + } else { + timerCountDown.unpause(); + } + buttonStartPause.value = "PAUSE"; buttonStartPause.draw(); - var time = timeStrToTime(timeStr); - timerIntervalId = setInterval(() => { - time = time - 1; + timerCountDown.draw(); - timeStr = timeToTimeStr(time); - drawTimer(timeStr); - - if (time === 0) { + if (timerCountDown.isFinished()) { buttonStartPause.value = "FINISHED!"; buttonStartPause.draw(); @@ -138,7 +135,7 @@ var main = () => { var buzzCount = 0; Bangle.buzz(1000, 1); buzzIntervalId = setInterval(() => { - if (buzzCount >= 10) { + if (buzzCount >= 5) { clearInterval(buzzIntervalId); buzzIntervalId = undefined; return; @@ -155,6 +152,10 @@ var main = () => { }); buttonStop.setOnClick(() => { + if (timerCountDown) { + timerCountDown = undefined; + } + if (timerIntervalId) { clearInterval(timerIntervalId); timerIntervalId = undefined; @@ -169,8 +170,8 @@ var main = () => { buttonStartPause.draw(); g.clear(); - timeStr = ""; - drawTimer(timeStr); + timerEdit.reset(); + timerEdit.draw(); timerRunningButtons.forEach((button) => button.disable()); @@ -182,7 +183,7 @@ var main = () => { // initalize g.clear(); - drawTimer(timeStr); + timerEdit.draw(); timerInputButtons.forEach((button) => { button.enable(); button.draw(); @@ -197,24 +198,6 @@ var log = (message) => { } }; -var drawTimer = (timeStr) => { - timeStr = timeStr.padStart(6, "0"); - var timeStrDisplay = - "" + - timeStr.slice(0, 2) + - "h " + - timeStr.slice(2, 4) + - "m " + - timeStr.slice(4, 6) + - "s"; - - g.clearRect(0, 0, 176, 34); - g.setColor(g.theme.fg); - g.setFontAlign(-1, -1); - g.setFont("Vector:26x40"); - g.drawString(timeStrDisplay, 2, 0); -}; - var touchHandlers = []; Bangle.on("touch", (_button, xy) => { @@ -312,50 +295,147 @@ class Button { } } -var timeToTimeStr = (time) => { - var hours = Math.floor(time / 3600); - time = time - hours * 3600; - var minutes = Math.floor(time / 60); - time = time - minutes * 60; - var seconds = time; - - if (hours === 0) { - hours = ""; - } else { - hours = hours.toString(); +class TimerEdit { + constructor() { + this.timeStr = ""; } - if (hours.length === 0) { - if (minutes === 0) { - minutes = ""; - } else { - minutes = minutes.toString(); + appendNumber(number) { + if (number === 0 && this.timeStr.length === 0) { + return; } - } else { - minutes = minutes.toString().padStart(2, "0"); - } - if (hours.length === 0 && minutes.length === 0) { - if (seconds === 0) { - seconds = ""; - } else { - seconds = seconds.toString(); + if (this.timeStr.length <= 6) { + this.timeStr = this.timeStr + number; } - } else { - seconds = seconds.toString().padStart(2, "0"); } - return hours + minutes + seconds; -}; + removeNumber() { + if (this.timeStr.length > 0) { + this.timeStr = this.timeStr.slice(0, -1); + } + } -var timeStrToTime = (timeStr) => { - timeStr = timeStr.padStart(6, "0"); - return ( - parseInt(timeStr.slice(0, 2), 10) * 3600 + - parseInt(timeStr.slice(2, 4), 10) * 60 + - parseInt(timeStr.slice(4, 6), 10) - ); -}; + reset() { + this.timeStr = ""; + } + + draw() { + log("drawing timer edit"); + var timeStrPadded = this.timeStr.padStart(6, "0"); + var timeStrDisplay = + "" + + timeStrPadded.slice(0, 2) + + "h " + + timeStrPadded.slice(2, 4) + + "m " + + timeStrPadded.slice(4, 6) + + "s"; + log(timeStrPadded); + log(timeStrDisplay); + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); + } +} + +class TimerCountDown { + constructor(timeStr) { + log("creating timer"); + this.timeStr = timeStr; + log(this.timeStr); + this.start = Math.floor(Date.now() / 1000); + log(this.start); + this.pausedTime = undefined; + } + + getAdjustedTime() { + var elapsedTime = Math.floor(Date.now() / 1000) - this.start; + + var timeStrPadded = this.timeStr.padStart(6, "0"); + var timeStrHours = parseInt(timeStrPadded.slice(0, 2), 10); + var timeStrMinutes = parseInt(timeStrPadded.slice(2, 4), 10); + var timeStrSeconds = parseInt(timeStrPadded.slice(4, 6), 10); + + var hours = timeStrHours; + var minutes = timeStrMinutes; + var seconds = timeStrSeconds - elapsedTime; + + if (seconds < 0) { + var neededMinutes = Math.ceil(Math.abs(seconds) / 60); + + seconds = seconds + neededMinutes * 60; + minutes = minutes - neededMinutes; + + if (minutes < 0) { + var neededHours = Math.ceil(Math.abs(minutes) / 60); + + minutes = minutes + neededHours * 60; + hours = hours - neededHours; + } + } + + if (hours < 0 || minutes < 0 || seconds < 0) { + hours = 0; + minutes = 0; + seconds = 0; + } + + return { hours: hours, minutes: minutes, seconds: seconds }; + } + + pause() { + this.pausedTime = Math.floor(Date.now() / 1000); + } + + unpause() { + if (this.pausedTime) { + this.start += Math.floor(Date.now() / 1000) - this.pausedTime; + } + + this.pausedTime = undefined; + } + + draw() { + log("drawing timer count down"); + var adjustedTime = this.getAdjustedTime(); + var hours = adjustedTime.hours; + var minutes = adjustedTime.minutes; + var seconds = adjustedTime.seconds; + + var timeStrDisplay = + "" + + hours.toString().padStart(2, "0") + + "h " + + minutes.toString().padStart(2, "0") + + "m " + + seconds.toString().padStart(2, "0") + + "s"; + log(timeStrDisplay); + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); + } + + isFinished() { + var adjustedTime = this.getAdjustedTime(); + var hours = adjustedTime.hours; + var minutes = adjustedTime.minutes; + var seconds = adjustedTime.seconds; + + if (hours <= 0 && minutes <= 0 && seconds <= 0) { + return true; + } else { + return false; + } + } +} // start main function From 3150fc7536b7b8bfa1aaa228a36aefb357bcfc96 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 2 Jan 2022 21:01:49 +0000 Subject: [PATCH 472/503] touchtimer: add settings --- apps.json | 6 ++- apps/touchtimer/ChangeLog | 3 +- apps/touchtimer/README.md | 3 +- apps/touchtimer/app.js | 24 +++++++++--- apps/touchtimer/settings.js | 77 +++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 apps/touchtimer/settings.js diff --git a/apps.json b/apps.json index 01ad2eac4..846ab7efe 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "touchtimer", "name": "Touch Timer", "shortName": "Touch Timer", - "version": "0.01", + "version": "0.02", "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", @@ -5076,7 +5076,9 @@ "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}], "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, + { "name":"touchtimer.settings.js", "url":"settings.js"}, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } - ] + ], + "data": [{"name":"touchtimer.data.json"}] } ] diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog index 193a476aa..01904c6ea 100644 --- a/apps/touchtimer/ChangeLog +++ b/apps/touchtimer/ChangeLog @@ -1 +1,2 @@ -0.01: Initial creation of the touch timer app \ No newline at end of file +0.01: Initial creation of the touch timer app +0.02: Add settings menu \ No newline at end of file diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index c97e69afc..39afba8e5 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -9,7 +9,8 @@ Quickly and easily create a timer with touch-only input. The time can be easily - If the timer time is correct, press "OK". - If you have accidentially pressed "OK", press "STOP" to go cancel. - Press "START" to start the timer, if the time is correct. -- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 5 times, or until you press "STOP" +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 1 seconds for a total of 3 times, or until you press "STOP" +- -> The number of buzzes, the buzz duration, and the pause between buzzes is configurable in the settings app ## Screenshots diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index c3200327d..ffa1af80a 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,6 +1,9 @@ var DEBUG = false; +var FILE = "touchtimer.data.json"; var main = () => { + var settings = readSettings(); + var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); var button2 = new Button({ x1: 60, y1: 35, x2: 116, y2: 70 }, 2); var button3 = new Button({ x1: 118, y1: 35, x2: 174, y2: 70 }, 3); @@ -132,18 +135,18 @@ var main = () => { timerIntervalId = undefined; } - var buzzCount = 0; - Bangle.buzz(1000, 1); + var buzzCount = 1; + Bangle.buzz(settings.buzzDuration * 1000, 1); buzzIntervalId = setInterval(() => { - if (buzzCount >= 5) { + if (buzzCount >= settings.buzzCount) { clearInterval(buzzIntervalId); buzzIntervalId = undefined; return; } else { - Bangle.buzz(1000, 1); + Bangle.buzz(settings.buzzDuration * 1000, 1); buzzCount++; } - }, 5000); + }, settings.buzzDuration * 1000 + settings.pauseBetween * 1000); } }, 1000); @@ -437,6 +440,17 @@ class TimerCountDown { } } +var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + buzzCount: 3, + buzzDuration: 1, + pauseBetween: 1, + }; + log(settings); + return settings; +}; + // start main function main(); diff --git a/apps/touchtimer/settings.js b/apps/touchtimer/settings.js new file mode 100644 index 000000000..885670f57 --- /dev/null +++ b/apps/touchtimer/settings.js @@ -0,0 +1,77 @@ +(function (back) { + var DEBUG = false; + var FILE = "touchtimer.data.json"; + + var settings = {}; + + var showMainMenu = () => { + log("Loading main menu"); + + E.showMenu({ + "": { title: "Touch Timer" }, + "< Back": () => back(), + "Buzz Count": { + value: settings.buzzCount, + min: 1, + max: 3, + step: 1, + onchange: (value) => { + settings.buzzCount = value; + writeSettings(settings); + }, + }, + "Buzz Duration": { + value: settings.buzzDuration, + min: 1, + max: 10, + step: 0.5, + format: (value) => value + "s", + onchange: (value) => { + settings.buzzDuration = value; + writeSettings(settings); + }, + }, + "Pause Between": { + value: settings.pauseBetween, + min: 1, + max: 5, + step: 1, + format: (value) => value + "s", + onchange: (value) => { + settings.pauseBetween = value; + writeSettings(settings); + }, + }, + }); + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + buzzCount: 3, + buzzDuration: 1, + pauseBetween: 1, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + // start main function + + settings = readSettings(); + showMainMenu(); +}); From 495ee69251126350d174b3785117626693d03e3e Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 3 Jan 2022 11:08:32 +0100 Subject: [PATCH 473/503] Update apps/gpsinfo/gps-info.js (nofBD and/or nofGP are not recognized as numbers) Co-authored-by: BartS23 <10829389+BartS23@users.noreply.github.com> --- apps/gpsinfo/gps-info.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 4c935b61a..3c8bd42ea 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -113,8 +113,8 @@ function onGPSraw(nmea) { var nofGP = 0; if (nmea.slice(3,6) == "GSV") { // console.log(nmea); - if (nmea.slice(0,7) == "$BDGSV,") nofBD = nmea.slice(11,13); - if (nmea.slice(0,7) == "$GPGSV,") nofGP = nmea.slice(11,13); + if (nmea.slice(0,7) == "$BDGSV,") nofBD = Number(nmea.slice(11,13)); + if (nmea.slice(0,7) == "$GPGSV,") nofGP = Number(nmea.slice(11,13)); SATinView = nofBD + nofGP; } } From aa45ecdb961dab07cd74b992f44fe5692f69aafc Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 3 Jan 2022 11:49:43 +0100 Subject: [PATCH 474/503] Update gps-info.js : make nofBD and nofGP global ...otherwise one of them is always zero. Thanks, BartS23 --- apps/gpsinfo/gps-info.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 3c8bd42ea..a16d4a04e 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -17,6 +17,8 @@ var lastFix = { satellites: 0 }; var SATinView = 0; +var nofBD = 0; +var nofGP = 0; function formatTime(now) { if (now == undefined) { @@ -109,8 +111,6 @@ function onGPS(fix) { } function onGPSraw(nmea) { - var nofBD = 0; - var nofGP = 0; if (nmea.slice(3,6) == "GSV") { // console.log(nmea); if (nmea.slice(0,7) == "$BDGSV,") nofBD = Number(nmea.slice(11,13)); From 402a2fc6b4a99ce6b7be75c7a1c3cc056790bfc8 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:07:17 +0100 Subject: [PATCH 475/503] Updated contributors --- apps/lcars/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index b7a692c96..4630db1ea 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,9 +1,8 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, the health app is required. -If this app is not installed, the data will not be shown. - +Note: To display the steps, the health app is required. If this app is not installed, the data will not be shown. +To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerdavid/BangleApps) ## Features * LCARS Style watch face. @@ -28,5 +27,6 @@ Access different screens via swipe left/ right -## Creator -Made by [David Peer](https://github.com/peerdavid) \ No newline at end of file +## Contributors +- Creator: [David Peer](https://github.com/peerdavid). +- Improvements: [Adam Schmalhofer](https://github.com/adamschmalhofer). From b04578840bf945f53cf844e2a64344157f90b86f Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:19:48 +0100 Subject: [PATCH 476/503] Added vref to settings --- apps/lcars/lcars.app.js | 5 +++++ apps/lcars/lcars.settings.js | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 391f14c20..36a335a81 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -145,6 +145,11 @@ function printData(key, y){ g.drawString("HRM:", 26, y); g.drawString(hrmValue, 65, y); + } else if (key == "VREF"){ + var voltage = E.getAnalogVRef().toFixed(2); + g.drawString("VREF:", 26, y); + g.drawString(voltage + "V", 65, y); + } else { g.drawString("NOT FOUND", 26, y); } diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 2255caf9b..0d004b002 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -18,14 +18,14 @@ storage.write(SETTINGS_FILE, settings) } - var data_options = ['Battery', 'Steps', 'Temp.', "HRM"]; + var data_options = ["Battery", "Steps", "Temp.", "HRM", "VREF"]; E.showMenu({ '': { 'title': 'LCARS Clock' }, '< Back': back, 'Row 1': { value: 0 | data_options.indexOf(settings.dataRow1), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow1 = data_options[v]; @@ -34,7 +34,7 @@ }, 'Row 2': { value: 0 | data_options.indexOf(settings.dataRow2), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow2 = data_options[v]; @@ -43,7 +43,7 @@ }, 'Row 3': { value: 0 | data_options.indexOf(settings.dataRow3), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow3 = data_options[v]; From 9551f7751033f2b3fabd411cb2bae58945ba942d Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:38:02 +0100 Subject: [PATCH 477/503] Show large text for alarm --- apps/lcars/lcars.app.js | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 36a335a81..8aa31f18b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,6 +23,7 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +let cRed = "#FF0000"; /* * Global lcars variables @@ -79,12 +80,6 @@ var iconSatellite = { buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) }; -var iconAlarm = { - width : 50, height : 50, bpp : 3, - transparent : 1, - buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) -}; - var iconCharging = { width : 50, height : 50, bpp : 3, transparent : 5, @@ -193,24 +188,26 @@ function drawState(){ var current = new Date(); var hours = current.getHours(); - var iconImg = - isAlarmEnabled() ? iconAlarm : - Bangle.isCharging() ? iconCharging : - bat < 30 ? iconNoBattery : - Bangle.isGPSOn() ? iconSatellite : - hours % 4 == 0 ? iconSaturn : - hours % 4 == 1 ? iconMars : - hours % 4 == 2 ? iconMoon : - iconEarth; - g.drawImage(iconImg, 117, 107); - - // Alarm within symbol - g.setFontAntonioMedium(); - if(isAlarmEnabled()){ + if(!isAlarmEnabled()){ + var iconImg = + Bangle.isCharging() ? iconCharging : + bat < 30 ? iconNoBattery : + Bangle.isGPSOn() ? iconSatellite : + hours % 4 == 0 ? iconSaturn : + hours % 4 == 1 ? iconMars : + hours % 4 == 2 ? iconMoon : + iconEarth; + g.drawImage(iconImg, 117, 107); + } else { + // Alarm within symbol + g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 117+25, 107+25+1); + g.setColor(cRed); + g.drawString("ALARM", 117+25, 107); + g.setFontAntonioLarge(); + g.drawString(getAlarmMinutes(), 117+25, 107+35); } + g.setFontAlign(-1, -1, 0); } From 4856788e9eb13802d6be8688242872dd74c922b4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:48:57 +0100 Subject: [PATCH 478/503] Minor color changes --- apps/lcars/lcars.app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8aa31f18b..1ba16fc59 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,7 +23,6 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; -let cRed = "#FF0000"; /* * Global lcars variables @@ -202,7 +201,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cRed); + g.setColor(cPurple); g.drawString("ALARM", 117+25, 107); g.setFontAntonioLarge(); g.drawString(getAlarmMinutes(), 117+25, 107+35); From 9ecfb20fbc1f74b1121bbcf4206b53faaf67cc30 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:56:10 +0100 Subject: [PATCH 479/503] Updated colors --- apps/lcars/lcars.app.js | 3 ++- apps/lcars/screenshot.png | Bin 4798 -> 4732 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1ba16fc59..9d125db4a 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -173,6 +173,7 @@ function drawLock(){ g.drawString("NOCON", 128, 33); } if(Bangle.isLocked()){ + g.setColor(cPurple); g.drawString("LOCK", 128, 53); } } @@ -201,7 +202,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cPurple); + g.setColor(cOrange); g.drawString("ALARM", 117+25, 107); g.setFontAntonioLarge(); g.drawString(getAlarmMinutes(), 117+25, 107+35); diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 4d4911227dc8ce48bd8db53c3947900c4e8ac87e..385273048d77e884dd0ebfb66931ccc68d884ca1 100644 GIT binary patch delta 4726 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 Eg5O2u&j0`b delta 4793 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 TQ(~2;00000NkvXXu0mjfvsL(J From a58f32b042b1af718b6d7543c1611b5c7b522b86 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 19:33:49 +0100 Subject: [PATCH 480/503] Performane improvements --- apps/lcars/lcars.app.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9d125db4a..f9b1e410e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -183,6 +183,7 @@ function drawState(){ return; } + g.clearRect(110, 90, g.getWidth(), 170); g.setColor(cWhite); var bat = E.getBattery(); var current = new Date(); @@ -197,7 +198,7 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 117, 107); + g.drawImage(iconImg, 117, 104); } else { // Alarm within symbol g.setFontAntonioMedium(); @@ -522,6 +523,11 @@ Bangle.on("drag", e => { } else { increaseAlarm(); } + + // Only update the state and return to + // avoid a full draw as this is much faster. + drawState(); + return; } if(lcarsViewPos == 1){ From aa7938162fffccc9054cecab033d6ce7f455beee Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Mon, 3 Jan 2022 15:19:06 -1000 Subject: [PATCH 481/503] Fix leading zero for hours < 12 --- apps/slash/app.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/slash/app.js b/apps/slash/app.js index 53ff2640a..f548bcaf7 100644 --- a/apps/slash/app.js +++ b/apps/slash/app.js @@ -54,20 +54,23 @@ function convertDate(date) { function draw() { var d = new Date(); var h = d.getHours(), m = d.getMinutes(); - var hour = (" "+h).substr(-2); var minutes = ("0"+m).substr(-2); g.reset(); // Convert to 12hr time mode - if (is12Hour && hour > 12) { - hour = hour - 12; - if (hour < 10) { - hour = "0" + hour; + if (is12Hour && h > 12) { + h = h - 12; + if (h < 10) { + h = "0" + h; } - } else if (hour == 0) { - hour = 12; + } else if (h < 12) { + h = "0" + h; + } else if (h == 0) { + h = 12; } + var hour = (" "+h).substr(-2); + // Draw the time, vector font g.setFont("Vector", 50); g.setFontAlign(1,1); // Align right bottom From 0e167ada67f86208fb6fb84cf5edd708295933d3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 4 Jan 2022 08:05:59 +0100 Subject: [PATCH 482/503] Lower line as battery indicator --- apps/lcars/lcars.app.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f9b1e410e..07037b197 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -149,7 +149,7 @@ function printData(key, y){ } } -function drawHoriztonatlBgLine(color, x1, x2, y, h){ +function drawHorizontalBgLine(color, x1, x2, y, h){ g.setColor(color); for(var i=0; i Date: Tue, 4 Jan 2022 08:45:23 +0100 Subject: [PATCH 483/503] Design chnges --- apps/lcars/lcars.app.js | 55 +++++++++++++++++++++----------------- apps/lcars/screenshot.png | Bin 4732 -> 5112 bytes 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 07037b197..63e3a3a33 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,6 +23,7 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +let cBlack = "#000000"; /* * Global lcars variables @@ -104,6 +105,7 @@ Graphics.prototype.setFontAntonioLarge = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); }; + /* * Draw watch face */ @@ -117,36 +119,41 @@ function queueDraw() { } -function printData(key, y){ +function printData(key, y, c){ g.setFontAlign(-1,-1,0); + var text = "ERR"; + var value = "NOT FOUND"; if(key == "Battery"){ - var bat = E.getBattery(); - g.drawString("BAT:", 26, y); - g.drawString(bat+ "%", 65, y); + text = "BAT"; + value = E.getBattery() + "%"; } else if(key == "Steps"){ - var steps = getSteps(); - g.drawString("STEP:", 26, y); - g.drawString(steps, 65, y); + text = "STEP"; + value = getSteps(); } else if(key == "Temp."){ - var temperature = Math.floor(E.getTemperature()); - g.drawString("TMP:", 26, y); - g.drawString(temperature + "C", 65, y); + text = "TEMP"; + value = Math.floor(E.getTemperature()) + "C"; } else if(key == "HRM"){ - g.drawString("HRM:", 26, y); - g.drawString(hrmValue, 65, y); + text = "HRM"; + value = hrmValue; } else if (key == "VREF"){ - var voltage = E.getAnalogVRef().toFixed(2); - g.drawString("VREF:", 26, y); - g.drawString(voltage + "V", 65, y); + text = "VREF"; + value = E.getAnalogVRef().toFixed(2) + "V"; - } else { - g.drawString("NOT FOUND", 26, y); } + + g.setColor(c); + g.fillRect(133, y-2, 165 ,y+18); + g.fillCircle(164, y+8, 10); + g.setColor(cBlack); + g.drawString(text, 135, y); + + g.setColor(c); + g.drawString(value, 88, y); } function drawHorizontalBgLine(color, x1, x2, y, h){ @@ -183,7 +190,7 @@ function drawState(){ return; } - g.clearRect(110, 90, g.getWidth(), 170); + g.clearRect(20, 93, 77, 170); g.setColor(cWhite); var bat = E.getBattery(); var current = new Date(); @@ -198,16 +205,16 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 117, 104); + g.drawImage(iconImg, 29, 104); } else { // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); g.setColor(cOrange); - g.drawString("ALARM", 117+25, 107); + g.drawString("ALARM", 29+25, 107); g.setColor(cWhite); g.setFontAntonioLarge(); - g.drawString(getAlarmMinutes(), 117+25, 107+35); + g.drawString(getAlarmMinutes(), 29+25, 107+35); } g.setFontAlign(-1, -1, 0); @@ -252,9 +259,9 @@ function drawPosition0(){ // Draw data g.setFontAlign(-1, -1, 0); g.setColor(cWhite); - printData(settings.dataRow1, 97); - printData(settings.dataRow2, 122); - printData(settings.dataRow3, 147); + printData(settings.dataRow1, 97, cOrange); + printData(settings.dataRow2, 122, cPurple); + printData(settings.dataRow3, 147, cBlue); // Draw state drawState(); diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 385273048d77e884dd0ebfb66931ccc68d884ca1..ea57e979fcbbc7761a7b06bf69000c22d526cab9 100644 GIT binary patch delta 5110 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 YKi)^^b0eb_3;+NC07*qoM6N<$f=R!@)&Kwi delta 4727 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 Date: Tue, 4 Jan 2022 08:47:23 +0100 Subject: [PATCH 484/503] Updated readme --- apps/lcars/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 4630db1ea..97695a408 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -13,6 +13,7 @@ To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerda * [Screen 1] Shows different states such as (charging, out of battery, GPS on etc.) * [Screen 1] Swipe up/down to activate an alarm. * [Screen 1] Shows 3 customizable datapoints on the first screen. + * [Screen 1] The lower orange line indicates the battery level. * [Screen 2] Display month graphs for steps + hrm on the second screen. From a614a398ccc420b95c8d0e0456ccd489c5506cee Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 4 Jan 2022 09:05:31 +0100 Subject: [PATCH 485/503] Minor design improvements --- apps/lcars/lcars.app.js | 5 +++-- apps/lcars/screenshot.png | Bin 5112 -> 5195 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 63e3a3a33..74d0450c0 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -148,12 +148,13 @@ function printData(key, y, c){ g.setColor(c); g.fillRect(133, y-2, 165 ,y+18); - g.fillCircle(164, y+8, 10); + g.fillCircle(161, y+8, 10); g.setColor(cBlack); g.drawString(text, 135, y); g.setColor(c); - g.drawString(value, 88, y); + g.setFontAlign(1,-1,0); + g.drawString(value, 130, y); } function drawHorizontalBgLine(color, x1, x2, y, h){ diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index ea57e979fcbbc7761a7b06bf69000c22d526cab9..b3dfd42000766a5bff8e62a6e5d66103ac4f2a9b 100644 GIT binary patch delta 5194 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 Ef?}il!TQ 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 YKi)^^b0eb_3;+NC07*qoM6N<$g2zF@sQ>@~ From b5b40b8db6e6d97713c3550df9d4c61d32268796 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 4 Jan 2022 09:47:00 +0100 Subject: [PATCH 486/503] Extend TODO list --- apps/circlesclock/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 27c0566d3..66d9afe08 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -13,6 +13,8 @@ It shows besides time, date and day of week the following information: ## TODO * Show weather information +* Configure which information to show in each circle +* Configure visibility of widgets ## Creator Marco ([myxor](https://github.com/myxor)) From 36a8623810e8f42db4708401dcf5d27b0a9e245d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 09:37:59 +0000 Subject: [PATCH 487/503] check for duplicate apps --- bin/sanitycheck.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index fe59baa25..e50256fb6 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -76,8 +76,11 @@ function globToRegex(pattern) { const isGlob = f => /[?*]/.test(f) // All storage+data files in all apps: {app:,[file: | data:]} let allFiles = []; +let existingApps = []; apps.forEach((app,appIdx) => { if (!app.id) ERROR(`App ${appIdx} has no id`); + if (existingApps.includes(app.id)) ERROR(`Duplicate app '${app.id}'`); + existingApps.push(app.id); //console.log(`Checking ${app.id}...`); var appDir = APPSDIR+app.id+"/"; if (!fs.existsSync(APPSDIR+app.id)) ERROR(`App ${app.id} has no directory`); From 9d548ef5e697dcd659c3670f336984604cf09ff2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 09:47:18 +0000 Subject: [PATCH 488/503] fix merge --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e224e1576..4806955fe 100644 --- a/apps.json +++ b/apps.json @@ -5069,14 +5069,14 @@ "shortName":"AnDark", "version":"0.04", "description": "analog clock face without disturbing widgets", - "icon": "app_icon.png", + "icon": "andark_icon.png", "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"andark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} + {"name":"andark.img","url":"app_icon.js","evaluate":true} ] }, { From f9a34bf2c8052a0824434de8ff9f7e32fec7507c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:03:30 +0000 Subject: [PATCH 489/503] fix icon --- apps/supf/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index c06a65409..9b880b5e9 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("ogA/AH4A/AElAdbgcEDq46FgEEQX5HGACZbBDjQeCDrocbAH4A/AH4A0gX/AAPzgEBAoX/BgIFDiEAn4FCkAdFgYXEDpQXBAocwDow4BHwIIDEAIdCHAIdDAQM/Dp4UBAQodxmYABDrK5DDrY7BmQdaPRAd4d6CPESo4ACDoQACDowXDHwMBDpI+Bn4jEAH4A/AH4A/AB9ADjcEogdbogA+K7oddWyywBDzQcHAH4A/AGAA=")) +require("heatshrink").decompress(atob("mEw4UBAoP/AAXnnNVAH4ACoEABZJXBgoLUGaIAIgILLbf4AUnWqweq1gEB4QEBBZ0OwEA9k7h3C2ALGlk4BZAeBBZAvCBZOv/gLJ2EABZOggE7hQLFL5U+1XDBYYEB3jB/AClABRMBqoAXEhAiCBZdQBY8FHTAAj")) From 61b214da81a0d2ca1f2bf9898e9fe9efb328683a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:13:20 +0000 Subject: [PATCH 490/503] Update version for #1167 --- apps.json | 2 +- apps/gpsinfo/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 63dab2467..9d8ce0930 100644 --- a/apps.json +++ b/apps.json @@ -1501,7 +1501,7 @@ { "id": "gpsinfo", "name": "GPS Info", - "version": "0.05", + "version": "0.06", "description": "An application that displays information about altitude, lat/lon, satellites and time", "icon": "gps-info.png", "type": "app", diff --git a/apps/gpsinfo/ChangeLog b/apps/gpsinfo/ChangeLog index 381412c16..3ff284cb8 100644 --- a/apps/gpsinfo/ChangeLog +++ b/apps/gpsinfo/ChangeLog @@ -2,3 +2,4 @@ 0.03: Show number of satellites while waiting for fix 0.04: Add Maidenhead readout of GPS location 0.05: Refactor to use 'layout' library for multi-device support +0.06: Added number of satellites in view and fixed crash with GPS time From c56044efcc0412748b3240b917bc828f3aa231ed Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:22:04 +0000 Subject: [PATCH 491/503] bump versions --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f5d984143..7f1783dae 100644 --- a/apps.json +++ b/apps.json @@ -971,7 +971,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.07", + "version": "0.08", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", @@ -2184,7 +2184,7 @@ "id": "calculator", "name": "Calculator", "shortName": "Calculator", - "version": "0.04", + "version": "0.05", "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", "icon": "calculator.png", "screenshots": [{"url":"screenshot_calculator.png"}], From b7d5cbf9b6f174538e96a3f06ad42977eb772945 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:44:24 +0000 Subject: [PATCH 492/503] icon rename --- apps.json | 2 +- apps/promenu/{icons8-menu-48 (1).png => icon.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/promenu/{icons8-menu-48 (1).png => icon.png} (100%) diff --git a/apps.json b/apps.json index 03ecb9ae1..0dee4f9d9 100644 --- a/apps.json +++ b/apps.json @@ -5107,7 +5107,7 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in menu function.", - "icon": "icons8-menu-48 (1).png", + "icon": "icon.png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], diff --git a/apps/promenu/icons8-menu-48 (1).png b/apps/promenu/icon.png similarity index 100% rename from apps/promenu/icons8-menu-48 (1).png rename to apps/promenu/icon.png From fdc519c3df64c555b9b98dedfbe65b2ff2918863 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 11:58:04 +0100 Subject: [PATCH 493/503] Intial try to use weather condition code for icon selection --- apps/weather/app.js | 3 ++- apps/weather/lib.js | 49 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 8c8526fbd..5c6b29b64 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -9,7 +9,7 @@ var layout = new Layout({type:"v", bgCol: g.theme.bg, c: [ {filly: 1}, {type: "h", filly: 0, c: [ {type: "custom", width: g.getWidth()/2, height: g.getWidth()/2, valign: -1, txt: "unknown", id: "icon", - render: l => weather.drawIcon(l.txt, l.x+l.w/2, l.y+l.h/2, l.w/2-5)}, + render: l => weather.drawIcon(l, l.x+l.w/2, l.y+l.h/2, l.w/2-5)}, {type: "v", fillx: 1, c: [ {type: "h", pad: 2, c: [ {type: "txt", font: "18%", id: "temp", label: "000"}, @@ -47,6 +47,7 @@ function formatDuration(millis) { function draw() { layout.icon.txt = current.txt; + layout.icon.cond = current.code; const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); layout.temp.label = temp[1]; layout.tempUnit.label = temp[2]; diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 7cb9a9f9b..f86a51a18 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -16,7 +16,7 @@ function scheduleExpiry(json) { function update(weatherEvent) { let json = storage.readJSON('weather.json')||{}; - + if (weatherEvent) { let weather = weatherEvent.clone(); delete weather.t; @@ -55,7 +55,7 @@ scheduleExpiry(storage.readJSON('weather.json')||{}); exports.drawIcon = function(cond, x, y, r) { var palette; - + if (B2) { if (g.theme.dark) { palette = { @@ -101,7 +101,7 @@ exports.drawIcon = function(cond, x, y, r) { }; } } - + function drawSun(x, y, r) { g.setColor(palette.sun); g.fillCircle(x, y, r); @@ -280,5 +280,46 @@ exports.drawIcon = function(cond, x, y, r) { return drawUnknown; } - chooseIcon(cond)(x, y, r); + /* + * Choose weather icon to display based on weather conditition code + * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + */ + function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return drawThunderstorm; + case 3: return drawRain; + case 5: + switch (code) { + case 520: return drawShowerRain; + case 521: return drawShowerRain; + case 522: return drawShowerRain; + case 531: return drawShowerRain; + default: return drawRain; + } + break; + case 6: return drawSnow; + case 7: return drawMist; + case 8: + switch (code) { + case 800: return drawSun; + case 801: return drawFewClouds; + case 802: return drawCloud; + default: return drawBrokenClouds; + } + break; + default: return drawUnknown; + } + } + + const code = cond.code || -1; + if (code > 0) { + chooseIconByCode(code.code)(x, y, r); + } else { + chooseIcon(cond.txt)(x, y, r); + } + + console.log(cond); + + }; From 8a9e13b19caaf365680b18d86da28cc6ee4ac2c8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:00:26 +0000 Subject: [PATCH 494/503] remove un-needed files --- apps/bluetoothdock/add_to_apps.json | 15 --------------- apps/scribble/add_to_apps.json | 14 -------------- 2 files changed, 29 deletions(-) delete mode 100644 apps/bluetoothdock/add_to_apps.json delete mode 100644 apps/scribble/add_to_apps.json diff --git a/apps/bluetoothdock/add_to_apps.json b/apps/bluetoothdock/add_to_apps.json deleted file mode 100644 index cb59dcdbe..000000000 --- a/apps/bluetoothdock/add_to_apps.json +++ /dev/null @@ -1,15 +0,0 @@ -// Create an entry in apps.json as follows: -{ "id": "bluetoothdock", - "name": "Bluetooth Dock", - "shortName":"Dock", - "icon": "app.png", - "version":"0.01", - "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", - "tags": "bluetooth", - "readme": "README.md", - "storage": [ - {"name":"bluetoothdock.app.js","url":"app.js"}, - {"name":"bluetoothdock.boot.js","url":"boot.js"}, - {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/scribble/add_to_apps.json b/apps/scribble/add_to_apps.json deleted file mode 100644 index 054f35d55..000000000 --- a/apps/scribble/add_to_apps.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "scribble", - "name": "Scribble", - "shortName":"Scribble", - "version":"0.01", - "description": "A keyboard on your wrist!", - "icon": "app.png", - "tags": "keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"scribble.app.js","url":"app.js"}, - {"name":"scribble.img","url":"app-icon.js","evaluate":true} - ] -} From 0c7cc770fa549f292fb79b0c0957b2a3573d46e6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:00:56 +0000 Subject: [PATCH 495/503] remove un-needed files --- apps/tinydraw/add_to_apps.json | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 apps/tinydraw/add_to_apps.json diff --git a/apps/tinydraw/add_to_apps.json b/apps/tinydraw/add_to_apps.json deleted file mode 100644 index 21a90049e..000000000 --- a/apps/tinydraw/add_to_apps.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "tinydraw", - "name": "TinyDraw", - "shortName":"TinyDraw", - "version":"0.01", - "description": "Draw stuff in your wrist!", - "icon": "app.png", - "tags": "keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"tinydraw.app.js","url":"app.js"}, - {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} - ] -} From 144f4d31969d1306a193570bad2c6b2697e01c39 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:03:23 +0100 Subject: [PATCH 496/503] Fix naming of variable --- apps/weather/app.js | 2 +- apps/weather/lib.js | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 5c6b29b64..efd9b0209 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -47,7 +47,7 @@ function formatDuration(millis) { function draw() { layout.icon.txt = current.txt; - layout.icon.cond = current.code; + layout.icon.code = current.code; const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); layout.temp.label = temp[1]; layout.tempUnit.label = temp[2]; diff --git a/apps/weather/lib.js b/apps/weather/lib.js index f86a51a18..b1c306d58 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -312,14 +312,11 @@ exports.drawIcon = function(cond, x, y, r) { } } - const code = cond.code || -1; - if (code > 0) { - chooseIconByCode(code.code)(x, y, r); + if (cond.code > 0) { + chooseIconByCode(cond.code)(x, y, r); } else { chooseIcon(cond.txt)(x, y, r); } - console.log(cond); - }; From cde46c2cf5c21d74379b64f79f8e2317c54edc64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:03:47 +0000 Subject: [PATCH 497/503] version --- apps.json | 2 +- apps/calendar/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 39f0ddb3b..046f1b4ff 100644 --- a/apps.json +++ b/apps.json @@ -2429,7 +2429,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.04", + "version": "0.05", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index e164d6be9..3deec00e0 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -2,3 +2,4 @@ 0.02: Make Bangle 2 compatible 0.03: Add setting to start week on Sunday 0.04: Add setting to switch color schemes. On Bangle 2 non-dithering colors will be used by default. Use localized names for months and days of the week (Language app needed). +0.05: Update calendar weekend colors for start on Sunday From 8b0498b195e765d33ff04cdec918cb0a0410ac06 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:10:15 +0100 Subject: [PATCH 498/503] debug --- apps/weather/lib.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index b1c306d58..8ffd2037f 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -291,6 +291,7 @@ exports.drawIcon = function(cond, x, y, r) { case 3: return drawRain; case 5: switch (code) { + case 511: return drawSnow; case 520: return drawShowerRain; case 521: return drawShowerRain; case 522: return drawShowerRain; @@ -312,7 +313,9 @@ exports.drawIcon = function(cond, x, y, r) { } } - if (cond.code > 0) { + console.log("weather cond", cond); + + if (cond.code && cond.code > 0) { chooseIconByCode(cond.code)(x, y, r); } else { chooseIcon(cond.txt)(x, y, r); From fe747934c8a53e3f1d83d6c70665891915cbcffb Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:16:05 +0100 Subject: [PATCH 499/503] Update changelog and bump version --- apps.json | 2 +- apps/weather/ChangeLog | 1 + apps/weather/lib.js | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index ab6089e65..a440e9b15 100644 --- a/apps.json +++ b/apps.json @@ -845,7 +845,7 @@ { "id": "weather", "name": "Weather", - "version": "0.13", + "version": "0.14", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index fb6b28bf6..910cd4658 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -10,3 +10,4 @@ 0.11: Bangle.js 2 support 0.12: Allow hiding the widget 0.13: Tweak Bangle.js 2 light theme colors +0.14: Use weather condition code for icon selection diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 8ffd2037f..8afdfe6df 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -313,8 +313,6 @@ exports.drawIcon = function(cond, x, y, r) { } } - console.log("weather cond", cond); - if (cond.code && cond.code > 0) { chooseIconByCode(cond.code)(x, y, r); } else { From a44ec783f7eb1342bafa3850e14e0113ab957b6a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:22:00 +0000 Subject: [PATCH 500/503] Fix issue with settings overwritten --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 2a8e872ec..5a5957714 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 +Subproject commit 5a5957714d4aa04413329f57c03e6de0cfb74caf From c06afa1132b752ba433730004eb0168e1297d264 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 14:06:06 +0000 Subject: [PATCH 501/503] chronowid 0.05: Fix error running app on new firmwares (fix #1140) --- apps.json | 2 +- apps/chronowid/ChangeLog | 1 + apps/chronowid/app.js | 8 +------- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index 046f1b4ff..e36c573f4 100644 --- a/apps.json +++ b/apps.json @@ -2027,7 +2027,7 @@ "id": "chronowid", "name": "Chrono Widget", "shortName": "Chrono Widget", - "version": "0.04", + "version": "0.05", "description": "Chronometer (timer) which runs as widget.", "icon": "app.png", "tags": "tool,widget", diff --git a/apps/chronowid/ChangeLog b/apps/chronowid/ChangeLog index ded543397..ed230b737 100644 --- a/apps/chronowid/ChangeLog +++ b/apps/chronowid/ChangeLog @@ -3,3 +3,4 @@ 0.03: Display only minutes:seconds when less than 1 hour left 0.04: Change to 7 segment font, move to top widget bar Better auto-update behaviour, less RAM used +0.05: Fix error running app on new firmwares (fix #1140) diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js index f38105e34..ab363ed17 100644 --- a/apps/chronowid/app.js +++ b/apps/chronowid/app.js @@ -36,13 +36,7 @@ E.on('kill', () => { function showMenu() { const timerMenu = { '': { - 'title': 'Set timer', - 'predraw': function() { - timerMenu.hours.value = settingsChronowid.hours; - timerMenu.minutes.value = settingsChronowid.minutes; - timerMenu.seconds.value = settingsChronowid.seconds; - timerMenu.started.value = settingsChronowid.started; - } + 'title': 'Set timer' }, '< Back' : ()=>{load();}, 'Reset values': function() { From 128f2d4e66b99875f290fb0900125a39e25375f3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 14:27:23 +0000 Subject: [PATCH 502/503] messages 0.16: Fix text wrapping so it fits the screen even if title is big (fix #1147) --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/app.js | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index e36c573f4..5072ad5bf 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.15", + "version": "0.16", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 76407cb45..fe46ba97a 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -22,3 +22,4 @@ Now update correctly when 'require("messages").clearAll()' is called 0.14: Hide widget when all unread notifications are dismissed from phone 0.15: Don't buzz when Quiet Mode is active +0.16: Fix text wrapping so it fits the screen even if title is big (fix #1147) diff --git a/apps/messages/app.js b/apps/messages/app.js index eb066acb9..e36bb699e 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -243,7 +243,8 @@ function showMessage(msgid) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); } - lines = g.wrapString(msg.body, g.getWidth()-10); + var bodyFont = fontMedium; + lines = g.setFont(bodyFont).wrapString(msg.body, g.getWidth()-10); var body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); layout = new Layout({ type:"v", c: [ {type:"h", fillx:1, bgCol:colBg, c: [ @@ -256,7 +257,7 @@ function showMessage(msgid) { title?{type:"txt", font:titleFont, label:title, bgCol:colBg, fillx:1, pad:2 }:{}, ]}, ]}, - {type:"txt", font:fontMedium, label:body, fillx:1, filly:1, pad:2 }, + {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2 }, {type:"h",fillx:1, c: buttons} ]}); g.clearRect(Bangle.appRect); From e0a1732f79fa20506527f4a7cd7d2011064ec6e9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 16:51:01 +0000 Subject: [PATCH 503/503] Fix GPX file format for banglerun/recorder (fix #1197) --- apps/banglerun/interface.html | 2 +- apps/recorder/interface.html | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/banglerun/interface.html b/apps/banglerun/interface.html index 403f28258..6388d3b65 100644 --- a/apps/banglerun/interface.html +++ b/apps/banglerun/interface.html @@ -68,7 +68,7 @@ ${track.map(pt=>` ${pt.distance}\n`).join("")} function saveGPX(track, title) { var gpx = ` - + diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 42aa4e16d..0535b2d51 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -16,7 +16,7 @@ function saveKML(track,title) { ${track[0].Heartrate!==undefined ? ` Heart Rate - `:``} + `:``} ${track[0].Steps!==undefined ? ` Step Count `:``} @@ -25,7 +25,7 @@ ${track[0].Core!==undefined ? ` `:``} ${track[0].Skin!==undefined ? ` Skin Temp - `:``} + `:``} @@ -49,7 +49,7 @@ ${track.map(pt=>` ${0|pt.Core}\n`).join("")} `:``} ${track[0].Skin!==undefined ? ` ${track.map(pt=>` ${0|pt.Skin}\n`).join("")} - `:``} + `:``} @@ -72,8 +72,7 @@ ${track.map(pt=>` ${0|pt.Skin}\n`).join("")} function saveGPX(track, title) { var gpx = ` - - +