From 254d69fce6654dfdde7f197997229f66a7bbaa57 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 19:17:44 +0100 Subject: [PATCH 001/117] Added simple chrono widget with easier UI --- apps/chronosimplewid/ChangeLog | 6 ++ apps/chronosimplewid/README.md | 41 ++++++++++++ apps/chronosimplewid/app-icon.js | 1 + apps/chronosimplewid/app.js | 93 ++++++++++++++++++++++++++++ apps/chronosimplewid/app.png | Bin 0 -> 1060 bytes apps/chronosimplewid/metadata.json | 17 +++++ apps/chronosimplewid/screenshot.png | Bin 0 -> 2920 bytes apps/chronosimplewid/widget.js | 79 +++++++++++++++++++++++ 8 files changed, 237 insertions(+) create mode 100644 apps/chronosimplewid/ChangeLog create mode 100644 apps/chronosimplewid/README.md create mode 100644 apps/chronosimplewid/app-icon.js create mode 100644 apps/chronosimplewid/app.js create mode 100644 apps/chronosimplewid/app.png create mode 100644 apps/chronosimplewid/metadata.json create mode 100644 apps/chronosimplewid/screenshot.png create mode 100644 apps/chronosimplewid/widget.js diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog new file mode 100644 index 000000000..ed230b737 --- /dev/null +++ b/apps/chronosimplewid/ChangeLog @@ -0,0 +1,6 @@ +0.01: New widget and app! +0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) +0.03: Display only minutes:seconds when less than 1 hour left +0.04: Change to 7 segment font, move to top widget bar + Better auto-update behaviour, less RAM used +0.05: Fix error running app on new firmwares (fix #1140) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md new file mode 100644 index 000000000..6e0aba681 --- /dev/null +++ b/apps/chronosimplewid/README.md @@ -0,0 +1,41 @@ +# Chronometer Widget + +Chronometer (timer) that runs as a widget. +The advantage is, that you can still see your normal watchface and other widgets when the timer is running. +The widget is always active, but only shown when the timer is on. +Hours, minutes, seconds and timer status can be set with an app. + +When there is less than one second left on the timer it buzzes. + +The widget has been tested on Bangle 1 and Bangle 2 + +## Screenshots + +![](screenshot.png) + + +## Features + +* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) +* Target time is saved to a file and timer picks up again when widget is loaded again. + +## Settings + +There are no settings section in the settings app, timer can be set using an app. + +* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file +* Hours: Set the hours for the timer +* Minutes: Set the minutes for the timer +* Seconds: Set the seconds for the timer +* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. + + +## Releases + +* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) +* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) +* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid + +## Requests + +If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ diff --git a/apps/chronosimplewid/app-icon.js b/apps/chronosimplewid/app-icon.js new file mode 100644 index 000000000..db2010218 --- /dev/null +++ b/apps/chronosimplewid/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js new file mode 100644 index 000000000..8e2c82b68 --- /dev/null +++ b/apps/chronosimplewid/app.js @@ -0,0 +1,93 @@ +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +const storage = require('Storage'); +let settingsChronowid; + +function updateSettings() { + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + settingsChronowid.goal = goal.getTime(); + storage.writeJSON('chronowid.json', settingsChronowid); + if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); +} + +function resetSettings() { + settingsChronowid = { + hours : 0, + minutes : 0, + seconds : 0, + started : false, + counter : 0, + goal : 0, + }; + updateSettings(); +} + +settingsChronowid = storage.readJSON('chronowid.json',1); +if (!settingsChronowid) resetSettings(); + +E.on('kill', () => { + updateSettings(); +}); + +function showMenu() { + const timerMenu = { + '': { + 'title': 'Set timer' + }, + '< Back' : ()=>{load();}, + 'Reset Values': function() { + settingsChronowid.hours = 0; + settingsChronowid.minutes = 0; + settingsChronowid.seconds = 0; + settingsChronowid.started = false; + updateSettings(); + showMenu(); + }, + 'Hours': { + value: settingsChronowid.hours, + min: 0, + max: 24, + step: 1, + onchange: v => { + settingsChronowid.hours = v; + updateSettings(); + } + }, + 'Minutes': { + value: settingsChronowid.minutes, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.minutes = v; + updateSettings(); + } + }, + 'Seconds': { + value: settingsChronowid.seconds, + min: 0, + max: 59, + step: 1, + onchange: v => { + settingsChronowid.seconds = v; + updateSettings(); + } + }, + 'Timer on': { + value: settingsChronowid.started, + format: v => v ? "On" : "Off", + onchange: v => { + settingsChronowid.started = v; + updateSettings(); + } + }, + }; + + return E.showMenu(timerMenu); +} + +showMenu(); diff --git a/apps/chronosimplewid/app.png b/apps/chronosimplewid/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac7a480c5d4533c9851ba6264b74aae48035eb0 GIT binary patch literal 1060 zcmV+<1l#+GP)*2?CL* z=jdIsdaVqLAjyY*ycLl}Syc2;L97)RfoN7x+ost=DzrV^$!5>oot--~TQ7d$;EsFG z_k7Qtx%ZxXXA1}qX~XsfVFXm;x<_9I=$uURJ1ZseBV6R)F#Xg92 zC;;k!X6tX2rp*iB9q=U=45ym<6tfq%{NOz;R#zF~ zJ#TM22egDKJPw=zW_$>jHUpdnVmAI3OLSh6Xa!Os2$%L1*ptsBqQH3<0V&k;dH^*J zV!%>h8S0MJS>N^N=zw!Tp-U3u_?VrR0C%$lOrU0pB8}e`%Or|`Hefgl=b%lbJ&8}K z0d9mSa7Pnl3h2bW9NBGIHbj6fi%XY;{Z5Sg5f5-dL;ez|^x%8cvRtS_-ANgz&(_A* zqSmeY`$fNzK2BYIbgjB!6`wIzK6`b8=ix@{cYKKzS;Nui}lHqvFZQ(WIb6|yu`hkz&m1I8mjlf19JVWAIYSZF1nYXRZFlZI3veZ?Zx{Zz- z8U)9%7bjUM#@w4ba1E#UKX%2CD=z$#UYuryQ`9i1TdC|xfDJ{$-!T?-V<2r9M8a*K z9dr-w(56e^hqzvD804PIcY}spvhJGp;v`o<(?MK={xM1d>kPT%AWp~zx;ro;uD2Qn z9RX@lgZaBNBK9n5lVt>Xh&6?IE#n8Z zsI|x*yVnoVDxC9q0(E+jFT`XVq)WAoT2$kM2z58s3?hyzbG@mhlt>&`<*F<;=^ zP>ZwY)2MUOz$gT6YsjZjrw2i1rwDKu=QE!MZt?eMF)&KeCy_?gPVK0L$193a^SqoY z?cz&A(mszu+>h5Mfy=-_)QTBL?Ioht=LYM$0h}wWd~8DNc^%r&ZyAGHk`M;0SHw|0 z71k@JUh*@uTUMOHnq3)qg@)Rd!MF@c(8CV;o7*RA(a euUUTu4g4F8cKpwc4bA8P0000Pm&p8b7a+DT_yA%1Co004yS?W|n6 zk@oN5LvVd##}{92fP}l+S^$q3hvoo4K;GWU{7jVZ&(g8{&$5D6D*OAxW-4<=p=eq= z>Wy=;k1+#z;HKBg1#aqH$n z>`V6-&Xj5XD6A2dR<;wr>-}Q#xSNs1B~3Y*0k9XJ8F^YZ4`8K-gf`NT_7XMEUOuR; z2@FJsGn!#^B;b99pNorJVd5@GoUH2uiwzQx-*$A?R>!AJ z575JRzUtD%Q`}1%;!!HZOLYlzf6m3Ue#!i8=|_GZonKlV(-|lCee>k24K~uucd&mi z`ru&9fw;(&8ckydUXpdUjW{Vmx&+%^2bqkqs9m1!P8%5=2nx?n-L#0kIb&~t)m@sM zC;A4tFv|i}&fJe&pO0vLOCe1_MpdrL{tNqUM%{qoIz7 ze0K_Df8}` zq56Y2odt2^kslv0uf$5eMrE~!jQYsKrjdlT6x=xJ^>cwH<;OgpUB$A=?6!Z#qXsXK zjVa~AL$YOoHEPB;$UQL{b#J9)L*wst|D^>Do|$KWC0EucW*d4iB`^XWSVk!BEQT;- z!o&%KyVB?T!$=D((LUCXb-n(gPa#T3CQBUS*?;akBz7Shj}dq)(;LVe5V^0nEQVd; z2k^(ehl1RbQNcp=M)0u>|7-ebny$!P~Id!&dM5yg|=;DVTQTy`BmW+Ju;9gx&wN7=+SGhSn3{6A>h)MHep(s7-d4qYS|2a zS8_^kCOU3?JG|EE94Xmrqy)giu&`L&Q?t$qoD9RyI0(!6ch-x3 z^%iP_KO_5W%aOzBsy)M$4Jj3GZ0l2ezUajL_OB-L<72L=fDymW_T9z>lnP2<&aJ;7 z-=hyy?F{7YT+@QuMcNE4{bXXK;7x(Ew%fN62F&ZxS|*hjcWfvU{L^rDddGzL%A?{S ze{DCU7*)irpYLw#3+tU?IRP{q9QLr;mALW9cK6Aaku)K=g0VPlOD{6GQkkp{m(Vfa zFtD+ZzZ(%aEi8>RizDxF-{z(JSI8R0rC@3lnW04Ly6wUj>;|o3CtK3O)f% z{-~Gx*?i1)F5n-xm4sD%h@`T15Cu?&D}oLWObqe7oq0NK`_oLzeoXqgWk`Zu_*z5-H(MbBfl;OI#PFit8?5X zLrtL?0ff0I2h&eggF(?g2<%b8X$WIml{F7k&QTMy43|Uv8`iCp7 z;TN7B<$YhNw{<(@XF!Jnn5?S}d2_#1nAWQ2fG@q)+wo?kzkujBuGpR*Lp|ZX!`krP zZJrP#n4j0wX5pd}hqwLP$f4xJWcM9CO3R@dA2pf>1<1Me-}F@g^E4^TW;|%Cl^N$f zH16baN1hYqZaTEikca+ucNQp?P^J1n7c4iMfr4)jsVZKlWT_c()S}^ezqG__y&@&i zi}D~xvh%4D1R^7_N`$buP)$^wI}G~~5qdLs!6CBh%H7w(A50;Uf$Rn(Q%y%vmI{6r zl_t%t0Jhk?1A=Gn`am^GZ`*x7c*o;U4v$e`;#n~G#5~%Jr2vjghOMfgt9aL3>jyzr zwI9^uNu44W6JJvfNWJHg12f|yo^otjpn+6l>IPLrw_&3wkzAID)K*5{Yrfj$G^r{# z#*yOExYX2`x*Y^6h{_Ipql%-@zcYNz`9%qtnR-|o2=tiE^$mVk3Xq&qRiwkEZk_HH zk4z|!l%nEb`Y8&KFe}yzCIWL literal 0 HcmV?d00001 diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js new file mode 100644 index 000000000..2d1c78941 --- /dev/null +++ b/apps/chronosimplewid/widget.js @@ -0,0 +1,79 @@ +(() => { + var settingsChronowid; + var interval = 0; //used for the 1 second interval timer + var diff; + + //Convert ms to time + function getTime(t) { + var milliseconds = parseInt((t % 1000) / 100), + seconds = Math.floor((t / 1000) % 60), + minutes = Math.floor((t / (1000 * 60)) % 60), + hours = Math.floor((t / (1000 * 60 * 60)) % 24); + return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); + } + + /*function printDebug() { + print ("Goaltime: " + getTime(settingsChronowid.goal)); + print ("Goal: " + settingsChronowid.goal); + print("Difftime: " + getTime(diff)); + print("Diff: " + diff); + print ("Started: " + settingsChronowid.started); + print ("----"); + }*/ + + //counts down, calculates and displays + function countDown() { + var now = new Date(); + diff = settingsChronowid.goal - now; //calculate difference + // time is up + if (settingsChronowid.started && diff < 1000) { + Bangle.buzz(1500); + //write timer off to file + settingsChronowid.started = false; + require('Storage').writeJSON('chronowid.json', settingsChronowid); + clearInterval(interval); //stop interval + interval = undefined; + } + // calculates width and redraws accordingly + WIDGETS["chronowid"].redraw(); + } + + // add the widget + WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { + if (!this.width) return; + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); + //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; + var timeStr; + if (diff < 3600000) { //less than 1 hour left + width = 58; + scale = 2; + timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 + } else { //one hour or more left + width = 48; + scale = 1; + timeStr = getTime(diff); //display hour 00:00:00 but small + } + // Font5x9Numeric7Seg - just build this in as it's tiny + g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); + g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { + var last = this.width; + if (!settingsChronowid.started) this.width = 0; + else this.width = (diff < 3600000) ? 58 : 48; + if (last != this.width) Bangle.drawWidgets(); + else this.draw(); + }, reload:function() { + settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + if (interval) clearInterval(interval); + interval = undefined; + // start countdown each second + if (settingsChronowid.started) interval = setInterval(countDown, 1000); + // reset everything + countDown(); + }}; + + //printDebug(); + // set width correctly, start countdown each second + WIDGETS["chronowid"].reload(); +})(); From 4cb1cf2ba4438e93aa2e337133d00e3bba7cc99e Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 20:10:09 +0100 Subject: [PATCH 002/117] Simpler UI --- apps/chronosimplewid/ChangeLog | 7 +- apps/chronosimplewid/README.md | 45 ++--------- apps/chronosimplewid/app.js | 119 +++++++++++++++-------------- apps/chronosimplewid/metadata.json | 10 +-- 4 files changed, 73 insertions(+), 108 deletions(-) diff --git a/apps/chronosimplewid/ChangeLog b/apps/chronosimplewid/ChangeLog index ed230b737..07afedd21 100644 --- a/apps/chronosimplewid/ChangeLog +++ b/apps/chronosimplewid/ChangeLog @@ -1,6 +1 @@ -0.01: New widget and app! -0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme) -0.03: Display only minutes:seconds when less than 1 hour left -0.04: Change to 7 segment font, move to top widget bar - Better auto-update behaviour, less RAM used -0.05: Fix error running app on new firmwares (fix #1140) +0.01: Release \ No newline at end of file diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md index 6e0aba681..6f3b417c0 100644 --- a/apps/chronosimplewid/README.md +++ b/apps/chronosimplewid/README.md @@ -1,41 +1,10 @@ -# Chronometer Widget +# Simple Chronometer Widget -Chronometer (timer) that runs as a widget. -The advantage is, that you can still see your normal watchface and other widgets when the timer is running. -The widget is always active, but only shown when the timer is on. -Hours, minutes, seconds and timer status can be set with an app. +A fork of the awesome Chronometer Widget, but with a simple UI to set +a timer faster using only a tab events. Also very useful if combined +with the Pattern Launcher. -When there is less than one second left on the timer it buzzes. +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) -The widget has been tested on Bangle 1 and Bangle 2 - -## Screenshots - -![](screenshot.png) - - -## Features - -* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded) -* Target time is saved to a file and timer picks up again when widget is loaded again. - -## Settings - -There are no settings section in the settings app, timer can be set using an app. - -* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file -* Hours: Set the hours for the timer -* Minutes: Set the minutes for the timer -* Seconds: Set the seconds for the timer -* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on. - - -## Releases - -* Official app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/) -* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#) -* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid - -## Requests - -If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/ +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index 8e2c82b68..b115bde00 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,10 +1,15 @@ -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - const storage = require('Storage'); let settingsChronowid; + +const screenWidth = g.getWidth(); +const screenHeight = g.getHeight(); +const screenHalfWidth = parseInt(screenWidth/2); +const screenHalfHeight = parseInt(screenHeight/2); +let interval = 0; + + + function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), @@ -33,61 +38,57 @@ E.on('kill', () => { updateSettings(); }); -function showMenu() { - const timerMenu = { - '': { - 'title': 'Set timer' - }, - '< Back' : ()=>{load();}, - 'Reset Values': function() { - settingsChronowid.hours = 0; - settingsChronowid.minutes = 0; - settingsChronowid.seconds = 0; - settingsChronowid.started = false; - updateSettings(); - showMenu(); - }, - 'Hours': { - value: settingsChronowid.hours, - min: 0, - max: 24, - step: 1, - onchange: v => { - settingsChronowid.hours = v; - updateSettings(); - } - }, - 'Minutes': { - value: settingsChronowid.minutes, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.minutes = v; - updateSettings(); - } - }, - 'Seconds': { - value: settingsChronowid.seconds, - min: 0, - max: 59, - step: 1, - onchange: v => { - settingsChronowid.seconds = v; - updateSettings(); - } - }, - 'Timer on': { - value: settingsChronowid.started, - format: v => v ? "On" : "Off", - onchange: v => { - settingsChronowid.started = v; - updateSettings(); - } - }, - }; +function draw(){ + g.clear(1); + Bangle.drawWidgets(); - return E.showMenu(timerMenu); + g.setColor(g.theme.fg); + g.setFont("Vector", 25).setFontAlign(0,-1); + + g.setFontAlign(0, 0, 0); + g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + + if(settingsChronowid.started){ + g.setColor("#ff0000"); + g.setFont("Vector", 16).setFontAlign(0,-1); + g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + } } -showMenu(); +Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; + var upper = 24 + parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var isLeft = e.x < left; + var isRight = e.x > right; + var isUpper = e.y < upper; + var isLower = e.y > lower; + + if(isRight){ + print("right"); + settingsChronowid.minutes += 1; + } else if(isLeft){ + print("left"); + settingsChronowid.minutes -= 1; + } else if(isUpper){ + print("upper"); + settingsChronowid.minutes += 5; + } else if(isLower){ + print("lower"); + settingsChronowid.minutes -= 5; + } else { + print("else"); + settingsChronowid.started = !settingsChronowid.started; + } + + settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + updateSettings(); + draw(); +}); + +g.reset(); +setWatch(_=>load(), BTN1); +Bangle.loadWidgets(); +draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json index ad219ea4f..72cc13e32 100644 --- a/apps/chronosimplewid/metadata.json +++ b/apps/chronosimplewid/metadata.json @@ -1,12 +1,12 @@ { "id": "chronosimplewid", - "name": "Simple Chrono Widget", - "shortName": "Simple Chrono Widget", - "version": "0.05", - "description": "Fork from Chrono Widget with simpler UI.", + "name": "Simple Chrono", + "shortName": "Simple Chrono", + "version": "0.01", + "description": "Chrono Widget Fork. Implements a simpler UI.", "icon": "app.png", "tags": "tool,widget", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS","BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}], "readme": "README.md", "storage": [ From e678892223dbc96dfebc32179d1c4fb770d16fae Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:47:22 +0100 Subject: [PATCH 003/117] Bugfixes and improvements --- apps/chronosimplewid/app.js | 25 ++++++++++++------------- apps/chronosimplewid/widget.js | 4 ++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index b115bde00..ff97d20dd 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -1,13 +1,13 @@ +Bangle.loadWidgets(); + + const storage = require('Storage'); let settingsChronowid; - const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const screenHalfWidth = parseInt(screenWidth/2); const screenHalfHeight = parseInt(screenHeight/2); -let interval = 0; - function updateSettings() { @@ -15,10 +15,11 @@ function updateSettings() { const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronowid.json', settingsChronowid); + storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); } + function resetSettings() { settingsChronowid = { hours : 0, @@ -31,34 +32,34 @@ function resetSettings() { updateSettings(); } -settingsChronowid = storage.readJSON('chronowid.json',1); + +settingsChronowid = storage.readJSON('chronosimplewid.json',1); if (!settingsChronowid) resetSettings(); -E.on('kill', () => { - updateSettings(); -}); +setWatch(_=>load(), BTN1); function draw(){ g.clear(1); Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 25).setFontAlign(0,-1); + g.setFont("Vector", 26).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 16).setFontAlign(0,-1); + g.setFont("Vector", 20).setFontAlign(0,-1); g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); } } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; - var upper = 24 + parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -89,6 +90,4 @@ Bangle.on('touch', function(btn, e){ }); g.reset(); -setWatch(_=>load(), BTN1); -Bangle.loadWidgets(); draw(); \ No newline at end of file diff --git a/apps/chronosimplewid/widget.js b/apps/chronosimplewid/widget.js index 2d1c78941..3fc5888b1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/chronosimplewid/widget.js @@ -30,7 +30,7 @@ Bangle.buzz(1500); //write timer off to file settingsChronowid.started = false; - require('Storage').writeJSON('chronowid.json', settingsChronowid); + require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); clearInterval(interval); //stop interval interval = undefined; } @@ -64,7 +64,7 @@ if (last != this.width) Bangle.drawWidgets(); else this.draw(); }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronowid.json",1)||{}; + settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; if (interval) clearInterval(interval); interval = undefined; // start countdown each second From 56880b96f64ca8e35c6b47d32896ac339ab710ba Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Feb 2022 21:53:27 +0100 Subject: [PATCH 004/117] Improvements and fixes --- apps/chronosimplewid/app.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index ff97d20dd..c8d3a4db7 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -6,8 +6,8 @@ let settingsChronowid; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); -const screenHalfWidth = parseInt(screenWidth/2); -const screenHalfHeight = parseInt(screenHeight/2); +const cx = parseInt(screenWidth/2); +const cy = parseInt(screenHeight/2); function updateSettings() { @@ -43,15 +43,15 @@ function draw(){ Bangle.drawWidgets(); g.setColor(g.theme.fg); - g.setFont("Vector", 26).setFontAlign(0,-1); + g.setFont("Vector", 32).setFontAlign(0,-1); g.setFontAlign(0, 0, 0); - g.drawString("T-" + settingsChronowid.minutes + " min.", screenHalfWidth, screenHalfHeight); + g.drawString(settingsChronowid.minutes + " min.", cx, cy); if(settingsChronowid.started){ g.setColor("#ff0000"); g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", screenHalfWidth, screenHalfHeight+20); + g.drawString("[started]", cx, cy+20); } } @@ -68,23 +68,22 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - print("right"); settingsChronowid.minutes += 1; } else if(isLeft){ - print("left"); settingsChronowid.minutes -= 1; } else if(isUpper){ - print("upper"); settingsChronowid.minutes += 5; } else if(isLower){ - print("lower"); settingsChronowid.minutes -= 5; } else { - print("else"); settingsChronowid.started = !settingsChronowid.started; } - settingsChronowid.minutes = Math.max(0, settingsChronowid.minutes); + if(settingsChronowid.minutes <= 0){ + settingsChronowid.minutes = 0; + settingsChronowid.started = false; + } + updateSettings(); draw(); }); From 6a085c11d78a41b2988bba396424331923192c20 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 13:23:56 +0100 Subject: [PATCH 005/117] Improvements of design and user feedback --- apps/chronosimplewid/app.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/chronosimplewid/app.js b/apps/chronosimplewid/app.js index c8d3a4db7..d3293bc90 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/chronosimplewid/app.js @@ -13,7 +13,7 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds); + now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); settingsChronowid.goal = goal.getTime(); storage.writeJSON('chronosimplewid.json', settingsChronowid); if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); @@ -42,24 +42,26 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); - g.setColor(g.theme.fg); - g.setFont("Vector", 32).setFontAlign(0,-1); - g.setFontAlign(0, 0, 0); - g.drawString(settingsChronowid.minutes + " min.", cx, cy); + g.setFont("Vector", 32).setFontAlign(0,-1); + var text = settingsChronowid.minutes + " min."; + var rectWidth = parseInt(g.stringWidth(text) / 2); if(settingsChronowid.started){ g.setColor("#ff0000"); - g.setFont("Vector", 20).setFontAlign(0,-1); - g.drawString("[started]", cx, cy+20); + } else { + g.setColor(g.theme.fg); } + g.fillRect(cx-rectWidth-5, cy-5, cx+rectWidth, cy+30); + + g.setColor(g.theme.bg); + g.drawString(text, cx, cy); } - Bangle.on('touch', function(btn, e){ - var left = parseInt(g.getWidth() * 0.2); + var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.2); + var upper = parseInt(g.getHeight() * 0.25); var lower = g.getHeight() - upper; var isLeft = e.x < left; @@ -69,14 +71,19 @@ Bangle.on('touch', function(btn, e){ if(isRight){ settingsChronowid.minutes += 1; + Bangle.buzz(40, 0.3); } else if(isLeft){ settingsChronowid.minutes -= 1; + Bangle.buzz(40, 0.3); } else if(isUpper){ settingsChronowid.minutes += 5; + Bangle.buzz(40, 0.3); } else if(isLower){ settingsChronowid.minutes -= 5; + Bangle.buzz(40, 0.3); } else { settingsChronowid.started = !settingsChronowid.started; + Bangle.buzz(120, 0.6); } if(settingsChronowid.minutes <= 0){ From a03fdec826819931f9058f7dab986ffc8dfb27e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:14:19 +0100 Subject: [PATCH 006/117] Renaming --- apps/chronosimplewid/README.md | 10 --- apps/chronosimplewid/metadata.json | 17 ---- apps/{chronosimplewid => widtmr}/ChangeLog | 0 apps/widtmr/README.md | 12 +++ apps/{chronosimplewid => widtmr}/app-icon.js | 0 apps/{chronosimplewid => widtmr}/app.js | 47 +++++++---- apps/{chronosimplewid => widtmr}/app.png | Bin apps/widtmr/metadata.json | 17 ++++ .../screenshot.png | Bin apps/{chronosimplewid => widtmr}/widget.js | 78 +++++++++++------- 10 files changed, 108 insertions(+), 73 deletions(-) delete mode 100644 apps/chronosimplewid/README.md delete mode 100644 apps/chronosimplewid/metadata.json rename apps/{chronosimplewid => widtmr}/ChangeLog (100%) create mode 100644 apps/widtmr/README.md rename apps/{chronosimplewid => widtmr}/app-icon.js (100%) rename apps/{chronosimplewid => widtmr}/app.js (58%) rename apps/{chronosimplewid => widtmr}/app.png (100%) create mode 100644 apps/widtmr/metadata.json rename apps/{chronosimplewid => widtmr}/screenshot.png (100%) rename apps/{chronosimplewid => widtmr}/widget.js (60%) diff --git a/apps/chronosimplewid/README.md b/apps/chronosimplewid/README.md deleted file mode 100644 index 6f3b417c0..000000000 --- a/apps/chronosimplewid/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Simple Chronometer Widget - -A fork of the awesome Chronometer Widget, but with a simple UI to set -a timer faster using only a tab events. Also very useful if combined -with the Pattern Launcher. - -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/metadata.json b/apps/chronosimplewid/metadata.json deleted file mode 100644 index 72cc13e32..000000000 --- a/apps/chronosimplewid/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "chronosimplewid", - "name": "Simple Chrono", - "shortName": "Simple Chrono", - "version": "0.01", - "description": "Chrono Widget Fork. Implements a simpler UI.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], - "readme": "README.md", - "storage": [ - {"name":"chronosimplewid.wid.js","url":"widget.js"}, - {"name":"chronosimplewid.app.js","url":"app.js"}, - {"name":"chronosimplewid.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/chronosimplewid/ChangeLog b/apps/widtmr/ChangeLog similarity index 100% rename from apps/chronosimplewid/ChangeLog rename to apps/widtmr/ChangeLog diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md new file mode 100644 index 000000000..0694a13cc --- /dev/null +++ b/apps/widtmr/README.md @@ -0,0 +1,12 @@ +# Simple Chronometer Widget + +This is a fork of the Chrono Widget, but implements a +simpler UI which to be able to set a timer faster with +less interaction. Additionally, it exposes some functions +that can be used by other apps or clocks to easily +implement a timer. It is used e.g. by lcars or notanalog. + +# Contributors +Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/chronosimplewid/app-icon.js b/apps/widtmr/app-icon.js similarity index 100% rename from apps/chronosimplewid/app-icon.js rename to apps/widtmr/app-icon.js diff --git a/apps/chronosimplewid/app.js b/apps/widtmr/app.js similarity index 58% rename from apps/chronosimplewid/app.js rename to apps/widtmr/app.js index d3293bc90..311e0d3ea 100644 --- a/apps/chronosimplewid/app.js +++ b/apps/widtmr/app.js @@ -1,8 +1,19 @@ +/* + * This is a fork of the Chrono Widget, but implements a + * simpler UI which to be able to set a timer faster with + * less interaction. Additionally, it exposes some functions + * that can be used by other apps or clocks to easily + * implement a timer. It is used e.g. by lcars or notanalog. + * + * Creator: David Peer + * Date: 02/2022 + */ + Bangle.loadWidgets(); const storage = require('Storage'); -let settingsChronowid; +let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); @@ -13,15 +24,15 @@ const cy = parseInt(screenHeight/2); function updateSettings() { var now = new Date(); const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settingsChronowid.minutes, now.getSeconds()); - settingsChronowid.goal = goal.getTime(); - storage.writeJSON('chronosimplewid.json', settingsChronowid); - if (WIDGETS["chronowid"]) WIDGETS["chronowid"].reload(); + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { - settingsChronowid = { + settings = { hours : 0, minutes : 0, seconds : 0, @@ -33,8 +44,8 @@ function resetSettings() { } -settingsChronowid = storage.readJSON('chronosimplewid.json',1); -if (!settingsChronowid) resetSettings(); +settings = storage.readJSON('widtmr.json',1); +if (!settings) resetSettings(); setWatch(_=>load(), BTN1); @@ -44,10 +55,10 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var text = settingsChronowid.minutes + " min."; + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settingsChronowid.started){ + if(settings.started){ g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -70,25 +81,25 @@ Bangle.on('touch', function(btn, e){ var isLower = e.y > lower; if(isRight){ - settingsChronowid.minutes += 1; + settings.minutes += 1; Bangle.buzz(40, 0.3); } else if(isLeft){ - settingsChronowid.minutes -= 1; + settings.minutes -= 1; Bangle.buzz(40, 0.3); } else if(isUpper){ - settingsChronowid.minutes += 5; + settings.minutes += 5; Bangle.buzz(40, 0.3); } else if(isLower){ - settingsChronowid.minutes -= 5; + settings.minutes -= 5; Bangle.buzz(40, 0.3); } else { - settingsChronowid.started = !settingsChronowid.started; + settings.started = !settings.started; Bangle.buzz(120, 0.6); } - if(settingsChronowid.minutes <= 0){ - settingsChronowid.minutes = 0; - settingsChronowid.started = false; + if(settings.minutes <= 0){ + settings.minutes = 0; + settings.started = false; } updateSettings(); diff --git a/apps/chronosimplewid/app.png b/apps/widtmr/app.png similarity index 100% rename from apps/chronosimplewid/app.png rename to apps/widtmr/app.png diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json new file mode 100644 index 000000000..9645cc00c --- /dev/null +++ b/apps/widtmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "widtmr", + "name": "Timer Widget", + "shortName": "Timer Widget", + "version": "0.01", + "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", + "icon": "app.png", + "tags": "tool,widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"widtmr.wid.js","url":"widget.js"}, + {"name":"widtmr.app.js","url":"app.js"}, + {"name":"widtmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/chronosimplewid/screenshot.png b/apps/widtmr/screenshot.png similarity index 100% rename from apps/chronosimplewid/screenshot.png rename to apps/widtmr/screenshot.png diff --git a/apps/chronosimplewid/widget.js b/apps/widtmr/widget.js similarity index 60% rename from apps/chronosimplewid/widget.js rename to apps/widtmr/widget.js index 3fc5888b1..c918a52e1 100644 --- a/apps/chronosimplewid/widget.js +++ b/apps/widtmr/widget.js @@ -1,8 +1,11 @@ (() => { - var settingsChronowid; + let storage = require('Storage'); + + var settings; var interval = 0; //used for the 1 second interval timer var diff; + //Convert ms to time function getTime(t) { var milliseconds = parseInt((t % 1000) / 100), @@ -12,37 +15,35 @@ return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); } - /*function printDebug() { - print ("Goaltime: " + getTime(settingsChronowid.goal)); - print ("Goal: " + settingsChronowid.goal); - print("Difftime: " + getTime(diff)); - print("Diff: " + diff); - print ("Started: " + settingsChronowid.started); - print ("----"); - }*/ //counts down, calculates and displays function countDown() { var now = new Date(); - diff = settingsChronowid.goal - now; //calculate difference + diff = settings.goal - now; //calculate difference // time is up - if (settingsChronowid.started && diff < 1000) { + if (settings.started && diff < 1000) { Bangle.buzz(1500); //write timer off to file - settingsChronowid.started = false; - require('Storage').writeJSON('chronosimplewid.json', settingsChronowid); + settings.started = false; + storage.writeJSON('widtmr.json', settings); clearInterval(interval); //stop interval interval = undefined; } // calculates width and redraws accordingly - WIDGETS["chronowid"].redraw(); + WIDGETS["widtmr"].redraw(); } - // add the widget - WIDGETS["chronowid"]={area:"tl",width:0,draw:function() { - if (!this.width) return; + + /* + * Add the widgets and functions for other apps + */ + WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { + if (!this.width) { + return; + } + g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - //g.drawRect(this.x,this.y,this.x+this.width-1, this.y+23); + var scale; var timeStr; if (diff < 3600000) { //less than 1 hour left @@ -54,26 +55,47 @@ scale = 1; timeStr = getTime(diff); //display hour 00:00:00 but small } + // Font5x9Numeric7Seg - just build this in as it's tiny g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); g.drawString(timeStr, this.x+this.width/2, this.y+12); + }, redraw:function() { var last = this.width; - if (!settingsChronowid.started) this.width = 0; - else this.width = (diff < 3600000) ? 58 : 48; - if (last != this.width) Bangle.drawWidgets(); - else this.draw(); + if (!settings.started) { + this.width = 0; + } else { + this.width = (diff < 3600000) ? 58 : 48; + } + + if (last != this.width) { + Bangle.drawWidgets(); + } else { + this.draw(); + } + }, reload:function() { - settingsChronowid = require('Storage').readJSON("chronosimplewid.json",1)||{}; - if (interval) clearInterval(interval); + settings = storage.readJSON("widtmr.json",1)||{}; + if (interval) { + clearInterval(interval); + } interval = undefined; + // start countdown each second - if (settingsChronowid.started) interval = setInterval(countDown, 1000); + if (settings.started) { + interval = setInterval(countDown, 1000); + } + // reset everything countDown(); - }}; - //printDebug(); + }, isStarted: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + return settings.started; + } + +}; + // set width correctly, start countdown each second - WIDGETS["chronowid"].reload(); + WIDGETS["widtmr"].reload(); })(); From b8215908a625a754748a92ebc6512c3430e6940d Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 17:55:47 +0100 Subject: [PATCH 007/117] Expose timer functions for other apps. Updated notanalog and lcars to use this lib. --- apps/lcars/ChangeLog | 3 +- apps/lcars/README.md | 9 ++--- apps/lcars/lcars.app.js | 61 +++++---------------------------- apps/lcars/metadata.json | 3 +- apps/notanalog/ChangeLog | 3 +- apps/notanalog/README.md | 6 ++-- apps/notanalog/metadata.json | 3 +- apps/notanalog/notanalog.app.js | 56 ++++-------------------------- apps/widtmr/README.md | 18 +++++++--- apps/widtmr/app.js | 4 ++- apps/widtmr/widget.js | 38 ++++++++++++++++++++ 11 files changed, 85 insertions(+), 119 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 7d8fecb1e..08b3b3d4d 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -15,4 +15,5 @@ 0.15: Using wpedom to count steps. 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. -0.18: Fullscreen mode can now be enabled or disabled in the settings. \ No newline at end of file +0.18: Fullscreen mode can now be enabled or disabled in the settings. +0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f979b2304..cf360d647 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -15,7 +15,7 @@ with Gadgetbride and the weather app must be installed. * Tab on left/right to switch between different screens. * Cusomizable data that is shown on screen 1 (steps, weather etc.) * Shows random and real images of planets. - * Tap on top/bottom of screen 1 to activate an alarm. + * Tap on top/bottom of screen 1 to activate an alarm. Depends on widtmr. * The lower orange line indicates the battery level. * Display graphs (day or month) for steps + hrm on the second screen. @@ -36,8 +36,9 @@ Access different screens via tap on the left/ right side of the screen ![](screenshot_1.png) ![](screenshot_2.png) +## Creator +- [David Peer](https://github.com/peerdavid) ## Contributors -- [David Peer](https://github.com/peerdavid). -- [Adam Schmalhofer](https://github.com/adamschmalhofer). -- [Jon Warrington](https://github.com/BartokW). +- [Adam Schmalhofer](https://github.com/adamschmalhofer) +- [Jon Warrington](https://github.com/BartokW) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7d5da2d8e..13c163e26 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -480,9 +480,6 @@ function draw(){ // Queue draw first to ensure that its called in one minute again. queueDraw(); - // First handle alarm to show this correctly afterwards - handleAlarm(); - // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); @@ -561,43 +558,21 @@ function getWeather(){ /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } +function increaseAlarm(){ + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +} - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); +function decreaseAlarm(){ + WIDGETS["widtmr"].decreaseTimer(5); } @@ -625,26 +600,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} - - -function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); -} function feedback(){ Bangle.buzz(40, 0.3); diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index e6ca10f79..5efd29e7c 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,8 +3,9 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.18", + "version":"0.19", "readme": "README.md", + "dependencies": {"widtmr":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 574d46609..bb5297476 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,3 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. -0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. \ No newline at end of file +0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. +0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 2928fd959..3a0963090 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -8,8 +8,8 @@ black one the battery level (100% = 360 degrees). The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. -## Other features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). +## Other Features +- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. @@ -29,5 +29,5 @@ which helped a lot for this development. Icons from by Freepik - Flaticon -## Contributors +## Creator - [David Peer](https://github.com/peerdavid). \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5efb6bccf..5a0ddbaf0 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -3,10 +3,11 @@ "name": "Not Analog", "shortName":"Not Analog", "icon": "notanalog.png", - "version":"0.03", + "version":"0.04", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", + "dependencies": {"widtmr":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index cea8072b8..be9a01fa7 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -291,7 +291,6 @@ function drawSleep(){ function draw(fastUpdate){ // Execute handlers handleState(fastUpdate); - handleAlarm(); if(state.sleep){ drawSleep(); @@ -388,71 +387,28 @@ function queueDraw() { /* * Handle alarm */ -function getCurrentTimeInMinutes(){ - return Math.floor(Date.now() / (1000*60)); -} - function isAlarmEnabled(){ - return settings.alarm >= 0; + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ - var currentTime = getCurrentTimeInMinutes(); - return settings.alarm - currentTime; + return WIDGETS["widtmr"].getRemainingMinutes(); } -function handleAlarm(){ - if(!isAlarmEnabled()){ - return; - } - - if(getAlarmMinutes() > 0){ - return; - } - - // Alarm - var t = 300; - Bangle.buzz(t, 1) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)) - .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) - .then(() => { - // Update alarm state to disabled - settings.alarm = -1; - storage.writeJSON(SETTINGS_FILE, settings); - }); -} - - function increaseAlarm(){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); } - function decreaseAlarm(){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - - storage.writeJSON(SETTINGS_FILE, settings); + WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ Bangle.buzz(40, 0.6); } + /* * Lets start widgets, listen for btn etc. */ diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 0694a13cc..6820b74d0 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,4 +1,4 @@ -# Simple Chronometer Widget +# Timer Widget This is a fork of the Chrono Widget, but implements a simpler UI which to be able to set a timer faster with @@ -6,7 +6,17 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. -# Contributors -Originally from [Purple-Tentacle](https://github.com/Purple-Tentacle) +# Lib +Different functions are exposed to integrate a timer +into your own app. -Forked and adapted by [David Peer](https://github.com/peerdavid) \ No newline at end of file +Example: +```Javascript +WIDGETS["widtmr"].isStarted(); +WIDGETS["widtmr"].reload(); +WIDGETS["widtmr"].getRemainingMinutes(); +``` +# Creator + +[David Peer](https://github.com/peerdavid) + forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 311e0d3ea..5f836d417 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -1,4 +1,6 @@ /* + * TIMER WIDGET + * * This is a fork of the Chrono Widget, but implements a * simpler UI which to be able to set a timer faster with * less interaction. Additionally, it exposes some functions @@ -18,7 +20,7 @@ let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); -const cy = parseInt(screenHeight/2); +const cy = parseInt(screenHeight/2)-12; function updateSettings() { diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c918a52e1..127217364 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -34,6 +34,18 @@ } + function updateSettings(){ + var now = new Date(); + const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), + now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); + settings.goal = goal.getTime(); + + settings.goal = goal.getTime(); + storage.writeJSON('widtmr.json', settings); + WIDGETS["widtmr"].reload(); + } + + /* * Add the widgets and functions for other apps */ @@ -92,6 +104,32 @@ }, isStarted: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; return settings.started; + + }, setStarted: function(started){ + settings.started=started; + updateSettings(); + + }, increaseTimer: function(m){ + settings.minutes += m; + updateSettings(); + + }, decreaseTimer: function(m){ + settings.minutes -= m; + if(settings.minutes <= 0){ + settings.started=false; + settings.minutes=0; + } + updateSettings(); + + }, getRemainingMinutes: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return -1; + } + + var now = new Date(); + var diff = settings.goal - now; + return Math.floor(diff / (1000*60)); } }; From 6cfd7649162313e7cdcf085fcf2681a3a8eae3c6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:07:09 +0100 Subject: [PATCH 008/117] Improved documentation --- apps/widtmr/README.md | 29 +++++++++++++++++++++++++---- apps/widtmr/description.png | Bin 0 -> 7771 bytes apps/widtmr/metadata.json | 2 +- apps/widtmr/screenshot.png | Bin 2920 -> 1845 bytes apps/widtmr/screenshot_2.png | Bin 0 -> 1950 bytes 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 apps/widtmr/description.png create mode 100644 apps/widtmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 6820b74d0..9216a7b05 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -6,16 +6,37 @@ less interaction. Additionally, it exposes some functions that can be used by other apps or clocks to easily implement a timer. It is used e.g. by lcars or notanalog. +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + # Lib Different functions are exposed to integrate a timer into your own app. -Example: +The following functions are available: +- isStarted() -> boolean +- setStarted(boolean) -> void +- increaseTimer(int) -> void +- decreaseTimer(int) -> void +- getRemainingMinutes() -> int + +Example to increase the timer by 5 and ensure that its started: ```Javascript -WIDGETS["widtmr"].isStarted(); -WIDGETS["widtmr"].reload(); -WIDGETS["widtmr"].getRemainingMinutes(); +WIDGETS["widtmr"].increaseTimer(5); +WIDGETS["widtmr"].setStarted(true); ``` + +Example to decrease the timer. This also disables the timer if time <= 0.: +```Javascript +WIDGETS["widtmr"].decreaseTimer(5); +``` + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/description.png b/apps/widtmr/description.png new file mode 100644 index 0000000000000000000000000000000000000000..1286d1ab94e56658995ba8dabe08bfc7dea51bc6 GIT binary patch literal 7771 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 SWZ<+Iq^bmYRH|V9`ab}V`IlM% literal 0 HcmV?d00001 diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json index 9645cc00c..a30aea4c3 100644 --- a/apps/widtmr/metadata.json +++ b/apps/widtmr/metadata.json @@ -7,7 +7,7 @@ "icon": "app.png", "tags": "tool,widget", "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", "storage": [ {"name":"widtmr.wid.js","url":"widget.js"}, diff --git a/apps/widtmr/screenshot.png b/apps/widtmr/screenshot.png index f94eece94099f8e5e72db95bd1f6dd3e5a58a7b4..eff94475c73638521c0dc59ff9ec55182f609d2b 100644 GIT binary patch literal 1845 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 diff --git a/apps/widtmr/screenshot_2.png b/apps/widtmr/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5dc9a3df7dc091d1dfe6d8dd3aa29c51351127 GIT binary patch literal 1950 zcmeHI`#01H6d&KFOlD<9MQCO6Y+4K%#tepb3p;JQzwKYJXMec&bMC#L`?=@bbMCp{e(8>tm)j=? zfk5P)ogBQRSo_IfJEXp*X*y5}GI3s5dkFi5`a1|j*4NqL#2Iqn;{CzPbTk55ytOsA zAP#GjRq9;T(yeft5t}>F=j#rNCTqH<#2Y*XpaR;Ccx_=dx`~5Ova&=Q1Oa?mAYk;C zcW_4&_%@C_<&gMCBOmG|-;osV?VxO(z2uY)o_uT_Jx~D7hmj_Gmvjg(yW?b2GdcB2 zmC!)bvINghbo!GbtEl`V8CN1T;_oh_N*UdG1z>-&nxc-#RZXE+f-9=e?fmWb(cR>> z#u*_)ZfxI_KVr?pMv!eaY#S(_P~@g%KrumElU zShU_=&^KAa>W?@*yUT>q->L7C3x?ZknkfUAG}EXKW9OYk$AJ(*TFH9aq$L9vA zF24=qpZ1_|ejE>&sz}gHRW*agn|XsKXVx|&+l&YEQG_6r*q6S^?`x5q^(*H6aiH|$;;RBWDoD_jWr z4MC=&vM%^xMthg0!@DLjnuk@%6OnwFxFum4L+p^_Yw#P8WQV;u=bw(vUfW{CK@+=* z9JM5fW7S4{O1cY#;_Wq*ubU3)oi8=YhXB>(4^5mQ6kM16X=52E-r3WK3IPhTuUDJ_ zU`%QmTUQ2pNEPnJfFgYL90|?<67OBUV z=%SYn8XL{KDBAI;j|T4imj~`WBueNB{dLF?@F)%2)E2pp9xH@Xq7lmmrbr6LYC?@E z|8J4F5r{?wT-nZryA@Yfkp+^VAHSbGSeK1!Jr#lSlP^=Dp*@s^%p~Z3rzDSCPBz|5 zVi7TM-e%C!hk)f#ru}0LUoy@aonJ(G7Kdw9uuGB6@Hd-%{;`i=aO$rX9_hDZhGqyS zTE_?~}92lt`QYc&Ap(|&*f;LCfj5gFmk*uk? z=4597+VmxMFHdK?n$_Aq;X}kLAL?-c!=?5_4v!+qjz1Wb6IE38NI3S~)5P);ddjWd zJ>qdrYEOiPq-68`K%WY9fRYL&#U zxdDz{apX27*(TkwffvcoxO6}Ii$pxZ!u@LvN&>Yn zCDVJL%ITRfUlqsl=EnS8K)%lbN1ixLNdmFFG64HimG#9&_u_SC3$bVp4d|Fzi!eYF z`KEwS9?Qlj6fX#?hN|OAyj60P2tEnHp+%FCd)lAVW>Yd1Mq;+OCZ?11- Date: Fri, 25 Feb 2022 18:07:35 +0100 Subject: [PATCH 009/117] Minor changes --- apps/widtmr/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9216a7b05..9f3d96d9b 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -40,4 +40,4 @@ WIDGETS["widtmr"].decreaseTimer(5); # Creator [David Peer](https://github.com/peerdavid) - forked from [Purple-Tentacle](https://github.com/Purple-Tentacle) + forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) From 6bce7594dce96a074af47a345d935b48be2644f4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:13:01 +0100 Subject: [PATCH 010/117] Updated icons. --- apps/widtmr/README.md | 4 ++++ apps/widtmr/app-icon.js | 2 +- apps/widtmr/app.png | Bin 1060 -> 1153 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9f3d96d9b..e81cac3d5 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -41,3 +41,7 @@ WIDGETS["widtmr"].decreaseTimer(5); [David Peer](https://github.com/peerdavid) forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index db2010218..48f91a33b 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file diff --git a/apps/widtmr/app.png b/apps/widtmr/app.png index 5ac7a480c5d4533c9851ba6264b74aae48035eb0..04ed03751e6b271309a236bd123fa68ad8acfdba 100644 GIT binary patch delta 1132 zcmV-y1e5!u2!RQZB!2{RLP=Bz2nYy#2xN!=00cNmL_t(&f$iB_h*f122k_sSMjbN} zt>|v1Nl*`YA%hGeiR?xsm{1Qv7l?ca%BTp!mx>~=pvWG2=!Os#K@VLlNDM+`j3iM@ z4TUTdgh_8U*MGnG5L2okdn`=AQXG($dmHXI zxQaFho!R)D{F_=#KF3(xi_IdO>KTEjF!2OqJF>A`vvK{x8Ov~Hi})6zh8wY73a2i- z>e$KGE>`c4?EiKAipPZh9~R8R_mVfeu%dua4G&?TWbjTbGH~-c<*4Cuyf0on`bAPM zZu;L1*nc8bu#LFZ2vP!*MLEp9`?<6V?RZWqmFsX_RS&Mp1N%kj^kly;71DqRk*UI< zK71*1rxH}TggsJ|pq3qX2;%wmy!2Mq@u0yj76hA#!63Zo}+~o?8hn zz#C#O$aCNU%oK8CK5i0Sjy%cN;;P{w+l-l5C4Wfe8`?@CxnCDywHlYkCh zY>cNIHL(Y*lf2$75_uY)#^2fX!+2Me+h?TSPhH56C5rn~Ekhgb6qO`T$hz2tr{YNi zH>`df6cTxg$dz3U_x6g_IVDDP;9=~MbkOg3LP+2h8QFYiZtgIz#w?K+n2$BEF`FL`&n@Z>Cfru_GW zJoXo6V^>Kl(JS5wF0R^u*&=T1qOyFIU0Wb@O-`WfQ5VU)MC8Rvsq@^6cW_>n1}trO zc&7-NMM6=Y%$JwH@RCUW`D!j# zqB5105@$7>?-B`pj%qwK0r%isd@Z$7rkCM2QuO#3p;`}0LT{`R4jL&23>l*a3^z`D z1BNP~4hu=qT@jBi(Q_R%hHAieydZQ-6{U0!e!(?^9e6AQ+C*K>L#(lPbGGQfb!BEp zRhVdCXRkx3)4W}?PeHrA$a^!y+tj><`{N{IdxTzT1=^+hf5gDB+JFb~^NA)|ESB_S yB|_E5e%#kgwx|mIAT)brUq>oH9X~1v+5Z7%-K2onB!mS30000m;x<_9I=$uURJ1ZseBV6R)F#Xg92C;;k!X6tX2rp*iB9q=U=45y zm<6tfq%{NOz;R#zF~J#TM22egDKJPw=zW_$>jHUpdnVmAI3OLSh6 zXa!Os2$%L1*ngAHB%;817Xc~M^LhX^4r0JkU>WL;)mh*5=jecQK%q+#CN z1Wcf2iXx5Q7Rw}xfHq(_3+JFsq&Xup0P= zv**2v2Y76mSHyr(5i^CF1dP!qh^B#RLyj-NXG5ROILE|ULk>3JoW42@Im&FlWrn_o zMC>_Wy$Qi7L6E?F^V4YaZ#49c0I!6G6DH0dg>##s0Dumge}@l$Ie|>zu@iR)#}xWS zDi^wK9Dm(D{ELA}p`}SS(q*($T;D(yT&Aeb^4TkX0yo9~nq?zh0`=nhfsf#oWIp$e zz(yZDL*iO$)8aLmx2?`FXcelm)K#0hjgA`{1jn!!Cs`@R+?zXa4X5}&cEyk@F8q^T zoMwen)G(-9sq9IB4MoD=F&1@WAZ-{#!fl@&bbk--(56e^hqzvD804PIcY}spvhJGp z;v`o<(?MK={xM1d>kPT%AWp~zx;ro;uD2Qn9RX@lgZaB-JYLjIId5ATIc`f4ywWzho9=q2M(JGwtc>;BMkT1k>Zt9bm z*JJb8C&<#MqYvMNE{Fq9HSt=566?-GM=@XE+)#_N=hLWj(!eMLZfnS=QKtt%W~T^n z80Rye25#~9XfZHK(I=5c)lTiGg~uz3QGfHioGR_&OGDB=k3!s!*C&C?z(LfC8At6U zqSogI>$?G*E3ABMLhE@Q+R$$qgIbah2CP@aQ9TvbE2duZGqdGH1?t3X!lPJO+w@o* zz7fh#UQk6=J+KSdj@s0eqh2wAnq?+{x2V^x_ffA|e+3Qv8;y4S&y5Yu=l}o!00>D% JPDHLkV1fs`=HmbW From 217acc89aa61f0525bf1333d35b5f6a84cee8a78 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:23:22 +0100 Subject: [PATCH 011/117] New icon --- apps/widtmr/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/app-icon.js b/apps/widtmr/app-icon.js index 48f91a33b..bc4261459 100644 --- a/apps/widtmr/app-icon.js +++ b/apps/widtmr/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/AIDj4FL/+H///+ICBx4FuGoXhAQPHAQPDAQmDBwkHAQPw//+h4FB/F//hYB//8n4HBAoIPBCYIACg4fCGwQrCGAQ3CAAPjIYQFCJ4QAB4QREwwdEglhAgX+hkwAoX8jEYIIX4sEMJoXw4EGLIXhwEDMoXDgEBOIXGXwNDAoOEAoMhAoOMAoMxAsrFK/AQBAAMfApY")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwMAg//AAXgApcAvAZBhwCBuAFuGoUeAQM4AQM8AQl8Bwn4AQMPgEB+AFBg+AgZYBgED4AHBAoIPBCYIAC/AfCGwQrCGAQ3CAAMcIYQFCJ4QABnoREvIdE/eeAgUB+fPAoUD8/nIIUHz/zJoUPn/5LIUev/8MoU8//+OIU5XwO8AoN7AoPeAoNzAoPOAsrFKg4QBAAPgApYA==")) \ No newline at end of file From 2cc953e2b399f81f796ec3c9afbf869ba13cbfcd Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Feb 2022 18:58:35 +0100 Subject: [PATCH 012/117] Updated readme --- apps/widtmr/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index e81cac3d5..9e640c618 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,7 +15,7 @@ started / stopped. ![](description.png) -# Lib +# Library for other Apps Different functions are exposed to integrate a timer into your own app. @@ -28,20 +28,25 @@ The following functions are available: Example to increase the timer by 5 and ensure that its started: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); ``` Example to decrease the timer. This also disables the timer if time <= 0.: ```Javascript +Bangle.loadWidgets(); +... WIDGETS["widtmr"].decreaseTimer(5); ``` # Creator [David Peer](https://github.com/peerdavid) - forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) # Thanks to... -Time icon created by CreativeCons - Flaticon \ No newline at end of file +Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) + +Time icon created by CreativeCons - Flaticon \ No newline at end of file From 9daf898f1f310599256cc60b132009e47a73ea94 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:14:57 +0100 Subject: [PATCH 013/117] Show ceil of remaining minutes which is much easier to read. --- apps/widtmr/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 127217364..3b7cfb25e 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -129,7 +129,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.floor(diff / (1000*60)); + return Math.ceil(diff / (1000*60)); } }; From c6c86213d19560619c423f1277d22391a43c3ca5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:17:46 +0100 Subject: [PATCH 014/117] Add function to get the time rather than minutes only --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 9e640c618..7edaffb10 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -25,6 +25,7 @@ The following functions are available: - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int +- getRemainingTime() -> DateTime Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 3b7cfb25e..b83b4a204 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -130,6 +130,15 @@ var now = new Date(); var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); + + }, getRemainingTime: function(){ + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return getTime(diff); } }; From ef31fd4f01cd72b14e2630b1d675329d4ced3831 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:24:42 +0100 Subject: [PATCH 015/117] Added more functions to get the time, time str or remaining minutes. --- apps/widtmr/README.md | 1 + apps/widtmr/widget.js | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 7edaffb10..bd795d20f 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -26,6 +26,7 @@ The following functions are available: - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime +- getRemainingTimeStr() -> str Example to increase the timer by 5 and ensure that its started: ```Javascript diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index b83b4a204..8dcc5ec41 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -131,16 +131,30 @@ var diff = settings.goal - now; return Math.ceil(diff / (1000*60)); - }, getRemainingTime: function(){ + }, getRemainingTimeStr: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ return; } var now = new Date(); var diff = settings.goal - now; - return getTime(diff); - } + var timeStr = getTime(diff); + if(diff < 3600000){ + timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 + } + return timeStr; + }, getRemainingTime: function(){ + settings = storage.readJSON("widtmr.json",1)||{started: false}; + if(!settings.started){ + return; + } + + var now = new Date(); + var diff = settings.goal - now; + return diff; + } }; // set width correctly, start countdown each second From 777943e0315c1fa2e176bbcb24402d9d85d1629c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:36:29 +0100 Subject: [PATCH 016/117] For watch faces we want to start at 0 rather than the last value that was set... --- apps/lcars/lcars.app.js | 5 +++++ apps/notanalog/notanalog.app.js | 4 ++++ apps/widtmr/README.md | 21 ++++++++++++++++----- apps/widtmr/widget.js | 7 ++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 13c163e26..958ab7388 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,6 +567,11 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index be9a01fa7..6bd725f58 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,6 +396,10 @@ function getAlarmMinutes(){ } function increaseAlarm(){ + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + WIDGETS["widtmr"].increaseTimer(5); WIDGETS["widtmr"].setStarted(true); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index bd795d20f..4bdf20b93 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,25 +22,36 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void +- resetTimer() -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int - getRemainingTime() -> DateTime - getRemainingTimeStr() -> str -Example to increase the timer by 5 and ensure that its started: +For example if we want to increase the timer by +5 minutes each time +the touch event is fired: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].increaseTimer(5); -WIDGETS["widtmr"].setStarted(true); +Bangle.on('touch', function(btn, e){ + // Set to zero if alarm was disabled before + if(!isAlarmEnabled()){ + WIDGETS["widtmr"].resetTimer(); + } + + WIDGETS["widtmr"].increaseTimer(5); + WIDGETS["widtmr"].setStarted(true); +}); ``` -Example to decrease the timer. This also disables the timer if time <= 0.: +Example to decrease the timer by 5 and stop if 0 is reached: ```Javascript Bangle.loadWidgets(); ... -WIDGETS["widtmr"].decreaseTimer(5); +Bangle.on('touch', function(btn, e){ + WIDGETS["widtmr"].decreaseTimer(5); +} ``` # Creator diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 8dcc5ec41..751da4ee8 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,6 +121,11 @@ } updateSettings(); + }, resetTimer: function(){ + settings.started=false; + settings.minutes = 0; + updateSettings(); + }, getRemainingMinutes: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; if(!settings.started){ @@ -129,7 +134,7 @@ var now = new Date(); var diff = settings.goal - now; - return Math.ceil(diff / (1000*60)); + return Math.round(diff / (1000*60)); }, getRemainingTimeStr: function(){ settings = storage.readJSON("widtmr.json",1)||{started: false}; From 3bbbd8831c4c56e326e59b5a999000a6cbce07fe Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 09:53:38 +0100 Subject: [PATCH 017/117] Updated lcars and notanalog to also work if the widget is not installed. Then this functionality is not provided but the apps are not crashing. Also faster updates of the watch face in timer mode to show the correct time... --- apps/lcars/lcars.app.js | 35 ++++++++++++++++++++++++++++-- apps/notanalog/notanalog.app.js | 38 ++++++++++++++++++++++++++++++--- apps/widtmr/README.md | 6 ++++-- apps/widtmr/widget.js | 6 +++--- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 958ab7388..848065994 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -124,11 +124,16 @@ Graphics.prototype.setFontAntonioLarge = function(scale) { */ var drawTimeout; function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; draw(); - }, 60000 - (Date.now() % 60000)); + }, timeout - (Date.now() % timeout)); } /** @@ -558,18 +563,40 @@ function getWeather(){ /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -577,6 +604,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 6bd725f58..8939a5a75 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -376,28 +376,56 @@ Bangle.on('touch', function(btn, e){ * Some helpers */ function queueDraw() { + + // Faster updates during alarm to ensure that it is + // shown correctly... + var timeout = isAlarmEnabled() ? 10000 : 60000; + if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; - draw(true); - }, 60000 - (Date.now() % 60000)); + draw(); + }, timeout - (Date.now() % timeout)); } /* * Handle alarm */ +function isWidtmrAvailable(){ + try { + WIDGETS["widtmr"].isStarted(); + return true; + } catch { + // In case the widtmr widget is not installed, the timer can + // not be used... + return false; + } +} + function isAlarmEnabled(){ + if(!isWidtmrAvailable()){ + return false; + } + return WIDGETS["widtmr"].isStarted(); } function getAlarmMinutes(){ + if(!isWidtmrAvailable()){ + return "-"; + } return WIDGETS["widtmr"].getRemainingMinutes(); } function increaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + + // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -405,6 +433,10 @@ function increaseAlarm(){ } function decreaseAlarm(){ + if(!isWidtmrAvailable()){ + return; + } + WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 4bdf20b93..c4304bd81 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -22,7 +22,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- resetTimer() -> void +- setTime(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.loadWidgets(); Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].resetTimer(); + WIDGETS["widtmr"].setTime(0); } WIDGETS["widtmr"].increaseTimer(5); @@ -54,6 +54,8 @@ Bangle.on('touch', function(btn, e){ } ``` +You can find even more examples in the lcars or notanalog app ... + # Creator [David Peer](https://github.com/peerdavid) diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index 751da4ee8..c9ef4ffdb 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,9 +121,9 @@ } updateSettings(); - }, resetTimer: function(){ - settings.started=false; - settings.minutes = 0; + }, setTime: function(t){ + settings.minutes = Math.max(0, t); + settings.started = t > 0; updateSettings(); }, getRemainingMinutes: function(){ From 2124c2b0d4f7087d5bb167d546ccdca58db825c9 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 10:00:53 +0100 Subject: [PATCH 018/117] Bugfix --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 848065994..9af585ff7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 8939a5a75..91381fe71 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -396,7 +396,7 @@ function isWidtmrAvailable(){ try { WIDGETS["widtmr"].isStarted(); return true; - } catch { + } catch(e) { // In case the widtmr widget is not installed, the timer can // not be used... return false; From fd3401bd2372e4c522162546708d2dbf938f4927 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:05:39 +0100 Subject: [PATCH 019/117] Updated readme --- apps/widtmr/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index c4304bd81..2ffbfc8cf 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -1,10 +1,9 @@ # Timer Widget This is a fork of the Chrono Widget, but implements a -simpler UI which to be able to set a timer faster with -less interaction. Additionally, it exposes some functions -that can be used by other apps or clocks to easily -implement a timer. It is used e.g. by lcars or notanalog. +simpler UI. Additionally, it exposes functions for other +apps or clocks such that they can easily implement a timer. +Currently, it is used by lcars and notanalog. # Overview If you open the app, you can simply control the timer @@ -15,7 +14,7 @@ started / stopped. ![](description.png) -# Library for other Apps +# Lib Different functions are exposed to integrate a timer into your own app. @@ -35,7 +34,8 @@ the touch event is fired: Bangle.loadWidgets(); ... Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before + // Set to zero if alarm was disabled before. Otherwise + // it starts from the last setting made by the user. if(!isAlarmEnabled()){ WIDGETS["widtmr"].setTime(0); } @@ -54,10 +54,10 @@ Bangle.on('touch', function(btn, e){ } ``` -You can find even more examples in the lcars or notanalog app ... +You can find implementations and usages in the lcars or notanalog app. + # Creator - [David Peer](https://github.com/peerdavid) From 56a4cd0dff87d2e0e34071a813708a560d23e62a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 11:55:35 +0100 Subject: [PATCH 020/117] Renaming of setTime to setTimer. --- apps/lcars/lcars.app.js | 2 +- apps/notanalog/notanalog.app.js | 2 +- apps/widtmr/README.md | 4 ++-- apps/widtmr/widget.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9af585ff7..6ffc78ca7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -596,7 +596,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 91381fe71..5e56d6f6a 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -425,7 +425,7 @@ function increaseAlarm(){ // Set to zero if alarm was disabled before if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index 2ffbfc8cf..ae8b0945e 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -21,7 +21,7 @@ into your own app. The following functions are available: - isStarted() -> boolean - setStarted(boolean) -> void -- setTime(t) -> void +- setTimer(t) -> void - increaseTimer(int) -> void - decreaseTimer(int) -> void - getRemainingMinutes() -> int @@ -37,7 +37,7 @@ Bangle.on('touch', function(btn, e){ // Set to zero if alarm was disabled before. Otherwise // it starts from the last setting made by the user. if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTime(0); + WIDGETS["widtmr"].setTimer(0); } WIDGETS["widtmr"].increaseTimer(5); diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js index c9ef4ffdb..30eb950cf 100644 --- a/apps/widtmr/widget.js +++ b/apps/widtmr/widget.js @@ -121,7 +121,7 @@ } updateSettings(); - }, setTime: function(t){ + }, setTimer: function(t){ settings.minutes = Math.max(0, t); settings.started = t > 0; updateSettings(); From bffbe40290eaa0bb1258c9a58c70e647a44b06f3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Feb 2022 12:02:18 +0100 Subject: [PATCH 021/117] Minor changes --- apps/widtmr/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md index ae8b0945e..88893ce74 100644 --- a/apps/widtmr/README.md +++ b/apps/widtmr/README.md @@ -15,8 +15,8 @@ started / stopped. # Lib -Different functions are exposed to integrate a timer -into your own app. +Different functions are exposed by widtmr which enables other +apps to directly use and integrate this functionality: The following functions are available: - isStarted() -> boolean From 61c29c1c7ae2c4537434f9507be2cb5c1a8c1924 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 4 Mar 2022 17:35:34 +0100 Subject: [PATCH 022/117] First alarm lib test --- apps/alarm/ChangeLog | 1 + apps/alarm/lib.js | 3 +++ apps/alarm/metadata.json | 5 +++-- apps/widtmr/app.js | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 apps/alarm/lib.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 4576237a5..9442c234e 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,3 +14,4 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system +0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js new file mode 100644 index 000000000..9dfcca897 --- /dev/null +++ b/apps/alarm/lib.js @@ -0,0 +1,3 @@ +exports.createTimer = function() { + return 0; +} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index d29298309..bbb6012d9 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.15", + "version": "0.16", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,7 +12,8 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + {"name":"alarm.wid.js","url":"widget.js"}, + {"name":"alarm","url":"lib.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/widtmr/app.js b/apps/widtmr/app.js index 5f836d417..2a10b3b5c 100644 --- a/apps/widtmr/app.js +++ b/apps/widtmr/app.js @@ -57,6 +57,9 @@ function draw(){ g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + + print(require("alarm").createTimer()); + var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); From 29faff8eb8af71808b0ad4c51b8432793e82891f Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 7 Mar 2022 17:07:28 +0100 Subject: [PATCH 023/117] Tests with qalarm --- apps/qalarm/ChangeLog | 1 + apps/qalarm/lib.js | 81 +++++++++++++++++++++++++++++++++++++++ apps/qalarm/metadata.json | 3 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 apps/qalarm/lib.js diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index b9be6039d..850735ddb 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,3 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. +0.05: Include library for other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js new file mode 100644 index 000000000..1cb602456 --- /dev/null +++ b/apps/qalarm/lib.js @@ -0,0 +1,81 @@ +Bangle.loadWidgets(); + +let alarms = require("Storage").readJSON("qalarm.json", 1) || []; + +/** + * LIBRARY + */ +function alarmExists(alarmIndex){ + return alarmIndex > 0 && alarmIndex < alarms.length; +} + +function isAlarmStarted(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return false; + } + + let time = new Date(); + let t = getCurrentTime(); + a = alarms[alarmIndex]; + return a.on && + a.t <= t && + a.last != time.getDate() && + (a.timer || a.daysOfWeek[time.getDay()]); +} + +function getAlarmMin(alarmIndex){ + if(!isAlarmStarted(alarmIndex)){ + return 0; + } + + let t = getCurrentTime(); + let a = alarms[alarmIndex] ; + return a.t - t * 60; + } + +function _reload(){ + require("Storage").write("qalarm.json", JSON.stringify(alarms)); + eval(require("Storage").read("qalarmcheck.js")); + if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); +} + +function editTimer(alarmIndex, hrs, mins, secs){ + var a = { + timer: 300, + on: true, + rp: false, + as: false, + hard: false, + }; + a.timer = hrs * 3600 + mins * 60 + secs; + a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + + if(alarmExists(a)){ + alarms[alarmIndex] = a; + } else { + alarmIndex = alarms.length; + alarms.push(a) + } + + _reload(); + return alarmIndex; +} + + +function deleteAlarm(alarmIndex){ + if(!alarmExists(alarmIndex)){ + return; + } + + alarms.splice(alarmIndex, 1); + + _reload(); +} + + +// Export functions +exports.alarmExists = alarmExists; +exports.isAlarmStarted = isAlarmStarted; +exports.getAlarmMin = getAlarmMin; +exports.editTimer = editTimer; +exports.deleteAlarm = deleteAlarm; \ No newline at end of file diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 326ba33a7..1ab4f4192 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,11 +3,12 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.04", + "version": "0.05", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ + { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, From 630ea1a21c020114a531033eb39abcb29b1aa9be Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:03:23 +0100 Subject: [PATCH 024/117] Added library to qalarm and created a simple timer app which is an alternative UI. --- apps/alarm/ChangeLog | 1 - apps/alarm/lib.js | 3 - apps/alarm/metadata.json | 5 +- apps/alarm/widget.js | 8 +- apps/qalarm/ChangeLog | 2 +- apps/qalarm/lib.js | 41 ++++-- apps/{widtmr => smpltmr}/ChangeLog | 0 apps/smpltmr/README.md | 21 +++ apps/{widtmr => smpltmr}/app-icon.js | 0 apps/{widtmr => smpltmr}/app.js | 74 ++++++---- apps/{widtmr => smpltmr}/app.png | Bin apps/{widtmr => smpltmr}/description.png | Bin apps/smpltmr/metadata.json | 17 +++ apps/{widtmr => smpltmr}/screenshot.png | Bin apps/{widtmr => smpltmr}/screenshot_2.png | Bin apps/widtmr/README.md | 67 --------- apps/widtmr/metadata.json | 17 --- apps/widtmr/widget.js | 167 ---------------------- 18 files changed, 116 insertions(+), 307 deletions(-) delete mode 100644 apps/alarm/lib.js rename apps/{widtmr => smpltmr}/ChangeLog (100%) create mode 100644 apps/smpltmr/README.md rename apps/{widtmr => smpltmr}/app-icon.js (100%) rename apps/{widtmr => smpltmr}/app.js (55%) rename apps/{widtmr => smpltmr}/app.png (100%) rename apps/{widtmr => smpltmr}/description.png (100%) create mode 100644 apps/smpltmr/metadata.json rename apps/{widtmr => smpltmr}/screenshot.png (100%) rename apps/{widtmr => smpltmr}/screenshot_2.png (100%) delete mode 100644 apps/widtmr/README.md delete mode 100644 apps/widtmr/metadata.json delete mode 100644 apps/widtmr/widget.js diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 9442c234e..4576237a5 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -14,4 +14,3 @@ 0.13: Alarm widget state now updates when setting/resetting an alarm 0.14: Order of 'back' menu item 0.15: Fix hour/minute wrapping code for new menu system -0.16: Expose functions for other apps \ No newline at end of file diff --git a/apps/alarm/lib.js b/apps/alarm/lib.js deleted file mode 100644 index 9dfcca897..000000000 --- a/apps/alarm/lib.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.createTimer = function() { - return 0; -} \ No newline at end of file diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index bbb6012d9..d29298309 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Default Alarm & Timer", "shortName": "Alarms", - "version": "0.16", + "version": "0.15", "description": "Set and respond to alarms and timers", "icon": "app.png", "tags": "tool,alarm,widget", @@ -12,8 +12,7 @@ {"name":"alarm.boot.js","url":"boot.js"}, {"name":"alarm.js","url":"alarm.js"}, {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"}, - {"name":"alarm","url":"lib.js"} + {"name":"alarm.wid.js","url":"widget.js"} ], "data": [{"name":"alarm.json"}] } diff --git a/apps/alarm/widget.js b/apps/alarm/widget.js index e8bb79fc7..e1dec5ea2 100644 --- a/apps/alarm/widget.js +++ b/apps/alarm/widget.js @@ -1,7 +1,7 @@ WIDGETS["alarm"]={area:"tl",width:0,draw:function() { - if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); - },reload:function() { - WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; - } + if (this.width) g.reset().drawImage(atob("GBgBAAAAAAAAABgADhhwDDwwGP8YGf+YMf+MM//MM//MA//AA//AA//AA//AA//AA//AB//gD//wD//wAAAAADwAABgAAAAAAAAA"),this.x,this.y); +},reload:function() { + WIDGETS["alarm"].width = (require('Storage').readJSON('alarm.json',1)||[]).some(alarm=>alarm.on) ? 24 : 0; +} }; WIDGETS["alarm"].reload(); diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 850735ddb..424571439 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,4 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library for other apps. \ No newline at end of file +0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 1cb602456..670ee99ae 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -5,8 +5,19 @@ let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** * LIBRARY */ + +function getCurrentTime() { + let time = new Date(); + return ( + time.getHours() * 3600000 + + time.getMinutes() * 60000 + + time.getSeconds() * 1000 + ); +} + function alarmExists(alarmIndex){ - return alarmIndex > 0 && alarmIndex < alarms.length; + var exists = alarmIndex >= 0 && alarmIndex < alarms.length; + return exists; } function isAlarmStarted(alarmIndex){ @@ -18,20 +29,23 @@ function isAlarmStarted(alarmIndex){ let t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && - a.t <= t && + t <= a.t && a.last != time.getDate() && (a.timer || a.daysOfWeek[time.getDay()]); } -function getAlarmMin(alarmIndex){ +function getTimerMin(alarmIndex){ if(!isAlarmStarted(alarmIndex)){ return 0; } - let t = getCurrentTime(); let a = alarms[alarmIndex] ; - return a.t - t * 60; - } + let diff = a.t - getCurrentTime(); + // let hrs = Math.floor(t / 3600000); + let mins = Math.round((diff / 60000) % 60); + // return hrs + ":" + ("0" + mins).substr(-2); + return mins; +} function _reload(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); @@ -41,34 +55,31 @@ function _reload(){ function editTimer(alarmIndex, hrs, mins, secs){ var a = { - timer: 300, on: true, rp: false, as: false, hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + alarm.timer * 1000) % 86400000; + a.t = (getCurrentTime() + a.timer * 1000) % 86400000; if(alarmExists(a)){ alarms[alarmIndex] = a; } else { - alarmIndex = alarms.length; alarms.push(a) + alarmIndex = alarms.length-1; } _reload(); return alarmIndex; } - function deleteAlarm(alarmIndex){ if(!alarmExists(alarmIndex)){ return; } alarms.splice(alarmIndex, 1); - _reload(); } @@ -76,6 +87,10 @@ function deleteAlarm(alarmIndex){ // Export functions exports.alarmExists = alarmExists; exports.isAlarmStarted = isAlarmStarted; -exports.getAlarmMin = getAlarmMin; +exports.deleteAlarm = deleteAlarm; + +exports.timerExists = alarmExists; +exports.isTimerStarted = isAlarmStarted; +exports.getTimerMin = getTimerMin; exports.editTimer = editTimer; -exports.deleteAlarm = deleteAlarm; \ No newline at end of file +exports.deleteTimer = deleteAlarm; diff --git a/apps/widtmr/ChangeLog b/apps/smpltmr/ChangeLog similarity index 100% rename from apps/widtmr/ChangeLog rename to apps/smpltmr/ChangeLog diff --git a/apps/smpltmr/README.md b/apps/smpltmr/README.md new file mode 100644 index 000000000..1296166e2 --- /dev/null +++ b/apps/smpltmr/README.md @@ -0,0 +1,21 @@ +# Simple Timer + +A simple app to set a timer quickly. Simply tab on top/bottom/left/right +to select the minutes and tab in the middle of the screen to start/stop +the timer. Note that this timer depends on qalarm. + +# Overview +If you open the app, you can simply control the timer +by clicking on top, bottom, left or right of the screen. +If you tab at the middle of the screen, the timer is +started / stopped. + +![](description.png) + + +# Creator +[David Peer](https://github.com/peerdavid) + + +# Thanks to... +Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/app-icon.js b/apps/smpltmr/app-icon.js similarity index 100% rename from apps/widtmr/app-icon.js rename to apps/smpltmr/app-icon.js diff --git a/apps/widtmr/app.js b/apps/smpltmr/app.js similarity index 55% rename from apps/widtmr/app.js rename to apps/smpltmr/app.js index 2a10b3b5c..1de9057e8 100644 --- a/apps/widtmr/app.js +++ b/apps/smpltmr/app.js @@ -15,32 +15,26 @@ Bangle.loadWidgets(); const storage = require('Storage'); +const alarm = require('qalarm'); + let settings; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); const cy = parseInt(screenHeight/2)-12; +var minutes = 5; +var interval; //used for the 1 second interval timer function updateSettings() { - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); storage.writeJSON('widtmr.json', settings); - if (WIDGETS["widtmr"]) WIDGETS["widtmr"].reload(); } function resetSettings() { settings = { - hours : 0, - minutes : 0, - seconds : 0, - started : false, - counter : 0, - goal : 0, + alarmIndex: -1 }; updateSettings(); } @@ -55,15 +49,25 @@ function draw(){ g.clear(1); Bangle.drawWidgets(); + if (interval) { + clearInterval(interval); + } + interval = undefined; + + // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); + var started = alarm.isTimerStarted(settings.alarmIndex); + var text = minutes + " min."; + if(started){ + var min = alarm.getTimerMin(settings.alarmIndex); + text = min + " min."; + } - print(require("alarm").createTimer()); - - var text = settings.minutes + " min."; var rectWidth = parseInt(g.stringWidth(text) / 2); - if(settings.started){ + if(started){ + interval = setInterval(draw, 1000); g.setColor("#ff0000"); } else { g.setColor(g.theme.fg); @@ -74,6 +78,7 @@ function draw(){ g.drawString(text, cx, cy); } + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.25); var right = g.getWidth() - left; @@ -84,27 +89,34 @@ Bangle.on('touch', function(btn, e){ var isRight = e.x > right; var isUpper = e.y < upper; var isLower = e.y > lower; + var isMiddle = !isLeft && !isRight && !isUpper && !isLower; + print(settings.alarmIndex); + var started = alarm.isTimerStarted(settings.alarmIndex); - if(isRight){ - settings.minutes += 1; + if(isRight && !started){ + minutes += 1; Bangle.buzz(40, 0.3); - } else if(isLeft){ - settings.minutes -= 1; + } else if(isLeft && !started){ + minutes -= 1; Bangle.buzz(40, 0.3); - } else if(isUpper){ - settings.minutes += 5; + } else if(isUpper && !started){ + minutes += 5; Bangle.buzz(40, 0.3); - } else if(isLower){ - settings.minutes -= 5; + } else if(isLower && !started){ + minutes -= 5; Bangle.buzz(40, 0.3); - } else { - settings.started = !settings.started; - Bangle.buzz(120, 0.6); - } - - if(settings.minutes <= 0){ - settings.minutes = 0; - settings.started = false; + } else if(isMiddle) { + if(!started){ + settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + print("-----") + print(settings.alarmIndex); + print(alarm.timerExists(settings.alarmIndex)) + print(alarm.isTimerStarted(settings.alarmIndex)) + print("-----") + } else { + alarm.deleteTimer(settings.alarmIndex); + } + Bangle.buzz(80, 0.6); } updateSettings(); diff --git a/apps/widtmr/app.png b/apps/smpltmr/app.png similarity index 100% rename from apps/widtmr/app.png rename to apps/smpltmr/app.png diff --git a/apps/widtmr/description.png b/apps/smpltmr/description.png similarity index 100% rename from apps/widtmr/description.png rename to apps/smpltmr/description.png diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json new file mode 100644 index 000000000..4f0d473b4 --- /dev/null +++ b/apps/smpltmr/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "smpltmr", + "name": "Simple Timer", + "shortName": "Simple Timer", + "version": "0.01", + "description": "A simple app to set a timer.", + "icon": "app.png", + "tags": "tool", + "dependencies": {"qalarm":"app"}, + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], + "readme": "README.md", + "storage": [ + {"name":"smpltmr.app.js","url":"app.js"}, + {"name":"smpltmr.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/widtmr/screenshot.png b/apps/smpltmr/screenshot.png similarity index 100% rename from apps/widtmr/screenshot.png rename to apps/smpltmr/screenshot.png diff --git a/apps/widtmr/screenshot_2.png b/apps/smpltmr/screenshot_2.png similarity index 100% rename from apps/widtmr/screenshot_2.png rename to apps/smpltmr/screenshot_2.png diff --git a/apps/widtmr/README.md b/apps/widtmr/README.md deleted file mode 100644 index 88893ce74..000000000 --- a/apps/widtmr/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Timer Widget - -This is a fork of the Chrono Widget, but implements a -simpler UI. Additionally, it exposes functions for other -apps or clocks such that they can easily implement a timer. -Currently, it is used by lcars and notanalog. - -# Overview -If you open the app, you can simply control the timer -by clicking on top, bottom, left or right of the screen. -If you tab at the middle of the screen, the timer is -started / stopped. - -![](description.png) - - -# Lib -Different functions are exposed by widtmr which enables other -apps to directly use and integrate this functionality: - -The following functions are available: -- isStarted() -> boolean -- setStarted(boolean) -> void -- setTimer(t) -> void -- increaseTimer(int) -> void -- decreaseTimer(int) -> void -- getRemainingMinutes() -> int -- getRemainingTime() -> DateTime -- getRemainingTimeStr() -> str - -For example if we want to increase the timer by +5 minutes each time -the touch event is fired: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - // Set to zero if alarm was disabled before. Otherwise - // it starts from the last setting made by the user. - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); -}); -``` - -Example to decrease the timer by 5 and stop if 0 is reached: -```Javascript -Bangle.loadWidgets(); -... -Bangle.on('touch', function(btn, e){ - WIDGETS["widtmr"].decreaseTimer(5); -} -``` - -You can find implementations and usages in the lcars or notanalog app. - - -# Creator -[David Peer](https://github.com/peerdavid) - - -# Thanks to... -Forked from Chrono Widget of [Purple-Tentacle](https://github.com/Purple-Tentacle) - -Time icon created by CreativeCons - Flaticon \ No newline at end of file diff --git a/apps/widtmr/metadata.json b/apps/widtmr/metadata.json deleted file mode 100644 index a30aea4c3..000000000 --- a/apps/widtmr/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "widtmr", - "name": "Timer Widget", - "shortName": "Timer Widget", - "version": "0.01", - "description": "Fork from Chrono Widget with a simpler UI and a lib for other apps.", - "icon": "app.png", - "tags": "tool,widget", - "supports": ["BANGLEJS","BANGLEJS2"], - "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], - "readme": "README.md", - "storage": [ - {"name":"widtmr.wid.js","url":"widget.js"}, - {"name":"widtmr.app.js","url":"app.js"}, - {"name":"widtmr.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/widtmr/widget.js b/apps/widtmr/widget.js deleted file mode 100644 index 30eb950cf..000000000 --- a/apps/widtmr/widget.js +++ /dev/null @@ -1,167 +0,0 @@ -(() => { - let storage = require('Storage'); - - var settings; - var interval = 0; //used for the 1 second interval timer - var diff; - - - //Convert ms to time - function getTime(t) { - var milliseconds = parseInt((t % 1000) / 100), - seconds = Math.floor((t / 1000) % 60), - minutes = Math.floor((t / (1000 * 60)) % 60), - hours = Math.floor((t / (1000 * 60 * 60)) % 24); - return hours.toString().padStart(2,0) + ":" + minutes.toString().padStart(2,0) + ":" + seconds.toString().padStart(2,0); - } - - - //counts down, calculates and displays - function countDown() { - var now = new Date(); - diff = settings.goal - now; //calculate difference - // time is up - if (settings.started && diff < 1000) { - Bangle.buzz(1500); - //write timer off to file - settings.started = false; - storage.writeJSON('widtmr.json', settings); - clearInterval(interval); //stop interval - interval = undefined; - } - // calculates width and redraws accordingly - WIDGETS["widtmr"].redraw(); - } - - - function updateSettings(){ - var now = new Date(); - const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(), - now.getHours(), now.getMinutes() + settings.minutes, now.getSeconds()); - settings.goal = goal.getTime(); - - settings.goal = goal.getTime(); - storage.writeJSON('widtmr.json', settings); - WIDGETS["widtmr"].reload(); - } - - - /* - * Add the widgets and functions for other apps - */ - WIDGETS["widtmr"]={area:"tl",width:0,draw:function() { - if (!this.width) { - return; - } - - g.reset().setFontAlign(0,0).clearRect(this.x,this.y,this.x+this.width,this.y+23); - - var scale; - var timeStr; - if (diff < 3600000) { //less than 1 hour left - width = 58; - scale = 2; - timeStr = getTime(diff).substring(3); // remove hour part 00:00:00 -> 00:00 - } else { //one hour or more left - width = 48; - scale = 1; - timeStr = getTime(diff); //display hour 00:00:00 but small - } - - // Font5x9Numeric7Seg - just build this in as it's tiny - g.setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 9 + (scale<<8)); - g.drawString(timeStr, this.x+this.width/2, this.y+12); - - }, redraw:function() { - var last = this.width; - if (!settings.started) { - this.width = 0; - } else { - this.width = (diff < 3600000) ? 58 : 48; - } - - if (last != this.width) { - Bangle.drawWidgets(); - } else { - this.draw(); - } - - }, reload:function() { - settings = storage.readJSON("widtmr.json",1)||{}; - if (interval) { - clearInterval(interval); - } - interval = undefined; - - // start countdown each second - if (settings.started) { - interval = setInterval(countDown, 1000); - } - - // reset everything - countDown(); - - }, isStarted: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - return settings.started; - - }, setStarted: function(started){ - settings.started=started; - updateSettings(); - - }, increaseTimer: function(m){ - settings.minutes += m; - updateSettings(); - - }, decreaseTimer: function(m){ - settings.minutes -= m; - if(settings.minutes <= 0){ - settings.started=false; - settings.minutes=0; - } - updateSettings(); - - }, setTimer: function(t){ - settings.minutes = Math.max(0, t); - settings.started = t > 0; - updateSettings(); - - }, getRemainingMinutes: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return -1; - } - - var now = new Date(); - var diff = settings.goal - now; - return Math.round(diff / (1000*60)); - - }, getRemainingTimeStr: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - var timeStr = getTime(diff); - if(diff < 3600000){ - timeStr = timeStr.substring(3); // remove hour part 00:00:00 -> 00:00 - } - return timeStr; - - }, getRemainingTime: function(){ - settings = storage.readJSON("widtmr.json",1)||{started: false}; - if(!settings.started){ - return; - } - - var now = new Date(); - var diff = settings.goal - now; - return diff; - } -}; - - // set width correctly, start countdown each second - WIDGETS["widtmr"].reload(); -})(); From 8d2e3b81800fc89db35996b043c5dc3ca90b3cfc Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:12:35 +0100 Subject: [PATCH 025/117] Removed print statements --- apps/qalarm/lib.js | 6 +++--- apps/smpltmr/app.js | 14 +------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 670ee99ae..189041a02 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -47,7 +47,7 @@ function getTimerMin(alarmIndex){ return mins; } -function _reload(){ +function reloadQalarm(){ require("Storage").write("qalarm.json", JSON.stringify(alarms)); eval(require("Storage").read("qalarmcheck.js")); if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); @@ -70,7 +70,7 @@ function editTimer(alarmIndex, hrs, mins, secs){ alarmIndex = alarms.length-1; } - _reload(); + reloadQalarm(); return alarmIndex; } @@ -80,7 +80,7 @@ function deleteAlarm(alarmIndex){ } alarms.splice(alarmIndex, 1); - _reload(); + reloadQalarm(); } diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 1de9057e8..caa3e5cae 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -1,11 +1,5 @@ /* - * TIMER WIDGET - * - * This is a fork of the Chrono Widget, but implements a - * simpler UI which to be able to set a timer faster with - * less interaction. Additionally, it exposes some functions - * that can be used by other apps or clocks to easily - * implement a timer. It is used e.g. by lcars or notanalog. + * SIMPLE TIMER * * Creator: David Peer * Date: 02/2022 @@ -90,7 +84,6 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - print(settings.alarmIndex); var started = alarm.isTimerStarted(settings.alarmIndex); if(isRight && !started){ @@ -108,11 +101,6 @@ Bangle.on('touch', function(btn, e){ } else if(isMiddle) { if(!started){ settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); - print("-----") - print(settings.alarmIndex); - print(alarm.timerExists(settings.alarmIndex)) - print(alarm.isTimerStarted(settings.alarmIndex)) - print("-----") } else { alarm.deleteTimer(settings.alarmIndex); } From 49053e61214af5956ae85c13f11345c605ab1436 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:28:49 +0100 Subject: [PATCH 026/117] Include id such that the timer can precisely be selected by each app. --- apps/qalarm/lib.js | 48 ++++++++++++++++++++++++-------------- apps/qalarm/qalarmcheck.js | 1 - apps/smpltmr/app.js | 32 +++++-------------------- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 189041a02..8c4be311f 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -15,18 +15,29 @@ function getCurrentTime() { ); } -function alarmExists(alarmIndex){ +function getAlarmIndex(idx){ + for(var i=0; i= 0 && alarmIndex < alarms.length; return exists; } -function isAlarmStarted(alarmIndex){ - if(!alarmExists(alarmIndex)){ +function isAlarmStarted(idx){ + if(!alarmExists(idx)){ return false; } - let time = new Date(); - let t = getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var time = new Date(); + var t = getCurrentTime(); a = alarms[alarmIndex]; return a.on && t <= a.t && @@ -34,15 +45,16 @@ function isAlarmStarted(alarmIndex){ (a.timer || a.daysOfWeek[time.getDay()]); } -function getTimerMin(alarmIndex){ - if(!isAlarmStarted(alarmIndex)){ +function getTimerMin(idx){ + if(!isAlarmStarted(idx)){ return 0; } - let a = alarms[alarmIndex] ; - let diff = a.t - getCurrentTime(); + var alarmIndex = getAlarmIndex(idx); + var a = alarms[alarmIndex] ; + var diff = a.t - getCurrentTime(); // let hrs = Math.floor(t / 3600000); - let mins = Math.round((diff / 60000) % 60); + var mins = Math.round((diff / 60000) % 60); // return hrs + ":" + ("0" + mins).substr(-2); return mins; } @@ -53,12 +65,14 @@ function reloadQalarm(){ if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); } -function editTimer(alarmIndex, hrs, mins, secs){ +function editTimer(idx, hrs, mins, secs){ + var alarmIndex = getAlarmIndex(idx); var a = { - on: true, - rp: false, - as: false, - hard: false, + idx: idx, + on: true, + rp: false, + as: false, + hard: false, }; a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; @@ -71,10 +85,10 @@ function editTimer(alarmIndex, hrs, mins, secs){ } reloadQalarm(); - return alarmIndex; } -function deleteAlarm(alarmIndex){ +function deleteAlarm(idx){ + var alarmIndex = getAlarmIndex(idx); if(!alarmExists(alarmIndex)){ return; } diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 8dac43800..4976afb6f 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,7 +2,6 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ -print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index caa3e5cae..e1bb49c78 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,11 +8,9 @@ Bangle.loadWidgets(); -const storage = require('Storage'); const alarm = require('qalarm'); -let settings; - +const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); const screenHeight = g.getHeight(); const cx = parseInt(screenWidth/2); @@ -21,23 +19,6 @@ var minutes = 5; var interval; //used for the 1 second interval timer -function updateSettings() { - storage.writeJSON('widtmr.json', settings); -} - - -function resetSettings() { - settings = { - alarmIndex: -1 - }; - updateSettings(); -} - - -settings = storage.readJSON('widtmr.json',1); -if (!settings) resetSettings(); - - setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -51,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(settings.alarmIndex); + var min = alarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -84,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(settings.alarmIndex); + var started = alarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -100,14 +81,13 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - settings.alarmIndex = alarm.editTimer(settings.alarmIndex, 0, minutes, 0); + alarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(settings.alarmIndex); + alarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } - updateSettings(); draw(); }); From 06293ad9c0847768234462eeeaef8a4323332995 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:32:09 +0100 Subject: [PATCH 027/117] Fixed delete. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 8c4be311f..37be55927 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -89,7 +89,7 @@ function editTimer(idx, hrs, mins, secs){ function deleteAlarm(idx){ var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(alarmIndex)){ + if(!alarmExists(idx)){ return; } From ad84ec029b4eef0583f9ed9de0eb09bc41cf5e42 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:41:44 +0100 Subject: [PATCH 028/117] Minor renaming --- apps/smpltmr/app.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index e1bb49c78..ab08e3d3d 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require('qalarm'); +const qalarm = require('qalarm'); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -32,10 +32,10 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); var text = minutes + " min."; if(started){ - var min = alarm.getTimerMin(TIMER_IDX); + var min = qalarm.getTimerMin(TIMER_IDX); text = min + " min."; } @@ -65,7 +65,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = alarm.isTimerStarted(TIMER_IDX); + var started = qalarm.isTimerStarted(TIMER_IDX); if(isRight && !started){ minutes += 1; @@ -81,9 +81,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - alarm.editTimer(TIMER_IDX, 0, minutes, 0); + qalarm.editTimer(TIMER_IDX, 0, minutes, 0); } else { - alarm.deleteTimer(TIMER_IDX); + qalarm.deleteTimer(TIMER_IDX); } Bangle.buzz(80, 0.6); } From 75e88bd587031885badb9b1f6994361731a59076 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:43:56 +0100 Subject: [PATCH 029/117] Ensure time > 0. --- apps/smpltmr/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index ab08e3d3d..754fbae5b 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -87,6 +87,7 @@ Bangle.on('touch', function(btn, e){ } Bangle.buzz(80, 0.6); } + minutes = Math.max(0, minutes); draw(); }); From e8adb6aa15bc5f812fe76dc66a4b1305bb64e06c Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 8 Mar 2022 19:56:53 +0100 Subject: [PATCH 030/117] Wrong index fix. --- apps/qalarm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index 37be55927..d75ce4204 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -77,7 +77,7 @@ function editTimer(idx, hrs, mins, secs){ a.timer = hrs * 3600 + mins * 60 + secs; a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - if(alarmExists(a)){ + if(alarmExists(idx)){ alarms[alarmIndex] = a; } else { alarms.push(a) From 0fb271dfefa11dc0ad12e3e40c8fd9a9d4c34e80 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:06:24 +0100 Subject: [PATCH 031/117] Updated lcars and notanalog to use qalarm --- apps/lcars/ChangeLog | 2 +- apps/lcars/lcars.app.js | 47 ++++++++------------------------- apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/metadata.json | 2 +- apps/notanalog/notanalog.app.js | 45 +++++++------------------------ apps/qalarm/lib.js | 2 -- 7 files changed, 25 insertions(+), 77 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 08b3b3d4d..fcd817015 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,4 +16,4 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use widtmr for alarm functionality instead of own implementation. \ No newline at end of file +0.19: Use qalarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 6ffc78ca7..94159a74e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,6 +1,7 @@ const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); -const storage = require('Storage') +const storage = require('Storage'); +const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -563,52 +564,26 @@ function getWeather(){ /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 5efd29e7c..b5d8e0a52 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,7 @@ "icon": "lcars.png", "version":"0.19", "readme": "README.md", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index bb5297476..3d6f1fce8 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use widtmr widget for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 5a0ddbaf0..25cfa706d 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,7 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"widtmr":"app"}, + "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index 5e56d6f6a..f51fc23fd 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -5,6 +5,7 @@ const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; +const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -392,52 +393,26 @@ function queueDraw() { /* * Handle alarm */ -function isWidtmrAvailable(){ - try { - WIDGETS["widtmr"].isStarted(); - return true; - } catch(e) { - // In case the widtmr widget is not installed, the timer can - // not be used... - return false; - } -} - function isAlarmEnabled(){ - if(!isWidtmrAvailable()){ - return false; - } - - return WIDGETS["widtmr"].isStarted(); + return qalarm.isTimerStarted("lcars"); } function getAlarmMinutes(){ - if(!isWidtmrAvailable()){ - return "-"; - } - return WIDGETS["widtmr"].getRemainingMinutes(); + return qalarm.getTimerMin("lcars"); } function increaseAlarm(){ - if(!isWidtmrAvailable()){ - return; - } - - // Set to zero if alarm was disabled before - if(!isAlarmEnabled()){ - WIDGETS["widtmr"].setTimer(0); - } - - WIDGETS["widtmr"].increaseTimer(5); - WIDGETS["widtmr"].setStarted(true); + var mins = qalarm.getTimerMin("lcars")+5; + qalarm.deleteTimer("lcars"); + qalarm.editTimer("lcars", 0, mins, 0); } function decreaseAlarm(){ - if(!isWidtmrAvailable()){ - return; + var mins = qalarm.getTimerMin("lcars")-5; + qalarm.deleteTimer("lcars"); + if(mins > 0){ + qalarm.editTimer("lcars", 0, mins, 0); } - - WIDGETS["widtmr"].decreaseTimer(5); } function feedback(){ diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js index d75ce4204..6d186d190 100644 --- a/apps/qalarm/lib.js +++ b/apps/qalarm/lib.js @@ -1,5 +1,3 @@ -Bangle.loadWidgets(); - let alarms = require("Storage").readJSON("qalarm.json", 1) || []; /** From 02faa5cc267dd2cb31b686c72d03649517be3c76 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 10 Mar 2022 22:11:46 +0100 Subject: [PATCH 032/117] Unique alarm ID for notanalog --- apps/notanalog/notanalog.app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index f51fc23fd..fcd49af25 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,24 +394,24 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + return qalarm.isTimerStarted("notanalog"); } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + return qalarm.getTimerMin("notanalog"); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + var mins = qalarm.getTimerMin("notanalog")+5; + qalarm.deleteTimer("notanalog"); + qalarm.editTimer("notanalog", 0, mins, 0); } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); + var mins = qalarm.getTimerMin("notanalog")-5; + qalarm.deleteTimer("notanalog"); if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); + qalarm.editTimer("notanalog", 0, mins, 0); } } From 8a6152b7ceb4df6bcdebb95e28d30f741179bc45 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 20 Mar 2022 20:42:19 +0100 Subject: [PATCH 033/117] Minor fix --- apps/lcars/lcars.app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 94159a74e..b00fe40b3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -244,6 +244,7 @@ function drawInfo(){ return; } + g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); From fd01680ef995b1b9b5ed8d266ae9411a1d6e975d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 18:12:38 +0100 Subject: [PATCH 034/117] Addd 90s clk --- apps/90sclk/ChangeLog | 2 ++ apps/90sclk/README.md | 4 +++ apps/90sclk/app-icon.js | 1 + apps/90sclk/app.js | 72 +++++++++++++++++++++++++++++++++++++ apps/90sclk/app.png | Bin 0 -> 2446 bytes apps/90sclk/metadata.json | 16 +++++++++ apps/90sclk/screenshot.png | Bin 0 -> 2884 bytes 7 files changed, 95 insertions(+) create mode 100644 apps/90sclk/ChangeLog create mode 100644 apps/90sclk/README.md create mode 100644 apps/90sclk/app-icon.js create mode 100644 apps/90sclk/app.js create mode 100644 apps/90sclk/app.png create mode 100644 apps/90sclk/metadata.json create mode 100644 apps/90sclk/screenshot.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog new file mode 100644 index 000000000..8c2a33143 --- /dev/null +++ b/apps/90sclk/ChangeLog @@ -0,0 +1,2 @@ +0.01: New App! +0.02: Load widgets after setUI so widclk knows when to hide diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md new file mode 100644 index 000000000..470a27c6c --- /dev/null +++ b/apps/90sclk/README.md @@ -0,0 +1,4 @@ +# Wave Clock + +![](screenshot.png) + diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js new file mode 100644 index 000000000..00892e9c3 --- /dev/null +++ b/apps/90sclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js new file mode 100644 index 000000000..f1c67ce2f --- /dev/null +++ b/apps/90sclk/app.js @@ -0,0 +1,72 @@ +function getImg() { + return require("heatshrink").decompress(atob("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")); +} +var IMAGEWIDTH = 176; +var IMAGEHEIGHT = 109; + +Graphics.prototype.setFontZCOOL = function() { +// Actual height 40 (46 - 7) +var widths = atob("CxAhEh8hJCIjGSMdCw=="); +var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); +var scale = 1; // size multiplier for this font +g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); +}; + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +function draw() { + var x = g.getWidth()/2; + var y = 24+20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); + if (g.getWidth() == IMAGEWIDTH) + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); + else { + let scale = g.getWidth()/IMAGEWIDTH; + y *= scale; + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); + } + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date,1); + var dateStr = require("locale").date(date).toUpperCase(); + // draw time + g.setFontAlign(0,0).setFont("ZCOOL"); + g.drawString(timeStr,x,y); + // draw date + y += 35; + g.setFontAlign(0,0,1).setFont("6x8"); + g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ff43bb10655c67224603dec35559aac7b98fc560 GIT binary patch literal 2446 zcmV;9332v`P)R}BKQ(n^v* zNlPWs(#8iqu)2gPKG5649J%=-(`#LGBn8U{f{+LJozMN_aO@m;duQ(SM{D*UzqR+; zYkz-huf6tK+l0^`iQM!Dqdx)t3Fr?3$n<{$)J*z8n&@EfldMumHL=!`A>EMNs|`Ib zAz2!X2vKXZfB`@n2wGD`)173@unvH|j?w0>N`OU9-&3h;MNzwj9+j+8x^!GJq)4ey zdQU2F6?;*dDh-rINhaw#>AKXxG1^D6NpCyJ8+UD?`(ZE$PQY5|4ZT2605e=Ayqvwu> zCI8EoNsncZs8uwm%4$VJ&b}R=<6idVt&#Tuc!p`;zlWNG@uM^XuI&u9TnwS033t_ z5Cl5ip-N5F`t`mkDUo3LEZeGEh#ckAr8ypYHxkgd${m!P{#|L&CAb2UAQLj-D~NNI z?FZ>FVBbEk)vML9(^@U-F=vg>_z_Lxrp{7S&H7)3<&6Opj%;To zgu_7a10^MEWt2dxSG#!Vp)c&Sn?Ogqny(K&HGGl(w1r!`eD<;5kxEtGxzJx>Tmt~v zWD6b?=>S7HGy@ri-hW@8eyTltBx&bPO?ACyH^u3Ao__t+2V}FU@Pe?#fR-e+U%26+ z;GO}GbiX^Nwmly7BybXdIWW{Pl#-%xa%^1ycKhGa-zN-_*xz9yOE;h{x~WHQxRhL~g+*GsPqFAtUUbN73%YNh|!lWqgrs;!N_k;cM9PJl{PI-<$w z*rKaH!cu7ODml@SZ+SvAY=@5_`0{0eJKVP@w$?1vRDs2c#fp=)YHp7FP9-WH>N6@d zJLhva1xuhm_&7XC^6BFCR))|GiScct$VOquv)0_ zBp|gxm+P8SXTE}CkOD8mAXo;kI~6v*Fb(4EJs*CkPMzfEXZI9I8ZbbTA|jkhk5~lD zt0mrscsII!KyN`F9E9HB3%#J}%9Y0;$!?qC;`k-+=;%>Et5#|A=9-SUN#5SKx!3d> zNzc~0;NxkC13LdmpI0AF-aRaJP5<2OPj5V#sKhEj_dpkDV;7%0R~CyT-=jwr7pJ1D zx_D6;@5pMj{bZ|ley)!`szOkAHGH-?pNVX7Q~W9l#dT3Aie>!MYi6G{W6zzu2x+hs zPJu#0yZ0Jjr0WO?WVH%3V}?9DoU(2=si)@7QD&yf%PqJ6acCd4>Ff?|CrnV!2W74y zv}TPF&xp0nSS=PbW3xXQGG=*XeBh~s#X9+&PM@yQ79KwIryq5*D8~EsDhtVGQ~r5n z@05p!9tl;je+|EU;er<&hA{8~59kCs@{J@}JZm)4wsxwV@g&1uC1gIKFI5IT5zt|X zKx3b(k_eRc?3Xl8ar?D*w|Sof(6M7mOV!`PRaPcYU|_WZ#Z5s$Q{fQgz7eNm z^;~6c<`wSuCd$-&V2Hl{T9J`*lN9VMGg2e(bn4j!1!1R7D|3{f+v(H#xlq9^?$qt) zXDTXE$BvId?Af!HfBcgUGns7>@%8|yt0&a8_Is|AFa_+)((Anum@y- zf8yH$?MYX3s-*E6|NCqoA4&4@)`A5tS|cJV;R*oDa&to?BkRS{R&DK?TdCE2%}4Cg zuDJ zLWUtwMTNfqUel&I3f$TYH-G=hkPX2lC4(J45Cj=u8Z)LUGPP<|Q;lji%Ph%H)u0Ck zN`_%F40ljvr3^z|yE+R5yZWHhD`)Eo@VOmFe!d+|D43xqoPspSg)LwnF`|A;TP#gS zkAC6Wwfie8rTBQ$EZG4p6rS=sQiG82S@xnDnddg^x&{rb5C##*R-R@OWS2Ib@^ zeT!031Rj~0!tpkim#5|}bzu8Yn@!LI&cHXYw6O5WbLU20yS5rSLCcJdffTd@B_{_< z{R1YcPp=j+G1AjdyEumYYX;)&?Y3@RG|YjPpapYvB2SM#sv}4255}#JA9r&0cIxJ% zn>YPHVPUdbTR<24-JF&tP(nf{`35OK1B3M53e9{>4|M(@=c`}fzb(4C5nw3;yZ`_I M07*qoM6N<$g2mI7k^lez literal 0 HcmV?d00001 diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json new file mode 100644 index 000000000..3d96bf844 --- /dev/null +++ b/apps/90sclk/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "90sclk", + "name": "90s Clock", + "version": "0.02", + "description": "A clock in 90s style", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"90sclk.app.js","url":"app.js"}, + {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/90sclk/screenshot.png b/apps/90sclk/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7f05ce68880935db0de4aaf840077e9b30413db7 GIT binary patch literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:16:23 +0100 Subject: [PATCH 035/117] Finished 90s clock --- apps/90sclk/ChangeLog | 3 +- apps/90sclk/README.md | 2 +- apps/90sclk/app-icon.js | 2 +- apps/90sclk/app.js | 100 ++++++++++++++++++++++++------------- apps/90sclk/app.png | Bin 2446 -> 4238 bytes apps/90sclk/bg.png | Bin 0 -> 37016 bytes apps/90sclk/metadata.json | 4 +- apps/90sclk/screenshot.png | Bin 2884 -> 6093 bytes 8 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 apps/90sclk/bg.png diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 8c2a33143..2286a7f70 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1,2 +1 @@ -0.01: New App! -0.02: Load widgets after setUI so widclk knows when to hide +0.01: New App! \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 470a27c6c..55fe21ce6 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,4 @@ -# Wave Clock +# 90s Clock ![](screenshot.png) diff --git a/apps/90sclk/app-icon.js b/apps/90sclk/app-icon.js index 00892e9c3..28f75c4e6 100644 --- a/apps/90sclk/app-icon.js +++ b/apps/90sclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwge27dtAX4C+/dt+wFB/wCECIu3/dvBYNv34RC7/tCIu//99EYN9C4IpB74jG3379ovDFIIRBEYxHD/47D2wjHCIX+AQJHBCIIXBNZt/+5QBEZIgBAQX///9EZRWBBARHDEwhlC/9/EAJoBDQIOBNwyPCEYYCDJQ4CJSQ4CB0O2lojL2lwBIXFiwsK0f/KgUbuwRJo6cBPAO34cUmJHH7U/97tBgEGBIODEY/RXoOw7cAgHbtlxoojGx7hCjAjD20ANA1378MEIIAB4d0u5HGNAPYCAYAB2n2SQSPDjv3CIsF2lxEYto//+CoOGCIUt0O3EYtHvqMBvlw4UAgJQBqIjERgQDBsO+7FAhaMH64DB+4qB+3AgARG9uhIgQJD4dghd+7dLBQZoBaISwC4cArf27dpCIf/23f9uHCIQABhoNClsl20ttuwgYKBEAIAChOmCIOH/vx9ttwB2BDgMBAoIRBmnbpkbtk2ltsgAMCJQOwAgMBk+eq3AhiSBsE2GAX//4WCAAOBAoVbtt8mCJBgHHfYMHdgoRBott+zmDsEAn/tEwkC7UAVoYACgPbv4REAASTBEYY0BPIPwCJAjEu3Dvq8BCAnbsEwGgm2jbAC8EAjFvEAQREjuwDQXbvvx7cd2K/EgEb9oRCAoLOBjEAgk/A=")) +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index f1c67ce2f..02a35e69f 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,17 +1,24 @@ -function getImg() { - return require("heatshrink").decompress(atob("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")); -} -var IMAGEWIDTH = 176; -var IMAGEHEIGHT = 109; +const locale = require('locale'); -Graphics.prototype.setFontZCOOL = function() { -// Actual height 40 (46 - 7) -var widths = atob("CxAhEh8hJCIjGSMdCw=="); -var font = atob("AAAAAAAAAAAAAAAEAAAAAAAPAAAAAAAP4AAAAAAD+AAAAAAA/gAAAAAAP8AAAAAAB/AAAAAAAfAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAfgAAAAAAf4AAAAAA/+AAAAAA//AAAAAB/+AAAAAB/+AAAAAD/8AAAAAD/8AAAAAD/4AAAAAH/4AAAAAH/wAAAAAD/wAAAAAAfwAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAP8AAAAAB//gAAAAP//4AAAB////AAAP////wAAf///h8AAH//8AfAAD//gAHwAA/8AAB8AAPgAAAfAAD4AAAHwAAfAAAB+AAHwAAAPgAB8AAAD4AAfAAAA+AAHwAAAPgAB8AAAD4AAPgAAA+AAD4AAAPgAA+AAAD8AAPgAAAfAAD4AAAHwAA/////8AAH/////AAB/////wAAf////4AAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAA/AAAAAAAfgAAAAAAH4AAAAAAD8AAAAAAB+AAAAAAA/AAAAAAAPwAAH/gAH4D///4AD/////+AB//////gAf/////4AD////gAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAGAAAfAAAD4AAPwAAB/AAH4AAA/wAB8AAAf8AA/AAAP/AAfgAAP/gAHwAAH/4AD8AAD++AB+AAB/PgAfAAA/j4AHwAAfw+AB+AAP4PgAfwAH8D4AD8AH+A+AAfgD/AfAAD8B/AHwAAfg/gB8AAD8fwAfAAA/v4AHwAAH/8AB8AAA/+AAfAAAH/AAHwAAA/AAB8AAAHgAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAAAAAAAAABAAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAHwAAMAAAB8AAfAAAAfAAHwAAAHwAB8AAAA+AAfAAAAPgAHwAfAD4AA+AP4A+AAPgD+APgAD4B/gB8AA+A/8AfAAPgf/AHwAD4H/wB8AA+D98AfgAHh+fgD4AB4/D4A+AAffg+A/gAH34Pg/4AB/8D8f8AAf+Aff+AAH/AH/+AAA/wB/+AAAP4Af+AAAD8AD/AAAA+AA/AAAAHgADAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAD+AAAAAAH/gAAAAAH/4AAAAAP/+AAAAAP//gAAAAf/z4AAAAf/w+AAAA//gPgAAA//gD4AAAf/AA+AAAH/AAPgAAB/AAD4AAAeAAA+AAACAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAP/+AAAAP///gAB/////4AAf////+AAH/////AAB///+AAAAf/APgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAAAAAAAAAAAAACAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAH4AAAAAAA+AAAAAAAPgAAAAAAD4AAAAfwA+AAAH/+AHwAAf//gB8AAP//4AfAAH//+AHwAB/+PwB+AAfwB8APgAHwAfAD4AB8AHwA+AAfAB8APgAHwAfAB8AB8AHwAfAAfAB8AHwAHwAfAB8AB8AH4AfAAfAA+AH4AHwAPgH+AB8AD4H/gAfAA+H/wAHwAPv/4AB8AD//4AAfAA//wAAHwAP/wAAB8AD/gAAAAAAfgAAAAAABAAAAAAAAAAAAAAAAAHwAAAAAAH8AAAAAAD/gAAAAAD/4AAAAAD/+AAAAAD/3wAAAAD/x8AAAAD/4PgAAAD/4D4AAAD/4A+AAAB/4AHwAAB/4AB8AAB/4AAfAAB/4CAD4AB/8DgA+AAf8B8APgAD8AfAB8AA8AH4AfAAEAA+AH4AAAAPgA+AAAAD8AfgAAAAfAP4AAAAH4P8AAAAA+H+AAAAAPj+AAAAAB9/AAAAAAf/gAAAAAH/wAAAAAA/4AAAAAAP8AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAD4AAAAAAA+AAAAAAAPwAAAAAAB8AAAAAAAfAAAAAAAHwAAAAAAB8AAAAAAAfAAAAAAAHwAAADAAB8AAAD4AAfAAAD+AAHwAAH/wAB8AAH/4AAfgAH/4AAH4AH/4AAA+AH/wAAAPgH/wAAAD4H/wAAAA+H/wAAAAPv/wAAAAD//wAAAAA//gAAAAAP/gAAAAAD/gAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAH4AAAAAAB+AAAHwAA/wAAB8AAf8AAA/gAP/AAAP8AH/wAAH/gD8+AAB/4B+PgAAf/A/j4AAPn4Pw+AAD4/H4HwAB+Pz8B8AAfB/+AfAAPwP/AHwAD4B/gB+AA+AfwAPgAfAP+AD4AHwD/wA+AB+B/+AfgAfw/PgPwAB/fj8D8AAP/wfh+AAB/4D8fAAAP+AfPwAAB/AH/4AAAPgA/8AAAAAAH/AAAAAAA/gAAAAAAPwAAAAAAB8AAAAAAAAAAAAAAAAAAAAAGAAAAAAAD4AAAAAAB/AAAAAAB/wAAAAAA/+AAAAAAf/gAAAAAf78AAAAAP8fAAAAAP+H4AAAAD+A+AAAAB/APgAAAAfAB8AAAAH4AfAAYAA+AD4AfAAPgA+AfwAD4APgf+AA+ABgf/AAHwAA//AAB8AA//AAAfAA//AAAHwA//AAAB+A/+AAAAPh/+AAAAD5/+AAAAA//+AAAAAP/+AAAAAB/8AAAAAAf8AAAAAAH8AAAAAAAAAAAAAAAAADgAOAAAAH4AfgAAAD+AP4AAAA/wD/AAAAH8AfwAAAB/AH8AAAAfwB/AAAADgAOAAAAAAAAAAAAAAAAA="); -var scale = 1; // size multiplier for this font -g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); + +function getImg() { + return require("heatshrink").decompress(atob("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")); +} + +Graphics.prototype.setFontTime = function(scale) { + // Actual height 54 (56 - 3) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAPwAAAAAAAA/gAAAAAAAF/AAAAAAAA/8AAAAAAAD/wAAAAAAAP/AAAAAAAA/wAAAAAAAB/AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAB+AAAAAAAAf4AAAAAAAH/wAAAAAAB//AAAAAAAf/+AAAAAAH//8AAAAAB///wAAAAAf///gAAAAH///+AAAAB////4AAAAf///+AAAAH////gAAAB////8AAAA/////AAAAP////wAAAD////8AAAA/////AAAAP////gAAAD////4AAAA////+AAAAD////gAAAAP///4AAAAAf//+AAAAAB///gAAAAAD//4AAAAAAP/+AAAAAAAf/gAAAAAAB/wAAAAAAAH8AAAAAAAAPAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAAAf/wAAAAAAH//gAAAAAD///gAAAAAf///AAAAAB///+AAAAgP///8AAAHg////wAAAfn////gAAD/t////AAAP/j///8AAA//D///4AAH//D///gAAf//H//+AAB///H//4AAH//+P//gAAP//+P/+AAA///8f/4AAD///8f/gAAP///8f+AAAf///8/wAAB////w/AAAD////A4AAAH///4BgAAAP///gAAAAAf//8AAAAAA///AAAAAAA//wAAAAAAA/+AAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAD+AAAAAAAAP4AAAAAAAB/gAAAAAAAP+AAAAAAAA/5//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+A/7//////4D/v//////gP+//////+Af7//////4A/v//////gA+//////+AA7///hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAD/4AAfwAAAf/gAD/AAAH/+AA/8AAA//4AH/wAAP//gA//AAD//+AH/8AA///4Af/wAP///gD//AD///+AP/8Af///4A//wH////gD//B////+AP/8f//7/4A//3///P/gD/////w/+AP////8D/4A/////AP/gD////4A/+AP///+AD/4Af///gAH/gB///4AAf/AD///AAB/8AH//wAAH/wAP/8AAAf/AAf/gAAB/4AA/4AAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wD/+AAAB//AP/4AAAH/8A//gAAAf/wB/+AAAAAAAAAB/4A//8A////////wH////////Af///////8A////////wD///+////AP///7///8A////P///wB///8f//+AH///h///4AP//+D///AAf//wH//4AA//+AP//AAB//wAf/4AAD/+AAf/AAAD/gAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAAAAAH//AAAAAAA//+AAAAAAP//8AAAAAB///4AAAAAP///wAAAAA////gAAAAH////AAAAA////8AAAAD////4AAAAf////j//gB////+//+AP///////4A////////gD///////+Af///////4B////////gH///////+Af///////gB//////AAAH8AAAHAAAAAAA//wAAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAP//gAAAAAA//+AAAAAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AB/AAf///+AP/+B////4A//4H////AD//gf///8AP/+B////4A//4H////gD//gf/////+AAAAAAAP///wP//gA////A//+AD///8D//4AP///wP//gAf//+A//+AB///4D//4AD///gAB/gAH//8AAAAAAP//gAAAAAAf/8AAAAAAA//gAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAP/8AAAAAAB//8AAAAAAf//8AAAAAD///4AAAAAf///wAAAAD////wAAAAf////AAAAD////+AAAAP////8AAAB/////wAAAP/////gAAA/////+AAAH/////8AAAf/////wAAB//////gAAP/////+AAA//////4AAD//////gAAP/////+AAA//////4AAD//////gAAP//////AAA//////8AAAAf////wAAAAAAP//gAAAAB///+AAAAAH///4AAAAAf///gAAAAB///+AAAAAH///wAAAAAf///AAAAAA///8AAAAAD///gAAAAAH//+AAAAAAP//wAAAAAAf/+AAAAAAA//wAAAAAAB/+AAAAAAAB/gAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAB///wAAAAAH///AAAAAAf//8AAAAAA//AAAAAAAAAAAAAAAAwAAP//////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////////8D////////wP////////A////0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAD/gAH//AAA//gA//+AAP//AH//8AB//+A///4AP//8H///wA///4f///AH///j///+Af///P///4D///9////wP////////A////////8D////////wP///3///+AAAAAAAAAAB/wAAAAAAAP///x4AAAA////P///4D///8////gH///z///+Af///H///4B///8f///gD///g///8AH//8D///wAf//wH//+AA//+AP//wAA//gA//+AAA/4AA//gAAAEAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAH/8AAAAAAB//8AAAAAAP//4AAAAAB///wAAAAAP///gAAAAB////AAAAAP///8AAAAA////4AAAAH////gAAAAf////AAAAD////8AAAAP////wAAAA/////AAAAD////8AAAAH////wAAAAAAAAAAAAAD///+AAAAAP///////AA///////8AD///////wAP///////AA///////8AB///////wAH//////+AAf//////4AA///////gAD//////8AAH//////wAAf/////+AAA//////4AAB//////AAAH/////4AAAP/////AAAAf////4AAAA////+AAAAB////wAAAAB///8AAAAAB///AAAAAAB//wAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AB8AAAAAH8AP4AAAAA/4B/wAAAAH/gO/AAAAAf+A/8AAAAB/4D/wAAAAH/AP/AAAAAP4AfwAAAAAfAA+AAAAAAQAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("FionHyIiJiIyJScyFA=="), 58+(scale<<8)+(1<<16)); + return this; }; + +Graphics.prototype.setFontDate = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///wf///B///8H///wf//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAfwAAB+AAAAAAAAfwAAB/AAAH8AAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAADg8AAfH+AB//4A///gD//+AP//AA/w/gBPf+AB//4A///wB//8AH//AAfw8AAPDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAD4AAAfwAAD/h4B/+HwH/4/Af//+AP5/4A/n/gB8f8ADg/gAAD8AAADgAAAAAAAAAAAAAAAAAAAAAAAAB8AAAP4CAB/gcAH+D4Af4/wB/n+AH9/wAHv+AAB/wAAf8AAD/gAA/54AH/PwAf5/gB+H+ADw/4AEB/gAAH8AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAP4AB9/wAP//gB///AP//8A///4D///gH//+Af3/wAfP/AAAf8AAB/gAAP/AAB/8AAP/wAAfOAAAQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAP4AAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBgAH///g////n////f///9/////8AB/fgAH8AAAPAAAAAAAAAAAAAAAAAAAAAAD9/AAf38AB/f///9////z///+H///wP//8AAAAAAAAAAAAAAAAAAAAAAAAFAAAA+AAAH8AAAfwAAB/AAAD8AAAEAAAAAAAAAAAAAAAAAAAAAAAAfAAAB8AAAHwAAAfAAA//wAD//AAP/8AA//wAD//AAAfAAAB8AAAHwAAAfAAAAAAAAAAAAAAAAAAAAAAABkAAAPwAAA/AAAB4AAACAAAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAD4AAAPgAAA+AAAAAAAAAAAAAAAAAAAAAAACAAAAeAAAD4AAAPgAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAPAAAD+AAA/4AAP/wAD//AB//wAf/8AH//AB//wAf/8AA//AAD/wAAH8AAAeAAAAgAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/4AEP/wAd//gD9//AP9/8A/9/wD/7/AP/78Af/7wA//CAB/8AAD/AAADwAAAAAAAAAAAAAAAAAAAABwAAAPAAAB8AAAH3//+ff//59///n3//+Pf//4d///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAD8B4AfwfgH/B+A/8P4P/w/j//D+//8P//vw//4/D/+B8H/gHwf8AfAfAA8AAAAAAAAAAAAAAfgAPx/AB/H8AH8fwAPwH/f/H///8f///x/+//H/7/8P/H/gf8P8A/APgAAAAAAAAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//gAD//AAf/9/h///+H///4f///h//8AAD/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAf/4PB//g/n/+D+f/4P5/gf/n/B/+f8H/5/wP/AAAf4AAA/AAAAAAAAAAAAAAAAAAAAAAAAAA8AAAP8AAD/8AAf/4AD//wAP//gB//+AH//8A///wD///AP//8A///wAAP/AAD/+AAH/4AAf/AAB/8AAD/gAAH+AAAPgAAAAAAAAAAAAAAAAAAAAeAAD/4AAP/gAA/+AAB/4AAAAAM+f///5////n///+f///5////n///+f5AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AP4H+B/w/8P/n/4////n///+f///4AAAAH/9/+P///4/+f/j/5/+H/D/wH4H+AAAHgAAAAAAAAAAAAAAAAAAAA/AAAP/AAB/+AAP/4AA//wAH//AAf/8AB//wAH///wf///B///8H///wP//+A///4B///gD//8AP//gAP/4AAf+AAAPAAAAAAAAAAAAAAAAAAAAAAGAwAA8HgAH4+AAfD4AA4HAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAB4+AAPn4AA+PgABwcAAAAAAAAAAAAAAAAAAAAABgAAAOAAAB8AAAf4AAD/wAAf/AAD/+AAfz8AA8HwADgfgAEA+AAABgAAAAAAAAAAAAAAAAAAAAHj4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHz4AAfPgAB8+AAHj4AAAAAAAAAAAAAAAAAAAAAAAAAAAYAAQDwADgfgAfD8AB/fgAD/8AAH/wAAP+AAAfwAAA+AAABwAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAf8AAD/wAAf/gAB/+AAH/4AgA//3B///cH//9wf//3A//8YD/+AAH/4AAP+AAAPgAAAAAAAAAAAAAAAAAD8AAA/8AAH/4AA//wAH8fgAfu+AAf98AOf7wA///ADn/8AO//wA///AD//YAP/8AA/gMAB//wAD//AAH/4AAP/AAAPwAAAAAAAAAAAAAAAAAAAAP///h///+P///5////n///+f//AB+D8AH///+f///4////h///+B///4AAAAAAAAAAAAAAAAAAAAAAAf///j////P///8////z////P///8////z///AP///+f///5////D/5/8H/H/gPwH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gAA//gAH//AA//+AH//8A///4D///gf///B///8H///wf///B/gH8H+Afwf4B/BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//8A////D///8P///w////B///8H///gP//+A///wB//+AD//wAD/8AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////n///+f///5////n///+f///5////n/fP+f9+/5/37/n/AP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAf///5////n///+f///5////n///+f///5/z8AH/PwAf8AAAAAAAAAAAAAAAAAAAAAAA/gAAP/wAD//wAf//gD///Af//+B///4P///w////H///8f///x////H///8f4H/x/gf/D+B/8AAHAAAAcAAABwAAAHAAAAAAAAAAAAAAAAAAAAAAABgH///gf//+B///4H///gf//+B///4AB+AAf/9+B///4H///gf//+B///4H///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8P///w////D///8P///w////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAfAAAB+AAAH4AAAfgAAB+f///5////n///+f///x///8AAAAAAAAAAAAAAAAAAAAAAAAAAANH///8f///x////H///8f///x////H//+AAH/8AA//4AH//wA///gD//+Af//8B///wH///Af//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX5////n///+f///5////v///+////5//7/gAAP+AAA/4AAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAvh///+P///5////n///+f///5/wAAD+AAAP8AAAfwAAD/AAAP4AAB////n///+f///5////j///+H///4AAAAAAAAAAAAAAAAAAAAAAAH///gf//+B///4H///gf//+B///4B//4AB//4B///4H///gf//+B///4H///gf//+B///4AAAAAAAAAAAAAAAD/AAA//gAH//AA//+AH//8Af//wD///gf//+B///8H///wf///B/z/8H//wAf///B///8H///wf///A///8D///gH//8AP//wAf/+AA//gAA/4AAAAAAAAAAAAAAAAAA/x////H///8f///x////H///8f///x//gAH/+AAf/4AA//gAB/8AAD/gAAH8AAAAAAAAAAAAAAAAAAAAAAAcAAAP8AAD/8AA//8AH//4Af//wD///AP//+B///4H///wf///B///8H//+Af///B///8H///wf///A///8D///gH//+Af//4A///gB//+AB//4AB/PgAAAYAAAAAAAAAAAAAAAAAAAP///5////n///+f///5////n///+P///4////D///+P///4////h/9/+D/gAAD4AAAAAAAAAAAAAAAAAAAAAAAAAADwAAA/wAAH/gAA//AfH/8D8f/4f5////n+P/+f4P/5/g//j8D/8DgH/wAAP8AAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAfAAAB8//8H///wf///B///8H///wf//AB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAB///8H///8f///5////n///+AAAH5////n///+f///x////H///wf/gAAAAAAAAAAAAAAAAQAAAD8AAAP/AAA//wAH//8Af//+B////gf//+AP//4AP//gP//+P///5////n///gP//gA//AAD/gAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+D///8P///4////j///+PAAfwAAB/AAAH4AAAfw////j//++P//74///vj///8AAB7AAAAAAAAAAAAAAAAAAAAAAAAAAABgeAA+B/AP8P/n/w////j///+H///gH//4D///8P///4////h/4/8H8AfwPAAOAgAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHwAAAfgAAB/AAAH8H/wf///B///8H///wf///B///8H/8cAfwAAB+AAAHwAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABwAAAHAAD8cAD/xwD//HH//+f///5////n///+P//w4f/wDh/gAOHgAA4AAADgAAAOAAAAAAAAAAAAAA///+////////////////////////+AAA/wAAD/gAAP+AAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA/AAAD/AAAf/AAB//gAD//gAD//gAD//gAD//gAD//gAD//AAD/4AAB/AAAB8AAABgAAAAAAAAAAAAAAAAAAOAAAe4AAB7gAAHuAAAe////7////v///+////7////v///YwAAAAAAAA="), 32, atob("HA4NFhEaFwoNDQsRCRALFBMPEBESEBgSExgKCRARERIXEhQVExEPGBMOERYRFhQaExwUExARFRYTFhMPFA4="), 28+(scale<<8)+(1<<16)); + return this; +} + + // timeout used to update every minute var drawTimeout; @@ -25,35 +32,49 @@ function queueDraw() { } -function draw() { - var x = g.getWidth()/2; - var y = 24+20; - - g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); - if (g.getWidth() == IMAGEWIDTH) - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - else { - let scale = g.getWidth()/IMAGEWIDTH; - y *= scale; - g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); +function drawBorderString(str, x, y, bw, fc){ + g.setColor("#000"); + for(var i=-bw; i{};wd.area="";} + var x = g.getWidth()/2; + var y = g.getHeight()/2-20; + + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); + g.drawImage(getImg(),0,0); + var date = new Date(); - var timeStr = require("locale").time(date,1); - var dateStr = require("locale").date(date).toUpperCase(); - // draw time - g.setFontAlign(0,0).setFont("ZCOOL"); - g.drawString(timeStr,x,y); - // draw date - y += 35; - g.setFontAlign(0,0,1).setFont("6x8"); - g.drawString(dateStr,g.getWidth()-8,g.getHeight()/2); + var timeStr = locale.time(date,1); + g.setFontAlign(0,0); + g.setFontTime(); + drawBorderString(timeStr, x, y, 5, "#fff"); + + y += 50; + x = x - g.stringWidth(timeStr) / 2 + 5; + g.setFontDate(); + g.setFontAlign(-1,0); + var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + fc = E.getBattery() < 50 ? "#f00" : fc; + drawBorderString(dateStr, x, y, 3, fc); + // queue draw in one minute queueDraw(); } +Bangle.loadWidgets(); + // Clear the screen once, at startup -g.setTheme({bg:"#f0f",fg:"#fff",dark:true}).clear(); +g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on @@ -65,8 +86,15 @@ Bangle.on('lcdPower',on=>{ drawTimeout = undefined; } }); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); diff --git a/apps/90sclk/app.png b/apps/90sclk/app.png index ff43bb10655c67224603dec35559aac7b98fc560..29875b1dceaa209aa7aaad86d60402290ee0f9cc 100644 GIT binary patch literal 4238 zcmV;95OME`P)^C<+(^()fsh2uN8}t0E#z;;V&L zxw-M;vdg8>ga+pfFUI*ae@v-dfBpR-@*49bMHA^-}Y4F#frjt+`u_+stt#Q|b~d|)|nhKB}! ze}4`fSj!Xc?a+J_1n4yPjVcgifY=StxfTqU0XTV5VeHsL*rWrrKnm~+pb^*!oCkL- zfF}?FL;`Y?id{>cg?}EHq=#%1+Qmbsp5MFThm%zT*NLfZjf)M-cwEzx^#O zEiDul7ShwxL;2Qtk{&mJ2$=g$AWDIV1)%B$J_5{~KYxqV)EXKaJNla*Vr_o}MG-|& zL{X^(+W|Ya00hMazMuB&v(L)>`STrc-a19jeKFFtDWn~f=7}zgebab?=U%y^XoH!xdw{Mr& z*jRCMbCbs~2>$;5vTWHh`TXd+BMUxSi|ma=+Eb8G52-+GY^)qO zaNxcsGJ5oA*}HeIR8>{Uym|9v(4ax~aRo)*&_63|-n>~RPMl~Tm_2*8y!6sb4<&#e zWK|@xX9{9XMkE=jn}8_y(9NAYR}vBuocQze^X0ww-gCfdwOW}sZ=O_ER?3khM`ZHk z$>Qnh?9|Wde<}wl5cfrk79kD+w}0>e9vcYRL692&L2jU!fg1pBoK*r5E;;ZN78bf( zqqMY?jT<)-6BEP8kt0b-Ng*pMi#>bxuwcOgs;jGA@&ypUFByjyR-Bx8(xgdTym*nC zni>Ztof=YtV7?Z9>Ir*#;Lv%P5Txd^a*_$(hyuDZWuDSW46bK9qBrYzFs;VlCMx#rbq@*M?8VvyD z<>jPVMv>1XxJz&c+uE{ai&(8z5fQOkt&*3QCo3W&MdlzK*^%-Ke?N(jkC(c-Idm{=?pDJm)w5s}H0Cp*z-wOT1FE3?ZYBGTB{ zD8q(^%VvHp2Pu#;3dBi)3l}cP-Ei^ZMbWENVp=*?Hl{|3o12>)KYrXkzJLFI`}e6+ zr^L<8&9&fagvV^(RaI3Eysi{@?X}m$6*M(9$v~AxzGAtQQ6To(DiYY59nZvx6M6B) z7bz|-rntD6%QZEO8!-YaP*_vXh!GPy08`C_kiBDDJ3K% zIP?b%8pNVSi(Jx%hllgTGf(ji-=hHTw+HHhr?X$7_JcHXa&nkBaiX2+Kz%(odjh~6 zr>JoD>{*At!C-LcM@L6fKeV2n|L%cm*9v%hdpqKjM3^X+i?A?(Sq|Wzlg@(PB26S-Em0ElLaYSwu!g28yEGrL3b3H8nM{ zW5+iH2Zyj@#|{Dl0?5wJX6x3iy!YOFfbBkUd-od}8rZaH6JOKB+w7o(bHMG?tSI)Z zxN+k~2gh-Dcb5xGmxvS;$mtj6h^DU$xO(-fWMyT^!i5VZCMHJkL-+_`q;1aevX@=+{-*Rx`oSYodM~;x+%zs(@{r&9@oST~~3l=O84-XGHefqRrj?~mtR{_E~ zVz^Xb(^5IN`9+Bs^r(zU9U}z04xN#a??`<7KO{0T zOO`BIBKi6GQe0dtD^{!!jV9b7e17`rr{e4DD|6<|vCB|WQX(qX_m%z?sHmurK%GvE zC9CAg;Q=ys>{zi_EcWsF^XJPCKl~sfBAuO`5*r(Pr&iMI<+aydlc7V0N@V12nL1Tu z>eN;NokPg};)^fD!^1-WdFrXBWaY}00!Uq5oqe5%hzOS( zon_0Gq19@6?z!i9`|Y>M&(9|!A_9QTn>W+Y(BM)&m0o|J;M@mBqY)9|@8A6JAYGl{ z=FOWJ3+ z=1eYJxIkfHAxoDobyT4L$m3d}{^0J!Hh1n^o_z924j(?uh7C)p`D_90?N@mG@y7`b z4duv@BM!U({RX(9zMs(W6Is^UXKO%*^E2v15n`CXaOkn&`>!5j`yY>si@X1gO|O@Xj0`7yaB#5v8&C{rYt@8Vy-lS%A%EKl|)6+}zyo@$qpg zK|DP@(dl%ww6vhrYDr5=z3@^y<7bJ z{Oo3P?%X+hf{KZWk=E8$sjsiM)$#)e{!1sN*XteTP>~Gm0>wf{g7ENgbUNJw=j{(nCX>UR zSw#qt3v72JytnSZ4Q8{MEnBuY;WIKam@;JwAAR%@2?+^wb#?LKhab|~+RD0h>#$fX zeEjjp_Sdw37r68BqcaT|GK70GxLU2It*wpp^mGgc0|N&RWXX~x09Y&*u3x`SU0vOM zZTp{v`zEqcqej{5nzXbuJ6=Q>K72SnK0XfgwY9aJIdg`}%1YL+U(a9u@)w$$oAL1Q zAS)}2kdP1-FJA1VIC?$WprC(FdTpOf_qN;hdUtoX96x?sMvWTf(uvd3((H5@85t51 z5@N4pdwP20)TvVv8yoAuclYxkAS5M8{Mxk=G$BjWYW1Tz^-K4L(LQ+Rop(r1PNu1; ziIkKS1`i%gV`C#FB_#lMC#tHdV%f4~l$4a9)9IKsYZhO9^_4x-0$ja%m1WD80Z?3A zOlxba;{j+ibOIq0VhI^NnyN3qMCvLYy!$@~eDCwHbsMHln}$xOpw*tG&- zVPVXgH4Br;#0P);fE0ZS&qR$N(qN#|+{XFK7WP{Xar|s8ilXr9tFQ9SH{bB(mtQ`T z@V6DHPfR2pFaTz&6&Q}v-Nvc?yD^=r0IL;0KR>2VpH5<8BEOIRGvEGKIh=HH0%2ic zY}l}Yyu3U-Z+J2-?$`V>*yhY4g4tXHTtiWyvD?U%5d#@8d;n|Lu6<gQ2~kn(+qaM6wqnTC!wOsWckqGe=xCCYllj%JeuY}? z%gm^ygt$G0m)Xm%05|*rBZ>kkgX0LA|1(BSOS->+dOeF4EyBmghm$8yvUBIoJA-au z3XKA*6%)_^3{|O6=tkiTSf55SVjAb8VE?vlw45u0b--_I!fUl!$1vK~*2cDN+Yk|^ z#xEdbz*qnrT`CZmfLcGA@V6$>{&5*o2gEy2sMTsRGc)=8^Uv9~Z5!R)-ISJ=QczG} zf2ak(LjwbS?Oh{xn}hMr%5}ovIWy1{Kf!=ML_=RHiHeGHJb_D>F4=eOiJzu`N#GxV zA{YT*1W{~D1ZT%`>66Q})&9tgkXZh7bq~EFOqnu;)vH(2)YQb9HEa0pyYK9Cn$2d1 zB20}6PthGdf@{~V@xlu)IQ_nml$1nSS(yXQ zL#4voYNbPU#}Lk1t@r{yfL5gfS}{hK)9Y5r;2##^X*HAZ%(EDyMlv8N)wKc+2|5@s zgLK>KJCMPaNpqI85Z zWO_VtFJ)lrZ6+%#%cbyObGDwI9x5v<9q_mG;!**ynNkH%Ir=nD*GA!gvl*cq=`*gM zB?n`vJ>Xh_mX<0MWdJIb4wXuW)z=HFzZdNqFP@wf!63^Zl0Hg8kf9nKKzYcraaEU6{>gEEWrl3WMOAAiaQ}jkxbEh#(`RHQ>KL0ez=CH5V_^{KYP= zefxJ7EnG-dRTUK#6)5xP&zI8DQm1!*jYdOG&hH2bc^s?Ns}C!vif#a4P!z^_c~MO@ zOAjrjR}BKQ(n^v* zNlPWs(#8iqu)2gPKG5649J%=-(`#LGBn8U{f{+LJozMN_aO@m;duQ(SM{D*UzqR+; zYkz-huf6tK+l0^`iQM!Dqdx)t3Fr?3$n<{$)J*z8n&@EfldMumHL=!`A>EMNs|`Ib zAz2!X2vKXZfB`@n2wGD`)173@unvH|j?w0>N`OU9-&3h;MNzwj9+j+8x^!GJq)4ey zdQU2F6?;*dDh-rINhaw#>AKXxG1^D6NpCyJ8+UD?`(ZE$PQY5|4ZT2605e=Ayqvwu> zCI8EoNsncZs8uwm%4$VJ&b}R=<6idVt&#Tuc!p`;zlWNG@uM^XuI&u9TnwS033t_ z5Cl5ip-N5F`t`mkDUo3LEZeGEh#ckAr8ypYHxkgd${m!P{#|L&CAb2UAQLj-D~NNI z?FZ>FVBbEk)vML9(^@U-F=vg>_z_Lxrp{7S&H7)3<&6Opj%;To zgu_7a10^MEWt2dxSG#!Vp)c&Sn?Ogqny(K&HGGl(w1r!`eD<;5kxEtGxzJx>Tmt~v zWD6b?=>S7HGy@ri-hW@8eyTltBx&bPO?ACyH^u3Ao__t+2V}FU@Pe?#fR-e+U%26+ z;GO}GbiX^Nwmly7BybXdIWW{Pl#-%xa%^1ycKhGa-zN-_*xz9yOE;h{x~WHQxRhL~g+*GsPqFAtUUbN73%YNh|!lWqgrs;!N_k;cM9PJl{PI-<$w z*rKaH!cu7ODml@SZ+SvAY=@5_`0{0eJKVP@w$?1vRDs2c#fp=)YHp7FP9-WH>N6@d zJLhva1xuhm_&7XC^6BFCR))|GiScct$VOquv)0_ zBp|gxm+P8SXTE}CkOD8mAXo;kI~6v*Fb(4EJs*CkPMzfEXZI9I8ZbbTA|jkhk5~lD zt0mrscsII!KyN`F9E9HB3%#J}%9Y0;$!?qC;`k-+=;%>Et5#|A=9-SUN#5SKx!3d> zNzc~0;NxkC13LdmpI0AF-aRaJP5<2OPj5V#sKhEj_dpkDV;7%0R~CyT-=jwr7pJ1D zx_D6;@5pMj{bZ|ley)!`szOkAHGH-?pNVX7Q~W9l#dT3Aie>!MYi6G{W6zzu2x+hs zPJu#0yZ0Jjr0WO?WVH%3V}?9DoU(2=si)@7QD&yf%PqJ6acCd4>Ff?|CrnV!2W74y zv}TPF&xp0nSS=PbW3xXQGG=*XeBh~s#X9+&PM@yQ79KwIryq5*D8~EsDhtVGQ~r5n z@05p!9tl;je+|EU;er<&hA{8~59kCs@{J@}JZm)4wsxwV@g&1uC1gIKFI5IT5zt|X zKx3b(k_eRc?3Xl8ar?D*w|Sof(6M7mOV!`PRaPcYU|_WZ#Z5s$Q{fQgz7eNm z^;~6c<`wSuCd$-&V2Hl{T9J`*lN9VMGg2e(bn4j!1!1R7D|3{f+v(H#xlq9^?$qt) zXDTXE$BvId?Af!HfBcgUGns7>@%8|yt0&a8_Is|AFa_+)((Anum@y- zf8yH$?MYX3s-*E6|NCqoA4&4@)`A5tS|cJV;R*oDa&to?BkRS{R&DK?TdCE2%}4Cg zuDJ zLWUtwMTNfqUel&I3f$TYH-G=hkPX2lC4(J45Cj=u8Z)LUGPP<|Q;lji%Ph%H)u0Ck zN`_%F40ljvr3^z|yE+R5yZWHhD`)Eo@VOmFe!d+|D43xqoPspSg)LwnF`|A;TP#gS zkAC6Wwfie8rTBQ$EZG4p6rS=sQiG82S@xnDnddg^x&{rb5C##*R-R@OWS2Ib@^ zeT!031Rj~0!tpkim#5|}bzu8Yn@!LI&cHXYw6O5WbLU20yS5rSLCcJdffTd@B_{_< z{R1YcPp=j+G1AjdyEumYYX;)&?Y3@RG|YjPpapYvB2SM#sv}4255}#JA9r&0cIxJ% zn>YPHVPUdbTR<24-JF&tP(nf{`35OK1B3M53e9{>4|M(@=c`}fzb(4C5nw3;yZ`_I M07*qoM6N<$g2mI7k^lez diff --git a/apps/90sclk/bg.png b/apps/90sclk/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebf755ad53d9a2f452b8fb2be6f19589986f318 GIT binary patch literal 37016 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 literal 2884 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 iR539+GBi3hI4dwQIxsMs^94u%0000 Date: Wed, 23 Mar 2022 19:18:42 +0100 Subject: [PATCH 036/117] Fixed lcars --- apps/lcars/lcars.app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 77321f19c..357070fdc 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -618,6 +618,8 @@ function increaseAlarm(){ } else { settings.alarm = getCurrentTimeInMinutes() + 5; } +} + function feedback(){ Bangle.buzz(40, 0.3); From d93646abd7f9dcdded6e6351d6b50f9a7f9c41d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 23 Mar 2022 21:36:15 +0100 Subject: [PATCH 037/117] Show steps. Performance improvement --- apps/90sclk/app.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 02a35e69f..76676b49a 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -32,32 +32,49 @@ function queueDraw() { } -function drawBorderString(str, x, y, bw, fc){ +function drawBorderString(str, x, y, b, fc){ g.setColor("#000"); - for(var i=-bw; i{};wd.area="";} - var x = g.getWidth()/2; + var x = g.getWidth()/2-5; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); + // Draw time var date = new Date(); var timeStr = locale.time(date,1); g.setFontAlign(0,0); g.setFontTime(); drawBorderString(timeStr, x, y, 5, "#fff"); + // Draw date y += 50; x = x - g.stringWidth(timeStr) / 2 + 5; g.setFontDate(); @@ -67,6 +84,11 @@ function draw() { fc = E.getBattery() < 50 ? "#f00" : fc; drawBorderString(dateStr, x, y, 3, fc); + // Draw steps + g.setFontAlign(1,1); + var steps = parseInt(getSteps() / 1000); + drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // queue draw in one minute queueDraw(); } From 034026019ad845fd59ad274d8f7465358c3ec507 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:07:29 +0100 Subject: [PATCH 038/117] Minor changes --- apps/90sclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 76676b49a..750a129b6 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -61,7 +61,7 @@ function getSteps() { function draw() { for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - var x = g.getWidth()/2-5; + var x = g.getWidth()/2; var y = g.getHeight()/2-20; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); From 12678604206308f03c97f2022619c75e9c1fe606 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:14:30 +0100 Subject: [PATCH 039/117] Added settings for fullscreen mode --- apps/90sclk/ChangeLog | 3 ++- apps/90sclk/README.md | 9 +++++++++ apps/90sclk/app.js | 28 +++++++++++++++++++++++++--- apps/90sclk/metadata.json | 8 +++++--- apps/90sclk/settings.js | 31 +++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 apps/90sclk/settings.js diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog index 2286a7f70..feb008f5f 100644 --- a/apps/90sclk/ChangeLog +++ b/apps/90sclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Fullscreen settings. \ No newline at end of file diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 55fe21ce6..6f820886a 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -1,4 +1,13 @@ # 90s Clock +A watch face in 90s style: + ![](screenshot.png) + +# Settings +In the settings you can enable / disable the fullscreen mode. + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 750a129b6..367d77502 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -1,4 +1,19 @@ +const SETTINGS_FILE = "90sclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: false, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} function getImg() { @@ -60,9 +75,9 @@ function getSteps() { function draw() { - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} var x = g.getWidth()/2; - var y = g.getHeight()/2-20; + var y_offset = settings.fullscreen ? 0 : 10; + var y = g.getHeight()/2-20 + y_offset; g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); g.drawImage(getImg(),0,0); @@ -89,6 +104,13 @@ function draw() { var steps = parseInt(getSteps() / 1000); drawBorderString(steps, g.getWidth()-10, g.getHeight()-10, 3, "#f0f"); + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } + // queue draw in one minute queueDraw(); } @@ -96,7 +118,7 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index f3cf33eae..95ef96ccf 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -1,8 +1,9 @@ { "id": "90sclk", "name": "90s Clock", - "version": "0.01", - "description": "A clock in 90s style", + "version": "0.02", + "description": "A 90s style watch-face", + "readme": "README.md", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", @@ -11,6 +12,7 @@ "allow_emulator": true, "storage": [ {"name":"90sclk.app.js","url":"app.js"}, - {"name":"90sclk.img","url":"app-icon.js","evaluate":true} + {"name":"90sclk.img","url":"app-icon.js","evaluate":true}, + {"name":"90sclk.settings.js","url":"settings.js"} ] } diff --git a/apps/90sclk/settings.js b/apps/90sclk/settings.js new file mode 100644 index 000000000..8f97cd317 --- /dev/null +++ b/apps/90sclk/settings.js @@ -0,0 +1,31 @@ +(function(back) { + const SETTINGS_FILE = "90sclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + fullscreen: false, + }; + 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) + } + + + E.showMenu({ + '': { 'title': '90s Clock' }, + '< Back': back, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From c32040c3118b47079689c26f497621e2b488e0f5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 16:19:18 +0100 Subject: [PATCH 040/117] Minor changes --- apps/90sclk/README.md | 8 ++++---- apps/90sclk/metadata.json | 2 +- apps/90sclk/screenshot_2.png | Bin 0 -> 5412 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 apps/90sclk/screenshot_2.png diff --git a/apps/90sclk/README.md b/apps/90sclk/README.md index 6f820886a..c09c6fe23 100644 --- a/apps/90sclk/README.md +++ b/apps/90sclk/README.md @@ -2,12 +2,12 @@ A watch face in 90s style: +![](screenshot_2.png) + +Fullscreen mode can be enabled in the settings: + ![](screenshot.png) -# Settings -In the settings you can enable / disable the fullscreen mode. - - ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json index 95ef96ccf..fb2824a6f 100644 --- a/apps/90sclk/metadata.json +++ b/apps/90sclk/metadata.json @@ -5,7 +5,7 @@ "description": "A 90s style watch-face", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], diff --git a/apps/90sclk/screenshot_2.png b/apps/90sclk/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9646b11683a95eee86a16dba9344cae669ed8996 GIT binary patch literal 5412 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 Date: Fri, 25 Mar 2022 17:22:39 +0100 Subject: [PATCH 041/117] Add black and white clock --- apps/bwclk/ChangeLog | 1 + apps/bwclk/README.md | 7 +++ apps/bwclk/app-icon.js | 1 + apps/bwclk/app.js | 97 ++++++++++++++++++++++++++++++++++++++ apps/bwclk/app.png | Bin 0 -> 4238 bytes apps/bwclk/metadata.json | 17 +++++++ apps/bwclk/screenshot.png | Bin 0 -> 6093 bytes 7 files changed, 123 insertions(+) create mode 100644 apps/bwclk/ChangeLog create mode 100644 apps/bwclk/README.md create mode 100644 apps/bwclk/app-icon.js create mode 100644 apps/bwclk/app.js create mode 100644 apps/bwclk/app.png create mode 100644 apps/bwclk/metadata.json create mode 100644 apps/bwclk/screenshot.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/bwclk/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md new file mode 100644 index 000000000..49ee7f593 --- /dev/null +++ b/apps/bwclk/README.md @@ -0,0 +1,7 @@ +# Black & White clock + +![](screenshot.png) + + +## Creator +- [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js new file mode 100644 index 000000000..28f75c4e6 --- /dev/null +++ b/apps/bwclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js new file mode 100644 index 000000000..709597a0b --- /dev/null +++ b/apps/bwclk/app.js @@ -0,0 +1,97 @@ +const locale = require('locale'); + + +// timeout used to update every minute +var W = g.getWidth(); +var H = g.getHeight(); +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + + +function getSteps() { + try{ + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } else if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom.getSteps(); + } + } catch(ex) { + // In case we failed, we can only show 0 steps. + } + + return 0; +} + + +function draw() { + // Hide widgets + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + + // Clear old watch face + var x = W/2; + var y = H/2-20; + g.reset().clearRect(0,0,W,W); + + // Draw background + g.setColor("#000"); + g.fillRect(0,0,W/2,H/2); + g.setColor("#fff"); + g.fillRect(W/2,H/2,W/2,H/2); + + // // Draw time + // var date = new Date(); + // var timeStr = locale.time(date,1); + // g.setFontAlign(0,0); + // g.setFontTime(); + // g.drawString(timeStr, x, y); + + // // Draw date + // y += 50; + // x = x - g.stringWidth(timeStr) / 2 + 5; + // g.setFontDate(); + // g.setFontAlign(-1,0); + // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); + // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; + // fc = E.getBattery() < 50 ? "#f00" : fc; + // g.drawString(dateStr, x, y); + + // queue draw in one minute + queueDraw(); +} + +Bangle.loadWidgets(); + +// Clear the screen once, at startup +g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + + +Bangle.on('lock', function(isLocked) { + print("LOCK"); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + + +// Show launcher when middle button pressed +Bangle.setUI("clock"); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..29875b1dceaa209aa7aaad86d60402290ee0f9cc GIT binary patch literal 4238 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 literal 0 HcmV?d00001 From d3dcc50071a5ef549846aed8ce15c92d55f4681a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:23:54 +0100 Subject: [PATCH 042/117] Fixed invalid json --- apps/bwclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 0d48401c6..d570fb2d2 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -12,6 +12,6 @@ "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.img","url":"app-icon.js","evaluate":true} ] } From c2bce25a424440a28ce01b92a89f0414e8086c10 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 17:57:19 +0100 Subject: [PATCH 043/117] Finished V1 --- apps/bwclk/app.js | 63 ++++++++++++++++++++++++-------------- apps/bwclk/app.png | Bin 4238 -> 2103 bytes apps/bwclk/screenshot.png | Bin 6093 -> 2882 bytes 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 709597a0b..ec00b46fd 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,5 +1,18 @@ const locale = require('locale'); +// Manrope font +Graphics.prototype.setLargeFont = function(scale) { + // Actual height 41 (42 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); + return this; +}; + +Graphics.prototype.setSmallFont = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); + return this; +}; + // timeout used to update every minute var W = g.getWidth(); @@ -36,33 +49,37 @@ function draw() { // Hide widgets for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} - // Clear old watch face - var x = W/2; - var y = H/2-20; - g.reset().clearRect(0,0,W,W); - // Draw background - g.setColor("#000"); - g.fillRect(0,0,W/2,H/2); + g.reset().clearRect(0,0,W,W); g.setColor("#fff"); - g.fillRect(W/2,H/2,W/2,H/2); + g.fillRect(0,0,W,H/5*2); - // // Draw time - // var date = new Date(); - // var timeStr = locale.time(date,1); - // g.setFontAlign(0,0); - // g.setFontTime(); - // g.drawString(timeStr, x, y); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,0); + var date = new Date(); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, H/5*2 + 40); - // // Draw date - // y += 50; - // x = x - g.stringWidth(timeStr) / 2 + 5; - // g.setFontDate(); - // g.setFontAlign(-1,0); - // var dateStr = locale.dow(date, true).toUpperCase() + date.getDate(); - // var fc = Bangle.isLocked() ? "#0ff" :"#fff"; - // fc = E.getBattery() < 50 ? "#f00" : fc; - // g.drawString(dateStr, x, y); + // Draw Steps + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, H/5*4 + 10); + + // Draw date + g.setColor("#000"); + g.setSmallFont(); + g.setFontAlign(0,1); + var y = H/5+30; + g.drawString(locale.dow(date, true), W/2-55, y); + var monthStr = date.getMonth()+1; + + monthStr = monthStr < 10 ? "0" + monthStr : monthStr; + g.drawString(monthStr, W/2+55, y); + + g.setLargeFont(); + g.drawString(date.getDate(), W/2, y+7); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index 29875b1dceaa209aa7aaad86d60402290ee0f9cc..cbe7fa8978429136351c0f09dd6becfea57b8b01 100644 GIT binary patch delta 2075 zcmV+$2;}#UA-52aGk*u}Nkl86k90Gqrp9m)6{$(fJ|LB%tc5Jm zrKHgp!^$%H$D*);6pZM@polCmKcI*p5-O7{YnV|=m`-!nVtrT?YHGSPoh+aCkMf6m z_t9GmLg>I@zkBX;?>T4Z+ktCCnlI$>lirkJsdwV+oKqL|gvhm*l@bu|Z zOq(_hRaI3m8jT1F3c{K-YvAYS=dOCk5jcGKFe4%&s8lMsefxGnZZsNs;=~D;|44g# zJHx`l7#JAHo}M0(-=l;dc`uPj2!PSi(d_K(v>AK)^nYnaMn*C&E{^r}^)#7GR4SEJ zDwR|y6n1!$bm+joefwBhSt+zjN=kU_*fACr74gQ68%~X{uCC_HnKLPoNT}241o@#u zhnSw8&g$xFc6N61{Q2_~i9}qxcCCQv?d|25*RSK{%a_n-G`M!{8Wt{G2$@US_Q$OiT<-2Axia;NW0fx^xNm?%jh{s}<()^72AQM+ZKA`h@!WdISarqOGkB@87>iLP7%i z`+xf}I5=o;fTO%RdGaJ5Ja{0qckI}~&dyFge*Bn6j~=zbj$fev%VXPUK|uk%y}c$=J6f~JkHglDflu)TuQl(O{si}!(vzc10mP)0PM~)nExDAU)_wEB%uU^I1 zuU{SZB_}5%Ffb4R@aWMaoIigaqobpkJ%4*Pva_=xlgZps4FGW4fxk@?z8V$%D6}Rl ziST{FO<0=nDKz07a9NFphK3?DGZTJ(emHXE2+U?PHf-2{ef##=VFv~VkeHYVv)OFd z=j-c>yu3U+`QYH7U73-Qk%9R5c*x~))YjJG*s)_685wcugu_E9At8b9-o3Lsuzxmh z-b{nRz}D7Q8Vm*+3?9H1u0!Azrv#6+uqobqj>+9p& zw{J<3_4V~m56U0xxTCVNl8udxLRISQ#0?D%<;chg@7=rSRLPhFg@uKb%jE*gWHJG> zYSk)|WJN^I4<0{$+@%9~d3hvBl}hDQNo;H^ zNm8v=JH?FMj{^b%erB)@J6*&L4Gpkbt)o*uQ^2JUr}|;JkVB1kAZ}=MWMS;?f4Uu9O;$26N`jL4Qt84n{{u z1^L5=4;?B6CN~P@X?&jUQ zcYl2i{ET+(+6A##jH03vd1%Fj471PtxX)>8? z(r?kCMI_1BuU|7UF_9{jij9qpv{)=$xpL*7O`)+pd(WOd4#$kYc>$oOrzg*zJ!^BL z>hA7lYHF&@xV?M#(rh*hnBn1J78De?wC|_Y=;Xe1idZ--GR6j-rh1pwg5lP7ro{JG0H|CQ5!o7{3>#*7)z z>-Es<^=NNzM{sa3R<2x$y1F{Fw6q{2BLe`iapOj`wzi_Nu@Oq864}|=(ChVRX=%Zg zD_7ih;9zwY9aJKYu<$LPGfB#S4nXVt*QqMg|85Q>|9>^5x6I zSglqoyk!3_yZt)7b?a6{MMa^hsR;n!=jVrK&z`|*wPI*!2qKXPw{G1+O-&7gf`X8l znJJ7-OG`smR+hUaxEBF$Z*O{ed9kXhieX`4Y-(x}w$QQf=H_OGhlevYHI=2MrNT+< zss#Uk*{wAY8GjjxWy_XfWMl;X{{E0iBDbWF!1VNV0$@^75}TWw zSyxxbS+iyl0B_v5!O4>+yB&dl=fK~le-8X@n(z+%7ZgCSjsX$Ymp=di002ovPDHLk FV1nvT3L5|b delta 4226 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

2$QTw4l{$NlQ!P#*G_%|NZxz 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 From ec40e5d8fdd11299d161b8d23033281dac7f4983 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:00:22 +0100 Subject: [PATCH 044/117] Show lock status. --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index ec00b46fd..eb95bc777 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,7 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, H/5*4 + 10); + g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 288123d72934809857ccf401da3e73d76a656e6a Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 25 Mar 2022 18:05:17 +0100 Subject: [PATCH 045/117] Minor fix --- apps/bwclk/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb95bc777..6c7db898e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -65,7 +65,9 @@ function draw() { // Draw Steps g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps() + Bangle.isLocked() ? "L" : "", W/2, H/5*4 + 10); + var lock = Bangle.isLocked() ? "L" : ""; + var steps = getSteps(); + g.drawString(steps + lock, W/2, H/5*4 + 10); // Draw date g.setColor("#000"); From 0bd35cec29274bb3c5de179f5d3fcbfefee98e27 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:28:25 +0100 Subject: [PATCH 046/117] Improvements accordingly to the community --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 22 ++++++++++++++-------- apps/bwclk/metadata.json | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 2286a7f70..1e1f155bb 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1 +1,2 @@ -0.01: New App! \ No newline at end of file +0.01: New App! +0.02: Use build in function for steps and other improvements. \ No newline at end of file diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index 28f75c4e6..a84b133d7 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgc8+fAgEgwAMDvPnz99BYdl2weHtu27ft2AGBiEcuEAhAPDg4jGgECIRMN23fthUNgP374vBAB3gAgc/gAXNjlx4EDxwJEpAjG/6IBjkBL4UAjVgBAJuCgPHBQMFEIkkyQjFhwEClgXBEYNBwkQJoibCBwNFBAUCEAVAQZAjC/8euPHDon//hKB//xEYMP//jBYP/+ARDNYM///+EYIgBj1B/8fCIUhEYQRB//FUIM/EZU4EYMkEYP/8VhEYUH/gRBWAUfI4MD+AjBoAsBwEH8EB/EDwE4HwYjCuEHWAOHgExEYKbBCIZNB8fAEYQHByE/EwPABAY+BgRHDBANyJQXHNwIjD8CSBj/+BwMSTwOOBYK2D/4CCNYZQB/iJBQwYjCCIcAgeBSoOAWYQjEVoIRCNAIjKAQKJBgAFC8ZoCWwJbDABMHGQPAAoMQB5EDx/4A4gqBZwIGCWwIABuBWC4EBZwPgv/AcwS/EAAcIU4IRBVQIRKEwIjBv0ARIUDCJIjD//x/ARK/5HC/+BCJkcI45uDgECUgQjCWAM4WwUBWYanEAA8cTARWBEYUC5RAHw1YgEOFQXADQPHIIkAhgICuARBh0A23blhHBagIKBsOGjNswhHDEYUUAoTUBhkxEYMwKwU503bvuwXILmCEYMYsumWYYjB85lDEYovBEYXm7fs25EBI4kYtOWNwIjD4+8NYsw4YjGz9/2hrEoOGjVBwE4NYdzNYSwBuEDEYcxaIUA8+atugGogjBiVgWAI")) +require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 6c7db898e..e022a1d2a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -36,6 +36,8 @@ function getSteps() { return WIDGETS.wpedom.getSteps(); } else if (WIDGETS.activepedom !== undefined) { return WIDGETS.activepedom.getSteps(); + } else { + return Bangle.getHealthStatus("day").steps; } } catch(ex) { // In case we failed, we can only show 0 steps. @@ -71,17 +73,21 @@ function draw() { // Draw date g.setColor("#000"); - g.setSmallFont(); - g.setFontAlign(0,1); var y = H/5+30; - g.drawString(locale.dow(date, true), W/2-55, y); - var monthStr = date.getMonth()+1; - - monthStr = monthStr < 10 ? "0" + monthStr : monthStr; - g.drawString(monthStr, W/2+55, y); + g.setFontAlign(0,1); g.setLargeFont(); - g.drawString(date.getDate(), W/2, y+7); + var dateStr = date.getDate(); + g.drawString(dateStr, W/2, y+7); + var strW = g.stringWidth(dateStr); + + g.setSmallFont(); + g.setFontAlign(1,1); + g.drawString(locale.dow(date, true), W/2-strW/2, y); + + g.setFontAlign(-1,1); + var monthStr = locale.month(date, 1); + g.drawString(monthStr, W/2+strW/2, y); // queue draw in one minute queueDraw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index d570fb2d2..aefb1e531 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.01", + "version": "0.02", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", From 9f3935cb9e9edebc01474d0cacb8200c075da5e2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 26 Mar 2022 08:31:06 +0100 Subject: [PATCH 047/117] Minor changes --- apps/bwclk/app.js | 1 - apps/bwclk/screenshot.png | Bin 2882 -> 2963 bytes 2 files changed, 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index e022a1d2a..eb61221d9 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -111,7 +111,6 @@ Bangle.on('lcdPower',on=>{ Bangle.on('lock', function(isLocked) { - print("LOCK"); if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index f6d1d96e34df9dd506d9b7689ef7bfdae01666b2..84fb273b760489ecfbee271b5c7bc2b45a3feca0 100644 GIT binary patch literal 2963 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 Date: Sun, 27 Mar 2022 11:26:22 +0200 Subject: [PATCH 048/117] Finished V0.02 with fullscreen mode and optional lock icon --- apps/90sclk/app.js | 6 +-- apps/bwclk/README.md | 9 ++++ apps/bwclk/app.js | 86 +++++++++++++++++++++++++----------- apps/bwclk/lock.png | Bin 0 -> 9212 bytes apps/bwclk/metadata.json | 5 ++- apps/bwclk/screenshot.png | Bin 2963 -> 2693 bytes apps/bwclk/screenshot_2.png | Bin 0 -> 3113 bytes apps/bwclk/settings.js | 40 +++++++++++++++++ 8 files changed, 116 insertions(+), 30 deletions(-) create mode 100644 apps/bwclk/lock.png create mode 100644 apps/bwclk/screenshot_2.png create mode 100644 apps/bwclk/settings.js diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js index 367d77502..6babbfec2 100644 --- a/apps/90sclk/app.js +++ b/apps/90sclk/app.js @@ -75,6 +75,9 @@ function getSteps() { function draw() { + // queue draw in one minute + queueDraw(); + var x = g.getWidth()/2; var y_offset = settings.fullscreen ? 0 : 10; var y = g.getHeight()/2-20 + y_offset; @@ -110,9 +113,6 @@ function draw() { } else { Bangle.drawWidgets(); } - - // queue draw in one minute - queueDraw(); } Bangle.loadWidgets(); diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 49ee7f593..18c87d7e8 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -3,5 +3,14 @@ ![](screenshot.png) +In the settings, fullscreen mode can be enabled and disabled: + +![](screenshot_2.png) + +Additionally, in fullscreen mode a lock icon can be shown... + +## Thanks to +Lock icons created by Those Icons - Flaticon + ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index eb61221d9..b1f433c12 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,4 +1,25 @@ +const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); +const storage = require('Storage'); + + +/* + * Load settings + */ +let settings = { + fullscreen: true, + showLock: true, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key] +} + + +/* + * Assets + */ // Manrope font Graphics.prototype.setLargeFont = function(scale) { @@ -13,6 +34,12 @@ Graphics.prototype.setSmallFont = function(scale) { return this; }; +var imgLock = { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) +}; + // timeout used to update every minute var W = g.getWidth(); @@ -48,37 +75,23 @@ function getSteps() { function draw() { - // Hide widgets - for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + // queue draw in one minute + queueDraw(); // Draw background + var yOffset = settings.fullscreen ? 0 : 10; + var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#fff"); - g.fillRect(0,0,W,H/5*2); - - // Draw time - g.setColor("#fff"); - g.setLargeFont(); - g.setFontAlign(0,0); - var date = new Date(); - var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, H/5*2 + 40); - - // Draw Steps - g.setSmallFont(); - g.setFontAlign(0,0); - var lock = Bangle.isLocked() ? "L" : ""; - var steps = getSteps(); - g.drawString(steps + lock, W/2, H/5*4 + 10); + g.setColor("#000"); + g.fillRect(0,y,W,H); // Draw date + var date = new Date(); g.setColor("#000"); - var y = H/5+30; - g.setFontAlign(0,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+7); + g.drawString(dateStr, W/2, y+5); var strW = g.stringWidth(dateStr); g.setSmallFont(); @@ -89,14 +102,37 @@ function draw() { var monthStr = locale.month(date, 1); g.drawString(monthStr, W/2+strW/2, y); - // queue draw in one minute - queueDraw(); + // Draw time + g.setColor("#fff"); + g.setLargeFont(); + g.setFontAlign(0,-1); + var timeStr = locale.time(date,1); + g.drawString(timeStr, W/2, y+10); + + // Draw Steps + y += H/5*2+10; + g.setSmallFont(); + g.setFontAlign(0,0); + g.drawString(getSteps(), W/2, y); + + // Draw lock + if(settings.showLock && Bangle.isLocked()){ + g.setColor("#000"); + g.drawImage(imgLock, 2, 2); + } + + // Draw widgets if not fullscreen + if(settings.fullscreen){ + for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} + } else { + Bangle.drawWidgets(); + } } Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#000",fg:"#fff",dark:false}).clear(); +g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); // Stop updates when LCD is off, restart when on diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2c8407e79bd5f67969487c1028db745fca11fa GIT binary patch literal 9212 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 HbLsy8P0)rp literal 0 HcmV?d00001 diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index aefb1e531..3fe04c4d5 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -5,13 +5,14 @@ "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true} + {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, + {"name":"bwclk.settings.js","url":"settings.js"} ] } diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 84fb273b760489ecfbee271b5c7bc2b45a3feca0..5a3c17c868b9710cf95b1518d9122efc3485a798 100644 GIT binary patch literal 2693 zcmcgu`#aS67k__dOzyWrg^?u{vuup(WGsb|E@F{e(_km-QpRQ&GcF(LBDs{PP{^Gz zGp52+OkE7Nn7~ri!xmkto78)a*wo8i3>|3V?uk*dbSzwB!Fo z*`n2z6|(l*&(~z!gU*k3z{QDl;ge2#;9%FQcw6?a*vgw^|G36{!CnR4N1RfoCjpSEy*Y@vP;h_HmEuUddfU=C`U8V-bD0r9T{)}G** zs#p@UXo$^FsQ6f=o8VwleCvH{$Bv&?dV=wYdIZg?x17>XEAl+k-tzzHD ztzT{PT{WS8-;4NU*P+>Mf6}7S$r!!%1d5=VLOklbJZGQya2_<(@g1W94r}> z)dUhJsDSS)m1q9URFy8JAuN(uQhDDL-(B7SmPP%#9w60V{j(XEG|q^%!I0f?&A@Nt z!kHX{0xo0OxZAVTw7c`4xD}OQQSMJ>0 z`S!xA&yNeMw>~871-^N$nM;L}=6kSlgxYRnaZvsWJ^&AiXVAQtmVF_J%$UoVR{DIIB~b` z4X%ULndg}U9NNL2b>C(GyM6ex6-UmrXIqjgTs;U2t+L35(XT&TU!8LH!CHh8oD##} z_>1u$(V`3b!$A|o>T@cX_?6Go+J<9L!^aSEP{mH6kwvKLExaYZj(uvh5?PX*eA>uZ zL7Un-#H$Gcwt}pE*ay4fEIxnf*m0xt^73g_m5hWatMJ*PEj<&xlS$xf#p+3C@gF$s z&AOc@)Acg6y02bnMwKyhVm7&8sxWGDwxCOdFJm^Ayv#z}kGh^7;9&0h+2{PIRbkygNlb5%6NEu* zA)~7`x<}RRFn@!FvcB-6y9HX_H`M$h?a2GD5GKU|O7JmEvT8c;OEuO8T(Ih4)VkR@Vt5R5MfQAvsWKcb)9^qZ zUTY2pL6E3FDMw8qajKH7PoG3Coi>7O>nLv5jw; zW5rv-nR>t)WaHS7ZCD_*=py_yA4o4Mt*^~|TMZ-*p5Kk>iUx8Ab*8QsXU z-8ghzO~lXw9ta-w3$y4Dy4fa|{|Q=K?h$nC`m1L3geGq~#zE$*p0WU)@^XC$I{bC*GatXFQqS>`!YFe`zxg4x*0k`$fRgzB~ zex9pmt^~X246<>3#`!5-K>YqPL@^NH8yfZJukO9oJhvZ+hj3dr6Nt9OcGnT8IO(5@ hr)IbO?~K~!cBT@d+B+t%L+UHRVVC31?1Q8W{{p+I;AQ{- literal 2963 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 (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Full Screen': { + value: settings.fullscreen, + format: () => (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + } + }); + }) From 2583bdd4afc0f2c9c89ee678586136083e5235fb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:26:34 +0200 Subject: [PATCH 049/117] Minor chnages --- apps/bwclk/lock.png | Bin 9212 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/bwclk/lock.png diff --git a/apps/bwclk/lock.png b/apps/bwclk/lock.png deleted file mode 100644 index 8c2c8407e79bd5f67969487c1028db745fca11fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9212 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 HbLsy8P0)rp From d51fd882466376dce27d1e3c5cb3f315fb14d4f1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:29:37 +0200 Subject: [PATCH 050/117] Set defaults correctly --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index b1f433c12..3a89bc68f 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -7,7 +7,7 @@ const storage = require('Storage'); * Load settings */ let settings = { - fullscreen: true, + fullscreen: false, showLock: true, }; From bceb2949bf46928498251a1c8e9bfc5abd75c3b7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 27 Mar 2022 11:53:27 +0200 Subject: [PATCH 051/117] Optional timer if qalarm is installed --- apps/bwclk/README.md | 2 ++ apps/bwclk/app.js | 71 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 18c87d7e8..85f01c8fe 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,6 +8,8 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... +If you installed the "qalarm" app, you can directly set a timer. Simply tab at +top / bottom of the screen. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 3a89bc68f..39c6b1e17 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -56,7 +56,9 @@ function queueDraw() { } - +/* + * Handle alarm + */ function getSteps() { try{ if (WIDGETS.wpedom !== undefined) { @@ -74,6 +76,44 @@ function getSteps() { } +function isAlarmEnabled(){ + try{ + var qalarm = require('qalarm'); + return qalarm.isTimerStarted("bwclk"); + } catch(ex){ } + return false; +} + + +function getAlarmMinutes(){ + try{ + var qalarm = require('qalarm'); + return qalarm.getTimerMin("bwclk"); + } catch(ex){ } + return -1; +} + +function increaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")+5; + qalarm.deleteTimer("bwclk"); + qalarm.editTimer("bwclk", 0, mins, 0); + } catch(ex){ } +} + +function decreaseAlarm(){ + try{ + var qalarm = require('qalarm'); + var mins = qalarm.getTimerMin("bwclk")-5; + qalarm.deleteTimer("bwclk"); + if(mins > 0){ + qalarm.editTimer("bwclk", 0, mins, 0); + } + } catch(ex){ } +} + + function draw() { // queue draw in one minute queueDraw(); @@ -109,11 +149,13 @@ function draw() { var timeStr = locale.time(date,1); g.drawString(timeStr, W/2, y+10); - // Draw Steps + // Draw steps or timer y += H/5*2+10; g.setSmallFont(); g.setFontAlign(0,0); - g.drawString(getSteps(), W/2, y); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + // Draw lock if(settings.showLock && Bangle.isLocked()){ @@ -135,6 +177,8 @@ Bangle.loadWidgets(); g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); // draw immediately at first, queue update draw(); + + // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -153,5 +197,26 @@ Bangle.on('lock', function(isLocked) { }); +Bangle.on('touch', function(btn, e){ + var upper = parseInt(g.getHeight() * 0.2); + var lower = g.getHeight() - upper; + + var is_upper = e.y < upper; + var is_lower = e.y > lower; + + if(is_upper){ + Bangle.buzz(40, 0.6); + increaseAlarm(); + draw(true); + } + + if(is_lower){ + Bangle.buzz(40, 0.6); + decreaseAlarm(); + draw(true); + } +}); + + // Show launcher when middle button pressed Bangle.setUI("clock"); From bf51d5ed7ae9407874b0cf0bda40a80381202270 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 28 Mar 2022 06:29:42 +0200 Subject: [PATCH 052/117] Minor improvement --- apps/bwclk/app.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39c6b1e17..5da262d03 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -128,19 +128,16 @@ function draw() { // Draw date var date = new Date(); g.setColor("#000"); - g.setFontAlign(0,1); + g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); g.drawString(dateStr, W/2, y+5); - var strW = g.stringWidth(dateStr); g.setSmallFont(); - g.setFontAlign(1,1); - g.drawString(locale.dow(date, true), W/2-strW/2, y); - g.setFontAlign(-1,1); var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2+strW/2, y); + g.drawString(monthStr, W/2 + 5, y+2); + g.drawString(locale.dow(date, true), W/2 + 5, y-22); // Draw time g.setColor("#fff"); From 1e91a2095e6e9e1380b7fa5ffa1106bbcefc2c6a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:05 +0100 Subject: [PATCH 053/117] Create fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 apps/fuzzyw/fuzzyw.app.js diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js new file mode 100644 index 000000000..4057563d3 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.app.js @@ -0,0 +1,78 @@ + +// adapted from https://github.com/hallettj/Fuzzy-Text-International/ +const fuzzy_strings = { + en_GB:{ + hours:[ + // AM hours + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + // PM hours + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + minutes:[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + text_scale:3.5, + }, + }; + + //const SETTINGS_FILE = "fuzzyw.settings.json"; + //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; + + //let fuzzy_string = fuzzy_strings[settings.language]; + let fuzzy_string = fuzzy_strings['en_GB']; + + const h = g.getHeight(); + const w = g.getWidth(); + + function getTimeString(date) { + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; + } + + function draw() { + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.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); + } + + g.clear(); + draw(); + setInterval(draw, 10000); // refresh every 10s + + // Stop updates when LCD is off, restart when on + Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } + }); + + Bangle.setUI('clock'); + Bangle.loadWidgets(); + Bangle.drawWidgets(); From 18ac62c0ede389efb61e65c68359ed060e6ca90d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:17:28 +0100 Subject: [PATCH 054/117] Add files via upload --- apps/fuzzyw/ChangeLog | 1 + apps/fuzzyw/README.md | 15 +++++++++++++++ apps/fuzzyw/fuzzy.png | Bin 0 -> 173 bytes apps/fuzzyw/fuzzyw-dark.png | Bin 0 -> 2172 bytes apps/fuzzyw/fuzzyw-light.png | Bin 0 -> 2578 bytes apps/fuzzyw/fuzzyw.icon.js | 1 + apps/fuzzyw/metadata.json | 19 +++++++++++++++++++ 7 files changed, 36 insertions(+) create mode 100644 apps/fuzzyw/ChangeLog create mode 100644 apps/fuzzyw/README.md create mode 100644 apps/fuzzyw/fuzzy.png create mode 100644 apps/fuzzyw/fuzzyw-dark.png create mode 100644 apps/fuzzyw/fuzzyw-light.png create mode 100644 apps/fuzzyw/fuzzyw.icon.js create mode 100644 apps/fuzzyw/metadata.json diff --git a/apps/fuzzyw/ChangeLog b/apps/fuzzyw/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/fuzzyw/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md new file mode 100644 index 000000000..1b5f2b8e8 --- /dev/null +++ b/apps/fuzzyw/README.md @@ -0,0 +1,15 @@ +# Fuzzy Text Clock + +An inaccurate clock for when you're not in a rush. + +This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! + +## TODO +* Other languages (currently only uk style time, could tie into the Languages app) +* Bold hour word + +## References +Based on Pebble app Fuzzy Text International: https://github.com/hallettj/Fuzzy-Text-International + +![](fuzzyw-light.png) +![](fuzzyw-dark.png) diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-dark.png b/apps/fuzzyw/fuzzyw-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..88220e5c7f3414e922f735d895d5eea03bae3f5a GIT binary patch literal 2172 zcmeH}|5wt78pr7~ObDIdCUZG=B}JW7cT3YL%F_fqJ?H-LJg@V5etFJ$|MX_Z zMu%H(+rA9~fmla;8-_Qt`>%m*HSeyzxua%mq2a?rA)WG17akR; zUs*vLHa8ct0{X=GGw9Uvjt;>yV?K!LR+N4o_@=m|sOTN@%}ly&0z_4tLr@7{oaq2~PId`sdirI|8}+5voR_>GYZXs+K^@kjU&y7al1G;FVvcurRUQ2L z#mK6S6p&Zp7md0YhUGO{B3|z}21st(&w3&+#mw46U-R3;RZ6PAv~7lU9BRDR6y@~= z=XUV$+*UBIksN$mMDMZ8W20}!xSP*tn7?@IewCsrdgM1~w5Aeo18l~?LC4feHu|hg zz;FM81pzQW{IA*t*k?ux$yuNoCto1mE5RUtl4U~IRXLvVWg&2<)K5iMEj;vNG`&qH6zc8-0 zXxRXdI#`z0YeS}VQQ}WlHMT!;&(XGC>wkrHpyf)Db!zH?iGn=obOl%26u4dj>;IlG zFukfwDImSQcZ20DSoK-u!>VP2(9Zrd;Z@Z#7*ix$u76&+sFiXBmeMr_3YUsF9PvcI zICaHSr#wZ{)Q`C|{FEtPi4`-DleBH^J;{b{ZyRrFo@t{xJ(*YW2XRZT)T{Cec6S7p^n4cq5~ocJ`c);lv; z9p9z@**?%ej{cBj{`gU2RWY`Vc?;S(o($i!em7@@U?9XL{9c;%rT7GZK|H6b4>=?_ zUZK1G5uL}C{xZKybn;{2a}{wz!oMqu%Gg4TdN9Dr9w2#9b36N*x(tE*E?#DyGJsLh zthXgP-WsI?ZY|fyOQ!nA&|+M<=18UNSfZOQp)Ji1y4x;s3oPq}+U9_&xLjie3u;Vn zwgwM|9f1HO;d+^!kb`o_-?<;-Y}WfJ9y#pFvlIY!dCDad19$yzv_$(rw95w9&(P}tB2D%>XV zENDET&$N<`RdP0;(q{cKcMnC%afJA%~9o89|Qu-%ZkN7?S literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw-light.png b/apps/fuzzyw/fuzzyw-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5383e08a49cad86ee7683b811f4bed918a36cd68 GIT binary patch literal 2578 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 literal 0 HcmV?d00001 diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json new file mode 100644 index 000000000..56ed896a8 --- /dev/null +++ b/apps/fuzzyw/metadata.json @@ -0,0 +1,19 @@ +{ + "id":"fuzzyw", + "name":"Fuzzy Text Clock", + "shortName": "Fuzzy Text", + "version": "0.01", + "description": "An inaccurate clock for when you're not in a rush", + "readme": "README.md", + "icon":"fuzzyw.png", + "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + ] +} From 949e746a75f1d26361d63420dd3d6c9d47c79f76 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:20:34 +0100 Subject: [PATCH 055/117] Add files via upload --- apps/fuzzyw/fuzzyw-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw-icon.js diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw-icon.js new file mode 100644 index 000000000..48750da61 --- /dev/null +++ b/apps/fuzzyw/fuzzyw-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From b03930125ca0f84ea1ba3e1383b96bf76a3a4785 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:24:17 +0100 Subject: [PATCH 056/117] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 0 -> 173 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/fuzzyw/fuzzyw.png diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png new file mode 100644 index 0000000000000000000000000000000000000000..125265aea211223268c701ba1d548552d26c7b77 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T literal 0 HcmV?d00001 From 0689cb6c03ce19a44549c579b35dcdee69ef38d2 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:25:42 +0100 Subject: [PATCH 057/117] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 56ed896a8..b1fa4c6d7 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -6,7 +6,7 @@ "description": "An inaccurate clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", - "screenshots": [{"url":"fuzzyw_light.png"},{"url":"fuzzyw_dark.png"}], + "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS", "BANGLEJS2"], From 96ea439a4560452d0860c4ce3b884133a15a2e8c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:38 +0100 Subject: [PATCH 058/117] Create fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/fuzzyw/fuzzyw.settings.js diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -0,0 +1 @@ + From a23dd54b5d446ab6aff9742ac39056a1b9288418 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:26:57 +0100 Subject: [PATCH 059/117] Delete fuzzy.png --- apps/fuzzyw/fuzzy.png | Bin 173 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/fuzzyw/fuzzy.png diff --git a/apps/fuzzyw/fuzzy.png b/apps/fuzzyw/fuzzy.png deleted file mode 100644 index 125265aea211223268c701ba1d548552d26c7b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}LPZ!6K zjK;Uu9R(WQWAJqKb6Mw<&;$Taw>c~T From c474d0c5f812557ca61ca738c87f577301296924 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:27:09 +0100 Subject: [PATCH 060/117] Delete fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/fuzzyw/fuzzyw.icon.js diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js deleted file mode 100644 index 48750da61..000000000 --- a/apps/fuzzyw/fuzzyw.icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) From c536aee610158a719d5f54fe5fcec1e3a3397144 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:31:33 +0100 Subject: [PATCH 061/117] Rename fuzzyw-icon.js to fuzzyw.img.js --- apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw-icon.js => fuzzyw.img.js} (100%) diff --git a/apps/fuzzyw/fuzzyw-icon.js b/apps/fuzzyw/fuzzyw.img.js similarity index 100% rename from apps/fuzzyw/fuzzyw-icon.js rename to apps/fuzzyw/fuzzyw.img.js From 991fd8726ee5740e4b13d314f3bb6da98f10c46a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:34:30 +0100 Subject: [PATCH 062/117] Rename fuzzyw.img.js to fuzzyw.icon.js --- apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/fuzzyw/{fuzzyw.img.js => fuzzyw.icon.js} (100%) diff --git a/apps/fuzzyw/fuzzyw.img.js b/apps/fuzzyw/fuzzyw.icon.js similarity index 100% rename from apps/fuzzyw/fuzzyw.img.js rename to apps/fuzzyw/fuzzyw.icon.js From 2fc67c46cecf8cfb9d7db42a4e25ecd394f800bb Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:04 +0100 Subject: [PATCH 063/117] Update fuzzyw.icon.js --- apps/fuzzyw/fuzzyw.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.icon.js b/apps/fuzzyw/fuzzyw.icon.js index 48750da61..acc7e2fcf 100644 --- a/apps/fuzzyw/fuzzyw.icon.js +++ b/apps/fuzzyw/fuzzyw.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("AH4AthMkyVJARIR5AH4AKKw+ACPwA/AAj7jCMYA/ABT7jCMYA/AAj7jCMYA/AFI=")) +require("heatshrink").decompress(atob("mEwgP/ABX8oYFD+AFE8AFE8IXE8YFKwFCj08h4FBocenEHCIPDjk4CoIFBhlwAoeMuIFEuBSBAoOI+AFD4HxGoQFB+AFD4P4uYFC8P4gYFD/w7BAFEfApfEj+B/Ecg/Ah8A+EMg/Dw0YseHj/Dw/8sfHAoPH/lhDoIFBwFwj4FB40AvkPAoU8v4dCAoIdDw04FIMP4EOgFwh47Bj8EvEfw/DJwgFXABY")) From 52a237f3e8c8a7cf8549c6ac4c8a4dfbc5702257 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:22:19 +0100 Subject: [PATCH 064/117] Add files via upload --- apps/fuzzyw/fuzzyw.png | Bin 173 -> 893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.png b/apps/fuzzyw/fuzzyw.png index 125265aea211223268c701ba1d548552d26c7b77..afd0b0f7669ba9f467b95edff2023270b30e76bf 100644 GIT binary patch delta 871 zcmV-t1DO1+0sRJ$BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!e zW~dHgK~%(1s#pXIrLEAagUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7 zNufoI2gm(*ckglc4iM^PrkWiSfT~$WG8Ppx*;O&{3O|O?jejwOBxdUI)M6T*F%=a_C-#2dsjo0iUbpE$&dl0tk=JZ{hhi66NxyZpwv;IP0m zLq<9|PaGl^3vDd7F)JD>@icK*Q8mgJGA=8ew>YciDr?@8zc857R#IH2IfNLN5Jv(c zWK>Z?85Sb6YJa4dNYZ}P!$0Ww6XcS~RRSZ&0xD1;Iezdz_}#6UpPF=&f>EIJ#kN02 zfWR)$sM+@Sv28a_0RJ;^rM3K(Ixzc5dab2}kAS{y;NrTa$$P-%4lwYfONQh~ewso) z54@kzH)VnTTcBsn?X9_w(+40;T`k`L2Zz9DfwI><-hbWI-rK)tn*IF%mCbUs8u46L z00006VoOIv03rYe067`TGob(g010qNS#tmYE+YT{E+YYWr9XB6000McNliru<^vxI zEf{}eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C4-mcmVz@jM+PuJe`AS+vt0Dr{Of}M^hE*iMIR1L>Hz+qGhg#hq$ z!>fP>04iY3Q`p@bwP@lM3K0>@e~oQG)x-s$02F|@MSX;^%BzY(VJNgJ;<*T^Ezox> zw?21YhnfRc-HQ|J#i<0>BALCj%uDu{7_rF<%_ySHOf8u#S_JhhW_pIIJ*%A%Mtaj8 z-(VcjD!5kl+%50W$h9KV2s1NOO;_&kfvjuH^K%t?a{ToAr*%!csfE9i{?SSsBgN3d xb1n|-xMWEiW-Ag`Hd+7*K!SoMYlAMm20mqH+ zTi^2eD Date: Thu, 31 Mar 2022 12:48:13 +0100 Subject: [PATCH 065/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 8b1378917..6b2dadb1e 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1 +1,46 @@ +(function(back) { + const SETTINGS_FILE = "fuzzyw.json"; + + var align_options = ['Left','Centre','Right']; + var language_options = ['System', 'en_GB']; + // initialize with default settings... + let s = {'language': language_options[0], 'align': align_options[1]}; + + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + let settings = storage.readJSON(SETTINGS_FILE, 1) || s; + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + E.showMenu({ + '': { 'title': 'Fuzzy Clock' }, + '< Back': back, + 'Language': { + value: 0 | language_options.indexOf(s.theme), + min: 0, max: language_options.length - 1, + format: v => language_options[v], + onchange: v => { + s.theme = language_options[v]; + save(); + } + }, + 'Language': { + value: 0 | align_options.indexOf(s.theme), + min: 0, max: align_options.length - 1, + format: v => align_options[v], + onchange: v => { + s.theme = align_options[v]; + save(); + } + }, + }); +}) From c270f8d34da94f3db4640d5ef1be54786e6b74ce Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:50:36 +0100 Subject: [PATCH 066/117] Create fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 apps/fuzzyw/fuzzy_strings.json diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json new file mode 100644 index 000000000..21926d747 --- /dev/null +++ b/apps/fuzzyw/fuzzy_strings.json @@ -0,0 +1,25 @@ +{ + "en_GB":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five past *$1", + "ten past *$1", + "quarter past *$1", + "twenty past *$1", + "twenty five past *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + } +} From 924c68527fad3f0863897db80a049f7178bb079c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:51:43 +0100 Subject: [PATCH 067/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 6b2dadb1e..40505aecb 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -33,7 +33,7 @@ save(); } }, - 'Language': { + 'Alignment': { value: 0 | align_options.indexOf(s.theme), min: 0, max: align_options.length - 1, format: v => align_options[v], From dce327bf620759a20f3ec5d6e0b424c195659d78 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:52:55 +0100 Subject: [PATCH 068/117] Update metadata.json --- apps/fuzzyw/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index b1fa4c6d7..1f197c519 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -14,6 +14,7 @@ "storage": [ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true} + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzy_strings.json"} ] } From f76cb9a346639505baa690138dd8e99c603fde16 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:56:53 +0100 Subject: [PATCH 069/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 110 +++++++++++++++----------------------- 1 file changed, 42 insertions(+), 68 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 4057563d3..a8a5c02d5 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,78 +1,52 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = { - en_GB:{ - hours:[ - // AM hours - "midnight", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven", - // PM hours - "twelve", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine", "ten", "eleven" - ], - minutes:[ - "*$1 o'clock", - "five past *$1", - "ten past *$1", - "quarter past *$1", - "twenty past *$1", - "twenty five past *$1", - "half past *$1", - "twenty five to *$2", - "twenty to *$2", - "quarter to *$2", - "ten to *$2", - "five to *$2" - ], - text_scale:3.5, - }, - }; +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); - //const SETTINGS_FILE = "fuzzyw.settings.json"; - //let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB'}; +const SETTINGS_FILE = "fuzzyw.settings.json"; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; - //let fuzzy_string = fuzzy_strings[settings.language]; - let fuzzy_string = fuzzy_strings['en_GB']; +let fuzzy_string = fuzzy_strings[settings.language]; +//let fuzzy_string = fuzzy_strings['en_GB']; - const h = g.getHeight(); - const w = g.getWidth(); +const h = g.getHeight(); +const w = g.getWidth(); - function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); - let hour = date.getHours() + Math.floor(segment/12); - f_string = fuzzy_string.minutes[segment % 12]; - if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); - } else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); - } - return f_string; - } +function getTimeString(date) { +let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); +let hour = date.getHours() + Math.floor(segment/12); +f_string = fuzzy_string.minutes[segment % 12]; +if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); +} else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); +} +return f_string; +} - function draw() { - let time_string = getTimeString(new Date()).replace('*', ''); - // print(time_string); - g.setFont('Vector', (h-24*2)/fuzzy_string.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); - } +function draw() { +let time_string = getTimeString(new Date()).replace('*', ''); +// print(time_string); +g.setFont('Vector', (h-24*2)/fuzzy_string.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); +} - g.clear(); - draw(); - setInterval(draw, 10000); // refresh every 10s +g.clear(); +draw(); +setInterval(draw, 10000); // refresh every 10s - // Stop updates when LCD is off, restart when on - Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately - } - }); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ +if (secondInterval) clearInterval(secondInterval); +secondInterval = undefined; +if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately +} +}); - Bangle.setUI('clock'); - Bangle.loadWidgets(); - Bangle.drawWidgets(); +Bangle.setUI('clock'); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From cc0e5f14b1ccddd1bcdb05db419263f245588648 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 12:58:17 +0100 Subject: [PATCH 070/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index a8a5c02d5..988080ea1 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,6 +1,6 @@ // adapted from https://github.com/hallettj/Fuzzy-Text-International/ -const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json); +const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; From 61c5c04c133a6f44ed55193105f3977a40b3cd03 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:04:30 +0100 Subject: [PATCH 071/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 52 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 988080ea1..ba1db294f 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -1,36 +1,38 @@ - // adapted from https://github.com/hallettj/Fuzzy-Text-International/ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'en_GB', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; + +if (settings.language == 'System') { + settings.language = require('locale').name; +} let fuzzy_string = fuzzy_strings[settings.language]; -//let fuzzy_string = fuzzy_strings['en_GB']; const h = g.getHeight(); const w = g.getWidth(); function getTimeString(date) { -let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); -let hour = date.getHours() + Math.floor(segment/12); -f_string = fuzzy_string.minutes[segment % 12]; -if (f_string.includes('$1')) { - f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); -} else { - f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); -} -return f_string; + let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let hour = date.getHours() + Math.floor(segment/12); + f_string = fuzzy_string.minutes[segment % 12]; + if (f_string.includes('$1')) { + f_string = f_string.replace('$1', fuzzy_string.hours[(hour) % 24]); + } else { + f_string = f_string.replace('$2', fuzzy_string.hours[(hour + 1) % 24]); + } + return f_string; } function draw() { -let time_string = getTimeString(new Date()).replace('*', ''); -// print(time_string); -g.setFont('Vector', (h-24*2)/fuzzy_string.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); + let time_string = getTimeString(new Date()).replace('*', ''); + // print(time_string); + g.setFont('Vector', (h-24*2)/fuzzy_string.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); } g.clear(); @@ -39,12 +41,12 @@ setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ -if (secondInterval) clearInterval(secondInterval); -secondInterval = undefined; -if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately -} + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); + draw(); // draw immediately + } }); Bangle.setUI('clock'); From 23916389beb4ee3d4103f941b6e39c6f733a1f3f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:06:30 +0100 Subject: [PATCH 072/117] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 1f197c519..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -15,6 +15,6 @@ {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, - {"name":"fuzzy_strings.json"} + {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From ea6b4624e671f37775d7fb5b58394129a5a98d07 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:26:41 +0100 Subject: [PATCH 073/117] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 138 +++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 21926d747..6b4b71419 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -21,5 +21,143 @@ "five to *$2" ], "text_scale":3.5 + }, + "en_US":{ + "hours":[ + "midnight", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven", + "twelve", "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten", "eleven" + ], + "minutes":[ + "*$1 o'clock", + "five after *$1", + "ten after *$1", + "quarter after *$1", + "twenty after *$1", + "twenty five after *$1", + "half past *$1", + "twenty five to *$2", + "twenty to *$2", + "quarter to *$2", + "ten to *$2", + "five to *$2" + ], + "text_scale":3.5 + }, + "es_ES":{ + "hours":[ + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once", + "doce", "una", "dos", "tres", "cuatro", "cinco", + "seis", "siete", "ocho", "nueve", "diez", "once" + ], + "minutes":[ + "*$1 en punto", + "*$1 y cinco", + "*$1 y diez", + "*$1 y cuarto", + "*$1 y veinte", + "*$1 y veinti- cinco", + "*$1 y media", + "*$2 menos veinti- cinco", + "*$2 menos veinte", + "*$2 menos cuarto", + "*$2 menos diez", + "*$2 menos cinco" + ], + "text_scale":3.5 + }, + "fr_FR":{ + "hours":[ + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze", + "douze", "une", "deux", "trois", "quatre", "cinq", + "six", "sept", "huit", "neuf", "dix", "onze" + ], + "minutes":[ + "*$1 heures", + "*$1 heures cinq", + "*$1 heures dix", + "*$1 heures et quart", + "*$1 heures vingt", + "*$1 heures vingt- cinq", + "*$1 heures et demie", + "*$2 moins vingt- cinq", + "*$2 heures moins vingt", + "*$2 moins le quart", + "*$2 heures moins dix", + "*$2 heures moins cinq" + ], + "text_scale":3.5 + }, + "no_NO":{ + "hours":[ + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve", + "tolv", "ett", "to", "tre", "fire", "fem", + "seks", "sju", "åtte", "ni", "ti", "elleve" + ], + "minutes":[ + "klokka er *$1", + "fem over *$1", + "ti over *$1", + "kvart over *$1", + "ti på halv *$2", + "fem på halv *$2", + "halv *$2", + "fem over halv *$2", + "ti over halv *$2", + "kvart på *$2", + "ti på *$2", + "fem på *$2" + ], + "text_scale":3.5 + }, + "sv_SE":{ + "hours":[ + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva", + "tolv", "ett", "två", "tre", "fyra", "fem", + "sex", "sju", "åtta", "nio", "tio", "elva" + ], + "minutes":[ + "*$1", + "fem över *$1", + "tio över *$1", + "kvart över *$1", + "tjugo över *$1", + "fem i halv *$2", + "halv *$2", + "fem över halv *$2", + "tjugo i *$2", + "kvart i *$2", + "tio i *$2", + "fem i *$2" + ], + "text_scale":3.5 + }, + "de_DE":{ + "hours":[ + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf", + "zwölf", "eins", "zwei", "drei", "vier", "fünf", + "sechs", "sieben", "acht", "neun", "zehn", "elf" + ], + "minutes":[ + "*$1 uhr", + "fünf nach *$1", + "zehn nach *$1", + "viertel nach *$1", + "zwanzig nach *$1", + "fünf for halb *$2", + "halb *$2", + "fünf nach halb *$2", + "zwanzig vor *$2", + "viertel vor *$2", + "zehn vor *$2", + "fünf vor *$2" + ], + "text_scale":3.5 } } From 5242d8662b70656d495155ff5358702648f48af8 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Thu, 31 Mar 2022 13:28:05 +0100 Subject: [PATCH 074/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 40505aecb..cb0d1117c 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -2,7 +2,7 @@ const SETTINGS_FILE = "fuzzyw.json"; var align_options = ['Left','Centre','Right']; - var language_options = ['System', 'en_GB']; + var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... let s = {'language': language_options[0], 'align': align_options[1]}; From a11999648f539a8397c43dede991544e89565790 Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 1 Apr 2022 08:17:59 +0200 Subject: [PATCH 075/117] Minor changes --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/app.png | Bin 2103 -> 1795 bytes apps/bwclk/screenshot.png | Bin 2693 -> 2575 bytes apps/bwclk/screenshot_2.png | Bin 3113 -> 2892 bytes 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a84b133d7..a90e091fd 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/AD3vAonB4IFDnOLAod974FD/OfAYP9u/5wP1r/71/zzHt3/9q/H/n9r/63/P/nt7/9+8VzoLB/e/gOB8c/EoNV65RNRrGH8Eqh0AgPFsE/jsAgfAsEgjARBoFAuEQAoPA40umwFBoPEu4XBgHBwEjnGABYImBiHAgHDgUh2AFBocGusVAoPCgE+h4XBAAMUgpUO80zCwdFqILD9MxAocBBYkppQFDotQRrAAGA")) +require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 5da262d03..272f78ca8 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -126,28 +126,30 @@ function draw() { g.fillRect(0,y,W,H); // Draw date + y -= settings.fullscreen ? 5 : 0; var date = new Date(); g.setColor("#000"); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - g.drawString(dateStr, W/2, y+5); + dateStr = ("0"+dateStr).substr(-2); + g.drawString(dateStr, W/2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - var monthStr = locale.month(date, 1); - g.drawString(monthStr, W/2 + 5, y+2); g.drawString(locale.dow(date, true), W/2 + 5, y-22); + g.drawString(locale.month(date, 1), W/2 + 5, y); // Draw time g.setColor("#fff"); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); - g.drawString(timeStr, W/2, y+10); + y += settings.fullscreen ? 20 : 10; + g.drawString(timeStr, W/2, y); // Draw steps or timer - y += H/5*2+10; + y += H/5*2; g.setSmallFont(); g.setFontAlign(0,0); var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index cbe7fa8978429136351c0f09dd6becfea57b8b01..c7c42effa88b07093d74b0322dc1446e2b148818 100644 GIT binary patch delta 1764 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 FV1oB43H<;7 diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a3c17c868b9710cf95b1518d9122efc3485a798..51f632ed36cd05f851968b66b1ec80d71e93c184 100644 GIT binary patch literal 2575 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 diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index 5ce483d7d5aebdf0a65b89c889db121d9f323970..71259932db68015eef9c2c477e43b15b0951229c 100644 GIT binary patch delta 2872 zcmaJ@c{G%b_kW(ph?yjmi5eRFmL-y1V;M_iDO=W2h{#exmY!#dH=-mhWPL4($dW9D zMoF@dG#JHL^J16?L+CsI|IYc{f9^f^p3lAK+;czo-cpfn?1SU*9!parhbT{G&S=DR zIe&cm20XXjHS&vI%Tqo8K3II#6=0b-aOd#F`qiCPj(mb0@?SvXs0RO;jP*(grLDs| zK0aQm?!K82XR{NWN9J(hTfN75)#?TCIN|Ox;8>1fzH7alU{j)rqgBw;eGF>Fv>r0C zvp91sbfi!I6V+S{u zr_O_46;t{XZa!KcN&z= z5MrQ7k`iejEW-4UOOI2B-+@c_LOgH}TSg3R-y|gJmesV2Zss5sd4b8vDj7=o%?8WY zgP`&XGbBzLk4=m*%!5O`7T=2*6mVIs+*=WO??3&w(RDTbYA5T)GyWiO$%bI1Um8eM zsgjDUN4ZGQBsoD?;2EIQ=IV1A5jH+RN^nWG zMpqg8L*)X2X$qhd?-@k+g0i{{1@mtq=)`yCD;Yw$klQgx8qf8E3a7?6IZx{!A^qnq zNi3^8E*j~#ze>}%LLx@Ba>7&4Q>i(3m!RBUq4?s$L;+*00vqjvKII>3wr5&J$r_?ZV5rSI`LR?0VRtX zw~Wp33)@*09^Ov#o*wFV>KGx%1$`J3Pn7Xmh$wQ7{T;g&JZaI=p(UuNmNFD;Vr5S) z*U!0X##7h*Sd9IeUb;>>TVi6w9Jw*k1BEWT#fuG_v`c$gMIJ5|0+)l3V%#!}CxR_{ zzX%tt73+0^I{9%UNiu3DI*GZ){$wLioVhA>f8m5{Ma`LgRfnc6q6+n@u#5$Ehnt4x zxW$uLC!^>XiR}X(GfA(F>x3PjUj+T8Z_i2QJabvebh)e@p2W}B_dM}mVJwPq5p=85 zrDaE0*&vb5c+z$mi`#l98Gy}SH0bOB$J_z_<#Pz|=Xc?TABTXmP-s*hgc>e6+N`BS zK(r1aAO9ST(xiM&_KIDhW?>f3G1!4osHnVM+(;<^Mqn&9nmIgf-ntfE!htE^e{3ic zkd661Y7Rz#RDy($zXZUsm#54lIqn>2Ada)TqbhfCKj8m^P6gRp7j2mP#d359;?f~s zkhZ&}E!96aUQQV9pC`BJ2dU4~WwY}CHoku z;6@X~$l-o6Hg)8i4jdDf%fD>z3^g(G$5uMeDaWEjm?Ozdzlay(!c71}?~CN@A;F7b z=Rf|VG)mTFF~4(JJ-&;mO8)cc60HxdHcY-`BqXRMY34*IZW`cPG$1CMPZ5R$=6`@*BaltSt zkml~@5}vxQz!fUp<{C9VNOq$f(qP zY~=0p76qQpQCba84X1m0AdOJcNseU$0Z_b)4e0H7WKiUlnT~p7mSV=S!&HJE3xB_W9&=G$ZqK z!q_Jw0=L6mX75BKlZ}wL%TE?5PK=t?ht*TQgLC|0P}626BZ%VDWj^1>IrOlaF;Xm3 z$kunYw$)Ev{_&`AGP)NT-7Z+Me>CFjTEle|)}SrjZY~jcjaj(2ux8G9Gsi4AJ7JBq zeiA@qpnY!%&3mtfAFAvT>>;*#WCUDBmR}8MdPo#>oCkZ0>_r~mB@}~Z_}n z>_3<8i+gcj`fB}^>)3UXRQ1DbNy5U+VPR*8T9$4mwICvX3R<*RrD$nTMkaQ4_Pk=j zg}tI4+E!r&zi zZ^Y13rCJo-czd|}ztvsvE+7#IugYz|@Z%ia+e<3}@Rip`=RO2@|8{##&K6l1Vtv!V zQz}*9oi7I%Tbi+Je7vleU0(1C3U0W$&&z-d+MZt-%G3XUaYp-;Poapp+gniwt2UJ^ z#mBcq=$8nH9$i9hP29+Io3~1gmMaIgyeJ^EFxBlFB6VvU>~=|erNdzGd_q$$y1LOM ze{D$LB6#g(LZP7>qz|z9VHG87?5X8jR4Mze+ko7j3|41y5}-;q_V*s7cNO1!&JAK! zCYMxd{g~cp)s|u2P=HZFAUujPkQ6f|JgYRb&*KTp*WU|5z2xDHFl1Rve9IKZ&{NfCN5bk#yj)%8yz zlb1eGGb+eHM^2Xi5F%%=R%~#C4*Gr4{_j-j_t2`UllZ6r2Xio3Vt(*$W(4Q|X)CCO zPz~Xm8T#OHS*~JXJf*nn^E6sbRK5ZLRXhx3ZILg80PbBbFa8HfiGexi0ghM_ZA@Po HlWzSF79U+A delta 3095 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 Date: Sat, 2 Apr 2022 12:22:16 +0200 Subject: [PATCH 076/117] bwclk, lcars, notanalog and smpltmr uses now the new alarm library. --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 52 +++++++++------ apps/lcars/ChangeLog | 2 +- apps/lcars/README.md | 3 +- apps/lcars/lcars.app.js | 62 ++++++++++++------ apps/lcars/metadata.json | 2 +- apps/notanalog/ChangeLog | 2 +- apps/notanalog/README.md | 2 +- apps/notanalog/notanalog.app.js | 56 +++++++++++++---- apps/qalarm/ChangeLog | 1 - apps/qalarm/lib.js | 108 -------------------------------- apps/qalarm/metadata.json | 3 +- apps/qalarm/qalarmcheck.js | 1 + apps/smpltmr/app.js | 40 ++++++++++-- apps/smpltmr/metadata.json | 4 +- 15 files changed, 164 insertions(+), 176 deletions(-) delete mode 100644 apps/qalarm/lib.js diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 85f01c8fe..83e4e97dd 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -8,7 +8,7 @@ In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "qalarm" app, you can directly set a timer. Simply tab at +If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. ## Thanks to diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 272f78ca8..967231648 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,3 +1,4 @@ +const TIMER_IDX = "bwclk"; const SETTINGS_FILE = "bwclk.setting.json"; const locale = require('locale'); const storage = require('Storage'); @@ -75,41 +76,56 @@ function getSteps() { return 0; } - function isAlarmEnabled(){ try{ - var qalarm = require('qalarm'); - return qalarm.isTimerStarted("bwclk"); + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + } catch(ex){ } return false; } - function getAlarmMinutes(){ - try{ - var qalarm = require('qalarm'); - return qalarm.getTimerMin("bwclk"); - } catch(ex){ } - return -1; + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")+5; - qalarm.deleteTimer("bwclk"); - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); } catch(ex){ } } function decreaseAlarm(){ try{ - var qalarm = require('qalarm'); - var mins = qalarm.getTimerMin("bwclk")-5; - qalarm.deleteTimer("bwclk"); - if(mins > 0){ - qalarm.editTimer("bwclk", 0, mins, 0); + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); } + + alarm.reload(); } catch(ex){ } } diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index dec0a4aa2..4935fe714 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,5 +16,5 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Use qalarm for alarm functionality instead of own implementation. 0.19: Alarms can not go bigger than 100. +0.20: Use alarm for alarm functionality instead of own implementation. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index cf360d647..f506f96c4 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -3,7 +3,8 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected -with Gadgetbride and the weather app must be installed. +with Gadgetbride and the weather app must be installed. To use the timer +the "alarm" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 357070fdc..353cc62dd 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,7 +1,7 @@ +const TIMER_IDX = "lcars"; const SETTINGS_FILE = "lcars.setting.json"; const locale = require('locale'); const storage = require('Storage'); -const qalarm = require('qalarm'); let settings = { alarm: -1, dataRow1: "Steps", @@ -566,25 +566,56 @@ function getWeather(){ * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("lcars"); + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; } function getAlarmMinutes(){ - return qalarm.getTimerMin("lcars"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")+5; - qalarm.deleteTimer("lcars"); - qalarm.editTimer("lcars", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("lcars")-5; - qalarm.deleteTimer("lcars"); - if(mins > 0){ - qalarm.editTimer("lcars", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } @@ -612,15 +643,6 @@ Bangle.on('charging',function(charging) { }); -function increaseAlarm(){ - if(isAlarmEnabled() && getAlarmMinutes() < 95){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } -} - - function feedback(){ Bangle.buzz(40, 0.3); } diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index b5d8e0a52..2fb17b550 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,7 +3,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.19", + "version":"0.20", "readme": "README.md", "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog index 3d6f1fce8..6515f787c 100644 --- a/apps/notanalog/ChangeLog +++ b/apps/notanalog/ChangeLog @@ -1,4 +1,4 @@ 0.01: Launch app. 0.02: 12k steps are 360 degrees - improves readability of steps. 0.03: Battery improvements through sleep (no minute updates) and partial updates of drawing. -0.04: Use qalarm for timer instead of own alarm implementation. \ No newline at end of file +0.04: Use alarm for timer instead of own alarm implementation. \ No newline at end of file diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index 3a0963090..f4cf19ed6 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.) - depends on widtmr. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index fcd49af25..b7c81837d 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -1,11 +1,10 @@ /** * NOT ANALOG CLOCK */ - +const TIMER_IDX = "notanalog"; const locale = require('locale'); const storage = require('Storage') const SETTINGS_FILE = "notanalog.setting.json"; -const qalarm = require('qalarm'); let settings = { alarm: -1, }; @@ -394,25 +393,56 @@ function queueDraw() { * Handle alarm */ function isAlarmEnabled(){ - return qalarm.isTimerStarted("notanalog"); -} + try{ + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; + + } catch(ex){ } + return false; + } function getAlarmMinutes(){ - return qalarm.getTimerMin("notanalog"); + if(!isAlarmEnabled()){ + return -1; + } + + var alarm = require('alarm'); + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } function increaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")+5; - qalarm.deleteTimer("notanalog"); - qalarm.editTimer("notanalog", 0, mins, 0); + try{ + var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, { + timer : (minutes+5)*60*1000, + }); + alarm.reload(); + } catch(ex){ } } function decreaseAlarm(){ - var mins = qalarm.getTimerMin("notanalog")-5; - qalarm.deleteTimer("notanalog"); - if(mins > 0){ - qalarm.editTimer("notanalog", 0, mins, 0); - } + try{ + var minutes = getAlarmMinutes(); + minutes -= 5; + + var alarm = require('alarm') + alarm.setAlarm(TIMER_IDX, undefined); + + if(minutes > 0){ + alarm.setAlarm(TIMER_IDX, { + timer : minutes*60*1000, + }); + } + + alarm.reload(); + } catch(ex){ } } function feedback(){ diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index 424571439..b9be6039d 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -4,4 +4,3 @@ Fix app icon Change menu order so 'back' is at the top 0.04: Fix alarm not activating sometimes. -0.05: Include library that can be used by other apps. \ No newline at end of file diff --git a/apps/qalarm/lib.js b/apps/qalarm/lib.js deleted file mode 100644 index 6d186d190..000000000 --- a/apps/qalarm/lib.js +++ /dev/null @@ -1,108 +0,0 @@ -let alarms = require("Storage").readJSON("qalarm.json", 1) || []; - -/** - * LIBRARY - */ - -function getCurrentTime() { - let time = new Date(); - return ( - time.getHours() * 3600000 + - time.getMinutes() * 60000 + - time.getSeconds() * 1000 - ); -} - -function getAlarmIndex(idx){ - for(var i=0; i= 0 && alarmIndex < alarms.length; - return exists; -} - -function isAlarmStarted(idx){ - if(!alarmExists(idx)){ - return false; - } - - var alarmIndex = getAlarmIndex(idx); - var time = new Date(); - var t = getCurrentTime(); - a = alarms[alarmIndex]; - return a.on && - t <= a.t && - a.last != time.getDate() && - (a.timer || a.daysOfWeek[time.getDay()]); -} - -function getTimerMin(idx){ - if(!isAlarmStarted(idx)){ - return 0; - } - - var alarmIndex = getAlarmIndex(idx); - var a = alarms[alarmIndex] ; - var diff = a.t - getCurrentTime(); - // let hrs = Math.floor(t / 3600000); - var mins = Math.round((diff / 60000) % 60); - // return hrs + ":" + ("0" + mins).substr(-2); - return mins; -} - -function reloadQalarm(){ - require("Storage").write("qalarm.json", JSON.stringify(alarms)); - eval(require("Storage").read("qalarmcheck.js")); - if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload(); -} - -function editTimer(idx, hrs, mins, secs){ - var alarmIndex = getAlarmIndex(idx); - var a = { - idx: idx, - on: true, - rp: false, - as: false, - hard: false, - }; - a.timer = hrs * 3600 + mins * 60 + secs; - a.t = (getCurrentTime() + a.timer * 1000) % 86400000; - - if(alarmExists(idx)){ - alarms[alarmIndex] = a; - } else { - alarms.push(a) - alarmIndex = alarms.length-1; - } - - reloadQalarm(); -} - -function deleteAlarm(idx){ - var alarmIndex = getAlarmIndex(idx); - if(!alarmExists(idx)){ - return; - } - - alarms.splice(alarmIndex, 1); - reloadQalarm(); -} - - -// Export functions -exports.alarmExists = alarmExists; -exports.isAlarmStarted = isAlarmStarted; -exports.deleteAlarm = deleteAlarm; - -exports.timerExists = alarmExists; -exports.isTimerStarted = isAlarmStarted; -exports.getTimerMin = getTimerMin; -exports.editTimer = editTimer; -exports.deleteTimer = deleteAlarm; diff --git a/apps/qalarm/metadata.json b/apps/qalarm/metadata.json index 1ab4f4192..326ba33a7 100644 --- a/apps/qalarm/metadata.json +++ b/apps/qalarm/metadata.json @@ -3,12 +3,11 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.05", + "version": "0.04", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ - { "name": "qalarm", "url": "lib.js" }, { "name": "qalarm.app.js", "url": "app.js" }, { "name": "qalarm.boot.js", "url": "boot.js" }, { "name": "qalarm.js", "url": "qalarm.js" }, diff --git a/apps/qalarm/qalarmcheck.js b/apps/qalarm/qalarmcheck.js index 4976afb6f..8dac43800 100644 --- a/apps/qalarm/qalarmcheck.js +++ b/apps/qalarm/qalarmcheck.js @@ -2,6 +2,7 @@ * This file checks for upcoming alarms and schedules qalarm.js to deal with them and itself to continue doing these checks. */ +print("Checking for alarms..."); if (Bangle.QALARM) { clearInterval(Bangle.QALARM); diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index 754fbae5b..f7717a2fc 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const qalarm = require('qalarm'); +const alarm = require("alarm"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); @@ -19,6 +19,33 @@ var minutes = 5; var interval; //used for the 1 second interval timer +function isTimerEnabled(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + if(alarmObj===undefined || !alarmObj.on){ + return false; + } + + return true; +} + +function getTimerMin(){ + var alarmObj = alarm.getAlarm(TIMER_IDX); + return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); +} + +function setTimer(minutes){ + alarm.setAlarm(TIMER_IDX, { + // msg : "Simple Timer", + timer : minutes*60*1000, + }); + alarm.reload(); +} + +function deleteTimer(){ + alarm.setAlarm(TIMER_IDX, undefined); + alarm.reload(); +} + setWatch(_=>load(), BTN1); function draw(){ g.clear(1); @@ -32,10 +59,11 @@ function draw(){ // Write time g.setFontAlign(0, 0, 0); g.setFont("Vector", 32).setFontAlign(0,-1); - var started = qalarm.isTimerStarted(TIMER_IDX); + + var started = isTimerEnabled(); var text = minutes + " min."; if(started){ - var min = qalarm.getTimerMin(TIMER_IDX); + var min = getTimerMin(); text = min + " min."; } @@ -65,7 +93,7 @@ Bangle.on('touch', function(btn, e){ var isUpper = e.y < upper; var isLower = e.y > lower; var isMiddle = !isLeft && !isRight && !isUpper && !isLower; - var started = qalarm.isTimerStarted(TIMER_IDX); + var started = isTimerEnabled(); if(isRight && !started){ minutes += 1; @@ -81,9 +109,9 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.3); } else if(isMiddle) { if(!started){ - qalarm.editTimer(TIMER_IDX, 0, minutes, 0); + setTimer(minutes); } else { - qalarm.deleteTimer(TIMER_IDX); + deleteTimer(); } Bangle.buzz(80, 0.6); } diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 4f0d473b4..feb841819 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -3,10 +3,10 @@ "name": "Simple Timer", "shortName": "Simple Timer", "version": "0.01", - "description": "A simple app to set a timer.", + "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"qalarm":"app"}, + "dependencies": {"alarm":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 280d5d1a8892e137067242a0bd42455a5b211bd2 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 12:24:41 +0200 Subject: [PATCH 077/117] Removed dependency to qalarm --- apps/lcars/metadata.json | 1 - apps/notanalog/metadata.json | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 2fb17b550..7155442f8 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -5,7 +5,6 @@ "icon": "lcars.png", "version":"0.20", "readme": "README.md", - "dependencies": {"qalarm":"app"}, "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json index 25cfa706d..0a291b180 100644 --- a/apps/notanalog/metadata.json +++ b/apps/notanalog/metadata.json @@ -7,7 +7,6 @@ "readme": "README.md", "supports": ["BANGLEJS2"], "description": "An analog watch face for people that can not read analog watch faces.", - "dependencies": {"qalarm":"app"}, "type": "clock", "tags": "clock", "screenshots": [ From 5781d4a7166bab112b3eafbaf4525f5055283908 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 14:43:27 +0200 Subject: [PATCH 078/117] Minor design improvements --- apps/bwclk/app.js | 8 ++++---- apps/bwclk/screenshot.png | Bin 2575 -> 2889 bytes apps/bwclk/screenshot_2.png | Bin 2892 -> 3152 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 967231648..7437293ae 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -148,13 +148,13 @@ function draw() { g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); - dateStr = ("0"+dateStr).substr(-2); - g.drawString(dateStr, W/2, y+3); + dateStr = ("0" + dateStr).substr(-2); + g.drawString(dateStr, W/2-2, y+3); g.setSmallFont(); g.setFontAlign(-1,1); - g.drawString(locale.dow(date, true), W/2 + 5, y-22); - g.drawString(locale.month(date, 1), W/2 + 5, y); + g.drawString(locale.dow(date, true), W/2 + 10, y-23); + g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time g.setColor("#fff"); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 51f632ed36cd05f851968b66b1ec80d71e93c184..5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae 100644 GIT binary patch literal 2889 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 S@%}mqI11Xr-n_vSOZX44)xbyq delta 2873 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 KZ~5GUa`k^eCtXwk From 79db8ba05d22c06746c1e1f0175e698c0fea77bd Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 15:59:44 +0200 Subject: [PATCH 079/117] V0.03 - Use theme of bangle. --- apps/bwclk/ChangeLog | 5 +++-- apps/bwclk/README.md | 14 +++++++++++--- apps/bwclk/app.js | 12 +++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_3.png | Bin 0 -> 3005 bytes 5 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 apps/bwclk/screenshot_3.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index 1e1f155bb..ce0443d4b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,2 +1,3 @@ -0.01: New App! -0.02: Use build in function for steps and other improvements. \ No newline at end of file +0.01: New App. +0.02: Use build in function for steps and other improvements. +0.03: Adapt colors based on the theme of the user. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 83e4e97dd..62df9a2d9 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,15 +2,23 @@ ![](screenshot.png) - +## Fullscreen mode In the settings, fullscreen mode can be enabled and disabled: ![](screenshot_2.png) -Additionally, in fullscreen mode a lock icon can be shown... -If you installed the "alarm" app, you can directly set a timer. Simply tab at + +## Custom theme +If you switch the light/dark theme on your bangle, the design changes accordingly: + +![](screenshot_3.png) + +## Other features +- Lock icon: Show lock icon in fullscreen mode +- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at top / bottom of the screen. + ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7437293ae..91eddc468 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -138,13 +138,13 @@ function draw() { var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; g.reset().clearRect(0,0,W,W); - g.setColor("#000"); + g.setColor(g.theme.fg); g.fillRect(0,y,W,H); // Draw date y -= settings.fullscreen ? 5 : 0; var date = new Date(); - g.setColor("#000"); + g.setColor(g.theme.fg); g.setFontAlign(1,1); g.setLargeFont(); var dateStr = date.getDate(); @@ -157,7 +157,7 @@ function draw() { g.drawString(locale.month(date, 1), W/2 + 10, y+1); // Draw time - g.setColor("#fff"); + g.setColor(g.theme.bg); g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); @@ -174,7 +174,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor("#000"); + g.setColor(g.theme.bg); g.drawImage(imgLock, 2, 2); } @@ -189,7 +189,9 @@ function draw() { Bangle.loadWidgets(); // Clear the screen once, at startup -g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); +var bgOrig = g.theme.bg +var fgOrig = g.theme.fg +g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); // draw immediately at first, queue update draw(); diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 3fe04c4d5..366622eeb 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.02", + "version": "0.03", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_3.png b/apps/bwclk/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfb5efe87cbeb9cc01bff74ac63ec7794b98e45 GIT binary patch literal 3005 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 literal 0 HcmV?d00001 From 240a14c715138eb5723957d73696bcc424ee8542 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:19:47 +0200 Subject: [PATCH 080/117] Hide steps --- apps/bwclk/ChangeLog | 3 ++- apps/bwclk/README.md | 6 ++++++ apps/bwclk/app.js | 31 ++++++++++++++++++++++++------- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_4.png | Bin 0 -> 2958 bytes apps/bwclk/settings.js | 25 +++++++++++++++++-------- 6 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ce0443d4b..ba8fd775b 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. -0.03: Adapt colors based on the theme of the user. \ No newline at end of file +0.03: Adapt colors based on the theme of the user. +0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 62df9a2d9..d2ad03c09 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -13,6 +13,12 @@ If you switch the light/dark theme on your bangle, the design changes accordingl ![](screenshot_3.png) +## Show / Hide steps +Optionally, you can hide the steps in the settings. + +![](screenshot_4.png) + + ## Other features - Lock icon: Show lock icon in fullscreen mode - Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 91eddc468..22dbdcf24 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,6 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, + showSteps: true, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -24,11 +25,19 @@ for (const key in saved_settings) { // Manrope font Graphics.prototype.setLargeFont = function(scale) { + // Actual height 49 (50 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAfwAAAAAAAAf/AAAAAAAAf/8AAAAAAAf//wAAAAAAP///AAAAAAP///8AAAAAP////wAAAAP////4AAAAP////8AAAAH////8AAAAH////8AAAAB////8AAAAAH///+AAAAAAf//+AAAAAAB//+AAAAAAAH/+AAAAAAAAf+AAAAAAAAB/AAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///gAAAAAD////4AAAAA/////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAA///////4AAD/4AAAH/wAAP+AAAAP/AAB/wAAAAf8AAH/AAAAA/4AAf4AAAAB/gAB/gAAAAH+AAP8AAAAAf4AA/wAAAAB/gAD/AAAAAH+AAP8AAAAAf4AAf4AAAAB/gAB/gAAAAH+AAH+AAAAA/4AAf8AAAAH/AAB/4AAAA/8AAD/4AAAH/wAAP/8AAH/+AAAf//////4AAA///////AAAB//////4AAAD//////AAAAH/////4AAAAP////+AAAAAP////gAAAAAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAB/wAAAAAAAAH/AAAAAAAAA/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAD/gAAAAAAAAP+AAAAAAAAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAf///////AAB///////8AAH///////wAAP///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAfwAAAH8AAAD/AAAB/wAAAf8AAAP/AAAD/wAAB/8AAAf/AAAP/wAAD/8AAB//AAAf/wAAH/8AAD//AAA//gAAf/8AAD/wAAB//wAAf+AAAP//AAB/wAAB//8AAH+AAAP//wAAf4AAB///AAD/AAAP/v8AAP8AAB/8/wAA/wAAP/j/AAD/AAB/8P8AAH+AAH/g/wAAf4AA/8D/AAB/wAH/gP8AAH/AA/+A/wAAf/AP/wD/AAA//D/+AP8AAD////wA/wAAH///+AD/AAAP///wAP8AAAf//+AA/wAAA///wAD/AAAB//+AAP8AAAB//gAA/wAAAB/4AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAD+AAAAHwAAAf4AAAAfwAAB/gAAAB/gAAH+AAAAP/AAAf4AAAA/8AAB/gAAAD/4AAH+ADAAH/wAAf4AeAAP/AAB/gD+AAP8AAH+Af+AA/4AAf4D/4AB/gAB/gP/AAH+AAH+B/8AAf4AAf4P/wAB/gAB/h//AAH+AAH+P/8AAf4AAf5//wAB/gAB/v//gAP+AAH+//+AA/4AAf//f8AH/AAB//5/8B/8AAH//D////gAAf/4P///+AAB//Af///wAAH/4A///+AAAf/AB///wAAB/4AD//+AAAH/AAH//gAAAP4AAD/4AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAA/+AAAAAAAAP/4AAAAAAAH//gAAAAAAB//+AAAAAAAf//4AAAAAAH///gAAAAAB///+AAAAAAf///4AAAAAH//9/gAAAAD///H+AAAAA///wf4AAAAP//8B/gAAAD///AH+AAAA///wAf4AAAH//8AB/gAAAf//AAH+AAAB//gAAf4AAAH/4AAB/gAAAf+AAAH+AAAB/gAf///8AAH4AB////wAAeAAH////AABgAAf///8AAAAAB////wAAAAAH////AAAAAAf///8AAAAAB////wAAAAAH////AAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAeAAAAAf//AB+AAAH///+AP8AAAf///4A/4AAB////gD/wAAH////Af/gAAf///8B/+AAB////wB/8AAH///+AB/wAAf4Af4AD/gAB/gB/AAP+AAH+AP8AAf4AAf4A/wAB/gAB/gD+AAH+AAH+AP4AAf4AAf4A/gAB/gAB/gD/AAH+AAH+AP8AAf4AAf4A/wAD/gAB/gD/gAf8AAH+AH/AD/wAAf4Af/Af+AAB/gB////4AAH+AD////AAAf4AH///8AAB/gAP///gAAH+AA///8AAAAAAA///AAAAAAAB//4AAAAAAAB/+AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///gAAAAAB////4AAAAAf////4AAAAH/////4AAAA//////wAAAH//////gAAA///////AAAH//////+AAAf//////4AAD/4D/wH/wAAP+AP8AP/AAB/wB/gAf8AAH/AH8AA/4AAf4A/wAB/gAB/gD/AAH+AAH8AP4AAf4AA/wA/gAB/gAD/AD+AAH+AAH8AP8AAf4AAf4A/wAB/gAB/gD/AAP+AAH+AP+AB/wAAf8Af8AP/AAA/4B/8B/8AAD/gH////gAAP8AP///8AAAfgAf///wAAA8AB///+AAADgAD///wAAAAAAD//+AAAAAAAH//gAAAAAAAH/4AAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAH+AAAAAAAAAf4AAAAAAAAB/gAAAAAAAAH+AAAAAAAAAf4AAAAADgAB/gAAAAA+AAH+AAAAAf4AAf4AAAAH/gAB/gAAAD/+AAH+AAAA//4AAf4AAAf//gAB/gAAH//+AAH+AAD///wAAf4AA///8AAB/gAf//+AAAH+AH///gAAAf4D///wAAAB/g///8AAAAH+f//+AAAAAf////gAAAAB////wAAAAAH///8AAAAAAf//+AAAAAAB///gAAAAAAH//wAAAAAAAf/8AAAAAAAB/+AAAAAAAAH/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAB/wB//wAAAAf/wf//gAAAD//z///AAAAf/////+AAAD//////8AAAf//////4AAD///////gAAP////w//AAB/+f/8Af8AAH/Af/gA/4AAf4A/8AD/gAB/gB/wAH+AAP8AH+AAf4AA/wAf4AB/gAD/AB/gAH+AAP8AH+AAf4AA/wAf4AB/gAB/gB/wAH+AAH+AP/AAf4AAf8A/+AD/gAB/8f/8Af8AAD////4H/wAAP//////+AAAf//////4AAA///////AAAD//////8AAAH//z///gAAAH/+H//4AAAAH/gH//AAAAAAAAH/wAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAP/wAAAAAAAD//wAAAAAAAf//wAAAAAAH///gABgAAA////AAPAAAD///+AB+AAAf///4AP4AAD////wB/wAAP/AP/AH/AAB/4Af+AP+AAH/AA/4A/4AAf4AB/gB/gAB/gAH+AH+AAP8AAP4Af4AA/wAA/gB/gAD/AAD+AH+AAP8AAP4Af4AA/4AB/gB/gAB/gAH+AH+AAH+AAfwA/4AAf8AD/AH/AAB/4Af4A/8AAD/4H/gP/wAAP//////+AAAf//////wAAA///////AAAB//////4AAAD//////AAAAH/////wAAAAH////+AAAAAH////AAAAAAAf/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAH+AD/AAAAAAf4AP8AAAAAB/gA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ExwqHCYlJyYoIicoFg=="), 64+(scale<<8)+(1<<16)); + return this; +}; + + +Graphics.prototype.setMediumFont = function(scale) { // Actual height 41 (42 - 2) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); return this; }; + Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -146,7 +155,7 @@ function draw() { var date = new Date(); g.setColor(g.theme.fg); g.setFontAlign(1,1); - g.setLargeFont(); + g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); g.drawString(dateStr, W/2-2, y+3); @@ -158,23 +167,31 @@ function draw() { // Draw time g.setColor(g.theme.bg); - g.setLargeFont(); g.setFontAlign(0,-1); var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; + + if(!isAlarmEnabled() && !settings.showSteps){ + y += 8; + g.setLargeFont(); + } else { + g.setMediumFont(); + } + g.drawString(timeStr, W/2, y); // Draw steps or timer y += H/5*2; - g.setSmallFont(); g.setFontAlign(0,0); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); - + if(isAlarmEnabled() || settings.showSteps){ + g.setSmallFont(); + var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; + g.drawString(str, W/2, y); + } // Draw lock if(settings.showLock && Bangle.isLocked()){ - g.setColor(g.theme.bg); + g.setColor(g.theme.fg); g.drawImage(imgLock, 2, 2); } diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 366622eeb..9c81bd5cc 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.03", + "version": "0.04", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..db36a2088c06f3665d1b512ac14d1d9c8a884562 GIT binary patch literal 2958 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 N (settings.fullscreen ? 'Yes' : 'No'), + onchange: () => { + settings.fullscreen = !settings.fullscreen; + save(); + }, + }, + 'Show Steps': { + value: settings.showSteps, + format: () => (settings.showSteps ? 'Yes' : 'No'), + onchange: () => { + settings.showSteps = !settings.showSteps; + save(); + }, + }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), @@ -27,14 +44,6 @@ settings.showLock = !settings.showLock; save(); }, - }, - 'Full Screen': { - value: settings.fullscreen, - format: () => (settings.fullscreen ? 'Yes' : 'No'), - onchange: () => { - settings.fullscreen = !settings.fullscreen; - save(); - }, } }); }) From 893e45805ed731b7f639c63bfcffe2295e574511 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:54:16 +0200 Subject: [PATCH 081/117] Circle through information --- apps/bwclk/README.md | 28 +++---------- apps/bwclk/app.js | 78 +++++++++++++++++++++++++++++++----- apps/bwclk/screenshot.png | Bin 2889 -> 2958 bytes apps/bwclk/screenshot_3.png | Bin 3005 -> 0 bytes apps/bwclk/screenshot_4.png | Bin 2958 -> 0 bytes apps/bwclk/settings.js | 9 ----- 6 files changed, 73 insertions(+), 42 deletions(-) delete mode 100644 apps/bwclk/screenshot_3.png delete mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index d2ad03c09..31cc60270 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -2,28 +2,12 @@ ![](screenshot.png) -## Fullscreen mode -In the settings, fullscreen mode can be enabled and disabled: - -![](screenshot_2.png) - - -## Custom theme -If you switch the light/dark theme on your bangle, the design changes accordingly: - -![](screenshot_3.png) - -## Show / Hide steps -Optionally, you can hide the steps in the settings. - -![](screenshot_4.png) - - -## Other features -- Lock icon: Show lock icon in fullscreen mode -- Timer: If you installed the "alarm" app, you can directly set a timer. Simply tab at -top / bottom of the screen. - +## Features +- Fullscreen on/off +- The design is adapted to the theme of your bangle. +- Tab in middle of screen to show between different information. +- Enable / disable lock icon in the settings. +- If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Lock icons created by Those Icons - Flaticon diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 22dbdcf24..2714a6492 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -10,7 +10,7 @@ const storage = require('Storage'); let settings = { fullscreen: false, showLock: true, - showSteps: true, + showInfo: 0, }; let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; @@ -85,6 +85,40 @@ function getSteps() { return 0; } + +function getWeather(){ + var weatherJson; + + try { + weatherJson = storage.readJSON('weather.json'); + var weather = weatherJson.weather; + + // Temperature + weather.temp = locale.temp(weather.temp-273.15); + + // Humidity + weather.hum = weather.hum + "%"; + + // Wind + const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/); + weather.wind = Math.round(wind[1]) + " km/h"; + + return weather + + } catch(ex) { + // Return default + } + + return { + temp: "??? °C", + hum: "-", + txt: "-", + wind: "??? km/h", + wdir: "-", + wrose: "-" + }; +} + function isAlarmEnabled(){ try{ var alarm = require('alarm'); @@ -171,7 +205,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && !settings.showSteps){ + if(!isAlarmEnabled() && settings.showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -180,13 +214,32 @@ function draw() { g.drawString(timeStr, W/2, y); - // Draw steps or timer + // Draw info or timer y += H/5*2; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showSteps){ + if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); - var str = isAlarmEnabled() ? "T-" + getAlarmMinutes() + " min." : getSteps() ; - g.drawString(str, W/2, y); + + var infoStr = ""; + if(isAlarmEnabled()){ + infoStr = "T-" + getAlarmMinutes() + " min."; + } else if (settings.showInfo == 1){ + infoStr = E.getBattery() + "%"; + } else if (settings.showInfo == 2){ + infoStr = getSteps() + infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead + infoStr = infoStr + "k steps"; + } else if (settings.showInfo == 3){ + infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + } else if (settings.showInfo == 4){ + var weather = getWeather(); + infoStr = weather.temp; + } else if (settings.showInfo == 5){ + var weather = getWeather(); + infoStr = weather.wind; + } + + g.drawString(infoStr, W/2, y); } // Draw lock @@ -205,14 +258,12 @@ function draw() { Bangle.loadWidgets(); -// Clear the screen once, at startup +// Clear the screen once, at startup and set the correct theme. var bgOrig = g.theme.bg var fgOrig = g.theme.fg g.setTheme({bg:fgOrig,fg:bgOrig}).clear(); -// draw immediately at first, queue update draw(); - // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ if (on) { @@ -223,14 +274,12 @@ Bangle.on('lcdPower',on=>{ } }); - Bangle.on('lock', function(isLocked) { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; draw(); }); - Bangle.on('touch', function(btn, e){ var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; @@ -249,6 +298,13 @@ Bangle.on('touch', function(btn, e){ decreaseAlarm(); draw(true); } + + if(!is_lower && !is_upper){ + Bangle.buzz(40, 0.6); + settings.showInfo = (settings.showInfo+1) % 6; + storage.write(SETTINGS_FILE, settings); + draw(true); + } }); diff --git a/apps/bwclk/screenshot.png b/apps/bwclk/screenshot.png index 5a6ffced04dfa772ba6dfdcb61d7ecebd66575ae..db36a2088c06f3665d1b512ac14d1d9c8a884562 100644 GIT binary patch literal 2958 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 N3|)15gx^X$&E|DD}W`+J@%o*p=92^9$d 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 diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png deleted file mode 100644 index db36a2088c06f3665d1b512ac14d1d9c8a884562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2958 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 N (settings.showSteps ? 'Yes' : 'No'), - onchange: () => { - settings.showSteps = !settings.showSteps; - save(); - }, - }, 'Show Lock': { value: settings.showLock, format: () => (settings.showLock ? 'Yes' : 'No'), From bb310a15c2127236eda79c2af3670f2842a19332 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:56:28 +0200 Subject: [PATCH 082/117] Minor design improvement --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2714a6492..66b3476f6 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -215,7 +215,7 @@ function draw() { g.drawString(timeStr, W/2, y); // Draw info or timer - y += H/5*2; + y += H/5*2-5; g.setFontAlign(0,0); if(isAlarmEnabled() || settings.showInfo > 0){ g.setSmallFont(); From 42c02763551e3dbec5efe2c2ca341a4cdfcde08a Mon Sep 17 00:00:00 2001 From: David Peer Date: Sat, 2 Apr 2022 16:59:58 +0200 Subject: [PATCH 083/117] Updated screenshots, icon etc. --- apps/bwclk/app-icon.js | 2 +- apps/bwclk/app.js | 2 +- apps/bwclk/app.png | Bin 1795 -> 2116 bytes apps/bwclk/screenshot.png | Bin 2958 -> 2946 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app-icon.js b/apps/bwclk/app-icon.js index a90e091fd..1df0fa6a5 100644 --- a/apps/bwclk/app-icon.js +++ b/apps/bwclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgP/ADPHv4DB4Hj7wJC5nD7oLCz1zApffAonvDoQFB84LE62nFIXz63PGoXz6QFC+f//U/I4f+KxqTeh8AuFgAoMbwHwAoURwGw4AFBjOAmAFCj+MmOQAoWAmOYAoM5AoMYXoWAmf4AoWMmf8C4WImARCHYMgiBUUjOcAockpgFDnkIAomECIgFEjscRzI")) +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 66b3476f6..2ceb7c359 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -245,7 +245,7 @@ function draw() { // Draw lock if(settings.showLock && Bangle.isLocked()){ g.setColor(g.theme.fg); - g.drawImage(imgLock, 2, 2); + g.drawImage(imgLock, W-16, 2); } // Draw widgets if not fullscreen diff --git a/apps/bwclk/app.png b/apps/bwclk/app.png index c7c42effa88b07093d74b0322dc1446e2b148818..5073f0ed0ee9f9c74536e8120360af8caf25aa46 100644 GIT binary patch delta 2088 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 N Date: Sun, 3 Apr 2022 13:47:33 +0200 Subject: [PATCH 084/117] Included icons for data that is shown. --- apps/bwclk/ChangeLog | 3 +- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 80 +++++++++++++++++++++++++++++++----- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_2.png | Bin 3152 -> 2874 bytes 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index ba8fd775b..05a22774f 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -1,4 +1,5 @@ 0.01: New App. 0.02: Use build in function for steps and other improvements. 0.03: Adapt colors based on the theme of the user. -0.04: Steps can be hidden now such that the time is even larger. \ No newline at end of file +0.04: Steps can be hidden now such that the time is even larger. +0.05: Included icons for information. \ No newline at end of file diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 31cc60270..64662f38b 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -10,7 +10,7 @@ - If the "alarm" app is installed tab top / bottom of the screen to set the timer. ## Thanks to -Lock icons created by Those Icons - Flaticon +Icons created by Flaticon ## Creator - [David Peer](https://github.com/peerdavid) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 2ceb7c359..7382c1f1a 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -1,11 +1,19 @@ -const TIMER_IDX = "bwclk"; -const SETTINGS_FILE = "bwclk.setting.json"; +/* + * Includes + */ const locale = require('locale'); const storage = require('Storage'); +/* + * Statics + */ +const SETTINGS_FILE = "bwclk.setting.json"; +const TIMER_IDX = "bwclk"; +const W = g.getWidth(); +const H = g.getHeight(); /* - * Load settings + * Settings */ let settings = { fullscreen: false, @@ -37,7 +45,6 @@ Graphics.prototype.setMediumFont = function(scale) { return this; }; - Graphics.prototype.setSmallFont = function(scale) { // Actual height 28 (27 - 0) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//84D//zgP/+GAAAAAAAAAAAAAAAAAAAD4AAAPgAAA+AAAAAAAAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAg4AAHDgAAcOCABw54AHD/gAf/8AD/8AB//gAP8OAA9w4YCHD/gAcf+AB//gAf/gAP/uAA/w4ADnDgAAcOAABw4AAHAAAAcAAAAAAAAAAAAAAAIAA+A4AH8HwA/4PgHjgOAcHAcBwcBw/BwH78DgfvwOB8HA4HAOBw8A+HngB4P8ADgfgAAAYAAAAAAAAAAB4AAAf4AQB/gDgOHAeA4cDwDhweAOHDwA88eAB/nwAD88AAAHgAAA8AAAHn4AA8/wAHnvgA8cOAHhg4A8GDgHgcOA8B74BgD/AAAH4AAAAAAAAAAAAAAAAAMAAAH8AD8/4Af/3wB/8HgODwOA4HA4DgODgOAcOA4A44DwDzgHAH8AMAPwAQP+AAA/8AAAB4AAADAAAAAA+AAAD4AAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAGAAAA4gAAB/AAAH8AAD/AAAP8AAAH4AAAfwAADiAAAOAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAD/+AAP/4AABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAADkAAAPwAAA/AAAAAAAAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAADgAAAOAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA/gAA/+AA//AA//AAP/AAA/AAADAAAAAAAAAAAAAAAAAAA//gAP//gB///AHgA8A8AB4DgADgOAAOA4AA4DgADgPAAeAeADwB///AD//4AD/+AAAAAAAAAAAAAAAA4AAAHgAAAcAAADwAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAAAAAYAeADgD4AeAfAD4DwAfgOAD+A4Ae4DgDzgOAeOA4Dw4DweDgH/wOAP+A4AfwDgAAAAAAAAAAAAIAOAA4A4ADwDggHAOHgOA48A4DnwDgO/AOA7uA4D84HgPh/8A8H/gDgH8AAACAAAAAAAAAAAAAHgAAB+AAA/4AAP7gAD+OAA/g4AP4DgA+AOADAA4AAB/+AAH/4AAf/gAADgAAAOAAAAAAAAAAAAAAAAD4cAP/h4A/+HwDw4HgOHAOA4cA4DhwDgOHAOA4cA4Dh4HAOD58A4H/gAAP8AAAGAAAAAAAAAAAAAAAAD/+AAf/8AD//4AePDwDw4HgOHAOA4cA4DhwDgOHAOA4cB4Bw8PAHD/8AIH/gAAH4AAAAAAAAAADgAAAOAAAA4AAYDgAHgOAD+A4B/wDgf4AOP+AA7/AAD/gAAP4AAA8AAAAAAAAAAAAAAAAAAeH8AD+/4Af//wDz8HgOHgOA4OA4Dg4DgODgOA4eA4Dz8HgH//8AP7/gAeH8AAAAAAAAAAAAAAAA+AAAH+AgB/8HAHh4cA8Dg4DgODgOAcOA4Bw4DgODgPA4eAeHDwB///AD//4AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAODgAA4OAADg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA5AHAD8AcAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAB8AAAP4AAB5wAAPDgAB4HAAHAOAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAABjAAAGMAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEAAcA4AB4HAADw4AADnAAAH4AAAPAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHgAAA4AAADgDzgOA/OA4D84DgeAAPHwAAf+AAA/wAAB8AAAAAAAAAAAAAAAAAAD+AAB/+AAP/8AB4B4AOABwBwADgHB8OA4P4cDhxxwMGDDAwYMMDBgwwOHHHA4f4cDh/xwHAHCAcAMAA8AwAB8PAAD/4AAD/AAAAAAAAAAAAAACAAAB4AAB/gAA/8AAf+AAP/wAH/nAA/gcADwBwAPwHAA/4cAA/9wAAf/AAAP/AAAD/gAAB+AAAA4AAAAAAAAAAAAAAD///gP//+A///4DgcDgOBwOA4HA4DgcDgOBwOA4HA4Dg8DgPHwOAf/h4A///AB8f4AAAfAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AHgPAAOA4AAAAAAAAAAAAAAAP//+A///4D///gOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOA8AB4BwAHAHwB8AP//gAP/4AAP+AAAAAAAAAAAAAAAA///4D///gP//+A4HA4DgcDgOBwOA4HA4DgcDgOBwOA4HA4DgcDgOBgOA4AA4AAAAAAAAAAAAAAD///gP//+A///4DgcAAOBwAA4HAADgcAAOBwAA4HAADgcAAOAwAA4AAAAAAAAAf+AAD/+AA//+ADwB4AeADwDwAHgOAAOA4AA4DgADgOAAOA4AA4DgMDgPAweAcDBwB8MfADw/4AHD/AAAPwAAAAAAAAAAAAAAAP//+A///4D///gABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAA///4D///gP//+AAAAAAAAAAAAAAAAAAAD///gP//+A///4AAAAAAAAAAAADgAAAPAAAA+AAAA4AAADgAAAOAAAA4AAAHgP//8A///wD//8AAAAAAAAAAAAAAAAAAAA///4D///gP//+AAHAAAA+AAAP8AAB54AAPDwAB4HgAPAPAB4AfAPAA+A4AA4DAABgAAACAAAAAAAAAAP//+A///4D///gAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAP//+A///4D///gD+AAAD+AAAB+AAAB/AAAB/AAAB/AAAB+AAAH4AAB+AAA/gAAP4AAD+AAA/AAAfwAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAP//+A///4D///gHwAAAPwAAAPgAAAfgAAAfAAAAfAAAA/AAAA+AAAB+AAAB8A///4D///gP//+AAAAAAAAAAAP+AAD/+AAf/8AD4D4AeADwBwAHAOAAOA4AA4DgADgOAAOA4AA4DgADgOAAOAcABwB4APAD4D4AH//AAP/4AAP+AAAAAAAAAAAP//+A///4D///gOAcAA4BwADgHAAOAcAA4BwADgHAAOAcAA4DgAD4eAAH/wAAP+AAAPgAAAAAAAA/4AAP/4AB//wAPgPgB4APAHAAcA4AA4DgADgOAAOA4AA4DgADgOAAOA4AO4BwA/AHgB8APgPwAf//gA//uAA/4QAAAAAAAAAA///4D///gP//+A4BwADgHAAOAcAA4BwADgHAAOAcAA4B8ADgP8APh/8Af/H4A/4HgA+AGAAAAAAAAAAAABgAHwHAA/g+AH/A8A8cBwDg4DgODgOA4OA4DgcDgOBwOA4HA4DwODgHg4cAPh/wAcH+AAwPwAAAAADgAAAOAAAA4AAADgAAAOAAAA4AAAD///gP//+A///4DgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAAAAAAAAAAAAAAAP//AA///AD//+AAAB8AAABwAAADgAAAOAAAA4AAADgAAAOAAAA4AAAHgAAA8A///gD//8AP//gAAAAAAAAAAIAAAA8AAAD+AAAH/AAAD/wAAB/4AAA/8AAAf4AAAPgAAB+AAA/4AAf+AAP/AAH/gAD/wAAP4AAA4AAAAAAAAPAAAA/gAAD/4AAA/+AAAf/AAAH/gAAB+AAAf4AAf/AAf/AAP/gAD/gAAPwAAA/4AAA/+AAAf/AAAH/wAAB/gAAB+AAB/4AA/+AA/+AA/+AAD/AAAPAAAAgAAAAAAAAMAAGA4AA4D4APgHwB8APwfAAPn4AAf+AAAfwAAB/AAAf+AAD4+AA/B8AHwB8A+AD4DgADgMAAGAwAAADwAAAPwAAAPwAAAfgAAAfgAAAf/4AAf/gAH/+AB+AAAPwAAD8AAA/AAADwAAAMAAAAgAAAAAAAAMAACA4AA4DgAPgOAD+A4Af4DgH7gOB+OA4Pw4Dj8DgO/AOA/4A4D+ADgPgAOA4AA4DAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAA4AAAD+AAAP/gAAH/4AAB/+AAAf+AAAH4AAABgAAAAAAAAADAAAAOAAAA4AAADgAAAP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAHH8AA8/4AHzjgAcMOABxwYAHHBgAccOABxwwAHGHAAP/4AA//4AA//gAAAAAAAAAAAAAAAAAAA///4D///gP//+AA4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AHADgAcAOABwA4AHADgAeAeAA8DwABwOAADAwAAAAAAAAAAAA/AAAP/AAD//AAPA8AB4B4AHADgAcAOABwA4AHADgAcAOAA4BwD///gP//+A///4AAAAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgAcYOABxg4AHGDgAeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAABgAAAGAAAB//+Af//4D///gPcAAA5gAADGAAAMYAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAD///gP//+AA//4ADgAAAcAAABwAAAHAAAAcAAABwAAAHgAAAP/+AAf/4AA//gAAAAAAAAAAAAAAMf/+A5//4Dn//gAAAAAAAAAAAAAAAAAAHAAAAfn///+f//+5///wAAAAAAAAAAAAAAAAAAP//+A///4D///gAAcAAAD8AAAf4AADzwAAeHgAHwPAAeAeABgA4AEABgAAAAAAAAAD///gP//+A///4AAAAAAAAAAAAAAAAAAAAf/+AB//4AH//gAOAAABwAAAHAAAAcAAABwAAAHgAAAP/+AA//4AB//gAOAAABwAAAHAAAAcAAABwAAAHgAAAf/+AA//4AA//gAAAAAAAAAAAAAAAf/+AB//4AD//gAOAAABwAAAHAAAAcAAABwAAAHAAAAeAAAA//4AB//gAD/+AAAAAAAAAAAAAAAAD8AAA/8AAH/4AA8DwAHgHgAcAOABwA4AHADgAcAOABwA4AHgHgAPh8AAf/gAA/8AAA/AAAAAAAAAAAAAAAAB///8H///wf///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4ADwPAAP/8AAf/AAAf4AAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAH//gAf/+AB//4ADwAAAcAAABwAAAHAAAAcAAAAAAAAAAMAAHw4AA/jwAH+HgAcYOABxw4AHHDgAcMOABw44AHjjgAPH+AA8fwAAw+AAAAAABgAAAGAAAAcAAAf//wB///AH//+ABgA4AGADgAYAOABgA4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAABwAAAH4AAAf8AAAP8AAAH+AAAD+AAAD4AAA/gAAf8AAP+AAH/AAAfgAABwAAAAAAAAAAAABwAAAH8AAAf+AAAP/gAAD/gAAB+AAAf4AAP8AAP+AAB/AAAH4AAAf8AAAP+AAAD/gAAB+AAAf4AAf/AAP/AAB/gAAHgAAAQAAABAAIAHADgAeAeAA8HwAB8+AAD/gAAD8AAAPwAAD/gAAfPgADwfAAeAeABwA4AEAAgAAAAABAAAAHgAAAfwAAA/wAAAf4BwAP4/AAP/8AAP+AAD/AAB/wAA/4AAP8AAB+AAAHAAAAQAAAAAAIAHADgAcAeABwD4AHA/gAcHuABx84AHPDgAf4OAB/A4AHwDgAeAOABgA4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAH4Af//////n//AAAA4AAADgAAAAAAAAAAAAAAAAAP//+A///4D///gAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////wAH4AAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAeAAAD4AAAOAAAA4AAADgAAAHAAAAcAAAA4AAADgAAAOAAAD4AAAPAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 32, atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMc"), 28+(scale<<8)+(1<<16)); @@ -50,10 +57,47 @@ var imgLock = { buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) }; +var imgSteps = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA==")) +}; +var imgBattery = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA")) +}; + +var imgBpm = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA")) +}; + +var imgTemperature = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA==")) +}; + +var imgWind = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A==")) +}; + +var imgTimer = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) +}; + + +/* + * Draw timeout + */ // timeout used to update every minute -var W = g.getWidth(); -var H = g.getHeight(); var drawTimeout; // schedule a draw for the next minute @@ -67,7 +111,7 @@ function queueDraw() { /* - * Handle alarm + * Helper */ function getSteps() { try{ @@ -173,6 +217,9 @@ function decreaseAlarm(){ } +/* + * D R A W + */ function draw() { // queue draw in one minute queueDraw(); @@ -221,25 +268,38 @@ function draw() { g.setSmallFont(); var infoStr = ""; + var infoImg; if(isAlarmEnabled()){ - infoStr = "T-" + getAlarmMinutes() + " min."; + infoStr = getAlarmMinutes() + " min."; + infoImg = imgTimer; } else if (settings.showInfo == 1){ infoStr = E.getBattery() + "%"; + infoImg = imgBattery; } else if (settings.showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead - infoStr = infoStr + "k steps"; + infoStr = infoStr + "k"; + infoImg = imgSteps; } else if (settings.showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; + infoImg = imgBpm; } else if (settings.showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; + infoImg = imgTemperature; } else if (settings.showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; + infoImg = imgWind; } - g.drawString(infoStr, W/2, y); + var imgWidth = 0; + if(infoImg !== undefined){ + imgWidth = infoImg.width; + var strWidth = g.stringWidth(infoStr); + g.drawImage(infoImg, W/2 - strWidth/2 - infoImg.width/2 - 5, y - infoImg.height/2); + } + g.drawString(infoStr, W/2 + imgWidth/2, y+3); } // Draw lock diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 9c81bd5cc..babaa37bf 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BlackWhite Clock", - "version": "0.04", + "version": "0.05", "description": "Black and white clock.", "readme": "README.md", "icon": "app.png", diff --git a/apps/bwclk/screenshot_2.png b/apps/bwclk/screenshot_2.png index c5ce87521668c01d77216eb0ba1a1547110b196e..2f31c8b3c918944ea151e5fc4c6c0045fbdf3416 100644 GIT binary patch literal 2874 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 QZObrl+WH*24uwzpA1k?5N&o-= delta 3135 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 Rdut@%FlY;V^9EBa;Xl+^z%~E? From 32e377941a56fdbba2a6ce3d46b2ac0827378396 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:48:19 +0200 Subject: [PATCH 085/117] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 7382c1f1a..39065164e 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-2, y+3); + g.drawString(dateStr, W/2-1, y+3); g.setSmallFont(); g.setFontAlign(-1,1); From 4c2b77a5fbce77ce4af58a222acedb52ae29c4c7 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 13:57:05 +0200 Subject: [PATCH 086/117] Minor changes --- apps/bwclk/README.md | 2 +- apps/bwclk/app.js | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 64662f38b..0262ec7f7 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -5,7 +5,7 @@ ## Features - Fullscreen on/off - The design is adapted to the theme of your bangle. -- Tab in middle of screen to show between different information. +- Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. - If the "alarm" app is installed tab top / bottom of the screen to set the timer. diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 39065164e..65db16a53 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -341,9 +341,13 @@ Bangle.on('lock', function(isLocked) { }); Bangle.on('touch', function(btn, e){ + var left = parseInt(g.getWidth() * 0.2); + var right = g.getWidth() - left; var upper = parseInt(g.getHeight() * 0.2); var lower = g.getHeight() - upper; + var is_left = e.x < left; + var is_right = e.x > right; var is_upper = e.y < upper; var is_lower = e.y > lower; @@ -359,9 +363,18 @@ Bangle.on('touch', function(btn, e){ draw(true); } - if(!is_lower && !is_upper){ + var maxInfo = 6; + if(is_right){ Bangle.buzz(40, 0.6); - settings.showInfo = (settings.showInfo+1) % 6; + settings.showInfo = (settings.showInfo+1) % maxInfo; + storage.write(SETTINGS_FILE, settings); + draw(true); + } + + if(is_left){ + Bangle.buzz(40, 0.6); + settings.showInfo = settings.showInfo-1; + settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); draw(true); } From d39174e792da14e6476f350861fa17d7d52ba6df Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:58:41 +0200 Subject: [PATCH 087/117] Minor changes --- apps/bwclk/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 65db16a53..bee40f10d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -239,7 +239,7 @@ function draw() { g.setMediumFont(); var dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.drawString(dateStr, W/2-1, y+3); + g.drawString(dateStr, W/2-1, y+4); g.setSmallFont(); g.setFontAlign(-1,1); From 11d3c5c10e5c22bb34a4868ba86350062825a76d Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 14:59:14 +0200 Subject: [PATCH 088/117] Minor changes --- apps/bwclk/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index bee40f10d..420b7e24d 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -154,10 +154,10 @@ function getWeather(){ } return { - temp: "??? °C", + temp: "? °C", hum: "-", txt: "-", - wind: "??? km/h", + wind: "? km/h", wdir: "-", wrose: "-" }; From eba8b17a54184ef11e974fa761b597fb9b1f7e54 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:33:54 +0200 Subject: [PATCH 089/117] Show charging icon. --- apps/bwclk/app.js | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 420b7e24d..8456f7a6b 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -93,6 +93,13 @@ var imgTimer = { buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA==")) }; +var imgCharging = { + width : 24, height : 24, bpp : 1, + transparent : 1, + buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA=")) +}; + + /* * Draw timeout @@ -224,6 +231,17 @@ function draw() { // queue draw in one minute queueDraw(); + // Set info + var showInfo = settings.showInfo; + if(isAlarmEnabled()){ + showInfo = 100; + } + + if(Bangle.isCharging()){ + showInfo = 101; + } + + // Draw background var yOffset = settings.fullscreen ? 0 : 10; var y = H/5*2 + yOffset; @@ -252,7 +270,7 @@ function draw() { var timeStr = locale.time(date,1); y += settings.fullscreen ? 20 : 10; - if(!isAlarmEnabled() && settings.showInfo == 0){ + if(showInfo == 0){ y += 8; g.setLargeFont(); } else { @@ -264,30 +282,33 @@ function draw() { // Draw info or timer y += H/5*2-5; g.setFontAlign(0,0); - if(isAlarmEnabled() || settings.showInfo > 0){ + if(showInfo > 0){ g.setSmallFont(); var infoStr = ""; var infoImg; - if(isAlarmEnabled()){ + if(showInfo == 100){ infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; - } else if (settings.showInfo == 1){ + } else if(showInfo == 101){ + infoStr = ""; + infoImg = imgCharging; + } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; infoImg = imgBattery; - } else if (settings.showInfo == 2){ + } else if (showInfo == 2){ infoStr = getSteps() infoStr = Math.round(infoStr/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead infoStr = infoStr + "k"; infoImg = imgSteps; - } else if (settings.showInfo == 3){ + } else if (showInfo == 3){ infoStr = Math.round(Bangle.getHealthStatus("day").bpm) + " bpm"; infoImg = imgBpm; - } else if (settings.showInfo == 4){ + } else if (showInfo == 4){ var weather = getWeather(); infoStr = weather.temp; infoImg = imgTemperature; - } else if (settings.showInfo == 5){ + } else if (showInfo == 5){ var weather = getWeather(); infoStr = weather.wind; infoImg = imgWind; From d85017896c95904f1a6a9ebafe7e187882bbf219 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 15:59:20 +0200 Subject: [PATCH 090/117] Listen for oncharging event --- apps/bwclk/app.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 8456f7a6b..26cd3a2b5 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -361,6 +361,12 @@ Bangle.on('lock', function(isLocked) { draw(); }); +Bangle.on('charging',function(charging) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + draw(); +}); + Bangle.on('touch', function(btn, e){ var left = parseInt(g.getWidth() * 0.2); var right = g.getWidth() - left; From f7d1fda5ff0145e4989686692cd5612e391dbfda Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 3 Apr 2022 22:18:26 +0200 Subject: [PATCH 091/117] Minor fixes --- apps/bwclk/app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index 26cd3a2b5..c3e13ee73 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -291,7 +291,7 @@ function draw() { infoStr = getAlarmMinutes() + " min."; infoImg = imgTimer; } else if(showInfo == 101){ - infoStr = ""; + infoStr = E.getBattery() + "%"; infoImg = imgCharging; } else if (showInfo == 1){ infoStr = E.getBattery() + "%"; @@ -381,13 +381,13 @@ Bangle.on('touch', function(btn, e){ if(is_upper){ Bangle.buzz(40, 0.6); increaseAlarm(); - draw(true); + draw(); } if(is_lower){ Bangle.buzz(40, 0.6); decreaseAlarm(); - draw(true); + draw(); } var maxInfo = 6; @@ -395,7 +395,7 @@ Bangle.on('touch', function(btn, e){ Bangle.buzz(40, 0.6); settings.showInfo = (settings.showInfo+1) % maxInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } if(is_left){ @@ -403,7 +403,7 @@ Bangle.on('touch', function(btn, e){ settings.showInfo = settings.showInfo-1; settings.showInfo = settings.showInfo < 0 ? maxInfo-1 : settings.showInfo; storage.write(SETTINGS_FILE, settings); - draw(true); + draw(); } }); From 1bc47eb3f17e85e3476d7827805f14024a6cadcd Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:49:52 +0100 Subject: [PATCH 092/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index ba1db294f..fdeda5c51 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; if (settings.language == 'System') { settings.language = require('locale').name; @@ -12,6 +12,15 @@ let fuzzy_string = fuzzy_strings[settings.language]; const h = g.getHeight(); const w = g.getWidth(); +let align_mode = 0; +let align_pos = w/2; +if (settings.alignment =='Left') { + align_mode = -1; + align_pos = 0; +} else if (settings.alignment == 'Right') { + align_mode = 1; + align_pos = w; +} function getTimeString(date) { let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); @@ -29,10 +38,10 @@ function draw() { let time_string = getTimeString(new Date()).replace('*', ''); // print(time_string); g.setFont('Vector', (h-24*2)/fuzzy_string.text_scale); - g.setFontAlign(0, 0); + g.setFontAlign(align_mode, 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); + g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); } g.clear(); From 4e3a3c36d5a6ebaa9cee46598f6e96c43e40f41a Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:51:28 +0100 Subject: [PATCH 093/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index cb0d1117c..52526f6b6 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'align': align_options[1]}; + let s = {'language': language_options[0], 'alignment': align_options[1]}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -22,14 +22,14 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Clock' }, + '': { 'title': 'Fuzzy Word Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { - s.theme = language_options[v]; + s.language = language_options[v]; save(); } }, @@ -38,7 +38,7 @@ min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { - s.theme = align_options[v]; + s.alignment = align_options[v]; save(); } }, From 1ee8dfd3a7b008c506f1490ead81123f4f4bea96 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:52:02 +0100 Subject: [PATCH 094/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 52526f6b6..b316dc159 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -22,7 +22,7 @@ } E.showMenu({ - '': { 'title': 'Fuzzy Word Clock' }, + '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { value: 0 | language_options.indexOf(s.theme), From 417a575d5149025f49355ebdb84f5ad26dca450e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 12:59:39 +0100 Subject: [PATCH 095/117] Update metadata.json --- apps/fuzzyw/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..0a8d0f4a9 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,8 +12,8 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, - {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.app.js","url":"app.js"}, + {"name":"fuzzyw.settings.js","url":"settings.js"}, {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] From 195d279a747749394682a525d9fbbe5a93bd7668 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:01:18 +0100 Subject: [PATCH 096/117] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 0a8d0f4a9..a8db0d604 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"fuzzyw.app.js","url":"app.js"}, - {"name":"fuzzyw.settings.js","url":"settings.js"}, - {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"app.js","url":"fuzzyw.app.js"}, + {"name":"settings.js","url":"fuzzyw.settings.js"}, + {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From aab8df3bee340bd2c8a1a787d77b5869314273a1 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:02:41 +0100 Subject: [PATCH 097/117] Update metadata.json --- apps/fuzzyw/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index a8db0d604..2cc670c79 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -12,9 +12,9 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"app.js","url":"fuzzyw.app.js"}, - {"name":"settings.js","url":"fuzzyw.settings.js"}, - {"name":"icon.img","url":"fuzzyw.icon.js","evaluate":true}, + {"name":"fuzzyw.app.js","url":"fuzzyw.app.js"}, + {"name":"fuzzyw.settings.js","url":"fuzzyw.settings.js"}, + {"name":"fuzzyw.img","url":"fuzzyw.icon.js","evaluate":true}, {"name":"fuzzy_strings.json","url":"fuzzy_strings.json"} ] } From d9a3c0a44c490f09267a14114e2df555964818bc Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:10:51 +0100 Subject: [PATCH 098/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index fdeda5c51..494e45124 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -2,7 +2,7 @@ const fuzzy_strings = require("Storage").readJSON("fuzzy_strings.json"); const SETTINGS_FILE = "fuzzyw.settings.json"; -let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Center'}; +let settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'language': 'System', 'alignment':'Centre'}; if (settings.language == 'System') { settings.language = require('locale').name; From 1d122ef08ee1d23890e21a8dde3be03fc84ccd1b Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:12:48 +0100 Subject: [PATCH 099/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index b316dc159..32a8b9031 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "fuzzyw.json"; + const SETTINGS_FILE = "fuzzyw.settings.json"; var align_options = ['Left','Centre','Right']; var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; From a719435d5622ad1c359eaecbfb1dc37c8cd37024 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:31:29 +0100 Subject: [PATCH 100/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 32a8b9031..765c4f3e4 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -5,7 +5,7 @@ var language_options = ['System', 'en_GB', 'en_US', 'es_ES', 'fr_FR', 'no_NO', 'sv_SE', 'de_DE']; // initialize with default settings... - let s = {'language': language_options[0], 'alignment': align_options[1]}; + let s = {'language': 'System', 'alignment': 'Centre'}; // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings From b27b6b0277902f8a93cfd9e338319cbb4cee6a50 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 13:57:01 +0100 Subject: [PATCH 101/117] Update fuzzyw.settings.js --- apps/fuzzyw/fuzzyw.settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js index 765c4f3e4..00219accf 100644 --- a/apps/fuzzyw/fuzzyw.settings.js +++ b/apps/fuzzyw/fuzzyw.settings.js @@ -25,7 +25,7 @@ '': { 'title': 'Fuzzy Text Clock' }, '< Back': back, 'Language': { - value: 0 | language_options.indexOf(s.theme), + value: 0 | language_options.indexOf(s.language), min: 0, max: language_options.length - 1, format: v => language_options[v], onchange: v => { @@ -34,7 +34,7 @@ } }, 'Alignment': { - value: 0 | align_options.indexOf(s.theme), + value: 0 | align_options.indexOf(s.alignment), min: 0, max: align_options.length - 1, format: v => align_options[v], onchange: v => { From 84554868e6ff733034cf0e043e4004adab502c93 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:00:45 +0100 Subject: [PATCH 102/117] Update metadata.json --- apps/fuzzyw/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json index 2cc670c79..ebd20e49f 100644 --- a/apps/fuzzyw/metadata.json +++ b/apps/fuzzyw/metadata.json @@ -3,7 +3,7 @@ "name":"Fuzzy Text Clock", "shortName": "Fuzzy Text", "version": "0.01", - "description": "An inaccurate clock for when you're not in a rush", + "description": "An imprecise clock for when you're not in a rush", "readme": "README.md", "icon":"fuzzyw.png", "screenshots": [{"url":"fuzzyw-light.png"},{"url":"fuzzyw-dark.png"}], From b496307227f6e774bfc77bb14f02b768fcd3060e Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:01:36 +0100 Subject: [PATCH 103/117] Update README.md --- apps/fuzzyw/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 1b5f2b8e8..b1afeb961 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -1,12 +1,12 @@ # Fuzzy Text Clock -An inaccurate clock for when you're not in a rush. +An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! ## TODO -* Other languages (currently only uk style time, could tie into the Languages app) -* Bold hour word +* 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 From c7049589fe326d4963a49d5d3f182ebdfbd5850f Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:04 +0100 Subject: [PATCH 104/117] Update README.md --- apps/fuzzyw/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index b1afeb961..9ad90bccd 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -4,6 +4,16 @@ An imprecise clock for when you're not in a rush. This clock is a remake of one of my favourite Pebble watchfaces, Fuzzy Text International. I use this watch for weekends and holidays, when 'within 5 minutes of the actual time' is close enough! +By default it will use the language set on the watch, go to settings to pick: +* en_GB - English +* en_US - American +* es_ES - Spanish +* fr_FR - French +* no_NO - Norwegian +* sv_SE - Swedish +* de_DE - German +Most translations are taken from the original Fuzzy Text International code. + ## TODO * Bold hour word (as the pebble version has) * Animation when changing time? From aed0aa165909cea413cbfe14571f08fda5c3a19c Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Mon, 4 Apr 2022 14:04:23 +0100 Subject: [PATCH 105/117] Update README.md --- apps/fuzzyw/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fuzzyw/README.md b/apps/fuzzyw/README.md index 9ad90bccd..906eb167b 100644 --- a/apps/fuzzyw/README.md +++ b/apps/fuzzyw/README.md @@ -12,6 +12,7 @@ By default it will use the language set on the watch, go to settings to pick: * no_NO - Norwegian * sv_SE - Swedish * de_DE - German + Most translations are taken from the original Fuzzy Text International code. ## TODO From 530437750883703875475494cd28b5b2ff915fa0 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:32:30 +0200 Subject: [PATCH 106/117] Updated to "sched" library. --- apps/bwclk/app.js | 8 ++++---- apps/lcars/lcars.app.js | 8 ++++---- apps/notanalog/notanalog.app.js | 8 ++++---- apps/smpltmr/app.js | 2 +- apps/smpltmr/metadata.json | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index c3e13ee73..d4e6c50ab 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -172,7 +172,7 @@ function getWeather(){ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -189,7 +189,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -197,7 +197,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -210,7 +210,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 353cc62dd..577955d2e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -567,7 +567,7 @@ function getWeather(){ */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -584,7 +584,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -592,7 +592,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -605,7 +605,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js index b7c81837d..c3dc9308f 100644 --- a/apps/notanalog/notanalog.app.js +++ b/apps/notanalog/notanalog.app.js @@ -394,7 +394,7 @@ function queueDraw() { */ function isAlarmEnabled(){ try{ - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); if(alarmObj===undefined || !alarmObj.on){ return false; @@ -411,7 +411,7 @@ function getAlarmMinutes(){ return -1; } - var alarm = require('alarm'); + var alarm = require('sched'); var alarmObj = alarm.getAlarm(TIMER_IDX); return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000)); } @@ -419,7 +419,7 @@ function getAlarmMinutes(){ function increaseAlarm(){ try{ var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, { timer : (minutes+5)*60*1000, }); @@ -432,7 +432,7 @@ function decreaseAlarm(){ var minutes = getAlarmMinutes(); minutes -= 5; - var alarm = require('alarm') + var alarm = require('sched') alarm.setAlarm(TIMER_IDX, undefined); if(minutes > 0){ diff --git a/apps/smpltmr/app.js b/apps/smpltmr/app.js index f7717a2fc..eb01e27d0 100644 --- a/apps/smpltmr/app.js +++ b/apps/smpltmr/app.js @@ -8,7 +8,7 @@ Bangle.loadWidgets(); -const alarm = require("alarm"); +const alarm = require("sched"); const TIMER_IDX = "smpltmr"; const screenWidth = g.getWidth(); diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index feb841819..5a46ae546 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"alarm":"app"}, + "dependencies": {"sched":"app"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 4d0389ba5c8fe6ff6b96da2d878273588f6536e5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 4 Apr 2022 18:33:40 +0200 Subject: [PATCH 107/117] Updated readme --- apps/bwclk/README.md | 2 +- apps/lcars/README.md | 2 +- apps/notanalog/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index 0262ec7f7..a5b66df71 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -7,7 +7,7 @@ - The design is adapted to the theme of your bangle. - Tab left/right of screen to show steps, temperature etc. - Enable / disable lock icon in the settings. -- If the "alarm" app is installed tab top / bottom of the screen to set the timer. +- If the "sched" app is installed tab top / bottom of the screen to set the timer. ## Thanks to Icons created by Flaticon diff --git a/apps/lcars/README.md b/apps/lcars/README.md index f506f96c4..7024e8edf 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -4,7 +4,7 @@ A simple LCARS inspired clock. Note: To display the steps, the wpedom app is required. To show weather data such as temperature, humidity or window you BangleJS must be connected with Gadgetbride and the weather app must be installed. To use the timer -the "alarm" app must be installed on your device. +the "sched" app must be installed on your device. ## Control * Tap left / right to change between screens. diff --git a/apps/notanalog/README.md b/apps/notanalog/README.md index f4cf19ed6..e368f75d2 100644 --- a/apps/notanalog/README.md +++ b/apps/notanalog/README.md @@ -9,7 +9,7 @@ The selected theme is also respected. Note that this watch face is in fullscreen mode, but widgets are still loaded in background. ## Other Features -- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "alarm" is installed. +- Set a timer - simply touch top (+5min.) or bottom (-5 min.). This only works if "sched" is installed. - If the weather is available through the weather app, the outside temp. will be shown. - Sleep modus at midnight to save more battery (no minute updates). - Icons for charging and GPS. From eb0d809a610945ac89efc30b8f942e6e51acfada Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:49:59 +0100 Subject: [PATCH 108/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 494e45124..e4fa71070 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -10,6 +10,18 @@ if (settings.language == 'System') { let fuzzy_string = fuzzy_strings[settings.language]; +let timeout = 2.5*60; +let drawTimeout; + +function queueDraw(seconds) { + let millisecs = seconds * 1000; + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, millisecs - (Date.now() % millisecs)); +} + const h = g.getHeight(); const w = g.getWidth(); let align_mode = 0; @@ -42,11 +54,11 @@ function draw() { g.clearRect(0, 24, w, h-24); g.setColor(g.theme.fg); g.drawString(g.wrapString(time_string, w).join("\n"), align_pos, h/2); + queueDraw(timeout); } g.clear(); draw(); -setInterval(draw, 10000); // refresh every 10s // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ From f0fce411b993d3416aa340d18ad4523666cfdb92 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:54:17 +0100 Subject: [PATCH 109/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index e4fa71070..37d497e20 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -62,11 +62,11 @@ draw(); // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; if (on) { - secondInterval = setInterval(draw, 10000); - draw(); // draw immediately + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; } }); From 575926b654bf6e1ed2ee68c1b9cf5c00dec06086 Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:17:03 +0100 Subject: [PATCH 110/117] Update fuzzyw.app.js --- apps/fuzzyw/fuzzyw.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js index 37d497e20..07b5c4068 100644 --- a/apps/fuzzyw/fuzzyw.app.js +++ b/apps/fuzzyw/fuzzyw.app.js @@ -35,7 +35,7 @@ if (settings.alignment =='Left') { } function getTimeString(date) { - let segment = Math.round((date.getMinutes()*60 + date.getSeconds())/300); + let segment = Math.round((date.getMinutes()*60 + date.getSeconds() + 1)/300); let hour = date.getHours() + Math.floor(segment/12); f_string = fuzzy_string.minutes[segment % 12]; if (f_string.includes('$1')) { From fb3dc7fe71ad1c49e2c2eccf64d5e7d0d820183d Mon Sep 17 00:00:00 2001 From: sir-indy <53864146+sir-indy@users.noreply.github.com> Date: Wed, 6 Apr 2022 13:23:55 +0100 Subject: [PATCH 111/117] Update fuzzy_strings.json --- apps/fuzzyw/fuzzy_strings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fuzzyw/fuzzy_strings.json b/apps/fuzzyw/fuzzy_strings.json index 6b4b71419..8594ad554 100644 --- a/apps/fuzzyw/fuzzy_strings.json +++ b/apps/fuzzyw/fuzzy_strings.json @@ -91,7 +91,7 @@ ], "text_scale":3.5 }, - "no_NO":{ + "no_NB":{ "hours":[ "tolv", "ett", "to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni", "ti", "elleve", From c48a951f2d1705f1b57e14a84dd85ae61a82548e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 14:55:07 +0100 Subject: [PATCH 112/117] 0.06: Add button for force compass calibration (#1660) --- apps/compass/ChangeLog | 1 + apps/compass/compass.js | 7 ++++++- apps/compass/metadata.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/compass/ChangeLog b/apps/compass/ChangeLog index 4bb7838ac..d1adafc4c 100644 --- a/apps/compass/ChangeLog +++ b/apps/compass/ChangeLog @@ -3,3 +3,4 @@ 0.03: Eliminate flickering 0.04: Fix for Bangle.js 2 and themes 0.05: Fix bearing not clearing correctly (visible in single or double digit bearings) +0.06: Add button for force compass calibration diff --git a/apps/compass/compass.js b/apps/compass/compass.js index 65ad83c4f..ee0d3d8ba 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -64,7 +64,12 @@ Bangle.on('mag', function(m) { oldHeading = m.heading; }); -g.clear(); +g.clear(1); +g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + Bangle.resetCompass(); +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); + Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setCompassPower(1); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index 318d90c86..e24ca4adc 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -1,7 +1,7 @@ { "id": "compass", "name": "Compass", - "version": "0.05", + "version": "0.06", "description": "Simple compass that points North", "icon": "compass.png", "screenshots": [{"url":"screenshot_compass.png"}], From 459fb273f195957e59abdc0519ec19f730268cc0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:09:41 +0100 Subject: [PATCH 113/117] Add altimeter app --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app-icon.js | 1 + apps/altimeter/app.js | 34 ++++++++++++++++++++++++++++++++++ apps/altimeter/app.png | Bin 0 -> 1289 bytes apps/altimeter/metadata.json | 12 ++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 apps/altimeter/ChangeLog create mode 100644 apps/altimeter/app-icon.js create mode 100644 apps/altimeter/app.js create mode 100644 apps/altimeter/app.png create mode 100644 apps/altimeter/metadata.json diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/altimeter/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/altimeter/app-icon.js b/apps/altimeter/app-icon.js new file mode 100644 index 000000000..1f8dfb637 --- /dev/null +++ b/apps/altimeter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///t9TmuV3+GJf4AN+ALVgf8BasP/4LVn//4ALUWgJUJBZUDBYJUIBZcP3/nKhEOt/WBZE5r+VKg0KgEVr9V3wLHqtaqt9sALElWAqoABt1QBZNeBYuq0ILCrVUBYulBYVWBYkCBYgABBZ8K1WVBYlABZegKQWqBQlVqALKqWoKQWpBYtWBZeqKRAAB1WABZZSHAANq0ALLKQ6qC1ALLKQ5UEAH4AG")) diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js new file mode 100644 index 000000000..06c254a36 --- /dev/null +++ b/apps/altimeter/app.js @@ -0,0 +1,34 @@ +// place your const, vars, functions or classes here + +// clear the screen +g.clear(); + +var n = 0; + +// redraw the screen +function draw() { + g.reset().clearRect(Bangle.appRect); + g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); + g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); +} + +// Respond to user input +Bangle.setUI({mode: "updown"}, function(dir) { + if (dir<0) { + n--; + draw(); + } else if (dir>0) { + n++; + draw(); + } else { + n = 0; + draw(); + } +}); + +// First draw... +draw(); + +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/altimeter/app.png b/apps/altimeter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9d6907762d253ba62b9d3f954c9252c002969b GIT binary patch literal 1289 zcmV+k1@`)hP)85fi3beW{$s+Y+K7*&r}Q6lfXBAc0bT`a@f6drsSP zUN5$G{XKBxbTg*U)j7}ieed%=@B5w8?-a-(ha7VFU!#6R`tkkI@VRWor)&iV0JAlG zfE4Zq04CaN-kEn^d)&XWp ztvJ&=dh2AR17?f#5HXD)wLr|wyUh>h59_6sl@1Wo$qcaxM73%7f3KxyFaY?#D(+C& zFb0N@K~XkDl%1z4){X0-r+Wt!*-)D?c>rJtvS4^yFFjp5V73Ie5et6-Fs(2(Y>?&h zQxyeMYt_`b141oUP96aAWTS9G4@KQN&|u}Q5jivkqWt8sz=91*SVUoIS&U=mkWrSm zpWMBEb}hQPbs#KDwIIr09PEL#n8`#wb9s^ zdu$M_$N+%(D?dSz!*S}ACoa3{)}p;?17}(~y3Vw8bS3jOU!O0T?YnTmGyZ$*)hT(L zkd_=^MTUE9Fg7>r_rYbk61%teT?7fnm(9QWHfPm9Q)_!AfI|QdH8ywdj~|=+qxY!a zHc^_q#ye?&_nH-vz;Xib7`hBu3IYIvi#AN0`^x07^naXH1BycLMX!nY!{~L@;kSyw z{A#*2-bo8wmVp#rmV$5$T>=1@ita+l=f=WsJylP>ZZ6iEJg^D_O|9*fMA#Qc?TL1Q z*9k`fq!kvI90)Ah(#CX-4j{C=1k;91*9k^Zo)S8uF?Rq^`N_Y5C!TutTO!;a&k69Y(?3=$G;r!?G0%OrP_fs)sJG2(X{bX03}+) z;^CPX28X10YLiJ6s%>84ajZAM=hy zgd>sFoOx6cblQ`tEi4zjq9sN~1DUGN%$S{9(4wIgCl1!sq@1TRA+3SN=Fa_@tM7yq z()65ZMQI^zco6`YnVMQUyPH}%yO}xd!80w{*xb>R&HyuGaCj7=B&A!XC#E-w&awyh z9(;y~&jJ7uo_p>2r@u>{n9>2Yy}#&k-HPM^V4G+C<`;;R`Y6H7ADP?QQl7gM18RGJ z#y+oankq1maGDu6KOjI46ia!BQ|86rs8!$TUV@{DycY z!GK!zZT2~xQ(PG{$(n=`nS*b{Q!xW-)pvP3@CSq0$Wax6U=XgPE)db1UwqScPxL-! zAXD`Lz;+Aweln)*bKtm7Q2>QulMwsc(g3Je-|g|>Z@)jgS*pMv2*Bg@C6Y|lpEY-t z0XGc%SF0bz^lZxWmuDck9ssDRwY`#=eonX0Yv%pZ&lb;UXJ3TJL4%PqDKsB z)t{M7Ic(iF%-B=@J|brRCQa1;Lk(xU|hM!ENZ00000NkvXXu0mjf&Ua!E literal 0 HcmV?d00001 diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json new file mode 100644 index 000000000..137ceb8ba --- /dev/null +++ b/apps/altimeter/metadata.json @@ -0,0 +1,12 @@ +{ "id": "altimeter", + "name": "Altimeter", + "version":"0.01", + "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", + "icon": "app.png", + "tags": "tool,outdoors", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"altimeter.app.js","url":"app.js"}, + {"name":"altimeter.img","url":"app-icon.js","evaluate":true} + ] +} From cb6a393110535a565c77744800beea04d98ea357 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 15:44:46 +0100 Subject: [PATCH 114/117] alt 0.02: Actually upload correct code --- apps/altimeter/ChangeLog | 1 + apps/altimeter/app.js | 54 +++++++++++++++++------------------- apps/altimeter/metadata.json | 4 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/apps/altimeter/ChangeLog b/apps/altimeter/ChangeLog index 5560f00bc..29388520e 100644 --- a/apps/altimeter/ChangeLog +++ b/apps/altimeter/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Actually upload correct code diff --git a/apps/altimeter/app.js b/apps/altimeter/app.js index 06c254a36..cac4e80fd 100644 --- a/apps/altimeter/app.js +++ b/apps/altimeter/app.js @@ -1,34 +1,30 @@ -// place your const, vars, functions or classes here +Bangle.setBarometerPower(true, "app"); -// clear the screen -g.clear(); +g.clear(1); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +var zero = 0; +var R = Bangle.appRect; +var y = R.y + R.h/2; +var MEDIANLENGTH = 20; +var avr = [], median; +var value = 0; -var n = 0; - -// redraw the screen -function draw() { - g.reset().clearRect(Bangle.appRect); - g.setFont("6x8").setFontAlign(0,0).drawString("Up / Down",g.getWidth()/2,g.getHeight()/2 - 20); - g.setFont("Vector",60).setFontAlign(0,0).drawString(n,g.getWidth()/2,g.getHeight()/2 + 30); -} - -// Respond to user input -Bangle.setUI({mode: "updown"}, function(dir) { - if (dir<0) { - n--; - draw(); - } else if (dir>0) { - n++; - draw(); - } else { - n = 0; - draw(); +Bangle.on('pressure', function(e) { + while (avr.length>MEDIANLENGTH) avr.pop(); + avr.unshift(e.altitude); + median = avr.slice().sort(); + g.reset().clearRect(0,y-30,g.getWidth()-10,y+30); + if (median.length>10) { + var mid = median.length>>1; + value = E.sum(median.slice(mid-4,mid+5)) / 9; + g.setFont("Vector",50).setFontAlign(0,0).drawString((value-zero).toFixed(1), g.getWidth()/2, y); } }); -// First draw... -draw(); - -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); +g.reset(); +g.setFont("6x8").setFontAlign(0,0).drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"ZERO", g.getWidth()-5, g.getHeight()/2); +setWatch(function() { + zero = value; +}, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/altimeter/metadata.json b/apps/altimeter/metadata.json index 137ceb8ba..8bdbf3022 100644 --- a/apps/altimeter/metadata.json +++ b/apps/altimeter/metadata.json @@ -1,10 +1,10 @@ { "id": "altimeter", "name": "Altimeter", - "version":"0.01", + "version":"0.02", "description": "Simple altimeter that can display height changed using Bangle.js 2's built in pressure sensor.", "icon": "app.png", "tags": "tool,outdoors", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"altimeter.app.js","url":"app.js"}, {"name":"altimeter.img","url":"app-icon.js","evaluate":true} From 0b7fa0494d6862cba796a1f95882c1fe57bf4c24 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 6 Apr 2022 17:34:56 +0200 Subject: [PATCH 115/117] use type of sched instead of app --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5a46ae546..5adf00921 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"app"}, + "dependencies": {"sched":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From dfd5461fd9ff58ea722f77446fa0d87ba86a44d2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 16:37:26 +0100 Subject: [PATCH 116/117] https://github.com/espruino/BangleApps/pull/1661#issuecomment-1090413428 --- apps/smpltmr/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smpltmr/metadata.json b/apps/smpltmr/metadata.json index 5adf00921..06bad962d 100644 --- a/apps/smpltmr/metadata.json +++ b/apps/smpltmr/metadata.json @@ -6,7 +6,7 @@ "description": "A very simple app to start a timer.", "icon": "app.png", "tags": "tool", - "dependencies": {"sched":"type"}, + "dependencies": {"scheduler":"type"}, "supports": ["BANGLEJS2"], "screenshots": [{"url":"screenshot.png"}, {"url": "screenshot_2.png"}], "readme": "README.md", From 3c28c0c9c9a625e663bfbf324b3a58a4fb53eb12 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 6 Apr 2022 19:45:27 +0100 Subject: [PATCH 117/117] readme --- apps/compass/README.md | 29 +++++++++++++++++++++++++++++ apps/compass/compass.js | 4 ++-- apps/compass/metadata.json | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 apps/compass/README.md diff --git a/apps/compass/README.md b/apps/compass/README.md new file mode 100644 index 000000000..d60192f73 --- /dev/null +++ b/apps/compass/README.md @@ -0,0 +1,29 @@ +# Compass + +This app uses Bangle.js's built-in magnetometer as a compass. + +## Usage + +Hold your Bangle.js **face up** (so the display is parallel to the ground), +and the red arrow will point north, with the heading in degrees printed at +the top of the screen. + +This compass app does not include tilt compensation - so much like a real +compass you should always keep it face up when taking a reading. + +The first time you run the compass after your Bangle has booted (or if +you move to an area with a substantially different magnetic field) you will +need to recalibrate your compass (even if a heading is shown). + +## Calibration + +Press the button next to the `RESET` label on the screen. The North/South marker +will disappear and a message will appear asking you to rotate the watch 360 degrees. + +* Hold the watch face up, so the display is parallel to the ground +* Rotate it around slowly, all 360 degrees (with the display still parallel to the ground) +* The `Uncalibrated` message will disappear before you have finished rotating the full 360 degrees - but you should still complete the full rotation in order for the compass to work properly. + +Once you've rotated the full 360 degrees your compass should now work fine, +and calibration is stored between runs of the app. However if you go near +to a strong magnet you may still need to recalibrate. diff --git a/apps/compass/compass.js b/apps/compass/compass.js index ee0d3d8ba..4730111ac 100644 --- a/apps/compass/compass.js +++ b/apps/compass/compass.js @@ -38,7 +38,7 @@ Bangle.on('mag', function(m) { if (!wasUncalibrated) { g.clearRect(0,24,W,48); g.setFontAlign(0,-1).setFont("6x8"); - g.drawString("Uncalibrated\nturn 360° around",M,24+4); + g.drawString(/*LANG*/"Uncalibrated\nturn 360° around",M,24+4); wasUncalibrated = true; } } else { @@ -65,7 +65,7 @@ Bangle.on('mag', function(m) { }); g.clear(1); -g.setFont("6x8").setFontAlign(0,0,3).drawString("RESET", g.getWidth()-5, g.getHeight()/2); +g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"RESET", g.getWidth()-5, g.getHeight()/2); setWatch(function() { Bangle.resetCompass(); }, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat:true}); diff --git a/apps/compass/metadata.json b/apps/compass/metadata.json index e24ca4adc..3e3b37f72 100644 --- a/apps/compass/metadata.json +++ b/apps/compass/metadata.json @@ -7,6 +7,7 @@ "screenshots": [{"url":"screenshot_compass.png"}], "tags": "tool,outdoors", "supports": ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"compass.app.js","url":"compass.js"}, {"name":"compass.img","url":"compass-icon.js","evaluate":true}