From 5e1dc79bb560fd322501e79259a9f914a1cb7c58 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 30 Jan 2023 11:55:11 +0100 Subject: [PATCH 01/38] iconlaunch - Bump version --- apps/iconlaunch/ChangeLog | 1 + apps/iconlaunch/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/iconlaunch/ChangeLog b/apps/iconlaunch/ChangeLog index 0c33a4871..6f0e8194c 100644 --- a/apps/iconlaunch/ChangeLog +++ b/apps/iconlaunch/ChangeLog @@ -20,3 +20,4 @@ still be loaded when they weren't supposed to. 0.15: Ensure that we hide widgets if in fullscreen mode (So that widgets are still hidden if launcher is fast-loaded) +0.16: Use firmware provided E.showScroller method diff --git a/apps/iconlaunch/metadata.json b/apps/iconlaunch/metadata.json index 27f6386d3..435a29b39 100644 --- a/apps/iconlaunch/metadata.json +++ b/apps/iconlaunch/metadata.json @@ -2,7 +2,7 @@ "id": "iconlaunch", "name": "Icon Launcher", "shortName" : "Icon launcher", - "version": "0.15", + "version": "0.16", "icon": "app.png", "description": "A launcher inspired by smartphones, with an icon-only scrollable menu.", "tags": "tool,system,launcher", From 9645b287b522a9d5cc0fb35ec62a032d60cc6815 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 30 Jan 2023 17:38:18 +0100 Subject: [PATCH 02/38] Added styles --- apps/bwclk/README.md | 1 + apps/happyclk/happyclk.app.js | 81 +++++++++++++++++++++++++++-- apps/happyclk/happyclk.settings.js | 32 ++++++++++++ apps/happyclk/metadata.json | 9 ++-- apps/happyclk/screenshot_2.png | Bin 2501 -> 2297 bytes apps/happyclk/screenshot_4.png | Bin 0 -> 2494 bytes apps/happyclk/screenshot_5.png | Bin 0 -> 2508 bytes 7 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 apps/happyclk/happyclk.settings.js create mode 100644 apps/happyclk/screenshot_4.png create mode 100644 apps/happyclk/screenshot_5.png diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 5e2a7b55f..882d525f6 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -11,6 +11,7 @@ sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), ![](screenshot_3.png) +Note: Check out the settings to change different themes. ## Settings - Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index ad8f80cbf..5eac225e9 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -1,6 +1,78 @@ /************************************************ * Happy Clock */ + + +/************************************************ + * Settings + */ +const storage = require('Storage'); +const SETTINGS_FILE = "happyclk.setting.json"; + +let settings = { + color: "Dark" +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key]; +} + +var color_map = { + "Dark":{ + fg: "#fff", + bg: "#000", + eye: "#fff", + eyePupils: "#000" + }, + "Black":{ + fg: "#fff", + bg: "#000", + eye: "#000", + eyePupils: "#fff" + }, + "White":{ + fg: "#000", + bg: "#fff", + eye: "#fff", + eyePupils: "#000" + }, + "Blue":{ + fg: "#fff", + bg: "#00f", + eye: "#fff", + eyePupils: "#000" + }, + "Green":{ + fg: "#000", + bg: "#0f0", + eye: "#fff", + eyePupils: "#000" + }, + "Red":{ + fg: "#fff", + bg: "#f00", + eye: "#fff", + eyePupils: "#000" + }, + "Purple":{ + fg: "#fff", + bg: "#f0f", + eye: "#fff", + eyePupils: "#000" + }, + "Yellow":{ + fg: "#000", + bg: "#ff0", + eye: "#fff", + eyePupils: "#000" + } +}; +var colors = color_map[settings.color]; + +/************************************************ + * Globals + */ var W = g.getWidth(),R=W/2; var H = g.getHeight(); var drawTimeout; @@ -19,11 +91,12 @@ Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { g.setColor(g.theme.fg); g.fillCircle(cx, cy, 32); - g.setColor(g.theme.bg); + + g.setColor(colors.eye); g.fillCircle(cx, cy, 27); g.fillCircle(cx+dx, cy+dy, 28); - g.setColor(g.theme.fg); + g.setColor(colors.eyePupils); g.fillCircle(x, y, 8); g.fillCircle(x+1, y, 8); }; @@ -85,6 +158,7 @@ let drawEyes = function(){ let drawSmile = function(isLocked){ + g.setColor(colors.fg); var y = 120; var o = parseInt(E.getBattery()*0.8); @@ -100,6 +174,7 @@ let drawSmile = function(isLocked){ } let drawEyeBrow = function(){ + g.setColor(colors.fg); var w = 6; for(var i = 0; i < w; i++){ g.drawLine(25, 25+i, 70, 15+i%3); @@ -170,7 +245,7 @@ Bangle.loadWidgets(); require('widget_utils').hide(); // Clear the screen once, at startup and draw clock -// g.setTheme({bg:"#fff",fg:"#000",dark:false}); +g.setTheme({bg:colors.bg,fg:colors.fg,dark:false}); draw(); // After drawing the watch face, we can draw the widgets diff --git a/apps/happyclk/happyclk.settings.js b/apps/happyclk/happyclk.settings.js new file mode 100644 index 000000000..2cbadc9ca --- /dev/null +++ b/apps/happyclk/happyclk.settings.js @@ -0,0 +1,32 @@ +(function(back) { + const SETTINGS_FILE = "happyclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + color: "Dark" + }; + 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 colorOptions = ["Dark", "Black", "White", "Blue", "Green", "Red", "Purple", "Yellow"]; + E.showMenu({ + '': { 'title': 'Happy Clock' }, + '< Back': back, + 'Theme': { + value: 0 | colorOptions.indexOf(settings.color), + min: 0, max: colorOptions.length, + format: v => colorOptions[v], + onchange: v => { + settings.color = colorOptions[v]; + save(); + }, + } + }); +}) diff --git a/apps/happyclk/metadata.json b/apps/happyclk/metadata.json index 2388db667..e5129b0f0 100644 --- a/apps/happyclk/metadata.json +++ b/apps/happyclk/metadata.json @@ -3,7 +3,7 @@ "name": "Happy Clock", "shortName":"Happy Clock", "icon": "happyclk.png", - "version":"0.01", + "version":"0.02", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "A happy clock :)", @@ -12,10 +12,13 @@ "screenshots": [ {"url":"screenshot_1.png"}, {"url":"screenshot_2.png"}, - {"url":"screenshot_3.png"} + {"url":"screenshot_3.png"}, + {"url":"screenshot_4.png"}, + {"url":"screenshot_5.png"} ], "storage": [ {"name":"happyclk.app.js","url":"happyclk.app.js"}, - {"name":"happyclk.img","url":"happyclk.icon.js","evaluate":true} + {"name":"happyclk.img","url":"happyclk.icon.js","evaluate":true}, + {"name":"happyclk.settings.js","url":"happyclk.settings.js"} ] } diff --git a/apps/happyclk/screenshot_2.png b/apps/happyclk/screenshot_2.png index 5bb00bc38de160a0e8d86053d4e1299a93da59f3..49c09ee31d132eb8327ccada14e3948fc5c5c9e6 100644 GIT binary patch literal 2297 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 diff --git a/apps/happyclk/screenshot_4.png b/apps/happyclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b84e41ab128e8eb0214140d11da5665ddd43271c GIT binary patch literal 2494 zcmb7GYc!M#7k=NlnQJ5>LBQ=nli z$^T8StZ3lt>rMHjF&&m?P6_Gg&eBnwXY^RJbHSG%0TizKopsL#KgPi&1#L<8O$hi% zjS)|B=k7NyM+xIt9E`pNLTitbuU6R=(7>*~PJ zm%oXE?C*osS)%Wc_~C0RnsnI5bPONDEAffZacq>8%)7Mv{3Wf+Z9Khj>q|&JWRyc7 zGOpZcW$);JXN^*eZ6h5lk~jeNJ_}ZNkza0~{WTIJx!mu8__^G|a?uJ9S`%6faGmOr z5k+EN(8X0CqxJFX&qbsXY=$g-FtQh^GmiI*p8*pzs92*C1v$qHP0VP%t%FI>V8-9@ zVb8W1uyCy@QR8SXPG%GR%$r3?NcpsSA(RZznOl4*TYXl|EE1mErbrFBN*`@ZIAORZ zmX`%qd(c!*It|dz?F%`hAAjeV{|Z9V)4VV4$96E-JR<83!q^hRWG}Sl?@i9UU-q3BB8OW+fRYbLq}t-eo95lbm*=#*MtWJ=RMZ{ zGuWZIDo?>%t;2o4Zf*$fx4&-&Gic;^u#$stw093E3CuZ!>PeGBhLzH#*^e21?e`^t z-&4|ya)h~`}Y4kEZNa7C`N}}^QRYy2XihoVEYJ;V`7V2X61|*Jdf7E-z-}6MW*~PMK>^Jb;#=g zH>E=#WFQ1}#LO_oWxdfMxSI6=jJ)=0d+I!zc~JJiC&opw!_3O6O)KmI6g|TsVkzzB zw2xDHWzDvVT!j(LiRdlIhF*#AZW`XCT$sJh+4c8NmIJ%!J3FV7~Lz?rXT0{ZV{l^8Q?i_;iyckY zj7i}@9<*f z=skYUN6WX7wSU+OTAZ5M*183%bfBL89no~Ju2MPYzmT$#@~PPS;g&qjcUyY-3}7Mz ziHD*jF6NqW$=@ke2px8gtzD18%8JG=kPKIIElUKQ)>L4yOOSh!-h1$u&oWDdj*_9A zW2XgWYO76nxqVWMVn(-FV84Has6mlfSH0SDP8qh>Pt5nbGQa+Jji92=9ZI~f@LrJBrY1?h(@* zVrIL)Yn5N+`bgWf{%=rFA*L?CdhAoz8xeBlSmDeCBFE?Mlpj(eLKR@gpsOYBtlJ09 z7m5i=sRcL~OG@Mu{vjJsXg5 zJFIuN@cP}jUPOb1+{SF7MLtZHgm4G6&-pV3ItGG=#L> zk2ww*j3bI3aG_CCS}|?-6=AP&7h+?g4V%IPbl-}eMZg**d(Y>>c0Nl@%*t^fc0SNb zMJ$U6uo#fJq-~OHhYg;CFWa1QIzE(yJ;Lkpq48oIG43Gjk`y7cB9K_Ve|*AgBGFbC zaaFD50Jy8Gop(sn2r?)0Re2kBjn_Zuy0P-N9G>m=*>Lm!hrAAuoK!ErebGI#@sI&t M?&N(nuC(-j0LR~dGXMYp literal 0 HcmV?d00001 diff --git a/apps/happyclk/screenshot_5.png b/apps/happyclk/screenshot_5.png new file mode 100644 index 0000000000000000000000000000000000000000..1a711096e59d0bd0d8d342d4b59e400d23b88ade GIT binary patch literal 2508 zcmV;-2{ZPIP)Px;hDk(0RCr$Po!NHdAP_|3|Nm&uaS~-@S2d=kx3Ng?~_> zr~(fFT+}%<`&$733=m2y0Dw!|hsFb7Fi=_n09@KWG#&thfzk>9;L`S?@cJU006$R@A3Hg&nI3qO%M0>03Wd4 zIR${z^Sj^cls#atb^%}j9IAi>)^kGvZm4adn=e&DXo0O%@1FaJfmZl0GDcvn1nf1A zsDAGTb(sXFjN{BZE10X%VTFFT{7nh4#-v?#5oTz!642oQ&oE@C1=wu84(+N!?GEs4 z1F8zoDS7UWnXO;19Tl{70eH6P6@=9SDm`zuw$%NzXaaBwt6YB;+}6H^0&Ly6Rba~24+-4X9=if;-I;7g@7f;E$K5Uf z?`kCaZLa_Tw$~VUFjN2l8;Xld+baNo?KQ?73>5&thT`JV_6h)CdyR1iLj?e^p}4rT zy#h-BEZJB;B;8?8dIw!f0<1BH%7PVu-cgq_09%;Tg1QpSyX%r3U{8atKxYOSy8O76 z7GSACPX%oc=1mlrrYaWo=gcOnuP-?}eLIixs$%K^>XKDFE)7 z6ag;BJP(K|cq6o-N(>KO&i;f0oE_dntUKc@&C0GzmNF|8;Or(vC2l|1N|~7{yc)dT z^>8S_l~bk%u_T27uyPfBET*5&FZnA=!h5cqz9ZXetHSG0wAaZ-47T|8=G z04$tMdWTCFb60>@Dyc?hCW$5H0I!}h+FE!QU93|W0855D<5+GA?~uM8DGY!aP)ZH~ zz@KVaJa+#Z9M-!KyG)hRg&Y!C5)18PO%r%Gc)1Yori*1A41nhZ!P`}+GGeFnwXTB! zFaS1Cz^@Jlzy|gqfdQ}qR(_WRzyR2fHiJ6>U;u1@mER=+FaY+W&EQS|7yuh!<#$O> zfa!0_F@IZ@C9KucIP5~O>?BO z6wU-N=R47^mU%(ETKc+{5SF!YB)}u-d$$|Got310_JsGx>-Qga)(mV;HoGQpW{5Qg z&ooJz!vEp#{{pzCUmS3H$IR4)YKuF-RuD@QX>b?{04O zh1Xh$H7R9bl=q8Iv%$X8->P)@n}H$#wo2i<+KVzN3%n!sFx5w|&n*Tu)%K7QqGi^( zu^O<>=Tm8{xxQDzR4gST;C0`HkdzbL)i^amXMOGkZ*OpG2HmXwx31%@%e5V$3G9)? zGYpI}DSJ&ErOVq)8&v~;jHLc<(6sj^BtW;y5bK4>dnxqU;tWZg0p1iP1ZCFMJ`eMH z^|L3u)C}dJ#b?mmCryMd=>Vn-o4LrlugBZdK$Jn80qy~EhS})Wvn(Zqw4|7k%+yZB zagPk}at5~r$k}G2l#94tUD|r+A*p4x$7TXoGr%=Ka|U%LT~h2qZ~*fJIg>$@HoNOm z24GGtNSWRHyb`pneptYqU6+yoYo^oBnt25G8s}<&&JJw38n^~3Xl0ZFOC)fVc(`x8 z0suJP1GHd30RTK89!`x{0075(fEElW0DuR?!>REK0N{8J(1HO40Pui#I5l1Y037cD zS}>ph03Hwzr^YJ)fa5(t3kDPbzyspp)OZC_0sMOTq}t0Q@fPmgf;0dhZ%zT=y@8bW zJ_W$EVfpCC7zlCOJJJ5Hj0-*rke{qMj3pjpf1;PMse?#TYcI4}O_JwsS zfU$tf1#pFhbqK&H9dd!%Y7GFsQKt8YhDhK%U{~20a!p{)Uì!(?Q47mZ!f%mWu z5XV9cfG_$>;046F;C;0wbD+2+um<4l!o^}{bN7l{n;`%nBbozt=FxA1QQTE4?hd&F zdWb<6QpFYER+<80dq8`4s0yzuz?@Qm12X42u{hMbd&Sb>P}wDcC6)qW ziCW{wR!(2H1eVGSh^30@j;{`HT7bVBM*Qp+_KS7U{!P6NeXEsd=}L&REr56o(p493 zZ;WL9l_DxBuI5xr4m&jIE3Z&Gq+P_dxs(cS2=(sI~1>DE1NS9-}bIfb$v<#42WfDuU7Y#+J&I3LS5WfXvMmBDS(m2 zdo9|oy)9cpd~}5QtymjPJ%;A2HIIkVAf19v%qIVN7yYZX(e^}s6q zT&@Nl*)KkyTh(9++*N0ra!=x@9f=)5-WlF40M?Wg6%vaJ?&=S7maKtiC2_{`LIUpU z@NSd9Z$-awyX|f;MAXVsaCd-rOMtc8ZLRv-8fJjoU-@iPLbPPi0K#2NO5mQ=4#_>a z{m6XW_5hD8^0FDb8@yYW5Ecu)D4=%)_pcPp{x@+EP|TXnJ=(rAyhvbzu*@Lu4lWW{ z7>`+C2DtCWVG$<;Icm`daPN%*zzTq8KN#sX0pMaEco0$j>5{Sopz3r+0_$|cSxFQC zz)6fiGjs|7V4ZF_D~SRCIEfKxhE4$htkVr=B~btXCouxe&?x|bb-LlKBnklFBu1ba zIt2i*PB)yDL;(Pt#0WG)rvL!f>4vkCC;)(y7=dQ!6ac_F-EdYC1psgoBhU<;0{;NN WzOd{f>~Vbn0000 Date: Mon, 30 Jan 2023 17:38:47 +0100 Subject: [PATCH 03/38] Updated changelog --- apps/happyclk/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/happyclk/ChangeLog b/apps/happyclk/ChangeLog index 759f68777..768ae2c2f 100644 --- a/apps/happyclk/ChangeLog +++ b/apps/happyclk/ChangeLog @@ -1 +1,2 @@ -0.01: New app! \ No newline at end of file +0.01: New app! +0.02: Added settings for different styles. \ No newline at end of file From bad6569d424139cab6ca1de0bdf6a01309c7e256 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 30 Jan 2023 17:46:46 +0100 Subject: [PATCH 04/38] Minor fix --- apps/happyclk/happyclk.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/happyclk/happyclk.settings.js b/apps/happyclk/happyclk.settings.js index 2cbadc9ca..d4843514c 100644 --- a/apps/happyclk/happyclk.settings.js +++ b/apps/happyclk/happyclk.settings.js @@ -21,7 +21,7 @@ '< Back': back, 'Theme': { value: 0 | colorOptions.indexOf(settings.color), - min: 0, max: colorOptions.length, + min: 0, max: colorOptions.length-1, format: v => colorOptions[v], onchange: v => { settings.color = colorOptions[v]; From 2e27562c340951484f3e3a2c0a44030aabd72ec3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 30 Jan 2023 17:56:24 +0100 Subject: [PATCH 05/38] Minor changes --- apps/happyclk/ChangeLog | 2 +- apps/happyclk/README.md | 4 ++++ apps/happyclk/happyclk.app.js | 22 +++++++++++++++------- apps/happyclk/happyclk.settings.js | 15 +++++++++++++-- apps/happyclk/screenshot_5.png | Bin 2508 -> 2498 bytes 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/apps/happyclk/ChangeLog b/apps/happyclk/ChangeLog index 768ae2c2f..e87114779 100644 --- a/apps/happyclk/ChangeLog +++ b/apps/happyclk/ChangeLog @@ -1,2 +1,2 @@ 0.01: New app! -0.02: Added settings for different styles. \ No newline at end of file +0.02: Added settings to show/hide widgets and settings for different styles. \ No newline at end of file diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index 3540b5aca..2311add6a 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -14,6 +14,10 @@ Here you can see an example of a locked bangle with a low battery: ![](screenshot_3.png) +## Settings +- Screen: Normal (widgets shown), Full (widgets are hidden). +- Theme: Select your custom theme, independent of system settings. + ## Creator - [David Peer](https://github.com/peerdavid). diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 5eac225e9..b43ce2efa 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -10,7 +10,8 @@ const storage = require('Storage'); const SETTINGS_FILE = "happyclk.setting.json"; let settings = { - color: "Dark" + color: "Dark", + screen: "Full" }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -174,6 +175,8 @@ let drawSmile = function(isLocked){ } let drawEyeBrow = function(){ + if(settings.screen != "Full") return; + g.setColor(colors.fg); var w = 6; for(var i = 0; i < w; i++){ @@ -183,6 +186,15 @@ let drawEyeBrow = function(){ } +let drawWidgets = function(){ + if (settings.screen == "Full") { + require('widget_utils').hide(); + } else { + Bangle.drawWidgets(); + } +} + + let draw = function(){ // Queue draw in one minute @@ -199,6 +211,8 @@ let drawHelper = function(isLocked){ drawEyes(); drawEyeBrow(); drawSmile(isLocked); + + drawWidgets(); } @@ -237,12 +251,6 @@ let queueDraw = function() { // 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 - * so we will blank out the draw() functions of each widget and change the - * area to the top bar doesn't get cleared. - */ -require('widget_utils').hide(); // Clear the screen once, at startup and draw clock g.setTheme({bg:colors.bg,fg:colors.fg,dark:false}); diff --git a/apps/happyclk/happyclk.settings.js b/apps/happyclk/happyclk.settings.js index d4843514c..d047a8d4a 100644 --- a/apps/happyclk/happyclk.settings.js +++ b/apps/happyclk/happyclk.settings.js @@ -4,7 +4,8 @@ // initialize with default settings... const storage = require('Storage') let settings = { - color: "Dark" + color: "Dark", + screen: "Full" }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -16,9 +17,19 @@ } var colorOptions = ["Dark", "Black", "White", "Blue", "Green", "Red", "Purple", "Yellow"]; + var screenOptions = ["Normal", "Full"]; E.showMenu({ '': { 'title': 'Happy Clock' }, '< Back': back, + 'Screen': { + value: 0 | screenOptions.indexOf(settings.screen), + min: 0, max: screenOptions.length-1, + format: v => screenOptions[v], + onchange: v => { + settings.screen = screenOptions[v]; + save(); + }, + }, 'Theme': { value: 0 | colorOptions.indexOf(settings.color), min: 0, max: colorOptions.length-1, @@ -27,6 +38,6 @@ settings.color = colorOptions[v]; save(); }, - } + }, }); }) diff --git a/apps/happyclk/screenshot_5.png b/apps/happyclk/screenshot_5.png index 1a711096e59d0bd0d8d342d4b59e400d23b88ade..401bb0c515e83c2fe3145b609d0d9497a4d8220f 100644 GIT binary patch delta 2475 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 delta 2485 zcmV;m2}<_D6U-BkF@J_hL_t(|UhSRPcH-mL$P@t#+4**=$IW+rQ0RRjTN-F?>OWTLW17I*vS^)rD+CDTM0E2@|+4e(wf#nFOYcaaBwt6YB;+}6H^0&Ly6Rba~24+-4X9=if; z-I;7g@7f;E$K5Uf?`kCaZLa_Tw$~VUFjN2l8;Xld+kYznfbBKL9Sju!z=q=D()J1f zV0(>m2SWt_u%WoPw7mjL04&*9KP25@PkIMkN&>7ghRT8!fZkD;G5}kc(}KDZ%)9H7 z9$-&{u0Ur78M^$ql@?&BK~Dv359Uo2m!>Kf_2VL=og{u6^-ME7~%VIbcz)|2{fyf3jN0(P0ya)AJx2OT024Ko03v;L>Yk}-( z7Nv_7xROB~nZ_vq?wJ$;F2_6%h$(m@w4q824_(gwgae!%-b1WA<1Ed}u1l6OD-_`D zCPgK26EaD>IKY*r$X2y+HceAX+yPu! z7tbw6H-J}4nVBiP8ob{1a45i)Q>F*8B!vO6aut0nrk~F*`72Apd#;?mBim}L!t0sB zE`JHUx>0wAaZ-47T|8=G04$tMdWTCFb60>@Dyc?hCW$5H0I!}h+FE!QU93|W0855D z<5+GA?~uM8DGY!aP)ZH~z@KVaJa+#Z9M-!KyG)hRg&Y!C5)18PO%r%Gc)1Yori*1A z41nhZ!P`}+GGeFnwXTB!FaS1Cz^@Jlz<&nzA%Ov~0akvO1i%2;k2Zrl0bl@ZfR*1R z0Wbjeqs`z>02lxpVC8p7Pk`xf$}xXimL;s!(>Uxxu;iB=ra-+Zm|KJciy zvmge*e&quIK4}ersT|dRUOIt2%81eQowY*ermwaR&eBgQ%2Hh<*EcUA0C3w5X&qb< zV9WG%DIr<_zy9B1+LnyonTs2ZQGWn<#I2umT@u(jg)=0RcAE5tcvfg|(9;ZR&UMen zgaSM(g`)u;F$w@nk$pej4PeU@&IB;$JJGI|c|p8d`nr}7mbGvsz$58b?{04Oh1Xh$H7R9bl=q8Iv%$X8->P)@n}H$#wo2i<+KVzN z3%n!sFx5w|&n*Tu)%K7QqGi^(u^O<>=Tm8{xxQDzR4gST;C0`HkdzbL)i^amXMOGk zZ*OpG2HmXwx31%@%e5V$34iR7#4`+xGAVma9Hq? z$$KgE+2RaIoB`exB?M*G)jkjNdiAp>ywnWkp~Yv=+$T+hF6jWK44b*gyRXOF(?FC# zoB{3ua)#OH*0U@ngtVlXk<8Ri#c_`e@Nx#X1<2WEqm+xdUR~OH=zk%pWwpm<0#`G@ zH9&I)btYX>>_Tt=^8`7QL6kPT>rw__PAy28-TS-}w5@(vz?@x|k^pO_)6bfD1os-} zYJkoTY`Ge^1}bP}lmbg6aFlqsZ@dBkINk%aU_b!?JRlxUjaL8w$9sSl3@8AA2gJjv z@d^Oocn{Em0R;f?fPZ*6HC_P#9Pa^IFrWYc9uN1;FpWnI`Q5j^9~qP@=`v4G13aD|0+2*4;Ea({u^Y7GFsQKt8YhDhK% zU{~20a!p{)Uì!(?Q47mZ!f%mWu5XV9cfG_$>;046F;C;0wbD+2+um<4l!o^}{ zbN7l{n;`%nBbozt=FxA1QQTE4?hd&FdWb<6QpFYER+<80dq8`4s0yzu zz?@Qm12X42v41$!yL-jb;ZWHnfhCp#Vu@Pg$5u{Xw*;2T42Y$Q>5i`sZ(4xA8%F%> z7WRvE(Ed%m4SlPXXz5Cbvn_yl4ANB>Zf}fa{gomrDX!*JOAb3U=_{{LI;361wd6+{ z(_nIrSP9fF(N=uVX8lGY{YPu1pd9D*arp1|HcjKA&6FU<%w-XPa_Q;;0>o9YNk1 z-Yo#ulz$Wz5{nD&>JM|4tbu1GamMmO0`BVYZj-=oMZa*n?QSqc)XGwDcYt?GfVJCg zt@_&5{Sopz3r+0_$|cSxFQCz)6fiGjs|7V4ZF_D~SRCIEfKxhE4$h ztkVr=B~btXCouxe&?x|bb-LlKBnklFBu1baIt2i*PB)yDL;(Pt#0WG)rvL!f>4vkC zC@uhilNf Date: Mon, 30 Jan 2023 18:07:02 +0100 Subject: [PATCH 06/38] Added dynamic screen --- apps/happyclk/README.md | 2 +- apps/happyclk/happyclk.app.js | 32 +++++++++++++++++++++++++----- apps/happyclk/happyclk.settings.js | 4 ++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/apps/happyclk/README.md b/apps/happyclk/README.md index 2311add6a..d5b8752fb 100644 --- a/apps/happyclk/README.md +++ b/apps/happyclk/README.md @@ -15,7 +15,7 @@ Here you can see an example of a locked bangle with a low battery: ![](screenshot_3.png) ## Settings -- Screen: Normal (widgets shown), Full (widgets are hidden). +- Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). - Theme: Select your custom theme, independent of system settings. ## Creator diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index b43ce2efa..2ba84e1b5 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -3,15 +3,18 @@ */ +const storage = require('Storage'); +const widget_utils = require("widget_utils"); + + /************************************************ * Settings */ -const storage = require('Storage'); const SETTINGS_FILE = "happyclk.setting.json"; let settings = { color: "Dark", - screen: "Full" + screen: "Dynamic" }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -83,6 +86,16 @@ var drawTimeout; * HELPER */ +let isFullscreen = function() { + var s = settings.screen.toLowerCase(); + if(s == "dynamic"){ + return Bangle.isLocked(); + } else { + return s == "full"; + } + }; + + // Based on the great multi clock from https://github.com/jeffmer/BangleApps/ Graphics.prototype.drawPupils = function(cx, cy, r1, dx, dy, angle) { angle = angle % 360; @@ -175,7 +188,7 @@ let drawSmile = function(isLocked){ } let drawEyeBrow = function(){ - if(settings.screen != "Full") return; + if(!isFullscreen()) return; g.setColor(colors.fg); var w = 6; @@ -187,8 +200,8 @@ let drawEyeBrow = function(){ let drawWidgets = function(){ - if (settings.screen == "Full") { - require('widget_utils').hide(); + if (isFullscreen()) { + widget_utils.hide(); } else { Bangle.drawWidgets(); } @@ -229,6 +242,15 @@ Bangle.on('lcdPower',on=>{ }); Bangle.on('lock', function(isLocked) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + + if(!isLocked && settings.screen.toLowerCase() == "dynamic"){ + // If we have to show the widgets again, we load it from our + // cache and not through Bangle.loadWidgets as its much faster! + widget_utils.show(); + } + draw(isLocked); }); diff --git a/apps/happyclk/happyclk.settings.js b/apps/happyclk/happyclk.settings.js index d047a8d4a..dd9f2f675 100644 --- a/apps/happyclk/happyclk.settings.js +++ b/apps/happyclk/happyclk.settings.js @@ -5,7 +5,7 @@ const storage = require('Storage') let settings = { color: "Dark", - screen: "Full" + screen: "Dynamic" }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { @@ -17,7 +17,7 @@ } var colorOptions = ["Dark", "Black", "White", "Blue", "Green", "Red", "Purple", "Yellow"]; - var screenOptions = ["Normal", "Full"]; + var screenOptions = ["Normal", "Dynamic", "Full"]; E.showMenu({ '': { 'title': 'Happy Clock' }, '< Back': back, From c9d3c2317b11eb49131b9d98648592fa451499c4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 30 Jan 2023 18:10:25 +0100 Subject: [PATCH 07/38] Avoid multiple draws. --- apps/happyclk/happyclk.app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 2ba84e1b5..2c43a266e 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -199,10 +199,11 @@ let drawEyeBrow = function(){ } -let drawWidgets = function(){ +let drawWidgets = function(isLocked){ if (isFullscreen()) { widget_utils.hide(); } else { + if (isLocked) return; Bangle.drawWidgets(); } } @@ -225,7 +226,7 @@ let drawHelper = function(isLocked){ drawEyeBrow(); drawSmile(isLocked); - drawWidgets(); + drawWidgets(isLocked); } From 33a6c65ea04710958d49628ce57150a20865d95b Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 30 Jan 2023 18:14:54 +0100 Subject: [PATCH 08/38] Clear screen only where necessary --- apps/happyclk/happyclk.app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/happyclk/happyclk.app.js b/apps/happyclk/happyclk.app.js index 2c43a266e..8e22b6e1e 100644 --- a/apps/happyclk/happyclk.app.js +++ b/apps/happyclk/happyclk.app.js @@ -199,11 +199,10 @@ let drawEyeBrow = function(){ } -let drawWidgets = function(isLocked){ +let drawWidgets = function(){ if (isFullscreen()) { widget_utils.hide(); } else { - if (isLocked) return; Bangle.drawWidgets(); } } @@ -219,14 +218,16 @@ let draw = function(){ } let drawHelper = function(isLocked){ + g.setColor(g.theme.bg); + + g.fillRect(0, isFullscreen() ? 0 : 24, W, H); g.setColor(g.theme.fg); - g.reset().clear(); drawEyes(); drawEyeBrow(); drawSmile(isLocked); - drawWidgets(isLocked); + drawWidgets(); } From 6cc8ef8918a6fff210b8a232448fcf33b31f6c50 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 30 Jan 2023 18:27:21 +0100 Subject: [PATCH 09/38] qcenter - Add setting for a timeout --- apps/qcenter/app.js | 12 ++++++++++++ apps/qcenter/settings.js | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/apps/qcenter/app.js b/apps/qcenter/app.js index be28db3b6..f012fdda8 100644 --- a/apps/qcenter/app.js +++ b/apps/qcenter/app.js @@ -110,6 +110,7 @@ let layout = new Layout({ }, { remove: ()=>{ Bangle.removeListener("swipe", onSwipe); + Bangle.removeListener("touch", updateTimeout); delete Graphics.prototype.setFont8x12; } }); @@ -117,6 +118,16 @@ g.clear(); layout.render(); Bangle.drawWidgets(); +let timeout; +const updateTimeout = function(){ +if (settings.timeout){ + if (timeout) clearTimeout(timeout); + timeout = setTimeout(Bangle.showClock,settings.timeout*1000); + } +}; + +updateTimeout(); + // swipe event listener for exit gesture let onSwipe = function (lr, ud) { if(exitGesture == "swipeup" && ud == -1) Bangle.showClock(); @@ -126,4 +137,5 @@ let onSwipe = function (lr, ud) { } Bangle.on("swipe", onSwipe); +Bangle.on("touch", updateTimeout); } diff --git a/apps/qcenter/settings.js b/apps/qcenter/settings.js index 2c97f8a5f..5d38b079e 100644 --- a/apps/qcenter/settings.js +++ b/apps/qcenter/settings.js @@ -49,6 +49,11 @@ E.showMenu(exitGestureMenu); }; + // Set Timeout + mainmenu["Timeout: " + (settings.timeout ? (settings.timeout+"s") : "Off")] = function () { + E.showMenu(timeoutMenu); + }; + //List all pinned apps, redirecting to menu with options to unpin and reorder pinnedApps.forEach((app, i) => { mainmenu[app.name] = function () { @@ -129,5 +134,22 @@ showMainMenu(); }; + // menu for setting timeout + var timeoutMenu = { + "": { title: "Timeout", back: showMainMenu } + }; + timeoutMenu["Off"] = function () { + save("timeout", 0); + showMainMenu(); + }; + let timeoutvalues = [10,20,30,60]; + for (c in timeoutvalues){ + let v = timeoutvalues[c]; + timeoutMenu[v+"s"] = function () { + save("timeout", v); + showMainMenu(); + }; + } + showMainMenu(); }); From 46790eb67fc8b3092930f2c5d2e53d3dc15c92af Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 30 Jan 2023 18:27:37 +0100 Subject: [PATCH 10/38] qcenter - Bump version --- apps/qcenter/ChangeLog | 1 + apps/qcenter/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/qcenter/ChangeLog b/apps/qcenter/ChangeLog index 900b9017c..366b0ff86 100644 --- a/apps/qcenter/ChangeLog +++ b/apps/qcenter/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Fix fast loading on swipe to clock +0.03: Adds a setting for going back to clock on a timeout diff --git a/apps/qcenter/metadata.json b/apps/qcenter/metadata.json index a325de10f..630fd2bef 100644 --- a/apps/qcenter/metadata.json +++ b/apps/qcenter/metadata.json @@ -2,7 +2,7 @@ "id": "qcenter", "name": "Quick Center", "shortName": "QCenter", - "version": "0.02", + "version": "0.03", "description": "An app for quickly launching your favourite apps, inspired by the control centres of other watches.", "icon": "app.png", "tags": "", From bf2004fc925e19135d35d715b40a85172df4b85a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 30 Jan 2023 19:46:17 +0000 Subject: [PATCH 11/38] Adding animation to fuzzyw --- apps/fuzzyw/ChangeLog | 3 +- apps/fuzzyw/README.md | 1 - apps/fuzzyw/fuzzyw.app.js | 63 +++++++++++++++++++++++++++++---------- apps/fuzzyw/metadata.json | 2 +- 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/apps/fuzzyw/ChangeLog b/apps/fuzzyw/ChangeLog index 206efb10f..dd73475f9 100644 --- a/apps/fuzzyw/ChangeLog +++ b/apps/fuzzyw/ChangeLog @@ -1,3 +1,4 @@ 0.01: First release 0.02: Move translations to locale module (removed watch settings, now pick language in Bangle App Loader, More..., Settings) -0.03: Change for fast loading, use widget_utils to hide widgets \ No newline at end of file +0.03: Change for fast loading, use widget_utils to hide widgets +0.04: Add animation when display changes \ No newline at end of file diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 49d0fe0d5..062c9ac25 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -16,7 +16,6 @@ Most translations are taken from the original Fuzzy Text International code. ## TODO * Bold hour word (as the pebble version has) -* Animation when changing time? ## References Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index e185e2ccf..8bc51710f 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -33,13 +33,17 @@ ] }; -let text_scale = 3.5; +let text_scale = 4; let timeout = 2.5*60; let drawTimeout; +let animInterval; +let time_string = ""; +let time_string_old = ""; +let time_string_old_wrapped = ""; let loadSettings = function() { settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'showWidgets': false}; -} +}; let queueDraw = function(seconds) { let millisecs = seconds * 1000; @@ -48,10 +52,7 @@ let queueDraw = function(seconds) { drawTimeout = undefined; draw(); }, millisecs - (Date.now() % millisecs)); -} - -const h = g.getHeight(); -const w = g.getWidth(); +}; let getTimeString = function(date) { let segment = Math.round((date.getMinutes()*60 + date.getSeconds() + 1)/300); @@ -63,18 +64,47 @@ let getTimeString = function(date) { f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 12]); } return f_string; -} +}; let draw = function() { - let time_string = getTimeString(new Date()).replace('*', ''); - // print(time_string); - g.setFont('Vector', (h-24*2)/text_scale); - g.setFontAlign(0, 0); - g.clearRect(0, 24, w, h-24); - g.setColor(g.theme.fg); - g.drawString(g.wrapString(time_string, w).join("\n"), w/2, h/2); + time_string = getTimeString(new Date()).replace('*', ''); + //print(time_string); + if (time_string != time_string_old) { + g.setFont('Vector', R.h/text_scale).setFontAlign(0, 0); + animate(3); + } queueDraw(timeout); -} +}; + +let animate = function(step) { + if (animInterval) clearInterval(animInterval); + let time_string_new_wrapped = g.wrapString(time_string, R.w).join("\n"); + slideX = 0; + animInterval = setInterval(function() { + let time_start = getTime() + //blank old time + g.setColor(g.theme.bg); + g.drawString(time_string_old_wrapped, R.x + R.w/2 + slideX, R.y + R.h/2); + g.drawString(time_string_new_wrapped, R.x - R.w/2 + slideX, R.y + R.h/2); + g.setColor(g.theme.fg); + slideX += step; + let stop = false; + if (slideX>=R.w) { + slideX=R.w; + stop = true; + } + //draw shifted new time + g.drawString(time_string_old_wrapped, R.x + R.w/2 + slideX, R.y + R.h/2); + g.drawString(time_string_new_wrapped, R.x - R.w/2 + slideX, R.y + R.h/2); + if (stop) { + time_string_old = time_string; + clearInterval(animInterval); + animInterval=undefined; + time_string_old_wrapped = time_string_new_wrapped; + } + print(Math.round((getTime() - time_start)*1000)) + }, 30); +}; g.clear(); loadSettings(); @@ -95,6 +125,8 @@ Bangle.setUI({ // Called to unload all of the clock app if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; + if (animInterval) clearInterval(animInterval); + animInterval = undefined; require('widget_utils').show(); // re-show widgets } }); @@ -106,5 +138,6 @@ if (settings.showWidgets) { require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe } +R = Bangle.appRect; draw(); } \ No newline at end of file diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index d1040fda3..97f060866 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -2,7 +2,7 @@ "id":"fuzzyw", "name":"Fuzzy Text Clock", "shortName": "Fuzzy Text", - "version": "0.03", + "version": "0.04", "description": "An imprecise clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", From c3ac80374d792801aa5ca7b8d07752f726adeb8f Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Tue, 31 Jan 2023 19:04:06 +0100 Subject: [PATCH 12/38] alarm: menu changes - Display date in locale - When switching 'repeat' from 'Workdays', 'Weekends' to 'Custom' preset Custom menu with previous selection - Display alarm label in delete prompt --- apps/alarm/ChangeLog | 3 +++ apps/alarm/app.js | 20 ++++++++++++-------- apps/alarm/metadata.json | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index bb8a292a0..398396c96 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -38,3 +38,6 @@ 0.35: Add automatic translation of more strings 0.36: alarm widget moved out of app 0.37: add message input and dated Events +0.38: Display date in locale + When switching 'repeat' from 'Workdays', 'Weekends' to 'Custom' preset Custom menu with previous selection + Display alarm label in delete prompt diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 74007d04b..e97b61917 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -40,6 +40,14 @@ function handleFirstDayOfWeek(dow) { // Check the first day of week and update the dow field accordingly (alarms only!) alarms.filter(e => e.timer === undefined).forEach(a => a.dow = handleFirstDayOfWeek(a.dow)); +function getLabel(e) { + const dateStr = e.date && require("locale").date(new Date(e.date), 1); + return (e.timer + ? require("time_utils").formatDuration(e.timer) + : (dateStr ? `${dateStr} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "")) + ) + (e.msg ? " " + e.msg : ""); +} + function showMainMenu() { const menu = { "": { "title": /*LANG*/"Alarms & Timers" }, @@ -48,11 +56,7 @@ function showMainMenu() { }; alarms.forEach((e, index) => { - var label = (e.timer - ? require("time_utils").formatDuration(e.timer) - : (e.date ? `${e.date.substring(5,10)} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "")) - ) + (e.msg ? " " + e.msg : ""); - menu[label] = { + menu[getLabel(e)] = { value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff), onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index) }; @@ -184,7 +188,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { if (!isNew) { menu[/*LANG*/"Delete"] = () => { - E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Alarm" }).then((confirm) => { + E.showPrompt(getLabel(alarm) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Alarm" }).then((confirm) => { if (confirm) { alarms.splice(alarmIndex, 1); saveAndReload(); @@ -264,7 +268,7 @@ function showEditRepeatMenu(repeat, dow, dowChangeCallback) { }, /*LANG*/"Custom": { value: isCustom ? decodeDOW({ rp: true, dow: dow }) : false, - onchange: () => setTimeout(showCustomDaysMenu, 10, isCustom ? dow : EVERY_DAY, dowChangeCallback, originalRepeat, originalDow) + onchange: () => setTimeout(showCustomDaysMenu, 10, dow, dowChangeCallback, originalRepeat, originalDow) } }; @@ -372,7 +376,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { if (!keyboard) delete menu[/*LANG*/"Message"]; if (!isNew) { menu[/*LANG*/"Delete"] = () => { - E.showPrompt(/*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { + E.showPrompt(getLabel(timer) + "\n" + /*LANG*/"Are you sure?", { title: /*LANG*/"Delete Timer" }).then((confirm) => { if (confirm) { alarms.splice(timerIndex, 1); saveAndReload(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 29e71b3d9..28d48daab 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.37", + "version": "0.38", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", From c7cb16ec94382454beaf1e326002c2a66b7e7ef9 Mon Sep 17 00:00:00 2001 From: notEvil Date: Wed, 1 Feb 2023 15:08:39 +0100 Subject: [PATCH 13/38] - apps/chargent: added threshold --- apps/chargent/ChangeLog | 1 + apps/chargent/README.md | 2 ++ apps/chargent/boot.js | 28 ++++++++++++++++++---------- apps/chargent/metadata.json | 5 ++++- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/apps/chargent/ChangeLog b/apps/chargent/ChangeLog index ae4aa0e36..3003cd07d 100644 --- a/apps/chargent/ChangeLog +++ b/apps/chargent/ChangeLog @@ -1,2 +1,3 @@ 0.01: First version 0.02: Support BangleJS2 +0.03: Added threshold diff --git a/apps/chargent/README.md b/apps/chargent/README.md index 56bc763b4..db93615a6 100644 --- a/apps/chargent/README.md +++ b/apps/chargent/README.md @@ -6,6 +6,8 @@ The first stage of charging Li-ion ends at ~80% capacity when the charge voltage This app has no UI and no configuration. To disable the app, you have to uninstall it. +New in v0.03: before the very first buzz, the average value after the peak is written to chargent.json and used as threshold for future charges. This reduces the time spent in the second charge stage. + Side notes - Full capacity is reached after charge current drops to an insignificant level. This is quite some time after charge voltage reached its peak / `E.getBattery()` returns 100. - This app starts buzzing some time after `E.getBattery()` returns 100 (~15min on my watch), and at least 5min after the peak to account for noise. diff --git a/apps/chargent/boot.js b/apps/chargent/boot.js index b02d00a8e..c62003a21 100644 --- a/apps/chargent/boot.js +++ b/apps/chargent/boot.js @@ -6,19 +6,27 @@ if (charging) { if (!id) { var max = 0; - var count = 0; + var cnt = 0; + var sum = 0; + var lim = (require('Storage').readJSON('chargent.json', true) || {}).limit || 0; id = setInterval(() => { - var battlvl = analogRead(pin); - if (max < battlvl) { - max = battlvl; - count = 0; + var val = analogRead(pin); + if (max < val) { + max = val; + cnt = 1; + sum = val; } else { - count++; - if (10 <= count) { // 10 * 30s == 5 min // TODO ? customizable - // TODO ? customizable - Bangle.buzz(500); - setTimeout(() => Bangle.buzz(500), 1000); + cnt++; + sum += val; + } + if (10 < cnt || (lim && lim <= max)) { // 10 * 30s == 5 min // TODO ? customizable + if (!lim) { + lim = sum / cnt; + require('Storage').writeJSON('chargent.json', {limit: lim}); } + // TODO ? customizable + Bangle.buzz(500); + setTimeout(() => Bangle.buzz(500), 1000); } }, 30*1000); } diff --git a/apps/chargent/metadata.json b/apps/chargent/metadata.json index e2e6f5a61..653cb7d74 100644 --- a/apps/chargent/metadata.json +++ b/apps/chargent/metadata.json @@ -1,6 +1,6 @@ { "id": "chargent", "name": "Charge Gently", - "version": "0.02", + "version": "0.03", "description": "When charging, reminds you to disconnect the watch to prolong battery life.", "icon": "icon.png", "type": "bootloader", @@ -9,5 +9,8 @@ "readme": "README.md", "storage": [ {"name": "chargent.boot.js", "url": "boot.js"} + ], + "data": [ + {"name": "chargent.json"} ] } From 999f4abdb8f04b0d13debcb82b4abd7443e94e24 Mon Sep 17 00:00:00 2001 From: pancake Date: Wed, 1 Feb 2023 15:38:46 +0100 Subject: [PATCH 14/38] inspire: Disable autolock when breathing --- apps/inspire/ChangeLog | 1 + apps/inspire/README.md | 3 +- apps/inspire/app.js | 88 ++++++++++++++++++++------------------ apps/inspire/metadata.json | 2 +- 4 files changed, 50 insertions(+), 44 deletions(-) diff --git a/apps/inspire/ChangeLog b/apps/inspire/ChangeLog index 267ee22c2..e8e154f2f 100644 --- a/apps/inspire/ChangeLog +++ b/apps/inspire/ChangeLog @@ -1 +1,2 @@ 0.01: First public version +0.02: Disable screen lock when breathing diff --git a/apps/inspire/README.md b/apps/inspire/README.md index f5f8e3aa9..43df1b760 100644 --- a/apps/inspire/README.md +++ b/apps/inspire/README.md @@ -2,7 +2,7 @@ A minimalistic app that will help you practive breathing. -Author: Written by pancake in 2022, powered by insomnia +Author: Written by pancake in 2022, updated in 2023, powered by insomnia ## Features @@ -10,6 +10,7 @@ Author: Written by pancake in 2022, powered by insomnia * [x] Tap to start * [x] Subtle vibrations * [x] Drag to pause breathing +* [x] Dont lock screen while breathing * [ ] Automatic buzz every hour during day ## Screenshots diff --git a/apps/inspire/app.js b/apps/inspire/app.js index 92b2c4ef2..818a6af76 100644 --- a/apps/inspire/app.js +++ b/apps/inspire/app.js @@ -14,6 +14,7 @@ var mode = 0; var sin = 0; var dragged = 0; var lastTime = Date.now(); + function breath(t) { var r = Math.abs(Math.sin(t / 100)) * w2; g.fillCircle(w/2,h/2, r); @@ -26,7 +27,7 @@ setTimeout(()=>{Bangle.buzz(60);}, 500); function showTouchScreen() { g.setColor(1,1,1); - g.fillCircle (w2, h2, h2-5); + g.fillCircle(w2, h2, h2-5); g.setColor(0,0,0); g.setFont("Vector", 32); g.drawString("Tap to", w/6, h2-fs); @@ -40,7 +41,7 @@ g.clear(); function animateCircle() { g.clear(); g.setColor(1,1,1); - g.fillCircle (w2, h2, radius); + g.fillCircle(w2, h2, radius); radius-=2; if (radius < 40) { breathing = true; @@ -68,6 +69,9 @@ function main() { return; } started = true; + Bangle.setLCDPower(1); + Bangle.setLocked(0); + Bangle.setLCDTimeout(0); animateCircle(); Bangle.buzz(40); } @@ -78,48 +82,48 @@ function main() { main(); function startBreathing() { -var cicles = 3; -g.setFont("Vector", fs); - -var interval = setInterval(function() { -if (lastTime + 10 > Date.now()) { - return; -} - lastTime = Date.now(); - g.setColor(0, 0, 0); - g.clear(); - - g.setColor(0, 0.5, 1); - var b = breath(count); - g.setColor(0.5, 0.5, 1); - var c = breath(count + 50); - count++; - g.setColor(1, 1, 1); - if (b < c) { - g.drawString("inspire",8,ty); - if (mode) { - mode = 0; - Bangle.buzz(20); - if (!dragged ) { - cicles--; + var cicles = 3; + g.setFont("Vector", fs); + + function breathTime() { + if (lastTime + 10 > Date.now()) { + return; + } + lastTime = Date.now(); + g.setColor(0, 0, 0); + g.clear(); + + g.setColor(0, 0.5, 1); + var b = breath(count); + g.setColor(0.5, 0.5, 1); + var c = breath(count + 50); + count++; + g.setColor(1, 1, 1); + if (b < c) { + g.drawString("inspire",8,ty); + if (mode) { + mode = 0; + Bangle.buzz(20); + if (!dragged ) { + cicles--; + } + } + } else { + g.drawString("expire",8,ty); + if (!mode) { + mode = 1; + Bangle.buzz(20); } } - } else { - g.drawString("expire",8,ty); - if (!mode) { - mode = 1; - Bangle.buzz(20); + g.drawString(cicles, w-fs, ty); + if (cicles < 1) { + clearInterval(interval); + g.clear(); + g.drawString("Thanks for",20,h/3); + g.drawString(" breathing!",20,(h/3) + 16); + Bangle.showClock(); } - } - g.drawString(cicles, w-fs, ty); - if (cicles < 1) { - clearInterval(interval); - g.clear(); - g.drawString("Thanks for",20,h/3); - g.drawString(" breathing!",20,(h/3) + 16); - Bangle.showClock(); - } dragged = 0; - -}, 4); + } + var interval = setInterval(breathTime, 4); } diff --git a/apps/inspire/metadata.json b/apps/inspire/metadata.json index 85b7365be..3ffbc40e7 100644 --- a/apps/inspire/metadata.json +++ b/apps/inspire/metadata.json @@ -2,7 +2,7 @@ "id": "inspire", "name": "Inspire Breathing", "shortName": "Inspire", - "version": "0.01", + "version": "0.02", "description": "exercise breathing every now and then", "icon": "app-icon.png", "tags": "tools,health", From c3f11f90d5ff5acab328b1a88214b1ad2a94c756 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 2 Feb 2023 18:39:08 +0100 Subject: [PATCH 15/38] sched: add interface.html - Edit or delete existing events, add new - Add events from iCalendar file --- apps/sched/interface.html | 223 ++++++++++++++++++++++++++++++++++++++ apps/sched/metadata.json | 1 + 2 files changed, 224 insertions(+) create mode 100644 apps/sched/interface.html diff --git a/apps/sched/interface.html b/apps/sched/interface.html new file mode 100644 index 000000000..366e597a2 --- /dev/null +++ b/apps/sched/interface.html @@ -0,0 +1,223 @@ + + + + + + + + + +

Manage dated events

+ +
+ +
+ + + + + + + + + + + +
DateSummary
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ + + + + diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 2a1b0f8ca..42c3aaa12 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -10,6 +10,7 @@ "provides_modules" : ["sched"], "default" : true, "readme": "README.md", + "interface": "interface.html", "storage": [ {"name":"sched.boot.js","url":"boot.js"}, {"name":"sched.js","url":"sched.js"}, From 6b5fee29aff57101bc8ba8997d2274c3ed62d42c Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Thu, 2 Feb 2023 21:40:34 +0100 Subject: [PATCH 16/38] back button for settings main menu --- apps/powermanager/ChangeLog | 1 + apps/powermanager/metadata.json | 2 +- apps/powermanager/settings.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/powermanager/ChangeLog b/apps/powermanager/ChangeLog index a83e8c676..06f38d399 100644 --- a/apps/powermanager/ChangeLog +++ b/apps/powermanager/ChangeLog @@ -3,3 +3,4 @@ 0.03: Use default Bangle formatter for booleans 0.04: Remove calibration with current voltage (Calibrate->Auto) as it is now handled by settings app Allow automatic calibration on every charge longer than 3 hours +0.05: Add back button to settings menu. diff --git a/apps/powermanager/metadata.json b/apps/powermanager/metadata.json index 0777feee3..456831aa9 100644 --- a/apps/powermanager/metadata.json +++ b/apps/powermanager/metadata.json @@ -2,7 +2,7 @@ "id": "powermanager", "name": "Power Manager", "shortName": "Power Manager", - "version": "0.04", + "version": "0.05", "description": "Allow configuration of warnings and thresholds for battery charging and display.", "icon": "app.png", "type": "bootloader", diff --git a/apps/powermanager/settings.js b/apps/powermanager/settings.js index 9eeb29e00..fe4719275 100644 --- a/apps/powermanager/settings.js +++ b/apps/powermanager/settings.js @@ -23,6 +23,7 @@ '': { 'title': 'Power Manager' }, + "< Back" : back, 'Monotonic percentage': { value: !!settings.forceMonoPercentage, onchange: v => { From 6c8eb8e11d01526974a87fc21eb8228d21d7caf8 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 10:48:15 +1300 Subject: [PATCH 17/38] Create app.js --- tempgraph/app.js | 395 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 tempgraph/app.js diff --git a/tempgraph/app.js b/tempgraph/app.js new file mode 100644 index 000000000..a0bb3016b --- /dev/null +++ b/tempgraph/app.js @@ -0,0 +1,395 @@ +// Temperature Graph +// BangleJS Script + +Bangle.setBarometerPower(true,"tempgraph"); +Bangle.loadWidgets(); +var wids=WIDGETS; +var widsOn=true; +var rm=null; +var gt=null; +var dg=null; +var Layout=require("Layout"); +var C=true; +var temp,tempMode,readErrCnt,watchButton2; + +var graph=require("Storage").readJSON("tempgraph.json",true); +if(graph==undefined) { + graph=[]; +} + +var timesData=[ + // dur=duration, u=time units, d=divisions on graph, s=seconds per unit. + {dur:10,u:"Mins",d:5,s:60}, + {dur:20,u:"Mins",d:4,s:60}, + {dur:30,u:"Mins",d:3,s:60}, + {dur:40,u:"Mins",d:4,s:60}, + {dur:1,u:"Hr",d:4,s:3600}, + {dur:2,u:"Hrs",d:4,s:3600}, + {dur:3,u:"Hrs",d:3,s:3600}, + {dur:4,u:"Hrs",d:4,s:3600}, + {dur:6,u:"Hrs",d:6,s:3600}, + {dur:8,u:"Hrs",d:4,s:3600}, + {dur:12,u:"Hrs",d:6,s:3600}, + {dur:16,u:"Hrs",d:4,s:3600}, + {dur:20,u:"Hrs",d:5,s:3600}, + {dur:1,u:"Day",d:4,s:3600}, + {dur:2,u:"Days",d:4,s:86400}, + {dur:3,u:"Days",d:3,s:86400}, + {dur:4,u:"Days",d:4,s:86400}, + {dur:5,u:"Days",d:5,s:86400}, + {dur:6,u:"Days",d:6,s:86400}, + {dur:7,u:"Days",d:7,s:86400} +]; +var times=[]; +for(n=0;n{ + temp=p.temperature; + if(tempMode=="drawGraph"&&graph.length>0&&Math.abs(graph[graph.length-1].temp-temp)>10&&readErrCnt<2){ + // A large change in temperature may be a reading error. ie. A 0C or less reading after + // a 20C reading. So if this happens, the reading is repeated up to 2 times to hopefully + // skip such errors. + readErrCnt++; + print("readErrCnt "+readErrCnt); + return; + } + clearInterval(gt); + readErrCnt=0; + switch (tempMode){ + case "showTemp": + showT(); + break; + case "drawGraph": + var date=new Date(); + var dateStr=require("locale").date(date).trim(); + var hrs=date.getHours(); + var mins=date.getMinutes(); + var secs=date.getSeconds(); + graph.push({ + temp:temp, + date:dateStr, + hrs:hrs, + mins:mins, + secs:secs + }); + if(graph.length==1){ + graph[0].dur=durInd; + } + require("Storage").writeJSON("tempgraph.json", graph); + if(graph.length==150){ + clearInterval(dg); + } + drawG(); + } + }); +} + +function getTemp(){ + readErrCnt=0; + gt = setInterval(getT,800); +} + +function setButton(){ + var watchButton=setWatch(function(){ + clearInterval(gt); + clearInterval(dg); + clearWatch(watchButton); + Bangle.removeListener("touch",screenTouch); + openMenu(); + },BTN); + Bangle.on('touch',screenTouch); +} + +function setButton2(){ + watchButton2=setWatch(function(){ + clearWatch(watchButton2); + openMenu(); + },BTN); +} + +function zPad(n){ + return n.toString().padStart(2,0); +} + +function screenTouch(n,ev){ + if(ev.y>23&&ev.y<152){ + C=C==false; + drawG(false); + } +} + +function drawG(){ + function cf(t){ + if(C){ + return t; + } + return getF(t); + } + drawWids(); + var top=1; + var bar=21; + var barBot=175-22; + if(widsOn){ + top=25; + bar=bar+24; + barBot=barBot-24; + } + var low=graph[0].temp; + var hi=low; + for(n=0;nt){ + low=t; + } + if(hi10){ + div=5; + } + if(C){ + g.setColor(1,0,0); + }else{ + g.setColor(0,0,1); + } + var step=(barBot-bar)/((tempHi-tempLow)/div); + for(n=0;nexit()}, + ],lazy:true + }); + drawWids(); + messageLO.render(); +} + +function showT(){ + tempLO.lab1.label=tempLO.lab3.label; + tempLO.lab2.label=tempLO.lab4.label; + tempLO.lab3.label=tempLO.lab5.label; + tempLO.lab4.label=tempLO.lab6.label; + tempLO.lab5.label=temp.toFixed(2)+"C"; + tempLO.lab6.label=getF(temp).toFixed(2)+"F"; + tempLO.render(); +} + +function exit(){ + clearWatch(watchButton2); + openMenu(); +} + +function showTemp(){ + tempMode="showTemp"; + setButton2(); + tempLO=new Layout({ + type:"v",c:[ + {type:"h",c:[ + {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab1"}, + {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab2"} + ]}, + {type:"h",c:[ + {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab3"}, + {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab4"} + ]}, + {type:"h",c:[ + {type:"txt",pad:5,col:"#f00",font:"6x8:2",label:" ",id:"lab5"}, + {type:"txt",pad:5,col:"#00f",font:"6x8:2",label:" ",id:"lab6"} + ]}, + {type:"h",c:[ + {type:"btn",pad:2,font:"6x8:2",label:"Temp",cb:l=>getTemp()}, + {type:"btn",pad:2,font:"6x8:2",label:"Exit",cb:l=>exit()} + ]} + ] + },{lazy:true}); + tempLO.render(); + getTemp(); +} + +var menu={ + "":{ + "title":" Temp. Graph" + }, + + "Widgets":{ + value:widsOn, + format:vis=>vis?"Hide":"Show", + onchange:vis=>{ + widsOn=vis; + refreshMenu(); + } + }, + + "Duration":{ + value:times.indexOf(duration), + min:0,max:times.length-1,step:1,wrap:true, + format:tim=>times[tim], + onchange:(dur)=>{ + duration=times[dur]; + } + }, + + "Draw Graph":function(){ + E.showMenu(); + drawGraph(); + }, + + "Show Graph" : function(){ + E.showMenu(); + if(graph.length>0){ + showGraph(); + }else{ + message("No graph to\nshow as no\ngraph has been\ndrawn yet."); + } + }, + + "Save Graph" : function(){ + E.showMenu(); + if(graph.length>0){ + saveGraph(); + }else{ + message("No graph to\nsave as no\ngraph has been\ndrawn yet."); + } + }, + + "Save Data" : function(){ + E.showMenu(); + if(graph.length>0){ + saveData(); + }else{ + message("No data to\nsave as no\ngraph has been\ndrawn yet."); + } + }, + + "Show Temp":function(){ + E.showMenu(); + showTemp(); + } +}; + +openMenu(); From a77b4cf233e4c8f879c005e32efbeaf05263e5db Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 10:54:02 +1300 Subject: [PATCH 18/38] Add files via upload --- tempgraph/ChangeLog | 2 ++ tempgraph/README.md | 35 +++++++++++++++++++++++++++++++++++ tempgraph/metadata.json | 18 ++++++++++++++++++ tempgraph/screenshot_1.png | Bin 0 -> 3320 bytes tempgraph/screenshot_2.png | Bin 0 -> 4186 bytes tempgraph/screenshot_3.png | Bin 0 -> 3480 bytes 6 files changed, 55 insertions(+) create mode 100644 tempgraph/ChangeLog create mode 100644 tempgraph/README.md create mode 100644 tempgraph/metadata.json create mode 100644 tempgraph/screenshot_1.png create mode 100644 tempgraph/screenshot_2.png create mode 100644 tempgraph/screenshot_3.png diff --git a/tempgraph/ChangeLog b/tempgraph/ChangeLog new file mode 100644 index 000000000..58dd75a19 --- /dev/null +++ b/tempgraph/ChangeLog @@ -0,0 +1,2 @@ +0.01: 3/Feb/2023 Added 'Temperature Graph' app to depository. + diff --git a/tempgraph/README.md b/tempgraph/README.md new file mode 100644 index 000000000..e104c41e0 --- /dev/null +++ b/tempgraph/README.md @@ -0,0 +1,35 @@ +# Temperature Graph + +**Temperature Graph** (tempgraph) is a Bangle.js 2 app for recording graphs of the temperature for various time periods from 10 minutes to 7 days long. It samples the watch's temperature sensor 150 times while creating a graph, regardless of the time period selected. + +### Menu Options +* **Widgets** Toggles the watch's widgets on and off. With them off gives you a bigger graph when viewing it. + +* **Duration** Select the time period for drawing the graph, from 10 minutes to 7 days long. + +* **Draw Graph** Draws the graph. + * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). + * Pressing the watch button takes you back to the menu. **Note:** While the graph can still be viewed after returning to the menu, you can't continue recording it if you had returned to the menu before the time period was up. The graph is saved in the watch though so it's still there the next time you start the app. + +![](screenshot_1.png) +![](screenshot_2.png) +![](screenshot_3.png) + +* **Show Graph** Shows the last drawn graph. + * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). + * Pressing the watch button takes you back to the menu. + +* **Save Graph** Sends a screengrab of the graph to the Espruino Web IDE from where you can save it as you would any image on a webpage. + +* **Save Data** Sends a CSV file of the graph's temperature data to the Espruino Web IDE where you can save it for further use. I suggest you use the Espruino Web IDE's Terminal Logger (selected in the IDE's Settings/General) to record the data as it's sent. This is the easiest way to save it as a text file. + +* **Show Temp** Shows the current temperature. + +### Note +Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. + +### Creator +Carl Read ([mail](mailto:cread98@orcon.net.nz), [github](https://github.com/CarlR9)) + +#### License +[MIT License](LICENSE) diff --git a/tempgraph/metadata.json b/tempgraph/metadata.json new file mode 100644 index 000000000..f714c1eef --- /dev/null +++ b/tempgraph/metadata.json @@ -0,0 +1,18 @@ +{ "id": "tempgraph", + "name": "Temperature Graph", + "shortName":"Temp Graph", + "version":"0.01", + "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", + "icon": "app.png", + "type": "tool", + "tags": "temperature,tempgraph,graph", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tempgraph.app.js","url":"app.js"} + ], + "data": [ + {"name":"tempgraph.json"} + ], + "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] +} diff --git a/tempgraph/screenshot_1.png b/tempgraph/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7395f289695fd5be8a03d97b8644f55cc29072db GIT binary patch literal 3320 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 literal 0 HcmV?d00001 diff --git a/tempgraph/screenshot_2.png b/tempgraph/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..68d0ea236c6a513868c69eae8a5e51f995fad9f4 GIT binary patch literal 4186 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 Di-xj= literal 0 HcmV?d00001 From 7b68a37391be112b364caa3da7f793c283898848 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:05:06 +1300 Subject: [PATCH 19/38] Update README.md --- tempgraph/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tempgraph/README.md b/tempgraph/README.md index e104c41e0..de4a0af59 100644 --- a/tempgraph/README.md +++ b/tempgraph/README.md @@ -11,10 +11,6 @@ * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). * Pressing the watch button takes you back to the menu. **Note:** While the graph can still be viewed after returning to the menu, you can't continue recording it if you had returned to the menu before the time period was up. The graph is saved in the watch though so it's still there the next time you start the app. -![](screenshot_1.png) -![](screenshot_2.png) -![](screenshot_3.png) - * **Show Graph** Shows the last drawn graph. * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). * Pressing the watch button takes you back to the menu. @@ -25,6 +21,11 @@ * **Show Temp** Shows the current temperature. +### Screenshots +![](screenshot_1.png) +![](screenshot_2.png) +![](screenshot_3.png) + ### Note Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. From ff40b61747f8894710d85bf41e36e9f29282b74c Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:16:05 +1300 Subject: [PATCH 20/38] Delete tempgraph directory --- tempgraph/ChangeLog | 2 - tempgraph/README.md | 36 ---- tempgraph/app.js | 395 ------------------------------------- tempgraph/metadata.json | 18 -- tempgraph/screenshot_1.png | Bin 3320 -> 0 bytes tempgraph/screenshot_2.png | Bin 4186 -> 0 bytes tempgraph/screenshot_3.png | Bin 3480 -> 0 bytes 7 files changed, 451 deletions(-) delete mode 100644 tempgraph/ChangeLog delete mode 100644 tempgraph/README.md delete mode 100644 tempgraph/app.js delete mode 100644 tempgraph/metadata.json delete mode 100644 tempgraph/screenshot_1.png delete mode 100644 tempgraph/screenshot_2.png delete mode 100644 tempgraph/screenshot_3.png diff --git a/tempgraph/ChangeLog b/tempgraph/ChangeLog deleted file mode 100644 index 58dd75a19..000000000 --- a/tempgraph/ChangeLog +++ /dev/null @@ -1,2 +0,0 @@ -0.01: 3/Feb/2023 Added 'Temperature Graph' app to depository. - diff --git a/tempgraph/README.md b/tempgraph/README.md deleted file mode 100644 index de4a0af59..000000000 --- a/tempgraph/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Temperature Graph - -**Temperature Graph** (tempgraph) is a Bangle.js 2 app for recording graphs of the temperature for various time periods from 10 minutes to 7 days long. It samples the watch's temperature sensor 150 times while creating a graph, regardless of the time period selected. - -### Menu Options -* **Widgets** Toggles the watch's widgets on and off. With them off gives you a bigger graph when viewing it. - -* **Duration** Select the time period for drawing the graph, from 10 minutes to 7 days long. - -* **Draw Graph** Draws the graph. - * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). - * Pressing the watch button takes you back to the menu. **Note:** While the graph can still be viewed after returning to the menu, you can't continue recording it if you had returned to the menu before the time period was up. The graph is saved in the watch though so it's still there the next time you start the app. - -* **Show Graph** Shows the last drawn graph. - * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). - * Pressing the watch button takes you back to the menu. - -* **Save Graph** Sends a screengrab of the graph to the Espruino Web IDE from where you can save it as you would any image on a webpage. - -* **Save Data** Sends a CSV file of the graph's temperature data to the Espruino Web IDE where you can save it for further use. I suggest you use the Espruino Web IDE's Terminal Logger (selected in the IDE's Settings/General) to record the data as it's sent. This is the easiest way to save it as a text file. - -* **Show Temp** Shows the current temperature. - -### Screenshots -![](screenshot_1.png) -![](screenshot_2.png) -![](screenshot_3.png) - -### Note -Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. - -### Creator -Carl Read ([mail](mailto:cread98@orcon.net.nz), [github](https://github.com/CarlR9)) - -#### License -[MIT License](LICENSE) diff --git a/tempgraph/app.js b/tempgraph/app.js deleted file mode 100644 index a0bb3016b..000000000 --- a/tempgraph/app.js +++ /dev/null @@ -1,395 +0,0 @@ -// Temperature Graph -// BangleJS Script - -Bangle.setBarometerPower(true,"tempgraph"); -Bangle.loadWidgets(); -var wids=WIDGETS; -var widsOn=true; -var rm=null; -var gt=null; -var dg=null; -var Layout=require("Layout"); -var C=true; -var temp,tempMode,readErrCnt,watchButton2; - -var graph=require("Storage").readJSON("tempgraph.json",true); -if(graph==undefined) { - graph=[]; -} - -var timesData=[ - // dur=duration, u=time units, d=divisions on graph, s=seconds per unit. - {dur:10,u:"Mins",d:5,s:60}, - {dur:20,u:"Mins",d:4,s:60}, - {dur:30,u:"Mins",d:3,s:60}, - {dur:40,u:"Mins",d:4,s:60}, - {dur:1,u:"Hr",d:4,s:3600}, - {dur:2,u:"Hrs",d:4,s:3600}, - {dur:3,u:"Hrs",d:3,s:3600}, - {dur:4,u:"Hrs",d:4,s:3600}, - {dur:6,u:"Hrs",d:6,s:3600}, - {dur:8,u:"Hrs",d:4,s:3600}, - {dur:12,u:"Hrs",d:6,s:3600}, - {dur:16,u:"Hrs",d:4,s:3600}, - {dur:20,u:"Hrs",d:5,s:3600}, - {dur:1,u:"Day",d:4,s:3600}, - {dur:2,u:"Days",d:4,s:86400}, - {dur:3,u:"Days",d:3,s:86400}, - {dur:4,u:"Days",d:4,s:86400}, - {dur:5,u:"Days",d:5,s:86400}, - {dur:6,u:"Days",d:6,s:86400}, - {dur:7,u:"Days",d:7,s:86400} -]; -var times=[]; -for(n=0;n{ - temp=p.temperature; - if(tempMode=="drawGraph"&&graph.length>0&&Math.abs(graph[graph.length-1].temp-temp)>10&&readErrCnt<2){ - // A large change in temperature may be a reading error. ie. A 0C or less reading after - // a 20C reading. So if this happens, the reading is repeated up to 2 times to hopefully - // skip such errors. - readErrCnt++; - print("readErrCnt "+readErrCnt); - return; - } - clearInterval(gt); - readErrCnt=0; - switch (tempMode){ - case "showTemp": - showT(); - break; - case "drawGraph": - var date=new Date(); - var dateStr=require("locale").date(date).trim(); - var hrs=date.getHours(); - var mins=date.getMinutes(); - var secs=date.getSeconds(); - graph.push({ - temp:temp, - date:dateStr, - hrs:hrs, - mins:mins, - secs:secs - }); - if(graph.length==1){ - graph[0].dur=durInd; - } - require("Storage").writeJSON("tempgraph.json", graph); - if(graph.length==150){ - clearInterval(dg); - } - drawG(); - } - }); -} - -function getTemp(){ - readErrCnt=0; - gt = setInterval(getT,800); -} - -function setButton(){ - var watchButton=setWatch(function(){ - clearInterval(gt); - clearInterval(dg); - clearWatch(watchButton); - Bangle.removeListener("touch",screenTouch); - openMenu(); - },BTN); - Bangle.on('touch',screenTouch); -} - -function setButton2(){ - watchButton2=setWatch(function(){ - clearWatch(watchButton2); - openMenu(); - },BTN); -} - -function zPad(n){ - return n.toString().padStart(2,0); -} - -function screenTouch(n,ev){ - if(ev.y>23&&ev.y<152){ - C=C==false; - drawG(false); - } -} - -function drawG(){ - function cf(t){ - if(C){ - return t; - } - return getF(t); - } - drawWids(); - var top=1; - var bar=21; - var barBot=175-22; - if(widsOn){ - top=25; - bar=bar+24; - barBot=barBot-24; - } - var low=graph[0].temp; - var hi=low; - for(n=0;nt){ - low=t; - } - if(hi10){ - div=5; - } - if(C){ - g.setColor(1,0,0); - }else{ - g.setColor(0,0,1); - } - var step=(barBot-bar)/((tempHi-tempLow)/div); - for(n=0;nexit()}, - ],lazy:true - }); - drawWids(); - messageLO.render(); -} - -function showT(){ - tempLO.lab1.label=tempLO.lab3.label; - tempLO.lab2.label=tempLO.lab4.label; - tempLO.lab3.label=tempLO.lab5.label; - tempLO.lab4.label=tempLO.lab6.label; - tempLO.lab5.label=temp.toFixed(2)+"C"; - tempLO.lab6.label=getF(temp).toFixed(2)+"F"; - tempLO.render(); -} - -function exit(){ - clearWatch(watchButton2); - openMenu(); -} - -function showTemp(){ - tempMode="showTemp"; - setButton2(); - tempLO=new Layout({ - type:"v",c:[ - {type:"h",c:[ - {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab1"}, - {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab2"} - ]}, - {type:"h",c:[ - {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab3"}, - {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab4"} - ]}, - {type:"h",c:[ - {type:"txt",pad:5,col:"#f00",font:"6x8:2",label:" ",id:"lab5"}, - {type:"txt",pad:5,col:"#00f",font:"6x8:2",label:" ",id:"lab6"} - ]}, - {type:"h",c:[ - {type:"btn",pad:2,font:"6x8:2",label:"Temp",cb:l=>getTemp()}, - {type:"btn",pad:2,font:"6x8:2",label:"Exit",cb:l=>exit()} - ]} - ] - },{lazy:true}); - tempLO.render(); - getTemp(); -} - -var menu={ - "":{ - "title":" Temp. Graph" - }, - - "Widgets":{ - value:widsOn, - format:vis=>vis?"Hide":"Show", - onchange:vis=>{ - widsOn=vis; - refreshMenu(); - } - }, - - "Duration":{ - value:times.indexOf(duration), - min:0,max:times.length-1,step:1,wrap:true, - format:tim=>times[tim], - onchange:(dur)=>{ - duration=times[dur]; - } - }, - - "Draw Graph":function(){ - E.showMenu(); - drawGraph(); - }, - - "Show Graph" : function(){ - E.showMenu(); - if(graph.length>0){ - showGraph(); - }else{ - message("No graph to\nshow as no\ngraph has been\ndrawn yet."); - } - }, - - "Save Graph" : function(){ - E.showMenu(); - if(graph.length>0){ - saveGraph(); - }else{ - message("No graph to\nsave as no\ngraph has been\ndrawn yet."); - } - }, - - "Save Data" : function(){ - E.showMenu(); - if(graph.length>0){ - saveData(); - }else{ - message("No data to\nsave as no\ngraph has been\ndrawn yet."); - } - }, - - "Show Temp":function(){ - E.showMenu(); - showTemp(); - } -}; - -openMenu(); diff --git a/tempgraph/metadata.json b/tempgraph/metadata.json deleted file mode 100644 index f714c1eef..000000000 --- a/tempgraph/metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ "id": "tempgraph", - "name": "Temperature Graph", - "shortName":"Temp Graph", - "version":"0.01", - "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", - "icon": "app.png", - "type": "tool", - "tags": "temperature,tempgraph,graph", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"tempgraph.app.js","url":"app.js"} - ], - "data": [ - {"name":"tempgraph.json"} - ], - "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] -} diff --git a/tempgraph/screenshot_1.png b/tempgraph/screenshot_1.png deleted file mode 100644 index 7395f289695fd5be8a03d97b8644f55cc29072db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3320 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 diff --git a/tempgraph/screenshot_2.png b/tempgraph/screenshot_2.png deleted file mode 100644 index 68d0ea236c6a513868c69eae8a5e51f995fad9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4186 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 Di-xj= From 230625ae7830acc595f43f8e6e87b792f59e3e4e Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:18:27 +1300 Subject: [PATCH 21/38] Create app.js --- apps/tempgraph/app.js | 395 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 apps/tempgraph/app.js diff --git a/apps/tempgraph/app.js b/apps/tempgraph/app.js new file mode 100644 index 000000000..a0bb3016b --- /dev/null +++ b/apps/tempgraph/app.js @@ -0,0 +1,395 @@ +// Temperature Graph +// BangleJS Script + +Bangle.setBarometerPower(true,"tempgraph"); +Bangle.loadWidgets(); +var wids=WIDGETS; +var widsOn=true; +var rm=null; +var gt=null; +var dg=null; +var Layout=require("Layout"); +var C=true; +var temp,tempMode,readErrCnt,watchButton2; + +var graph=require("Storage").readJSON("tempgraph.json",true); +if(graph==undefined) { + graph=[]; +} + +var timesData=[ + // dur=duration, u=time units, d=divisions on graph, s=seconds per unit. + {dur:10,u:"Mins",d:5,s:60}, + {dur:20,u:"Mins",d:4,s:60}, + {dur:30,u:"Mins",d:3,s:60}, + {dur:40,u:"Mins",d:4,s:60}, + {dur:1,u:"Hr",d:4,s:3600}, + {dur:2,u:"Hrs",d:4,s:3600}, + {dur:3,u:"Hrs",d:3,s:3600}, + {dur:4,u:"Hrs",d:4,s:3600}, + {dur:6,u:"Hrs",d:6,s:3600}, + {dur:8,u:"Hrs",d:4,s:3600}, + {dur:12,u:"Hrs",d:6,s:3600}, + {dur:16,u:"Hrs",d:4,s:3600}, + {dur:20,u:"Hrs",d:5,s:3600}, + {dur:1,u:"Day",d:4,s:3600}, + {dur:2,u:"Days",d:4,s:86400}, + {dur:3,u:"Days",d:3,s:86400}, + {dur:4,u:"Days",d:4,s:86400}, + {dur:5,u:"Days",d:5,s:86400}, + {dur:6,u:"Days",d:6,s:86400}, + {dur:7,u:"Days",d:7,s:86400} +]; +var times=[]; +for(n=0;n{ + temp=p.temperature; + if(tempMode=="drawGraph"&&graph.length>0&&Math.abs(graph[graph.length-1].temp-temp)>10&&readErrCnt<2){ + // A large change in temperature may be a reading error. ie. A 0C or less reading after + // a 20C reading. So if this happens, the reading is repeated up to 2 times to hopefully + // skip such errors. + readErrCnt++; + print("readErrCnt "+readErrCnt); + return; + } + clearInterval(gt); + readErrCnt=0; + switch (tempMode){ + case "showTemp": + showT(); + break; + case "drawGraph": + var date=new Date(); + var dateStr=require("locale").date(date).trim(); + var hrs=date.getHours(); + var mins=date.getMinutes(); + var secs=date.getSeconds(); + graph.push({ + temp:temp, + date:dateStr, + hrs:hrs, + mins:mins, + secs:secs + }); + if(graph.length==1){ + graph[0].dur=durInd; + } + require("Storage").writeJSON("tempgraph.json", graph); + if(graph.length==150){ + clearInterval(dg); + } + drawG(); + } + }); +} + +function getTemp(){ + readErrCnt=0; + gt = setInterval(getT,800); +} + +function setButton(){ + var watchButton=setWatch(function(){ + clearInterval(gt); + clearInterval(dg); + clearWatch(watchButton); + Bangle.removeListener("touch",screenTouch); + openMenu(); + },BTN); + Bangle.on('touch',screenTouch); +} + +function setButton2(){ + watchButton2=setWatch(function(){ + clearWatch(watchButton2); + openMenu(); + },BTN); +} + +function zPad(n){ + return n.toString().padStart(2,0); +} + +function screenTouch(n,ev){ + if(ev.y>23&&ev.y<152){ + C=C==false; + drawG(false); + } +} + +function drawG(){ + function cf(t){ + if(C){ + return t; + } + return getF(t); + } + drawWids(); + var top=1; + var bar=21; + var barBot=175-22; + if(widsOn){ + top=25; + bar=bar+24; + barBot=barBot-24; + } + var low=graph[0].temp; + var hi=low; + for(n=0;nt){ + low=t; + } + if(hi10){ + div=5; + } + if(C){ + g.setColor(1,0,0); + }else{ + g.setColor(0,0,1); + } + var step=(barBot-bar)/((tempHi-tempLow)/div); + for(n=0;nexit()}, + ],lazy:true + }); + drawWids(); + messageLO.render(); +} + +function showT(){ + tempLO.lab1.label=tempLO.lab3.label; + tempLO.lab2.label=tempLO.lab4.label; + tempLO.lab3.label=tempLO.lab5.label; + tempLO.lab4.label=tempLO.lab6.label; + tempLO.lab5.label=temp.toFixed(2)+"C"; + tempLO.lab6.label=getF(temp).toFixed(2)+"F"; + tempLO.render(); +} + +function exit(){ + clearWatch(watchButton2); + openMenu(); +} + +function showTemp(){ + tempMode="showTemp"; + setButton2(); + tempLO=new Layout({ + type:"v",c:[ + {type:"h",c:[ + {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab1"}, + {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab2"} + ]}, + {type:"h",c:[ + {type:"txt",pad:5,col:"#f77",font:"6x8:2",label:" ",id:"lab3"}, + {type:"txt",pad:5,col:"#77f",font:"6x8:2",label:" ",id:"lab4"} + ]}, + {type:"h",c:[ + {type:"txt",pad:5,col:"#f00",font:"6x8:2",label:" ",id:"lab5"}, + {type:"txt",pad:5,col:"#00f",font:"6x8:2",label:" ",id:"lab6"} + ]}, + {type:"h",c:[ + {type:"btn",pad:2,font:"6x8:2",label:"Temp",cb:l=>getTemp()}, + {type:"btn",pad:2,font:"6x8:2",label:"Exit",cb:l=>exit()} + ]} + ] + },{lazy:true}); + tempLO.render(); + getTemp(); +} + +var menu={ + "":{ + "title":" Temp. Graph" + }, + + "Widgets":{ + value:widsOn, + format:vis=>vis?"Hide":"Show", + onchange:vis=>{ + widsOn=vis; + refreshMenu(); + } + }, + + "Duration":{ + value:times.indexOf(duration), + min:0,max:times.length-1,step:1,wrap:true, + format:tim=>times[tim], + onchange:(dur)=>{ + duration=times[dur]; + } + }, + + "Draw Graph":function(){ + E.showMenu(); + drawGraph(); + }, + + "Show Graph" : function(){ + E.showMenu(); + if(graph.length>0){ + showGraph(); + }else{ + message("No graph to\nshow as no\ngraph has been\ndrawn yet."); + } + }, + + "Save Graph" : function(){ + E.showMenu(); + if(graph.length>0){ + saveGraph(); + }else{ + message("No graph to\nsave as no\ngraph has been\ndrawn yet."); + } + }, + + "Save Data" : function(){ + E.showMenu(); + if(graph.length>0){ + saveData(); + }else{ + message("No data to\nsave as no\ngraph has been\ndrawn yet."); + } + }, + + "Show Temp":function(){ + E.showMenu(); + showTemp(); + } +}; + +openMenu(); From 862494a0d7d2967643cd59c766c0dbb58d3c9dca Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:19:47 +1300 Subject: [PATCH 22/38] Add files via upload --- apps/tempgraph/ChangeLog | 2 ++ apps/tempgraph/README.md | 36 ++++++++++++++++++++++++++++++++ apps/tempgraph/app.png | Bin 0 -> 6941 bytes apps/tempgraph/metadata.json | 18 ++++++++++++++++ apps/tempgraph/screenshot_1.png | Bin 0 -> 3320 bytes apps/tempgraph/screenshot_2.png | Bin 0 -> 4186 bytes apps/tempgraph/screenshot_3.png | Bin 0 -> 3480 bytes 7 files changed, 56 insertions(+) create mode 100644 apps/tempgraph/ChangeLog create mode 100644 apps/tempgraph/README.md create mode 100644 apps/tempgraph/app.png create mode 100644 apps/tempgraph/metadata.json create mode 100644 apps/tempgraph/screenshot_1.png create mode 100644 apps/tempgraph/screenshot_2.png create mode 100644 apps/tempgraph/screenshot_3.png diff --git a/apps/tempgraph/ChangeLog b/apps/tempgraph/ChangeLog new file mode 100644 index 000000000..58dd75a19 --- /dev/null +++ b/apps/tempgraph/ChangeLog @@ -0,0 +1,2 @@ +0.01: 3/Feb/2023 Added 'Temperature Graph' app to depository. + diff --git a/apps/tempgraph/README.md b/apps/tempgraph/README.md new file mode 100644 index 000000000..de4a0af59 --- /dev/null +++ b/apps/tempgraph/README.md @@ -0,0 +1,36 @@ +# Temperature Graph + +**Temperature Graph** (tempgraph) is a Bangle.js 2 app for recording graphs of the temperature for various time periods from 10 minutes to 7 days long. It samples the watch's temperature sensor 150 times while creating a graph, regardless of the time period selected. + +### Menu Options +* **Widgets** Toggles the watch's widgets on and off. With them off gives you a bigger graph when viewing it. + +* **Duration** Select the time period for drawing the graph, from 10 minutes to 7 days long. + +* **Draw Graph** Draws the graph. + * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). + * Pressing the watch button takes you back to the menu. **Note:** While the graph can still be viewed after returning to the menu, you can't continue recording it if you had returned to the menu before the time period was up. The graph is saved in the watch though so it's still there the next time you start the app. + +* **Show Graph** Shows the last drawn graph. + * Tapping the screen toggles the graph between Celsius (red) and Fahrenheit (blue). + * Pressing the watch button takes you back to the menu. + +* **Save Graph** Sends a screengrab of the graph to the Espruino Web IDE from where you can save it as you would any image on a webpage. + +* **Save Data** Sends a CSV file of the graph's temperature data to the Espruino Web IDE where you can save it for further use. I suggest you use the Espruino Web IDE's Terminal Logger (selected in the IDE's Settings/General) to record the data as it's sent. This is the easiest way to save it as a text file. + +* **Show Temp** Shows the current temperature. + +### Screenshots +![](screenshot_1.png) +![](screenshot_2.png) +![](screenshot_3.png) + +### Note +Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. + +### Creator +Carl Read ([mail](mailto:cread98@orcon.net.nz), [github](https://github.com/CarlR9)) + +#### License +[MIT License](LICENSE) diff --git a/apps/tempgraph/app.png b/apps/tempgraph/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae347ac837d8366797f532b8d304dc77802fd02 GIT binary patch literal 6941 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 V5(kw?=U-<5P+3(-m9%N_e*t{e8WjKl literal 0 HcmV?d00001 diff --git a/apps/tempgraph/metadata.json b/apps/tempgraph/metadata.json new file mode 100644 index 000000000..f714c1eef --- /dev/null +++ b/apps/tempgraph/metadata.json @@ -0,0 +1,18 @@ +{ "id": "tempgraph", + "name": "Temperature Graph", + "shortName":"Temp Graph", + "version":"0.01", + "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", + "icon": "app.png", + "type": "tool", + "tags": "temperature,tempgraph,graph", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tempgraph.app.js","url":"app.js"} + ], + "data": [ + {"name":"tempgraph.json"} + ], + "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] +} diff --git a/apps/tempgraph/screenshot_1.png b/apps/tempgraph/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7395f289695fd5be8a03d97b8644f55cc29072db GIT binary patch literal 3320 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 literal 0 HcmV?d00001 diff --git a/apps/tempgraph/screenshot_2.png b/apps/tempgraph/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..68d0ea236c6a513868c69eae8a5e51f995fad9f4 GIT binary patch literal 4186 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 Di-xj= literal 0 HcmV?d00001 From 364c25f26a076c1707e03a7ffe1f07788543c78a Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:29:15 +1300 Subject: [PATCH 23/38] Update README.md --- apps/tempgraph/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/tempgraph/README.md b/apps/tempgraph/README.md index de4a0af59..919c20267 100644 --- a/apps/tempgraph/README.md +++ b/apps/tempgraph/README.md @@ -21,14 +21,14 @@ * **Show Temp** Shows the current temperature. +### Note +Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. + ### Screenshots ![](screenshot_1.png) ![](screenshot_2.png) ![](screenshot_3.png) -### Note -Using the watch in a normal fashion can raise the temperature it's sensing to quite a few degrees above the surrounding temperature and it may take half an hour or so to drop to close to the surrounding temperature. After that it seems to give quite accurate readings, assuming the thermometer I've been comparing it to is itself reasonably accurate. So best to load the app then not touch the watch for half an hour before starting a recording. This is assuming you're not wearing the app and are just using it to record the temperature where you've put the watch. You could of course wear it and it'll still draw a graph, which might also be useful. - ### Creator Carl Read ([mail](mailto:cread98@orcon.net.nz), [github](https://github.com/CarlR9)) From 25cf6125fe2ea13c7ab4e39e9c8e7aec6a89e592 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:10:09 +1300 Subject: [PATCH 25/38] Delete app.png --- apps/tempgraph/app.png | Bin 6941 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/tempgraph/app.png diff --git a/apps/tempgraph/app.png b/apps/tempgraph/app.png deleted file mode 100644 index 1ae347ac837d8366797f532b8d304dc77802fd02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6941 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 V5(kw?=U-<5P+3(-m9%N_e*t{e8WjKl From 2c479ff715a5fdab7df5cdf2fbbec5c5ac2078ff Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:11:26 +1300 Subject: [PATCH 26/38] Add files via upload --- apps/tempgraph/app.png | Bin 0 -> 6941 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/tempgraph/app.png diff --git a/apps/tempgraph/app.png b/apps/tempgraph/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae347ac837d8366797f532b8d304dc77802fd02 GIT binary patch literal 6941 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 V5(kw?=U-<5P+3(-m9%N_e*t{e8WjKl literal 0 HcmV?d00001 From c7209882eed0c65bafb654614bf98a066ca070d5 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:38:06 +1300 Subject: [PATCH 27/38] Delete metadata.json --- apps/tempgraph/metadata.json | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 apps/tempgraph/metadata.json diff --git a/apps/tempgraph/metadata.json b/apps/tempgraph/metadata.json deleted file mode 100644 index f714c1eef..000000000 --- a/apps/tempgraph/metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ "id": "tempgraph", - "name": "Temperature Graph", - "shortName":"Temp Graph", - "version":"0.01", - "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", - "icon": "app.png", - "type": "tool", - "tags": "temperature,tempgraph,graph", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"tempgraph.app.js","url":"app.js"} - ], - "data": [ - {"name":"tempgraph.json"} - ], - "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] -} From cfde5ea465080948271b1e0e6d58ca968a164a62 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:39:07 +1300 Subject: [PATCH 28/38] Add files via upload --- apps/tempgraph/app-icon.js | 1 + apps/tempgraph/metadata.json | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 apps/tempgraph/app-icon.js create mode 100644 apps/tempgraph/metadata.json diff --git a/apps/tempgraph/app-icon.js b/apps/tempgraph/app-icon.js new file mode 100644 index 000000000..50aae4c01 --- /dev/null +++ b/apps/tempgraph/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+goA/AH4AgrHXABFYF0XXkYAK64utGENYFxoABSTxeHXYJglF+UAAIQvEBApfhE4UAF4IDBFwZf/X7hfsR4K/tL96/vRwpf/X/5fJGYK/tL9u02i/tF4KOFL/6/XF4ZftR4K/tL96/vRwpf/X/5fJGYK/tL96/vRwpf/X7gADF8ouBGA4v/F/6/urAmGABFYF7pgIL0owPF0KSC64AIRj4A/AH4ACA=")) \ No newline at end of file diff --git a/apps/tempgraph/metadata.json b/apps/tempgraph/metadata.json new file mode 100644 index 000000000..ea41d67ae --- /dev/null +++ b/apps/tempgraph/metadata.json @@ -0,0 +1,19 @@ +{ "id": "tempgraph", + "name": "Temperature Graph", + "shortName":"Temp Graph", + "version":"0.01", + "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", + "icon": "app.png", + "type": "tool", + "tags": "temperature,tempgraph,graph", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tempgraph.app.js","url":"app.js"}, + {"name":"tempgraph.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"tempgraph.json"} + ], + "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] +} From f050b75e5b4892fbbac23cf836a2c04e0ea6c12d Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Fri, 3 Feb 2023 07:45:22 +0100 Subject: [PATCH 29/38] widalarmeta: fix #2542 Fix check for active alarm, either remove brackets or add return for filter in map --- apps/widalarmeta/ChangeLog | 1 + apps/widalarmeta/metadata.json | 2 +- apps/widalarmeta/widget.js | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/widalarmeta/ChangeLog b/apps/widalarmeta/ChangeLog index 8bdf1156f..1012ee386 100644 --- a/apps/widalarmeta/ChangeLog +++ b/apps/widalarmeta/ChangeLog @@ -4,3 +4,4 @@ Add option to show seconds 0.03: Fix Bell not appearing on alarms > 24h and redrawing interval Update to match the default alarm widget, and not show itself when an alarm is hidden. +0.04: Fix check for active alarm diff --git a/apps/widalarmeta/metadata.json b/apps/widalarmeta/metadata.json index 89e35c090..aad3c4321 100644 --- a/apps/widalarmeta/metadata.json +++ b/apps/widalarmeta/metadata.json @@ -2,7 +2,7 @@ "id": "widalarmeta", "name": "Alarm & Timer ETA", "shortName": "Alarm ETA", - "version": "0.03", + "version": "0.04", "description": "A widget that displays the time to the next Alarm or Timer in hours and minutes, maximum 24h (configurable).", "icon": "widget.png", "type": "widget", diff --git a/apps/widalarmeta/widget.js b/apps/widalarmeta/widget.js index 8615aa1d2..3ad2e6ad2 100644 --- a/apps/widalarmeta/widget.js +++ b/apps/widalarmeta/widget.js @@ -9,10 +9,10 @@ function draw() { const times = alarms - .map(alarm => { + .map(alarm => alarm.hidden !== true && require("sched").getTimeToAlarm(alarm) - }) + ) .filter(a => a !== undefined); const next = times.length > 0 ? Math.min.apply(null, times) : 0; let calcWidth = 0; From 4a3e5bb5a3086a4e315c0654778b2937b2957c8f Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:52:25 +1300 Subject: [PATCH 30/38] Delete metadata.json --- apps/tempgraph/metadata.json | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 apps/tempgraph/metadata.json diff --git a/apps/tempgraph/metadata.json b/apps/tempgraph/metadata.json deleted file mode 100644 index ea41d67ae..000000000 --- a/apps/tempgraph/metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ "id": "tempgraph", - "name": "Temperature Graph", - "shortName":"Temp Graph", - "version":"0.01", - "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", - "icon": "app.png", - "type": "tool", - "tags": "temperature,tempgraph,graph", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"tempgraph.app.js","url":"app.js"}, - {"name":"tempgraph.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"tempgraph.json"} - ], - "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] -} From 230baf7b24fa0be212a32e440471b7c14933b639 Mon Sep 17 00:00:00 2001 From: CarlR9 <108166078+CarlR9@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:54:23 +1300 Subject: [PATCH 31/38] Add files via upload --- apps/tempgraph/metadata.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 apps/tempgraph/metadata.json diff --git a/apps/tempgraph/metadata.json b/apps/tempgraph/metadata.json new file mode 100644 index 000000000..6772429a5 --- /dev/null +++ b/apps/tempgraph/metadata.json @@ -0,0 +1,19 @@ +{ "id": "tempgraph", + "name": "Temperature Graph", + "shortName":"Temp Graph", + "version":"0.01", + "description": "An app for recording the temperature for time periods ranging from 10 minutes to 7 days.", + "icon": "app.png", + "type": "app", + "tags": "temperature,tempgraph,graph", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tempgraph.app.js","url":"app.js"}, + {"name":"tempgraph.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"name":"tempgraph.json"} + ], + "screenshots": [{"url":"screenshot_1.png"},{"url":"screenshot_2.png"},{"url":"screenshot_3.png"}] +} From aa91d43fa9a37e97653355c2880b308d93c4fa38 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 3 Feb 2023 12:49:54 +0100 Subject: [PATCH 32/38] qcenter - Cleanup timeout --- apps/qcenter/ChangeLog | 1 + apps/qcenter/app.js | 1 + apps/qcenter/metadata.json | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/qcenter/ChangeLog b/apps/qcenter/ChangeLog index 366b0ff86..436949dc9 100644 --- a/apps/qcenter/ChangeLog +++ b/apps/qcenter/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Fix fast loading on swipe to clock 0.03: Adds a setting for going back to clock on a timeout +0.04: Fix timeouts closing fast loaded apps \ No newline at end of file diff --git a/apps/qcenter/app.js b/apps/qcenter/app.js index f012fdda8..bd22c87e1 100644 --- a/apps/qcenter/app.js +++ b/apps/qcenter/app.js @@ -111,6 +111,7 @@ let layout = new Layout({ remove: ()=>{ Bangle.removeListener("swipe", onSwipe); Bangle.removeListener("touch", updateTimeout); + if (timeout) clearTimeout(timeout); delete Graphics.prototype.setFont8x12; } }); diff --git a/apps/qcenter/metadata.json b/apps/qcenter/metadata.json index 630fd2bef..cd3e350a4 100644 --- a/apps/qcenter/metadata.json +++ b/apps/qcenter/metadata.json @@ -2,7 +2,7 @@ "id": "qcenter", "name": "Quick Center", "shortName": "QCenter", - "version": "0.03", + "version": "0.04", "description": "An app for quickly launching your favourite apps, inspired by the control centres of other watches.", "icon": "app.png", "tags": "", From f4f07806a66cbd48d65857786de9944967f18161 Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 19:14:35 -0700 Subject: [PATCH 33/38] Added mtnclock support for reading weather.json This allows the use of owmweather or weather to provide weather updates to mtnclock. --- apps/mtnclock/app.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/mtnclock/app.js b/apps/mtnclock/app.js index 28ba25882..dedf60cfd 100644 --- a/apps/mtnclock/app.js +++ b/apps/mtnclock/app.js @@ -323,6 +323,11 @@ function setWeather() { draw(a); } +function readWeather() { + data = require("Storage").readJSON('weather.json').weather; + require("Storage").write('mtnclock.json', data); +} + const _GB = global.GB; global.GB = (event) => { if (event.t==="weather") { @@ -340,6 +345,7 @@ function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; + readWeather(); setWeather(); queueDraw(); }, 60000 - (Date.now() % 60000)); From 5c3b742a4275361656b734cda6037e2d68a4be25 Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 20:18:37 -0700 Subject: [PATCH 34/38] Prevent exceptions if weather.json doesn't exist. --- apps/mtnclock/app.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/mtnclock/app.js b/apps/mtnclock/app.js index dedf60cfd..82d06e03b 100644 --- a/apps/mtnclock/app.js +++ b/apps/mtnclock/app.js @@ -324,8 +324,13 @@ function setWeather() { } function readWeather() { - data = require("Storage").readJSON('weather.json').weather; - require("Storage").write('mtnclock.json', data); + var weatherData = require("Storage").readJSON('weather.json', true); + if (weatherData !== undefined) { + if (weatherData.weather.time > data.time) { + data = weatherData.weather; + require("Storage").write('mtnclock.json', data); + } + } } const _GB = global.GB; From 3371f86bb5b8335d4d312ce7ca1d8ce967fc818b Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 21:39:43 -0700 Subject: [PATCH 35/38] Save minimal weather data and limit weather update frequency --- apps/mtnclock/app.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/mtnclock/app.js b/apps/mtnclock/app.js index 82d06e03b..996fe2cee 100644 --- a/apps/mtnclock/app.js +++ b/apps/mtnclock/app.js @@ -324,19 +324,26 @@ function setWeather() { } function readWeather() { - var weatherData = require("Storage").readJSON('weather.json', true); - if (weatherData !== undefined) { - if (weatherData.weather.time > data.time) { - data = weatherData.weather; - require("Storage").write('mtnclock.json', data); - } + var weatherJson = require("Storage").readJSON('weather.json', 1); + // save updated weather data if available and it has been an hour since last updated + if (weatherJson !== undefined && (data.time === undefined || (data.time + 3600000) < weatherJson.weather.time)) { + data = { + time: weatherJson.weather.time, + temp: weatherJson.weather.temp, + code: weatherJson.weather.code + }; + require("Storage").writeJSON('mtnclock.json', data); } } const _GB = global.GB; global.GB = (event) => { if (event.t==="weather") { - data = event; + data = { + temp: event.temp, + code: event.code, + time: Date.now() + }; require("Storage").write('mtnclock.json', event); setWeather(); } @@ -357,5 +364,6 @@ function queueDraw() { } queueDraw(); +readWeather(); setWeather(); Bangle.setUI("clock"); From 653756c9172976d10a8098e780db694c1a231f49 Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 21:48:53 -0700 Subject: [PATCH 36/38] Updated version and README --- apps/mtnclock/README.md | 2 +- apps/mtnclock/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/mtnclock/README.md b/apps/mtnclock/README.md index 58538509d..066230d4e 100644 --- a/apps/mtnclock/README.md +++ b/apps/mtnclock/README.md @@ -4,7 +4,7 @@ Based on the Pebble watchface Weather Land. Mountain Pass Clock changes depending on time (day/night) and weather conditions. -This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification). To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather. +This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification), or a Bangle app that will update weather.kson such as OWM Weather. To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather. The scene will change according to the following OpenWeatherMap conditions: clear, cloudy, overcast, lightning, drizzle, rain, fog and snow. Each weather condition has night/day scenes. diff --git a/apps/mtnclock/metadata.json b/apps/mtnclock/metadata.json index a3a173069..82a0cccab 100644 --- a/apps/mtnclock/metadata.json +++ b/apps/mtnclock/metadata.json @@ -2,7 +2,7 @@ "id": "mtnclock", "name": "Mountain Pass Clock", "shortName": "Mtn Clock", - "version": "0.01", + "version": "0.02", "description": "A clock that changes scenery based on time and weather.", "readme":"README.md", "icon": "app.png", From 959e376f099fce0dedca47b43ff97c970c2f5637 Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 21:57:52 -0700 Subject: [PATCH 37/38] Fixed typo --- apps/mtnclock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtnclock/README.md b/apps/mtnclock/README.md index 066230d4e..441754b83 100644 --- a/apps/mtnclock/README.md +++ b/apps/mtnclock/README.md @@ -4,7 +4,7 @@ Based on the Pebble watchface Weather Land. Mountain Pass Clock changes depending on time (day/night) and weather conditions. -This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification), or a Bangle app that will update weather.kson such as OWM Weather. To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather. +This clock requires Gadgetbridge and an app that Gadgetbridge can use to get the current weather from OpenWeatherMap (e.g. Weather Notification), or a Bangle app that will update weather.json such as OWM Weather. To set up Gadgetbridge and weather, see https://codeberg.org/Freeyourgadget/Gadgetbridge/wiki/Weather. The scene will change according to the following OpenWeatherMap conditions: clear, cloudy, overcast, lightning, drizzle, rain, fog and snow. Each weather condition has night/day scenes. From b2b299efc35e80ef23e07e22df62ed3e6abc38ee Mon Sep 17 00:00:00 2001 From: Sam Sorensen <825813+sabrsorensen@users.noreply.github.com> Date: Sun, 5 Feb 2023 21:59:29 -0700 Subject: [PATCH 38/38] Updated minimal weather data save from GB --- apps/mtnclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mtnclock/app.js b/apps/mtnclock/app.js index 996fe2cee..c6adc7706 100644 --- a/apps/mtnclock/app.js +++ b/apps/mtnclock/app.js @@ -344,7 +344,7 @@ global.GB = (event) => { code: event.code, time: Date.now() }; - require("Storage").write('mtnclock.json', event); + require("Storage").writeJSON('mtnclock.json', data); setWeather(); } if (_GB) setTimeout(_GB, 0, event);