From 6b09377414e02d575b8335bb051c831ecc9da9d9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Sat, 23 May 2020 13:28:06 +0100 Subject: [PATCH 01/39] Added workarounds for Apple's iOS browser --- js/appinfo.js | 8 ++++++-- js/index.js | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/js/appinfo.js b/js/appinfo.js index ad2611d19..54cc1b7af 100644 --- a/js/appinfo.js +++ b/js/appinfo.js @@ -1,5 +1,9 @@ -if (typeof btoa==="undefined") - function btoa(d) { return Buffer.from(d).toString('base64'); } +if (typeof btoa==="undefined") { + // Don't define btoa as a function here because Apple's + // iOS browser defines the function even though it's in + // an IF statement that is never executed! + btoa = function(d) { return BufferA.from(d).toString('base64'); } +} // Converts a string into most efficient way to send to Espruino (either json, base64, or compressed base64) function toJS(txt) { diff --git a/js/index.js b/js/index.js index 031391f52..9bb4c2d9d 100644 --- a/js/index.js +++ b/js/index.js @@ -24,8 +24,8 @@ httpGet("appdates.csv").then(csv=>{ document.querySelector(".sort-nav").classList.remove("hidden"); csv.split("\n").forEach(line=>{ var l = line.split(","); - appSortInfo[l[0]] = { - created : Date.parse(l[1]), + appSortInfo[l[0]] = { + created : Date.parse(l[1]), modified : Date.parse(l[2]) }; }); @@ -196,7 +196,8 @@ function showTab(tabname) { // =========================================== Library -var chips = Array.from(document.querySelectorAll('.filter-nav .chip')).map(chip => chip.attributes.filterid.value); +// Can't use chip.attributes.filterid.value here because Safari/Apple's WebView doesn't handle it +var chips = Array.from(document.querySelectorAll('.filter-nav .chip')).map(chip => chip.getAttribute("filterid")); var hash = window.location.hash ? window.location.hash.slice(1) : ''; var activeFilter = !!~chips.indexOf(hash) ? hash : ''; From 4aae9f8027eed7e2121fac512c354d72e1773683 Mon Sep 17 00:00:00 2001 From: Frans Meulenbroeks Date: Sat, 23 May 2020 10:49:54 +0200 Subject: [PATCH 02/39] Add github link to My Apps Add a link to the github page for apps in the My Apps tab --- js/index.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/js/index.js b/js/index.js index 9bb4c2d9d..24aa2e4cb 100644 --- a/js/index.js +++ b/js/index.js @@ -458,15 +458,20 @@ function getAppsToUpdate() { function refreshMyApps() { var panelbody = document.querySelector("#myappscontainer .panel-body"); panelbody.innerHTML = appsInstalled.map(appInstalled => { -var app = appNameToApp(appInstalled.id); -var version = getVersionInfo(app, appInstalled); -return `
+ var app = appNameToApp(appInstalled.id); + var version = getVersionInfo(app, appInstalled); + var username = "espruino"; + var githubMatch = window.location.href.match(/\/(\w+)\.github\.io/); + if(githubMatch) username = githubMatch[1]; + var url = `https://github.com/${username}/BangleApps/tree/master/apps/${app.id}`; + return `
${escapeHtml(app.name)}

${escapeHtml(app.name)} (${version.text})

${escapeHtml(app.description)}

+ See the code on GitHub
From 97989e2884e24414ce96b686894b5be589315c63 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:31:48 +0100 Subject: [PATCH 03/39] Created a timer for pizza --- apps.json | 15 ++ apps/pizzatimer/ChangeLog | 1 + apps/pizzatimer/README.md | 1 + apps/pizzatimer/app-icon.js | 1 + apps/pizzatimer/app.js | 273 ++++++++++++++++++++++++++++++++++++ apps/pizzatimer/pizza.png | Bin 0 -> 4210 bytes 6 files changed, 291 insertions(+) create mode 100644 apps/pizzatimer/ChangeLog create mode 100644 apps/pizzatimer/README.md create mode 100644 apps/pizzatimer/app-icon.js create mode 100644 apps/pizzatimer/app.js create mode 100644 apps/pizzatimer/pizza.png diff --git a/apps.json b/apps.json index 3386867cf..8f29ede49 100644 --- a/apps.json +++ b/apps.json @@ -1773,5 +1773,20 @@ "storage": [ {"name":"widviz.wid.js","url":"widget.js"} ] + }, + { + "id": "pizzatimer", + "name": "Pizza Timer", + "shortName":"PTimer", + "icon": "pizza.png", + "version":"0.01", + "description": "A timer app for when you cook Pizza. Some say it can also time other things", + "tags": "timer,tool,pizza", + "readme": "README.md", + "allow_emulator":true, + "storage": [ + {"name":"pizzatimer.app.js","url":"app.js"}, + {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/pizzatimer/ChangeLog b/apps/pizzatimer/ChangeLog new file mode 100644 index 000000000..3c3e41a33 --- /dev/null +++ b/apps/pizzatimer/ChangeLog @@ -0,0 +1 @@ +0.01: You can now time cooking a Pizza! \ No newline at end of file diff --git a/apps/pizzatimer/README.md b/apps/pizzatimer/README.md new file mode 100644 index 000000000..14f2e6bbb --- /dev/null +++ b/apps/pizzatimer/README.md @@ -0,0 +1 @@ +# Pizza Timer \ No newline at end of file diff --git a/apps/pizzatimer/app-icon.js b/apps/pizzatimer/app-icon.js new file mode 100644 index 000000000..936ef6e2a --- /dev/null +++ b/apps/pizzatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4AwgCzUgEFqtVDIcQDpkQgtO9wACqAfCoAYKCwIVD93kCQMQgAcDAA8F73tqEAAAQXC6Fe8owIiFO9peBpvdAAIRBgvdHQIwIggKBhsNCoPUF4UEgtAp3gFxHlhsFgvQptAFAMQGoPUhpmCLoouB7tArvV7tVC4QEBAIPuC40O8hECAAVVIwXQKIPQC4xGB8FNotEgBBBXIMQhtAIwPQpx4FiBGCotFgFd7vQBQIUBF4NAhwIBLwpGC6ovCEwMAhvUqvVgsOSAsNRoJcCCwKlCgsNPoIXBCAJ2FLwJ2EgpeBGgKOBD4MEVAkQr3QaAIxCqgvBiFUNAMES4SQERwNA6tdBoPVhpeBCYVQQYKXBC4veNQMECIR2CAoUFoB/CC4vugoJBUgIABBgMQgtNoEFbQMA91RC4wAEgALCYoVQ6HQ7wvFOoYAB6DaBBoSMBBAMApxHGgC9BBgPUprbBB4RLBO4NNC4tVgqMBoHQYgQcBDAcAoFUR4tQhvQKoQuBroDBDAZLBKAYXCCoKzCJYKtBb4QHBGQYXEp3gC4XUVIYFBAQVQGYgACr3gCYVFAQJgCAwIKB6kEqAYFh3lU4JBCAQLDDUwNAH4IvFgnuhtF6FdCAJFDggGBgvuoAXFVANQC4NVhoxBqAUBPAVe9xfGPAKfBIgNNgsNhtVGAPVFwPlC40RhvkIgQqCLgQFBpw9BCwzHBKIKRFAANQIoIuIJAIwBgFUCodFgFd93tdggwGpwYBAAhEBIoIuIDAnu6lEolNCoIWNDAVUCYQAB6sACxoYCgEFqtQAgIVOAH4AC")) \ No newline at end of file diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js new file mode 100644 index 000000000..aac908cc9 --- /dev/null +++ b/apps/pizzatimer/app.js @@ -0,0 +1,273 @@ +/* UI GLOBALS */ + +const HOUR_SCENE = 0; +const MIN_SCENE = 1; +const SEC_SCENE = 2; +const COUNTDOWN_SCENE = 3; + +var currentScene = 0; + +var btn1Watch; +var btn2Watch; +var btn3Watch; + +var drawInterval; + +/* STATE GLOBALS */ + +var menuTime = new Uint8Array([0,0,0]); +var countdownTime = menuTime.slice(0); +var show = [true, true, true]; + +/* COUNTDOWN CONSTANTS */ + +const HOUR_INDEX = 0; +const MIN_INDEX = 1; +const SEC_INDEX = 2; + +var flashIndex = HOUR_INDEX; + +/* logic */ + +function setCountdownTime() { + countdownTime = menuTime.slice(0); +} + +function countDownFinished() { + return countdownTime[HOUR_INDEX] <= 0 && + countdownTime[MIN_INDEX] <= 0 && + countdownTime[SEC_INDEX] <= 0; +} + +function alertCountdownFinished() { + if (drawInterval) return; + Bangle.buzz() + .then(() => new Promise(resolve => setTimeout(resolve, 200))) + .then(() => Bangle.buzz()); + setTimeout(alertCountdownFinished, 2000); +} + +function unsetDrawInterval() { + clearInterval(drawInterval); + drawInterval = undefined; +} + +function decrementCountdownTime() { + const allZero = countDownFinished(); + + if(allZero) { + return; + } + + if (countdownTime[SEC_INDEX] !== 0) { + countdownTime[SEC_INDEX] = countdownTime[SEC_INDEX] - 1; + return; + } + + countdownTime[SEC_INDEX] = 59; + + if (countdownTime[MIN_INDEX] !== 0) { + countdownTime[MIN_INDEX] = countdownTime[MIN_INDEX] - 1; + return; + } + + countdownTime[MIN_INDEX] = 59; + + if (countdownTime[HOUR_INDEX] !== 0) { + countdownTime[HOUR_INDEX] = countdownTime[HOUR_INDEX] - 1; + return; + } +} + +function toggleShow(timeIndex) { + show[timeIndex] = !show[timeIndex]; +} + +function twoPadded(i) { + return i.length < 2 ? "0" + i : i; +} + +function getTimeString(t) { + let hour = t[HOUR_INDEX].toString(); + let min = t[MIN_INDEX].toString(); + let sec = t[SEC_INDEX].toString(); + + hour = show[HOUR_INDEX] ? twoPadded(hour) : " "; + min = show[MIN_INDEX] ? twoPadded(min) : " "; + sec = show[SEC_INDEX] ? twoPadded(sec) : " "; + + return hour + ":" + min + ":" + sec; +} + +/* drawing */ + +/* + shamelessly stollen from Bluetooth Music Controls + https://github.com/espruino/BangleApps/blob/6b09377414e02d575b8335bb051c831ecc9da9d9/apps/hidmsic/hid-music.js#L42 +*/ +function drawArrows() { + function c(a) { + return { + width: 8, + height: a.length, + bpp: 1, + buffer: (new Uint8Array(a)).buffer + }; + } + const d = g.getWidth() - 18; + g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); + g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); + g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); +} + +function drawTime(input) { + g.clear(); + g.setFontAlign(0,0); + g.setFont("4x6",5); + g.drawString(input, g.getWidth() / 2, g.getHeight() / 2); +} + +function drawMenu() { + const timeString = getTimeString(menuTime); + drawTime(timeString); + drawArrows(); +} + +function drawCountdown() { + const timeString = getTimeString(countdownTime); + drawTime(timeString); +} + +/* button callbacks */ + +function getMaxSelectableTime() { + return flashIndex === HOUR_INDEX ? 23 : 59; +} + +/* btn1 */ + +function incrementMenuTime() { + const maxTime = getMaxSelectableTime(); + const currentTime = menuTime[flashIndex]; + const newTime = currentTime < maxTime ? currentTime + 1 : 0; + menuTime[flashIndex] = newTime; +} + +/* btn2 */ + +function incrementScene() { + currentScene++; +} + +function incrementFlashIndex() { + flashIndex++; +} + +function showAll() { + for(var i = 0; i < show.length; i++) { + show[i] = true; + } +} + +function showFlashIndex() { + show[flashIndex] = true; +} + +function hideFlashIndex() { + show[flashIndex] = false; +} + +function next() { + incrementScene(); + + if (currentScene === COUNTDOWN_SCENE) { + showAll(); + startCountdownScene(); + } else { + showFlashIndex(); + incrementFlashIndex(); + hideFlashIndex(); + } +} + +/* btn3 */ + +function decrementMenuTime() { + const maxTime = getMaxSelectableTime(); + const currentTime = menuTime[flashIndex]; + const newTime = currentTime > 0 ? currentTime - 1 : maxTime; + menuTime[flashIndex] = newTime; +} + +/* watches */ + +function setupMenuWatches() { + clearWatch(); + btn1Watch = setWatch(incrementMenuTime, BTN1, {repeat: true}); + btn2Watch = setWatch(next, BTN2, {repeat: true}); + btn3Watch = setWatch(decrementMenuTime, BTN3, {repeat: true}); +} + +function setupCountdownWatches() { + clearWatch(); + btn2Watch = setWatch(main, BTN2, {repeat: true}); +} + +/* scenes */ + +function menu() { + drawMenu(); + toggleShow(flashIndex); +} + +function countdown() { + decrementCountdownTime(); + drawCountdown(); + + if (countDownFinished()) { + unsetDrawInterval(); + alertCountdownFinished(); + } +} + +/* init */ + +function unsetDrawInterval() { + if (!drawInterval) return; + clearInterval(drawInterval); + drawInterval = undefined; +} + +function startMenuScene() { + g.flip(); + Bangle.buzz(); + setupMenuWatches(); + unsetDrawInterval(); + menu(); + drawInterval = setInterval(menu, 500); +} + +function startCountdownScene() { + Bangle.beep(); + setupCountdownWatches(); + unsetDrawInterval(); + setCountdownTime(); + showAll(); + drawCountdown(); + drawInterval = setInterval(countdown, 1000); +} + +/* main */ + +function reset() { + currentScene = 0; + flashIndex = HOUR_INDEX; + hideFlashIndex(); +} + +function main() { + reset(); + startMenuScene(); +} + +main(); diff --git a/apps/pizzatimer/pizza.png b/apps/pizzatimer/pizza.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a083633a83da864fc15b425a935958739bf34d GIT binary patch literal 4210 zcmV-&5RLDNP)kH5Csw1_UWUwTYL(Ntum;Hh@!1BBt!<2NFtdCB%v}7l~g5_numMO`%#I8 zbO5z|f8JuRRcqBc!#>}>-#Ono-#NflT*Xyf#Z~+VAioih5x^(_!vRDBPy_G*=m1aw zprGgfZ;t;&KsaA8y?$kfgGvD0g|O$Y2<8_Ut^=@*Avm&PF0b!8sFj`As+xRj z7I*FCjCXpd^JICb%Gw1UfVP{$%V2BZTqzuE9UZ@0CE6a`wMKlB1QwK z8$FcG>o}n86mxV`%+b;FJ2iF7X7f42V%ZZ)8L40yG!ueO04@Nu=NI4@QUkyPU`8L# zc`7L>@7fsemvN-}p?Q36FYmfP%8mnQ05IrEhW(r=bRz*idU=Js;^F!H1OOcqt}xg0`ZCqPH(l!RsiI9r~Hb9*)?(2fo9ZqMcf+WXtNAhI|~FDc+zVgc|*AKp1K zj#Rxh&sfM1v@RQ~I-0+7Pz^)S{@O$GlVXmJy1&wRB`g{M%>K2;M+0cy{+Obm*Z9m7 z_L!O{CFj<}G#V6a;S_^BhaqTNJ5_tqu`xc#60{UPXs-5bPN1h&nyUz4zb8(ehw$7_ z=;7r6RBpS&_?>M-yr=Y$m^#PCc)w?J0^RqAs56AX*1S(^6?1fS(|xiN08U=c$jdF_ zSLSAM=a=3r%>;nC>s+~&7BQmc$=IYgoh0VNMMmzl%coy5Mpe2xOFNtpLY|%;QIlrk zk^x}-H=PX=B4niv-jE339RPJbybl-^jC;{_%5m*3vFpB%J8JLR)qc|96CF3D$VZNe z<;(Bd=q?9Q-`pTAXz-uwOR{#VR`Xq_?^*!=>@gky zHjEg=Rc0m1(u$jcRSvIc{$z}K?As$vrmBumJOCu=B{4k~bNR6V@Yw6#Q%O3me)e$1XaI0{#bC89L@KNS$NEF|#<4nC`Pc|q(VO2n zTl$h@#`1|2U;+HSrzj1;3PA)507@Pl0LcTT*8D}qtsTimNdo}vDt4Xj_R)y$e#) z=kK)UeO>7tydXwhv!~9P3;^j#OuUpseISSogpVVa6<`2xa;YZIChOl-`=bV+SaacI^+0{Ty($uUM!YS54f z0N8%eZ(N9(va?4? z+yGG9DztaIsCm(Ks*y#FfpbyM)q9iw+9bX9mFANoh1j2H>E4dK(~bUfIyuw6rmQ_0 z;ZtQ0!0HGE)3qp5*>PZr$@;)}%|rlLHAx%m2|_aVAI--PRCtO2K*143^1Qk!h5q4&gv>Spo5rGgvbK96lWijf)Sj z1$U5=)17{Gk;7LfQ1DtAxoGXIou*4~cseddCuekNCXNAc2;p=8bcR64ulL(SB0_!p z6t@J-lZ`UxoM=@POW3yX zw1fkI1NTHtm^_T{UUa5aGIO}BZst(=$i5^|N=C2Xh!OzymbkSD$9@3VD^fi4$mez@ z;@LXe&2P8mA?n(dkht)&L;&xx^2J2u1%c8{1= zG%dlEc*NrGbW)FALkwLmZ~(e5=K+>5@bs-bRqq=%{o zOC$`~;ZfXoX~$|?2oNZ)4mATnbBACAP<=T8UJ{NP005pbVMsB>kvN3Z3Ga9 zaFUY)U?G6P)wbYAckgMJ>DSlSy`1N$v3ta>f(OmlzdT#t&2yxqx{9tU9O0>l&fqt92YRS)k~Wvc%s@wBl1+o=Qr{^S_H2r;rjQ zA!u8fq*G2Y$hg$px^#Dl9!7Xq-38!d0Bt>9$pH{u(&Aq__g(9K0ESyW4xN`sAOJYf z-+18SRZRihK5vRN7-M9N8U+cy^JRc-To*za}7fo6830?HPo;@->FKBkhG;oOJjx@q-FOUwGQ51?`R28a5YcFVz^0atLg|2 zw|T@(0OkTn>X{K202~4EDuDfg5YGAn@FSejInfXOPk8TcUM3s-)IwR7Ac9J#cezU* zHhYo{T+~47KP~qZSF{D)%dc0bMaY?d+a>$L>JnQ{)_Uuw4p9u(@I>8P?iZ-%(0On9 zdqr-?af{E;p-z z>ip-*T7!=J$Eio?ZZ&bVvm zk5tA;St1)6$;HecsT`acE9=_zgG=$oBMNJD1f#EQ6{mOuNJ4m;4T%0b@zah}UzSOu`F|o!%hz0Kix0y=UjV+lJAvwlwwc(~GrV z*%dAuNN$ZU?MzGHLT`C#YrryVN2}?%#j?^r&6bYewnjchqhx#liY~=9kbnx2qUE1o z1x^FNqj&NdtxhrdtTottsLETq`ZIg3H%PrterfkCFsm!dvJWjKz5{rJRJ(exPQ`+Ft!}{!02X_wdBWBfe*O*InRS1Z zO#*M@%yKy>hkK>#@PwbeOHVs zXYDom69llIUOmVXqm|?nz{azr+Os)7o|2%O zX;K#ND0Kap(b+b{4|8owh{|7Sp1kE)_xCq!Ycs8$$5(!|UYXt7CTpd$&=;U30N%Zl zfJ@y<+{7?=r~U&C%#n;~&yir!A2z#_K3@{maYM3v$Uq$uUuY>;p%@aa zmKXt`-7VT9l|Nm#)YyV;%lF%>Pgs1Tu1}YI|K*Fy>okgRNTn3?&h_qN`@Rjv0GJA( z@k+*DNdN=jJ&lr#s(4o&X*MuXM~gxgbDnmyp&%3suT?hQKTaJ#Vvsb3T!JMe0u^n+ zhFwLj#t%ze%67Lnc+4=iXxBPr;x#c$d~Z8zC$(R{!c}Ey6@c)2gZ1Yaes+<7=qwCO#6sHRy+B>++Jq*=|gK>(1l@OT2Eywgkd0f9!d4BAr? z*b9rMbNKUZ{3w+?oHqb~KM4ObZ+r8%?DY>5MeGEy7Qf(e63tUTwsCWBm48ji_ zM-YAo`wG9&qu+1wN*N6x9Y8DqQ@^@KgtMqBgzt&2;{P4~7urn+a literal 0 HcmV?d00001 From 2205660600fa5237a5fe20f90f93b29e46a7d682 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:38:25 +0100 Subject: [PATCH 04/39] emulator --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index 8f29ede49..012a56c6f 100644 --- a/apps.json +++ b/apps.json @@ -1783,7 +1783,6 @@ "description": "A timer app for when you cook Pizza. Some say it can also time other things", "tags": "timer,tool,pizza", "readme": "README.md", - "allow_emulator":true, "storage": [ {"name":"pizzatimer.app.js","url":"app.js"}, {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} From 6e14fc851d11faaa65c5c26d44f52ad319873918 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:42:06 +0100 Subject: [PATCH 05/39] Removed debugging buzzes --- apps/pizzatimer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js index aac908cc9..abd31bcc5 100644 --- a/apps/pizzatimer/app.js +++ b/apps/pizzatimer/app.js @@ -226,6 +226,7 @@ function countdown() { if (countDownFinished()) { unsetDrawInterval(); + g.flip(); alertCountdownFinished(); } } @@ -248,7 +249,6 @@ function startMenuScene() { } function startCountdownScene() { - Bangle.beep(); setupCountdownWatches(); unsetDrawInterval(); setCountdownTime(); From 9990beeeac6c34abb73fce108b9ad03034f3c806 Mon Sep 17 00:00:00 2001 From: Adam Brewer Date: Sat, 23 May 2020 16:43:50 +0100 Subject: [PATCH 06/39] Updated short name --- apps.json | 2 +- apps/pizzatimer/app.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 012a56c6f..787781278 100644 --- a/apps.json +++ b/apps.json @@ -1777,7 +1777,7 @@ { "id": "pizzatimer", "name": "Pizza Timer", - "shortName":"PTimer", + "shortName":"Pizza Timer", "icon": "pizza.png", "version":"0.01", "description": "A timer app for when you cook Pizza. Some say it can also time other things", diff --git a/apps/pizzatimer/app.js b/apps/pizzatimer/app.js index abd31bcc5..2779124fd 100644 --- a/apps/pizzatimer/app.js +++ b/apps/pizzatimer/app.js @@ -226,7 +226,6 @@ function countdown() { if (countDownFinished()) { unsetDrawInterval(); - g.flip(); alertCountdownFinished(); } } @@ -240,8 +239,6 @@ function unsetDrawInterval() { } function startMenuScene() { - g.flip(); - Bangle.buzz(); setupMenuWatches(); unsetDrawInterval(); menu(); From 64a7a8f14747005ac17956e37f402466f752b0c8 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 18:42:52 +0200 Subject: [PATCH 07/39] Added settings. Changed size to better fit the screen of the physical device. Added date display. --- apps.json | 9 ++++++-- apps/berlinc/ChangeLog | 1 + apps/berlinc/berlin-clock.js | 39 ++++++++++++++++++++++------------ apps/berlinc/berlin-clock.json | 3 +++ apps/berlinc/settings.js | 16 ++++++++++++++ 5 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 apps/berlinc/berlin-clock.json create mode 100644 apps/berlinc/settings.js diff --git a/apps.json b/apps.json index 07cedf21a..08a79710a 100644 --- a/apps.json +++ b/apps.json @@ -887,14 +887,19 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.02", + "version":"0.03", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", "allow_emulator":true, + "data": [ + {"name":"berlin-clock.json"} + ], "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} + {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, + {"name":"berlinc.settings.js","url":"settings.js"}, + ] }, { "id": "ctrclk", diff --git a/apps/berlinc/ChangeLog b/apps/berlinc/ChangeLog index 7819dbe2a..f333911b4 100644 --- a/apps/berlinc/ChangeLog +++ b/apps/berlinc/ChangeLog @@ -1 +1,2 @@ 0.02: Modified for use with new bootloader and firmware +0.03: Shrinked size to avoid cut off edges on the physical device. Added date and settings. diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 93b584f66..544ccce64 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -1,29 +1,42 @@ -// place your const, vars, functions or classes here -fields = [ 4 , 4 , 11 , 4 ]; -width = g.getWidth(); -height = g.getHeight(); -rowHeight = height/4; +// Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr +const fields = [ 4 , 4 , 11 , 4 ]; +const offset = 20; +const width = g.getWidth() - 2*offset; +const height = g.getHeight() - 2*offset; +const rowHeight = height/4; + +//const settings = require("Storage").readJSON("berlin-clock.json", 1); +const show_date = true; // settings.show_date || true; + rowlights = []; function drawBerlinClock() { + g.clear(); + var now = new Date(); + if (show_date) { + var yr = now.getFullYear(); + var month = now.getMonth()+1; + var day = now.getDate(); + var dateString=`${yr}-${month<10?'0':''}${month}-${day<10?'0':''}${day}`; + var strWidth = g.stringWidth(dateString); + g.drawString(dateString,(g.getWidth()-strWidth)/2,height+offset+2); + } rowlights[0] = Math.floor(now.getHours() / 5); rowlights[1] = now.getHours() % 5; rowlights[2] = Math.floor(now.getMinutes() / 5); rowlights[3] = now.getMinutes() % 5; - - g.clear(); - - g.drawRect(0,0,width,height); + + g.drawRect(offset,offset,width+offset,height+offset); for (row = 0 ; row < 4 ; row++) { nfields = fields[row]; boxWidth = width/nfields; for (col = 0 ; col < nfields ; col++) { - x1 = col*boxWidth; - y1 = row*rowHeight; - x2 = (col+1)*boxWidth; - y2 = (row+1)*rowHeight; + x1 = col*boxWidth + offset ; + y1 = row*rowHeight + offset; + x2 = (col+1)*boxWidth + offset; + y2 = (row+1)*rowHeight + offset; g.setColor(1,1,1); g.drawRect(x1,y1,x2,y2); diff --git a/apps/berlinc/berlin-clock.json b/apps/berlinc/berlin-clock.json new file mode 100644 index 000000000..f11df27ed --- /dev/null +++ b/apps/berlinc/berlin-clock.json @@ -0,0 +1,3 @@ +{ + "show_date" : false +} \ No newline at end of file diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js new file mode 100644 index 000000000..b08df63fc --- /dev/null +++ b/apps/berlinc/settings.js @@ -0,0 +1,16 @@ +(function(back) { + let settings = require('Storage').readJSON('berlin-clock.json',1)||{}; + function save(key, value) { + settings[key] = value; + require('Storage').write('berlin-clock.json',settings); + } + const appMenu = { + '': {'title': 'Berlin Clock Settings'}, + '< Back': back, + 'Show Date': { + value: settings.show_date||false, + onchange: (m) => {save('show_date', m)} + } + }; + E.showMenu(appMenu) + }) \ No newline at end of file From 013a5e9e2ab5f5a19c1689c3cb5bac4262fe20cc Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 19:09:44 +0200 Subject: [PATCH 08/39] Corrected problem with apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 969267bc8..935a25e28 100644 --- a/apps.json +++ b/apps.json @@ -898,8 +898,7 @@ "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, - {"name":"berlinc.settings.js","url":"settings.js"}, - + {"name":"berlinc.settings.js","url":"settings.js"} ] }, { "id": "ctrclk", From f8a830c69634655ce4c9ce6426aead90af64009c Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 19:17:42 +0200 Subject: [PATCH 09/39] try to fix corrupt apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 935a25e28..e05500483 100644 --- a/apps.json +++ b/apps.json @@ -892,7 +892,7 @@ "tags": "clock", "type":"clock", "allow_emulator":true, - "data": [ + "data": [ {"name":"berlin-clock.json"} ], "storage": [ From e253e9d2c29f112c31bf2cb73602b9e282e59f08 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 19:54:24 +0200 Subject: [PATCH 10/39] Corrected Settings. Set Color for date always to white. --- apps/berlinc/berlin-clock.js | 2 +- apps/berlinc/settings.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 544ccce64..db4b5bbb9 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -12,7 +12,6 @@ rowlights = []; function drawBerlinClock() { g.clear(); - var now = new Date(); if (show_date) { var yr = now.getFullYear(); @@ -20,6 +19,7 @@ function drawBerlinClock() { var day = now.getDate(); var dateString=`${yr}-${month<10?'0':''}${month}-${day<10?'0':''}${day}`; var strWidth = g.stringWidth(dateString); + g.setColor(1,1,1); g.drawString(dateString,(g.getWidth()-strWidth)/2,height+offset+2); } rowlights[0] = Math.floor(now.getHours() / 5); diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index b08df63fc..6a785a4d4 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -9,7 +9,8 @@ '< Back': back, 'Show Date': { value: settings.show_date||false, - onchange: (m) => {save('show_date', m)} + format: v => v?'On':'Off', + onchange: v => {save('show_date', v)} } }; E.showMenu(appMenu) From 8bc72576a005236ff3173f12a8bb1184165e13e5 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 20:24:10 +0200 Subject: [PATCH 11/39] Enabled reading of settings. --- apps/berlinc/berlin-clock.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index db4b5bbb9..90c6cdeb7 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -5,8 +5,8 @@ const width = g.getWidth() - 2*offset; const height = g.getHeight() - 2*offset; const rowHeight = height/4; -//const settings = require("Storage").readJSON("berlin-clock.json", 1); -const show_date = true; // settings.show_date || true; +settings = require("Storage").readJSON("berlin-clock.json", 1); +const show_date = settings.show_date || false; rowlights = []; From da05661e34757e971c156d8d58e9ec275276809b Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 21:13:07 +0200 Subject: [PATCH 12/39] Fix settings --- apps/berlinc/berlin-clock.js | 3 +-- apps/berlinc/berlin-clock.json | 2 +- apps/berlinc/settings.js | 6 ++++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 90c6cdeb7..b205d87ed 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -5,8 +5,7 @@ const width = g.getWidth() - 2*offset; const height = g.getHeight() - 2*offset; const rowHeight = height/4; -settings = require("Storage").readJSON("berlin-clock.json", 1); -const show_date = settings.show_date || false; +const show_date = (require('Storage').readJSON('berlin-clock.json', 1) || {})['showdate']; rowlights = []; diff --git a/apps/berlinc/berlin-clock.json b/apps/berlinc/berlin-clock.json index f11df27ed..08c6dc9d4 100644 --- a/apps/berlinc/berlin-clock.json +++ b/apps/berlinc/berlin-clock.json @@ -1,3 +1,3 @@ { - "show_date" : false + "showdate" : false } \ No newline at end of file diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index 6a785a4d4..6abbf70c7 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -6,12 +6,14 @@ } const appMenu = { '': {'title': 'Berlin Clock Settings'}, - '< Back': back, + '< Back': back + /*, 'Show Date': { value: settings.show_date||false, format: v => v?'On':'Off', - onchange: v => {save('show_date', v)} + onchange: v => {save('showdate', v)} } + */ }; E.showMenu(appMenu) }) \ No newline at end of file From d8489a0e8a0ecbbc592a3aef833cfb1932d28bcb Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 21:31:16 +0200 Subject: [PATCH 13/39] Re-Wrote settings --- apps/berlinc/settings.js | 50 ++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index 6abbf70c7..90579c84c 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -1,19 +1,35 @@ (function(back) { - let settings = require('Storage').readJSON('berlin-clock.json',1)||{}; - function save(key, value) { - settings[key] = value; - require('Storage').write('berlin-clock.json',settings); + const SETTINGS_FILE = 'berlin-clock.json' + + // initialize structure + let s = { + 'showdate' : false + } + + const storage = require('Storage') + const savedsettings = storage.readJSON(SETTINGS_FILE,1) || {} + // read values from storage (if any) + for (const key in savedsettings) { + s[key]=savedsettings[key] + } + + function save (key) { + return function(value) { + s[key]=value; + storage.write(SETTINGS_FILE,s); } - const appMenu = { - '': {'title': 'Berlin Clock Settings'}, - '< Back': back - /*, - 'Show Date': { - value: settings.show_date||false, - format: v => v?'On':'Off', - onchange: v => {save('showdate', v)} - } - */ - }; - E.showMenu(appMenu) - }) \ No newline at end of file + } + + const booleanFormat = b => ( b ? 'on':'off' ) + + const menu = { + '' : { 'title' : 'Berlin Clock Settings'} , + '< Back' : back, + 'Show Date' : { + value : s.showdate, + format: booleanFormat, + onChange: save('showdat'), + }, + } + E.showMenu(menu) +}) \ No newline at end of file From b69c9e0c26f7f9c78d3ea641e41792ff5edf3281 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 21:45:25 +0200 Subject: [PATCH 14/39] Added json to storage structure --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e05500483..7be3dfe7b 100644 --- a/apps.json +++ b/apps.json @@ -898,7 +898,8 @@ "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, - {"name":"berlinc.settings.js","url":"settings.js"} + {"name":"berlinc.settings.js","url":"settings.js"}, + {"name":"berlin-clock.json","url":"berlin-clock.json"} ] }, { "id": "ctrclk", From 1bf355c8f0b3b8b402ff7db2330e98a381471f01 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sat, 23 May 2020 21:48:43 +0200 Subject: [PATCH 15/39] Temporarily added minor version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7be3dfe7b..318648004 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03", + "version":"0.03.01", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", From 388e1c792e51fa01f8f1501621d3eaaf3839e8b3 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Fri, 22 May 2020 22:57:32 -0400 Subject: [PATCH 16/39] weather: adjust widget height --- apps/weather/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/weather/widget.js b/apps/weather/widget.js index e02591543..79eba7251 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -3,9 +3,9 @@ const w = require('weather').load() if (!w) return; g.reset(); - g.setColor(0).fillRect(this.x, this.y, this.x+this.width, this.y+24) + g.setColor(0).fillRect(this.x, this.y, this.x+this.width-1, this.y+23) if (w.txt) { - require('weather').drawIcon(w.txt, this.x+10, this.y+8, 8); + require('weather').drawIcon(w.txt, this.x+10, this.y+8, 7.5); } if (w.temp) { let t = require('locale').temp(w.temp-273.15); // applies conversion From 18214da1f455e841d616305e88b6f92c33326ee6 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Fri, 22 May 2020 23:36:56 -0400 Subject: [PATCH 17/39] weather: draw widget if needed on LCD on --- apps/weather/widget.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/weather/widget.js b/apps/weather/widget.js index 79eba7251..9c3823445 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -17,6 +17,8 @@ } } + var dirty = false; + function update(weather) { require('weather').save(weather); if (!WIDGETS["weather"].width) { @@ -24,9 +26,18 @@ Bangle.drawWidgets() } else if (Bangle.isLCDOn()) { WIDGETS["weather"].draw() + } else { + dirty = true; } } + Bangle.on('lcdPower', (on) => { + if (on && dirty) { + WIDGETS["weather"].draw(); + dirty = false; + } + }); + const _GB = global.GB; global.GB = (event) => { if (event.t==="weather") update(event); From 3e4ac82b90c14f0a84fd1e9fad61748492770e72 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Fri, 22 May 2020 23:53:42 -0400 Subject: [PATCH 18/39] weather: add semicolons, replace substr with match --- apps/weather/app.js | 2 +- apps/weather/lib.js | 14 +++++++------- apps/weather/widget.js | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 8493144f7..209d147f3 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -50,5 +50,5 @@ } // Show launcher when middle button pressed - setWatch(Bangle.showLauncher, BTN2, {repeat: false, edge: 'falling'}) + setWatch(Bangle.showLauncher, BTN2, {repeat: false, edge: 'falling'}); })() diff --git a/apps/weather/lib.js b/apps/weather/lib.js index f87984fe5..28d44bc33 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -1,13 +1,13 @@ exports = { save: weather => { - let json = require('Storage').readJSON('weather.json')||{} - json.weather = Object.assign({}, weather) // don't mutate GB events - delete json.weather.t // don't save the event type (if present) - require('Storage').write('weather.json', json) + let json = require('Storage').readJSON('weather.json')||{}; + json.weather = Object.assign({}, weather); // don't mutate GB events + delete json.weather.t; // don't save the event type (if present) + require('Storage').write('weather.json', json); }, load: () => { - let json = require('Storage').readJSON('weather.json')||{} - return json.weather + let json = require('Storage').readJSON('weather.json')||{}; + return json.weather; }, drawIcon: (cond, x, y, r) => { function drawSun(x, y, r) { @@ -171,6 +171,6 @@ exports = { return drawMist; } - chooseIcon(cond)(x, y, r) + chooseIcon(cond)(x, y, r); }, } diff --git a/apps/weather/widget.js b/apps/weather/widget.js index 9c3823445..25b3adc9c 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -1,19 +1,19 @@ (() => { function draw() { - const w = require('weather').load() + const w = require('weather').load(); if (!w) return; g.reset(); - g.setColor(0).fillRect(this.x, this.y, this.x+this.width-1, this.y+23) + g.setColor(0).fillRect(this.x, this.y, this.x+this.width-1, this.y+23); if (w.txt) { require('weather').drawIcon(w.txt, this.x+10, this.y+8, 7.5); } if (w.temp) { let t = require('locale').temp(w.temp-273.15); // applies conversion - t = t.substr(0, t.length-2); // but we have no room for units + t = t.match(/[\d\-]*/)[0]; // but we have no room for units g.setFontAlign(0, 1); // center horizontally at bottom of widget g.setFont('6x8', 1); - g.setColor(-1) - g.drawString(t, this.x+10, this.y+24) + g.setColor(-1); + g.drawString(t, this.x+10, this.y+24); } } @@ -22,10 +22,10 @@ function update(weather) { require('weather').save(weather); if (!WIDGETS["weather"].width) { - WIDGETS["weather"].width = 20 - Bangle.drawWidgets() + WIDGETS["weather"].width = 20; + Bangle.drawWidgets(); } else if (Bangle.isLCDOn()) { - WIDGETS["weather"].draw() + WIDGETS["weather"].draw(); } else { dirty = true; } @@ -46,6 +46,6 @@ WIDGETS["weather"] = {area: "tl", width: 20, draw: draw}; if (!require('weather').load()) { - WIDGETS["weather"].width = 0 + WIDGETS["weather"].width = 0; } })(); From 3693d6ebce1275c725e99479c824d8724cd63086 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Sat, 23 May 2020 00:44:31 -0400 Subject: [PATCH 19/39] weather: show time since last weather update --- apps/weather/app.js | 39 ++++++++++++++++++++++++++++++++++++++- apps/weather/lib.js | 1 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 209d147f3..e529519b6 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -1,4 +1,12 @@ (() => { + function formatDuration(millis) { + let pluralize = (n, w) => n + " " + w + (n == 1 ? "" : "s"); + if (millis < 60000) return pluralize(Math.floor(millis/1000), "second"); + if (millis < 3600000) return pluralize(Math.floor(millis/60000), "minute"); + if (millis < 86400000) return pluralize(Math.floor(millis/3600000), "hour"); + return pluralize(Math.floor(millis/86400000), "day"); + } + function draw(w) { g.reset(); g.setColor(0).fillRect(0, 24, 239, 239); @@ -30,20 +38,49 @@ g.setFont("6x8", 1).setFontAlign(0, 0, 0); g.drawString(w.txt.charAt(0).toUpperCase()+w.txt.slice(1), 120, 190); + drawUpdateTime(w); + g.flip(); } + let updateTime = undefined; + + function drawUpdateTime(w) { + if (!updateTime) return; + let text = `Last update received ${formatDuration(Date.now() - updateTime)} ago`; + g.reset(); + g.setColor(0).fillRect(0, 202, 239, 210); + g.setColor(-1).setFont("6x8", 1).setFontAlign(0, 0, 0); + g.drawString(text, 120, 206); + } + const _GB = global.GB; global.GB = (event) => { - if (event.t==="weather") draw(event); + if (event.t==="weather") { + updateTime = Date.now(); + draw(event); + } if (_GB) setTimeout(_GB, 0, event); }; + let interval = setInterval(drawUpdateTime, 1000); + Bangle.on('lcdPower', (on) => { + if (interval) { + clearInterval(interval); + interval = undefined; + } + if (on) { + drawUpdateTime(); + interval = setInterval(drawUpdateTime, 1000); + } + }); + Bangle.loadWidgets(); Bangle.drawWidgets(); const weather = require('weather').load(); if (weather) { + updateTime = weather.time; draw(weather); } else { E.showMessage('Weather unknown\n\nIs Gadgetbridge\nconnected?'); diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 28d44bc33..a227cd0e2 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -3,6 +3,7 @@ exports = { let json = require('Storage').readJSON('weather.json')||{}; json.weather = Object.assign({}, weather); // don't mutate GB events delete json.weather.t; // don't save the event type (if present) + json.weather.time = Date.now(); require('Storage').write('weather.json', json); }, load: () => { From eed9868b76acb461855e28fbcedf108a6efc6a91 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Sat, 23 May 2020 22:37:38 -0400 Subject: [PATCH 20/39] weather: delete stale weather data --- apps.json | 3 ++- apps/weather/lib.js | 21 +++++++++++++++++++++ apps/weather/settings.js | 24 ++++++++++++++++++++++++ apps/weather/widget.js | 5 +++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 apps/weather/settings.js diff --git a/apps.json b/apps.json index 3386867cf..f1ca85f8e 100644 --- a/apps.json +++ b/apps.json @@ -392,7 +392,8 @@ {"name":"weather.app.js","url":"app.js"}, {"name":"weather.wid.js","url":"widget.js"}, {"name":"weather","url":"lib.js"}, - {"name":"weather.img","url":"icon.js","evaluate":true} + {"name":"weather.img","url":"icon.js","evaluate":true}, + {"name":"weather.settings.js","url":"settings.js"} ], "data": [ {"name": "weather.json"} diff --git a/apps/weather/lib.js b/apps/weather/lib.js index a227cd0e2..6ed9ae292 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -1,3 +1,21 @@ +let expiryTimeout = undefined; +function updateExpiry(json) { + if (expiryTimeout) { + clearTimeout(expiryTimeout); + expiryTimeout = undefined; + } + if (json.weather && json.weather.time && json.expiry) { + let t = json.weather.time + json.expiry - Date.now(); + expiryTimeout = setTimeout(() => { + expiryTimeout = undefined; + let json = require('Storage').readJSON('weather.json')||{}; + delete json.weather; + require('Storage').write('weather.json', json); + exports.emit("expiry"); + }, t); + } +} + exports = { save: weather => { let json = require('Storage').readJSON('weather.json')||{}; @@ -5,6 +23,7 @@ exports = { delete json.weather.t; // don't save the event type (if present) json.weather.time = Date.now(); require('Storage').write('weather.json', json); + updateExpiry(json); }, load: () => { let json = require('Storage').readJSON('weather.json')||{}; @@ -175,3 +194,5 @@ exports = { chooseIcon(cond)(x, y, r); }, } + +updateExpiry(require('Storage').readJSON('weather.json')||{}); diff --git a/apps/weather/settings.js b/apps/weather/settings.js new file mode 100644 index 000000000..1cc097e3a --- /dev/null +++ b/apps/weather/settings.js @@ -0,0 +1,24 @@ +(function(back) { + const storage = require('Storage'); + let settings = storage.readJSON('weather.json', 1) || {}; + function save(key, value) { + settings[key] = value; + storage.write('weather.json', settings); + } + E.showMenu({ + '': { 'title': 'Weather' }, + 'Expiry': { + value: "expiry" in settings ? settings["expiry"] : 2*3600000, + min: 0, + max : 24*3600000, + step: 15*60000, + format: x => { + if (x == 0) return "none"; + if (x < 3600000) return Math.floor(x/60000) + "m"; + if (x < 86400000) return Math.floor(x/36000)/100 + "h"; + }, + onchange: x => save('expiry', x), + }, + '< Back': back, + }); +}) diff --git a/apps/weather/widget.js b/apps/weather/widget.js index 25b3adc9c..7794b0489 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -44,6 +44,11 @@ if (_GB) setTimeout(_GB, 0, event); }; + require('weather').on("expiry", () => { + WIDGETS["weather"].width = 0; + Bangle.drawWidgets(); + }); + WIDGETS["weather"] = {area: "tl", width: 20, draw: draw}; if (!require('weather').load()) { WIDGETS["weather"].width = 0; From e0cea372386c8cffb410b830fcf60a1e4d8c10b3 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Sun, 24 May 2020 05:21:24 -0400 Subject: [PATCH 21/39] weather: general refactoring --- apps/weather/app.js | 42 +++--- apps/weather/lib.js | 336 +++++++++++++++++++++-------------------- apps/weather/widget.js | 39 ++--- 3 files changed, 215 insertions(+), 202 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index e529519b6..b43a52517 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -1,4 +1,6 @@ (() => { + const weather = require('weather'); + function formatDuration(millis) { let pluralize = (n, w) => n + " " + w + (n == 1 ? "" : "s"); if (millis < 60000) return pluralize(Math.floor(millis/1000), "second"); @@ -7,11 +9,12 @@ return pluralize(Math.floor(millis/86400000), "day"); } - function draw(w) { + function draw() { + let w = weather.current; g.reset(); g.setColor(0).fillRect(0, 24, 239, 239); - require('weather').drawIcon(w.txt, 65, 90, 55); + weather.drawIcon(w.txt, 65, 90, 55); const locale = require("locale"); g.setColor(-1); @@ -43,25 +46,22 @@ g.flip(); } - let updateTime = undefined; - - function drawUpdateTime(w) { - if (!updateTime) return; - let text = `Last update received ${formatDuration(Date.now() - updateTime)} ago`; + function drawUpdateTime() { + if (!weather.current || !weather.current.time) return; + let text = `Last update received ${formatDuration(Date.now() - weather.current.time)} ago`; g.reset(); g.setColor(0).fillRect(0, 202, 239, 210); g.setColor(-1).setFont("6x8", 1).setFontAlign(0, 0, 0); g.drawString(text, 120, 206); } - const _GB = global.GB; - global.GB = (event) => { - if (event.t==="weather") { - updateTime = Date.now(); - draw(event); + function update() { + if (weather.current) { + draw(); + } else { + E.showMessage('Weather unknown\n\nIs Gadgetbridge\nconnected?'); } - if (_GB) setTimeout(_GB, 0, event); - }; + } let interval = setInterval(drawUpdateTime, 1000); Bangle.on('lcdPower', (on) => { @@ -75,17 +75,13 @@ } }); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + weather.on("update", update); - const weather = require('weather').load(); - if (weather) { - updateTime = weather.time; - draw(weather); - } else { - E.showMessage('Weather unknown\n\nIs Gadgetbridge\nconnected?'); - } + update(weather.current); // Show launcher when middle button pressed setWatch(Bangle.showLauncher, BTN2, {repeat: false, edge: 'falling'}); + + Bangle.loadWidgets(); + Bangle.drawWidgets(); })() diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 6ed9ae292..8eda2dea9 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -1,5 +1,7 @@ +const storage = require('Storage'); + let expiryTimeout = undefined; -function updateExpiry(json) { +function scheduleExpiry(json) { if (expiryTimeout) { clearTimeout(expiryTimeout); expiryTimeout = undefined; @@ -8,191 +10,205 @@ function updateExpiry(json) { let t = json.weather.time + json.expiry - Date.now(); expiryTimeout = setTimeout(() => { expiryTimeout = undefined; - let json = require('Storage').readJSON('weather.json')||{}; + + let json = storage.readJSON('weather.json')||{}; delete json.weather; - require('Storage').write('weather.json', json); - exports.emit("expiry"); + storage.write('weather.json', json); + + exports.current = undefined; + exports.emit("update"); }, t); } } -exports = { - save: weather => { - let json = require('Storage').readJSON('weather.json')||{}; - json.weather = Object.assign({}, weather); // don't mutate GB events - delete json.weather.t; // don't save the event type (if present) - json.weather.time = Date.now(); - require('Storage').write('weather.json', json); - updateExpiry(json); - }, - load: () => { - let json = require('Storage').readJSON('weather.json')||{}; - return json.weather; - }, - drawIcon: (cond, x, y, r) => { - function drawSun(x, y, r) { +function setCurrentWeather(json) { + scheduleExpiry(json); + exports.current = json.weather; +} + +function update(weatherEvent) { + let weather = Object.assign({}, weatherEvent); + weather.time = Date.now(); + delete weather.t; + + let json = storage.readJSON('weather.json')||{}; + json.weather = weather; + storage.write('weather.json', json); + + setCurrentWeather(json); + + exports.emit("update"); +} + +const _GB = global.GB; +global.GB = (event) => { + if (event.t==="weather") update(event); + if (_GB) setTimeout(_GB, 0, event); +}; + +setCurrentWeather(storage.readJSON('weather.json')||{}); + +exports.drawIcon = function(cond, x, y, r) { + function drawSun(x, y, r) { + g.setColor("#FF7700"); + g.fillCircle(x, y, r); + } + + function drawCloud(x, y, r, c) { + const u = r/12; + if (c==null) c = "#EEEEEE"; + g.setColor(c); + g.fillCircle(x-8*u, y+3*u, 4*u); + g.fillCircle(x-4*u, y-2*u, 5*u); + g.fillCircle(x+4*u, y+0*u, 4*u); + g.fillCircle(x+9*u, y+4*u, 3*u); + g.fillPoly([ + x-8*u, y+7*u, + x-8*u, y+3*u, + x-4*u, y-2*u, + x+4*u, y+0*u, + x+9*u, y+4*u, + x+9*u, y+7*u, + ]); + } + + function drawBrokenClouds(x, y, r) { + drawCloud(x+1/8*r, y-1/8*r, 7/8*r, "#777777"); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawFewClouds(x, y, r) { + drawSun(x+3/8*r, y-1/8*r, 5/8*r); + drawCloud(x-1/8*r, y+1/8*r, 7/8*r); + } + + function drawRainLines(x, y, r) { + g.setColor("#FFFFFF"); + const y1 = y+1/2*r; + const y2 = y+1*r; + g.fillPoly([ + x-6/12*r+1, y1, + x-8/12*r+1, y2, + x-7/12*r, y2, + x-5/12*r, y1, + ]); + g.fillPoly([ + x-2/12*r+1, y1, + x-4/12*r+1, y2, + x-3/12*r, y2, + x-1/12*r, y1, + ]); + g.fillPoly([ + x+2/12*r+1, y1, + x+0/12*r+1, y2, + x+1/12*r, y2, + x+3/12*r, y1, + ]); + } + + function drawShowerRain(x, y, r) { + drawFewClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawRain(x, y, r) { + drawBrokenClouds(x, y-1/3*r, r); + drawRainLines(x, y, r); + } + + function drawThunderstorm(x, y, r) { + function drawLightning(x, y, r) { g.setColor("#FF7700"); - g.fillCircle(x, y, r); - } - - function drawCloud(x, y, r, c) { - const u = r/12; - if (c==null) c = "#EEEEEE"; - g.setColor(c); - g.fillCircle(x-8*u, y+3*u, 4*u); - g.fillCircle(x-4*u, y-2*u, 5*u); - g.fillCircle(x+4*u, y+0*u, 4*u); - g.fillCircle(x+9*u, y+4*u, 3*u); g.fillPoly([ - x-8*u, y+7*u, - x-8*u, y+3*u, - x-4*u, y-2*u, - x+4*u, y+0*u, - x+9*u, y+4*u, - x+9*u, y+7*u, + x-2/6*r, y-r, + x-4/6*r, y+1/6*r, + x-1/6*r, y+1/6*r, + x-3/6*r, y+1*r, + x+3/6*r, y-1/6*r, + x+0/6*r, y-1/6*r, + x+3/6*r, y-r, ]); } - function drawBrokenClouds(x, y, r) { - drawCloud(x+1/8*r, y-1/8*r, 7/8*r, "#777777"); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } + drawBrokenClouds(x, y-1/3*r, r); + drawLightning(x-1/12*r, y+1/2*r, 1/2*r); + } - function drawFewClouds(x, y, r) { - drawSun(x+3/8*r, y-1/8*r, 5/8*r); - drawCloud(x-1/8*r, y+1/8*r, 7/8*r); - } - - function drawRainLines(x, y, r) { - g.setColor("#FFFFFF"); - const y1 = y+1/2*r; - const y2 = y+1*r; - g.fillPoly([ - x-6/12*r+1, y1, - x-8/12*r+1, y2, - x-7/12*r, y2, - x-5/12*r, y1, - ]); - g.fillPoly([ - x-2/12*r+1, y1, - x-4/12*r+1, y2, - x-3/12*r, y2, - x-1/12*r, y1, - ]); - g.fillPoly([ - x+2/12*r+1, y1, - x+0/12*r+1, y2, - x+1/12*r, y2, - x+3/12*r, y1, - ]); - } - - function drawShowerRain(x, y, r) { - drawFewClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawRain(x, y, r) { - drawBrokenClouds(x, y-1/3*r, r); - drawRainLines(x, y, r); - } - - function drawThunderstorm(x, y, r) { - function drawLightning(x, y, r) { - g.setColor("#FF7700"); - g.fillPoly([ - x-2/6*r, y-r, - x-4/6*r, y+1/6*r, - x-1/6*r, y+1/6*r, - x-3/6*r, y+1*r, - x+3/6*r, y-1/6*r, - x+0/6*r, y-1/6*r, - x+3/6*r, y-r, - ]); + function drawSnow(x, y, r) { + function rotatePoints(points, pivotX, pivotY, angle) { + for(let i = 0; i {}; - condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return drawThunderstorm; - if (condition.includes("freezing")||condition.includes("snow")|| - condition.includes("sleet")) { - return drawSnow; - } - if (condition.includes("drizzle")|| - condition.includes("shower")) { - return drawRain; - } - if (condition.includes("rain")) return drawShowerRain; - if (condition.includes("clear")) return drawSun; - if (condition.includes("few clouds")) return drawFewClouds; - if (condition.includes("scattered clouds")) return drawCloud; - if (condition.includes("clouds")) return drawBrokenClouds; - return drawMist; + function chooseIcon(condition) { + if (!condition) return () => {}; + condition = condition.toLowerCase(); + if (condition.includes("thunderstorm")) return drawThunderstorm; + if (condition.includes("freezing")||condition.includes("snow")|| + condition.includes("sleet")) { + return drawSnow; } + if (condition.includes("drizzle")|| + condition.includes("shower")) { + return drawRain; + } + if (condition.includes("rain")) return drawShowerRain; + if (condition.includes("clear")) return drawSun; + if (condition.includes("few clouds")) return drawFewClouds; + if (condition.includes("scattered clouds")) return drawCloud; + if (condition.includes("clouds")) return drawBrokenClouds; + return drawMist; + } - chooseIcon(cond)(x, y, r); - }, -} - -updateExpiry(require('Storage').readJSON('weather.json')||{}); + chooseIcon(cond)(x, y, r); +}; diff --git a/apps/weather/widget.js b/apps/weather/widget.js index 7794b0489..eb5ead949 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -1,11 +1,13 @@ (() => { + const weather = require('weather'); + function draw() { - const w = require('weather').load(); + const w = weather.current; if (!w) return; g.reset(); g.setColor(0).fillRect(this.x, this.y, this.x+this.width-1, this.y+23); if (w.txt) { - require('weather').drawIcon(w.txt, this.x+10, this.y+8, 7.5); + weather.drawIcon(w.txt, this.x+10, this.y+8, 7.5); } if (w.temp) { let t = require('locale').temp(w.temp-273.15); // applies conversion @@ -19,8 +21,7 @@ var dirty = false; - function update(weather) { - require('weather').save(weather); + function update() { if (!WIDGETS["weather"].width) { WIDGETS["weather"].width = 20; Bangle.drawWidgets(); @@ -31,26 +32,26 @@ } } - Bangle.on('lcdPower', (on) => { + function hide() { + WIDGETS["weather"].width = 0; + Bangle.drawWidgets(); + } + + weather.on("update", () => { + if (weather.current) update(); + else hide(); + }); + + Bangle.on('lcdPower', on => { if (on && dirty) { WIDGETS["weather"].draw(); dirty = false; } }); - const _GB = global.GB; - global.GB = (event) => { - if (event.t==="weather") update(event); - if (_GB) setTimeout(_GB, 0, event); + WIDGETS["weather"] = { + area: "tl", + width: weather.current ? 20 : 0, + draw: draw, }; - - require('weather').on("expiry", () => { - WIDGETS["weather"].width = 0; - Bangle.drawWidgets(); - }); - - WIDGETS["weather"] = {area: "tl", width: 20, draw: draw}; - if (!require('weather').load()) { - WIDGETS["weather"].width = 0; - } })(); From aba59bd2c28f08135b150dfe8f49bcd681b97880 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Sun, 24 May 2020 05:37:00 -0400 Subject: [PATCH 22/39] weather: bump version & add change log --- apps.json | 2 +- apps/weather/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 apps/weather/ChangeLog diff --git a/apps.json b/apps.json index f1ca85f8e..0f0cd169d 100644 --- a/apps.json +++ b/apps.json @@ -384,7 +384,7 @@ { "id": "weather", "name": "Weather", "icon": "icon.png", - "version":"0.01", + "version":"0.02", "description": "Show Gadgetbridge weather report", "readme": "readme.md", "tags": "widget,outdoors", diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog new file mode 100644 index 000000000..f0eae0198 --- /dev/null +++ b/apps/weather/ChangeLog @@ -0,0 +1 @@ +0.02: Make minor adjustments to widget, and discard stale weather data after a configurable period. From 17d5e1a1c416598c6004d7aed0b2d3d910e5c420 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 13:29:11 +0200 Subject: [PATCH 23/39] Removed settings from apps.json for test purposes --- apps.json | 3 +-- apps/berlinc/berlin-clock.json | 2 +- apps/berlinc/settings.js | 6 +++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 318648004..b878242ef 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.01", + "version":"0.03.02", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", @@ -898,7 +898,6 @@ "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, - {"name":"berlinc.settings.js","url":"settings.js"}, {"name":"berlin-clock.json","url":"berlin-clock.json"} ] }, diff --git a/apps/berlinc/berlin-clock.json b/apps/berlinc/berlin-clock.json index 08c6dc9d4..ef4493569 100644 --- a/apps/berlinc/berlin-clock.json +++ b/apps/berlinc/berlin-clock.json @@ -1,3 +1,3 @@ { - "showdate" : false + "showdate" : true } \ No newline at end of file diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index 90579c84c..a5f06b2cf 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -1,4 +1,7 @@ (function(back) { + + digitalWrite(LED1,1); + const SETTINGS_FILE = 'berlin-clock.json' // initialize structure @@ -28,8 +31,9 @@ 'Show Date' : { value : s.showdate, format: booleanFormat, - onChange: save('showdat'), + onChange: save('showdate'), }, } + digitalWrite(LED1,0); E.showMenu(menu) }) \ No newline at end of file From bcea5326a50ddc3af1ae0ef290d129ab32a405ed Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 13:54:32 +0200 Subject: [PATCH 24/39] Replaced template String with concatenation. Performed code indentation. Enabled settings again. --- apps.json | 3 +- apps/berlinc/berlin-clock.js | 97 +++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/apps.json b/apps.json index b878242ef..d6bae8880 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.02", + "version":"0.03.03", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", @@ -898,6 +898,7 @@ "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, + {"name":"berlinc.settings.js","url":"settings.js"}, {"name":"berlin-clock.json","url":"berlin-clock.json"} ] }, diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index b205d87ed..8ed20f32e 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -1,70 +1,73 @@ // Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr -const fields = [ 4 , 4 , 11 , 4 ]; -const offset = 20; -const width = g.getWidth() - 2*offset; -const height = g.getHeight() - 2*offset; -const rowHeight = height/4; +const fields = [4, 4, 11, 4]; +const offset = 20; +const width = g.getWidth() - 2 * offset; +const height = g.getHeight() - 2 * offset; +const rowHeight = height / 4; const show_date = (require('Storage').readJSON('berlin-clock.json', 1) || {})['showdate']; rowlights = []; function drawBerlinClock() { - g.clear(); - var now = new Date(); - if (show_date) { - var yr = now.getFullYear(); - var month = now.getMonth()+1; - var day = now.getDate(); - var dateString=`${yr}-${month<10?'0':''}${month}-${day<10?'0':''}${day}`; - var strWidth = g.stringWidth(dateString); - g.setColor(1,1,1); - g.drawString(dateString,(g.getWidth()-strWidth)/2,height+offset+2); - } - rowlights[0] = Math.floor(now.getHours() / 5); - rowlights[1] = now.getHours() % 5; - rowlights[2] = Math.floor(now.getMinutes() / 5); - rowlights[3] = now.getMinutes() % 5; - - g.drawRect(offset,offset,width+offset,height+offset); - for (row = 0 ; row < 4 ; row++) { - nfields = fields[row]; - boxWidth = width/nfields; + g.clear(); + var now = new Date(); + if (show_date) { + var yr = now.getFullYear(); + var month = now.getMonth() + 1; + var day = now.getDate(); + //var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`; + var monthZero = month < 10 ? '0' : ''; + var dayZero = day < 10 ? '0' : ''; + var dateString = yr + "-" + monthZero + month + "-" + dayZero + day; + var strWidth = g.stringWidth(dateString); + g.setColor(1, 1, 1); + g.drawString(dateString, (g.getWidth() - strWidth) / 2, height + offset + 2); + } + rowlights[0] = Math.floor(now.getHours() / 5); + rowlights[1] = now.getHours() % 5; + rowlights[2] = Math.floor(now.getMinutes() / 5); + rowlights[3] = now.getMinutes() % 5; - for (col = 0 ; col < nfields ; col++) { - x1 = col*boxWidth + offset ; - y1 = row*rowHeight + offset; - x2 = (col+1)*boxWidth + offset; - y2 = (row+1)*rowHeight + offset; + g.drawRect(offset, offset, width + offset, height + offset); + for (row = 0; row < 4; row++) { + nfields = fields[row]; + boxWidth = width / nfields; - g.setColor(1,1,1); - g.drawRect(x1,y1,x2,y2); - if (col { g.clear(); if (on) { - Bangle.drawWidgets(); - // call your app function here - drawBerlinClock(); -}}); + Bangle.drawWidgets(); + // call your app function here + drawBerlinClock(); + } +}); // refesh every 15 sec setInterval(drawBerlinClock, 15E3); @@ -74,4 +77,4 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); drawBerlinClock(); // Show launcher when middle button pressed -setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); +setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); From ee6171e1ca1a38bb3fb060c83176ddcdcc789474 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 14:11:42 +0200 Subject: [PATCH 25/39] Commented out date code for debugging purpose. --- apps.json | 2 +- apps/berlinc/berlin-clock.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps.json b/apps.json index d6bae8880..4e967ba22 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.03", + "version":"0.03.04", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 8ed20f32e..a1ce5a90c 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -12,18 +12,17 @@ rowlights = []; function drawBerlinClock() { g.clear(); var now = new Date(); + /* if (show_date) { var yr = now.getFullYear(); var month = now.getMonth() + 1; var day = now.getDate(); - //var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`; - var monthZero = month < 10 ? '0' : ''; - var dayZero = day < 10 ? '0' : ''; - var dateString = yr + "-" + monthZero + month + "-" + dayZero + day; + var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`; var strWidth = g.stringWidth(dateString); g.setColor(1, 1, 1); - g.drawString(dateString, (g.getWidth() - strWidth) / 2, height + offset + 2); + g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 2); } + */ rowlights[0] = Math.floor(now.getHours() / 5); rowlights[1] = now.getHours() % 5; rowlights[2] = Math.floor(now.getMinutes() / 5); From bdd1dc018d87443e45865f31787b8d6542cc068e Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 14:39:12 +0200 Subject: [PATCH 26/39] Changed code for reading settings. --- apps.json | 2 +- apps/berlinc/berlin-clock.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 4e967ba22..0b2a51d27 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.04", + "version":"0.03.05", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index a1ce5a90c..3bc04cd08 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -5,14 +5,14 @@ const width = g.getWidth() - 2 * offset; const height = g.getHeight() - 2 * offset; const rowHeight = height / 4; -const show_date = (require('Storage').readJSON('berlin-clock.json', 1) || {})['showdate']; +const show_date = require("Storage").readJSON('berlin-clock.json')['showdate']; rowlights = []; function drawBerlinClock() { g.clear(); var now = new Date(); - /* + if (show_date) { var yr = now.getFullYear(); var month = now.getMonth() + 1; @@ -22,7 +22,7 @@ function drawBerlinClock() { g.setColor(1, 1, 1); g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 2); } - */ + rowlights[0] = Math.floor(now.getHours() / 5); rowlights[1] = now.getHours() % 5; rowlights[2] = Math.floor(now.getMinutes() / 5); From 4f77cb887ff74af40d68c82d37ac7b9a47b86a1f Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 14:47:39 +0200 Subject: [PATCH 27/39] Changed settings --- apps/berlinc/settings.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index a5f06b2cf..74f969eae 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -1,7 +1,5 @@ (function(back) { - digitalWrite(LED1,1); - const SETTINGS_FILE = 'berlin-clock.json' // initialize structure @@ -31,8 +29,8 @@ 'Show Date' : { value : s.showdate, format: booleanFormat, - onChange: save('showdate'), - }, + onChange: save('showdate') + } } digitalWrite(LED1,0); E.showMenu(menu) From 6c377eb582caf28cabeb806b77578261b22af2f8 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 14:48:08 +0200 Subject: [PATCH 28/39] Updated version --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0b2a51d27..0a9fda370 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.05", + "version":"0.03.06", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", From 2818c1049f50fc8706defcf0c9e2703d0b048d27 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 15:05:11 +0200 Subject: [PATCH 29/39] Changed logic for reading settings --- apps.json | 2 +- apps/berlinc/berlin-clock.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 0a9fda370..29b36dbf3 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.06", + "version":"0.03.07", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 3bc04cd08..03ceafa3f 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -5,7 +5,9 @@ const width = g.getWidth() - 2 * offset; const height = g.getHeight() - 2 * offset; const rowHeight = height / 4; -const show_date = require("Storage").readJSON('berlin-clock.json')['showdate']; +const storage = require("Storage"); +const settingsfile = 'berlin-clock.json'; +var show_date = false; rowlights = []; @@ -58,6 +60,14 @@ function drawBerlinClock() { } } +// try to read settings +try { + const settings = storage.readJSON(settingsfile); + show_date=settings['showdate'] || false; +} catch (exception) { + console.log(exception) +} + // special function to handle display switch on Bangle.on('lcdPower', (on) => { g.clear(); From 7a409f74a35b1bacc78526c9b1cf324e0643b830 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 15:40:02 +0200 Subject: [PATCH 30/39] Restructured settings file handling. --- apps.json | 8 ++++---- apps/berlinc/berlin-clock.js | 12 ++++++++++-- apps/berlinc/settings.js | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 29b36dbf3..1e3a3cc15 100644 --- a/apps.json +++ b/apps.json @@ -887,19 +887,19 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.07", + "version":"0.03.08", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", "allow_emulator":true, "data": [ - {"name":"berlin-clock.json"} + { "name":"berlinc.json","storageFile":true} ], "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, - {"name":"berlinc.settings.js","url":"settings.js"}, - {"name":"berlin-clock.json","url":"berlin-clock.json"} + {"name":"berlinc.settings.js","url":"settings.js"}, + {"name":"berlinc.json","url":"berlin-clock.json"} ] }, { "id": "ctrclk", diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 03ceafa3f..07116b5ca 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -6,7 +6,7 @@ const height = g.getHeight() - 2 * offset; const rowHeight = height / 4; const storage = require("Storage"); -const settingsfile = 'berlin-clock.json'; +const settingsfile = 'berlinc.json'; var show_date = false; rowlights = []; @@ -63,7 +63,15 @@ function drawBerlinClock() { // try to read settings try { const settings = storage.readJSON(settingsfile); - show_date=settings['showdate'] || false; + if (settings) { + if (settings.showdate) { + show_date=settings.showdate; + } else { + console.log("Settings file does not contain showdate."); + } + } else { + console.log("Settings file not defined.") + } } catch (exception) { console.log(exception) } diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index 74f969eae..1217c61fe 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -1,6 +1,6 @@ (function(back) { - const SETTINGS_FILE = 'berlin-clock.json' + const SETTINGS_FILE = 'berlinc.json' // initialize structure let s = { From a02a3c9edc9099b78378e0286835ac4e25ae44b3 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 17:12:02 +0200 Subject: [PATCH 31/39] Changed handling of settings. --- apps/berlinc/berlin-clock.js | 17 +++-------------- apps/berlinc/settings.js | 6 ++++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 07116b5ca..12e5ff49f 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -61,20 +61,9 @@ function drawBerlinClock() { } // try to read settings -try { - const settings = storage.readJSON(settingsfile); - if (settings) { - if (settings.showdate) { - show_date=settings.showdate; - } else { - console.log("Settings file does not contain showdate."); - } - } else { - console.log("Settings file not defined.") - } -} catch (exception) { - console.log(exception) -} +const settings = storage.readJSON(settingsfile,1) || { + "showdate" : true +} // special function to handle display switch on Bangle.on('lcdPower', (on) => { diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js index 1217c61fe..7fc0fa6a5 100644 --- a/apps/berlinc/settings.js +++ b/apps/berlinc/settings.js @@ -4,11 +4,13 @@ // initialize structure let s = { - 'showdate' : false + 'showdate' : true } const storage = require('Storage') - const savedsettings = storage.readJSON(SETTINGS_FILE,1) || {} + const savedsettings = storage.readJSON(SETTINGS_FILE,1) || { + "showdate" : true + } // read values from storage (if any) for (const key in savedsettings) { s[key]=savedsettings[key] From 96febe52f11035ea1052a67561c8f908a1932228 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 17:13:16 +0200 Subject: [PATCH 32/39] Changed version. --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1e3a3cc15..6d841e358 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.08", + "version":"0.03.09", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", From ef91392a9c6e1baf47519a767c9a3686c167e79c Mon Sep 17 00:00:00 2001 From: msdeibel Date: Sun, 24 May 2020 17:57:55 +0200 Subject: [PATCH 33/39] RandomClockWidget even less invasive --- apps.json | 2 +- apps/rndmclk/ChangeLog | 1 + apps/rndmclk/README.md | 4 ++-- apps/rndmclk/widget.js | 10 ++++------ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apps.json b/apps.json index 04c2f637d..fde4aeba0 100644 --- a/apps.json +++ b/apps.json @@ -1725,7 +1725,7 @@ { "id": "rndmclk", "name": "Random Clock Loader", "icon": "rndmclk.png", - "version":"0.02", + "version":"0.03", "description": "Load a different clock whenever the LCD is switched on.", "readme": "README.md", "tags": "widget,clock", diff --git a/apps/rndmclk/ChangeLog b/apps/rndmclk/ChangeLog index 2d387a04b..1f53ea4ae 100644 --- a/apps/rndmclk/ChangeLog +++ b/apps/rndmclk/ChangeLog @@ -1,2 +1,3 @@ 0.01: New widget 0.02: Less invasive, change default clock setting instead of directly loading the new clock (no longer breaks Gadgetbridge notifications) +0.03: Only changes when the widget id reloaded (no longer uses LCD turning off) diff --git a/apps/rndmclk/README.md b/apps/rndmclk/README.md index 86138e0e7..d75a53343 100644 --- a/apps/rndmclk/README.md +++ b/apps/rndmclk/README.md @@ -1,6 +1,6 @@ # Summary -Random Clock is a widget that will randomly show one of the installed watch faces each time the LCD is turned on. +Random Clock is a widget that will randomly show one of the installed watch faces each time after the widget is (re-)loaded. # How it works -Everytime the LCD is turned off, the widget randomly changes the clock. When you long press BTN 3 the next time, +Everytime the widget is reloaded, it randomly changes the clock. When you long press BTN 3 the next time, you might (or might not, it's random after all) see another watch face. \ No newline at end of file diff --git a/apps/rndmclk/widget.js b/apps/rndmclk/widget.js index 566d8eed5..479d8b2c3 100644 --- a/apps/rndmclk/widget.js +++ b/apps/rndmclk/widget.js @@ -16,20 +16,18 @@ if (clockApps && clockApps.length > 0) { var clockIndex = getRandomInt(clockApps.length); - // Only update the file if the clock really change to be nice to the FLASH mem + // Only update the file if the clock really changed to be nice to the FLASH mem if (clockApps[clockIndex].src != currentClock) { currentClock = clockApps[clockIndex].src; settings = require("Storage").readJSON('setting.json', 1); settings.clock = clockApps[clockIndex].src; require("Storage").write('setting.json', settings); + + console.log("RandomClockWidget set the clock to '" + clockApps[clockIndex].name + "'"); } } } - Bangle.on('lcdPower', (on) => { - if (!on) { - loadRandomClock(); - } - }); + loadRandomClock(); })(); \ No newline at end of file From 379da3d6dbe133b30d2dc86c9e3827d1fe9d531d Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 18:22:44 +0200 Subject: [PATCH 34/39] Final changes for new release. --- apps.json | 9 ++------ apps/berlinc/ChangeLog | 2 +- apps/berlinc/README.md | 10 +++++++++ apps/berlinc/berlin-clock.js | 39 ++++++++++++++++++++++++++-------- apps/berlinc/berlin-clock.json | 3 --- apps/berlinc/settings.js | 39 ---------------------------------- 6 files changed, 43 insertions(+), 59 deletions(-) create mode 100644 apps/berlinc/README.md delete mode 100644 apps/berlinc/berlin-clock.json delete mode 100644 apps/berlinc/settings.js diff --git a/apps.json b/apps.json index 6d841e358..3e6efb4cf 100644 --- a/apps.json +++ b/apps.json @@ -887,19 +887,14 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.09", + "version":"0.03", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", "allow_emulator":true, - "data": [ - { "name":"berlinc.json","storageFile":true} - ], "storage": [ {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}, - {"name":"berlinc.settings.js","url":"settings.js"}, - {"name":"berlinc.json","url":"berlin-clock.json"} + {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} ] }, { "id": "ctrclk", diff --git a/apps/berlinc/ChangeLog b/apps/berlinc/ChangeLog index f333911b4..a33332bc4 100644 --- a/apps/berlinc/ChangeLog +++ b/apps/berlinc/ChangeLog @@ -1,2 +1,2 @@ 0.02: Modified for use with new bootloader and firmware -0.03: Shrinked size to avoid cut off edges on the physical device. Added date and settings. +0.03: Shrinked size to avoid cut-off edges on the physical device. BTN3: show date. BTN1: show time in decimal. diff --git a/apps/berlinc/README.md b/apps/berlinc/README.md new file mode 100644 index 000000000..f21efdf29 --- /dev/null +++ b/apps/berlinc/README.md @@ -0,0 +1,10 @@ +# Berlin Clock Watch Face + +This is a clock-face analogous to the [Berlin Clock][https://en.wikipedia.org/wiki/Mengenlehreuhr]. + +## Usage + +* BTN1: toggle displaying the time in decimal figures (24 hour format) in the minutes fields. The first two fields are used for the hour and the last two fields for the minute. This might be a help when you're still familarizig yourself with this new way to express the time. +* BTN2: start the launcher +* BTN3: toggle displaying the current date (in ISO 8601 format) below the actual clock-face. + diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 12e5ff49f..66b25adb5 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -1,20 +1,22 @@ // Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr +// https://github.com/eska-muc/BangleApps const fields = [4, 4, 11, 4]; const offset = 20; const width = g.getWidth() - 2 * offset; const height = g.getHeight() - 2 * offset; const rowHeight = height / 4; -const storage = require("Storage"); -const settingsfile = 'berlinc.json'; var show_date = false; +var show_time = false; rowlights = []; +time_digit = []; function drawBerlinClock() { g.clear(); var now = new Date(); + // show date below the clock if (show_date) { var yr = now.getFullYear(); var month = now.getMonth() + 1; @@ -22,7 +24,8 @@ function drawBerlinClock() { var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`; var strWidth = g.stringWidth(dateString); g.setColor(1, 1, 1); - g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 2); + g.setFontAlign(-1,-1); + g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 4); } rowlights[0] = Math.floor(now.getHours() / 5); @@ -30,6 +33,11 @@ function drawBerlinClock() { rowlights[2] = Math.floor(now.getMinutes() / 5); rowlights[3] = now.getMinutes() % 5; + time_digit[0] = Math.floor(now.getHours() / 10); + time_digit[1] = now.getHours() % 10; + time_digit[2] = Math.floor(now.getMinutes() / 10); + time_digit[3] = now.getMinutes() % 10; + g.drawRect(offset, offset, width + offset, height + offset); for (row = 0; row < 4; row++) { nfields = fields[row]; @@ -44,7 +52,6 @@ function drawBerlinClock() { g.setColor(1, 1, 1); g.drawRect(x1, y1, x2, y2); if (col < rowlights[row]) { - if (row === 2) { if (((col + 1) % 3) === 0) { g.setColor(1, 0, 0); @@ -54,16 +61,26 @@ function drawBerlinClock() { } else { g.setColor(1, 0, 0); } - g.fillRect(x1 + 2, y1 + 2, x2 - 2, y2 - 2); + g.fillRect(x1 + 2, y1 + 2, x2 - 2, y2 - 2); + } + if (row == 3 && show_time) { + g.setColor(1,1,1); + g.setFontAlign(0,0); + g.drawString(time_digit[col],(x1+x2)/2,(y1+y2)/2); } } } } -// try to read settings -const settings = storage.readJSON(settingsfile,1) || { - "showdate" : true -} +function toggleDate() { + show_date = ! show_date; + drawBerlinClock(); +} + +function toggleTime() { + show_time = ! show_time; + drawBerlinClock(); +} // special function to handle display switch on Bangle.on('lcdPower', (on) => { @@ -82,5 +99,9 @@ g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); drawBerlinClock(); +// Toggle date display, when BTN3 is pressed +setWatch(toggleTime,BTN1, { repeat : true, edge: "falling"}); +// Toggle date display, when BTN3 is pressed +setWatch(toggleDate,BTN3, { repeat : true, edge: "falling"}); // Show launcher when middle button pressed setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); diff --git a/apps/berlinc/berlin-clock.json b/apps/berlinc/berlin-clock.json deleted file mode 100644 index ef4493569..000000000 --- a/apps/berlinc/berlin-clock.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "showdate" : true -} \ No newline at end of file diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js deleted file mode 100644 index 7fc0fa6a5..000000000 --- a/apps/berlinc/settings.js +++ /dev/null @@ -1,39 +0,0 @@ -(function(back) { - - const SETTINGS_FILE = 'berlinc.json' - - // initialize structure - let s = { - 'showdate' : true - } - - const storage = require('Storage') - const savedsettings = storage.readJSON(SETTINGS_FILE,1) || { - "showdate" : true - } - // read values from storage (if any) - for (const key in savedsettings) { - s[key]=savedsettings[key] - } - - function save (key) { - return function(value) { - s[key]=value; - storage.write(SETTINGS_FILE,s); - } - } - - const booleanFormat = b => ( b ? 'on':'off' ) - - const menu = { - '' : { 'title' : 'Berlin Clock Settings'} , - '< Back' : back, - 'Show Date' : { - value : s.showdate, - format: booleanFormat, - onChange: save('showdate') - } - } - digitalWrite(LED1,0); - E.showMenu(menu) -}) \ No newline at end of file From 10cd2a31e95c7296ba14068f79158e9439414b39 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 18:25:42 +0200 Subject: [PATCH 35/39] Corrected markdown syntax --- apps/berlinc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/berlinc/README.md b/apps/berlinc/README.md index f21efdf29..1f86ad73e 100644 --- a/apps/berlinc/README.md +++ b/apps/berlinc/README.md @@ -1,6 +1,6 @@ # Berlin Clock Watch Face -This is a clock-face analogous to the [Berlin Clock][https://en.wikipedia.org/wiki/Mengenlehreuhr]. +This is a clock-face analogous to the [Berlin Clock](https://en.wikipedia.org/wiki/Mengenlehreuhr). ## Usage From 42bb0e418e7ede99e7ed78a66537bbe9bfd44c97 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 18:45:38 +0200 Subject: [PATCH 36/39] Try/Catch and Stacktrace for debugging --- apps.json | 2 +- apps/berlinc/berlin-clock.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 3e6efb4cf..c99e0914a 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03", + "version":"0.03.10", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index 66b25adb5..b00eb3e01 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -13,6 +13,7 @@ rowlights = []; time_digit = []; function drawBerlinClock() { + try { g.clear(); var now = new Date(); @@ -65,11 +66,15 @@ function drawBerlinClock() { } if (row == 3 && show_time) { g.setColor(1,1,1); - g.setFontAlign(0,0); + g.setFontAlign(0,0); g.drawString(time_digit[col],(x1+x2)/2,(y1+y2)/2); } } } +} catch (e) { + console.log(e) + console.trace() +} } function toggleDate() { From 29170c9abe5d346b81eaba031c829ed0fb2391d6 Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 18:49:30 +0200 Subject: [PATCH 37/39] Attempt to fix reference error. --- apps/berlinc/berlin-clock.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js index b00eb3e01..3950147b8 100644 --- a/apps/berlinc/berlin-clock.js +++ b/apps/berlinc/berlin-clock.js @@ -8,12 +8,12 @@ const rowHeight = height / 4; var show_date = false; var show_time = false; +var yy = 0; rowlights = []; time_digit = []; function drawBerlinClock() { - try { g.clear(); var now = new Date(); @@ -66,15 +66,11 @@ function drawBerlinClock() { } if (row == 3 && show_time) { g.setColor(1,1,1); - g.setFontAlign(0,0); + g.setFontAlign(0,0); g.drawString(time_digit[col],(x1+x2)/2,(y1+y2)/2); } } } -} catch (e) { - console.log(e) - console.trace() -} } function toggleDate() { From 854cc6831320d33c01ea5cfc7f5aa61dd5f85a7d Mon Sep 17 00:00:00 2001 From: Stefan Kuehnel Date: Sun, 24 May 2020 18:54:16 +0200 Subject: [PATCH 38/39] Correct version number --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c99e0914a..3e6efb4cf 100644 --- a/apps.json +++ b/apps.json @@ -887,7 +887,7 @@ { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.03.10", + "version":"0.03", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", "type":"clock", From 7e92aba454fcd807b6c1157dce445927d0967674 Mon Sep 17 00:00:00 2001 From: Frans Meulenbroeks Date: Sun, 24 May 2020 22:41:21 +0200 Subject: [PATCH 39/39] Make : between hours and minutes flash Flash the : separator; even seconds off, odd seconds on --- apps/imgclock/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/imgclock/app.js b/apps/imgclock/app.js index becf0a1fb..751647a69 100644 --- a/apps/imgclock/app.js +++ b/apps/imgclock/app.js @@ -45,7 +45,8 @@ function draw() { cg.setFontAlign(1,-1); cg.drawString(hours, x, 0); x+=2; - cg.fillRect(x, 10, x+2, 10+2).fillRect(x, 20, x+2, 20+2); + if (t.getSeconds() & 1) + cg.fillRect(x, 10, x+2, 10+2).fillRect(x, 20, x+2, 20+2); x+=6; cg.setFontAlign(-1,-1); cg.drawString(("0"+t.getMinutes()).substr(-2), x, 0);