From 55ca187d5dc91ee52d57aa42f5d6a07c5bb20b0a Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Thu, 8 Dec 2022 20:12:47 +0000 Subject: [PATCH] Lato version of Simplepp Clock --- apps/lato/README.md | 54 +++++++++++++++ apps/lato/app.js | 138 +++++++++++++++++++++++++++++++++++++ apps/lato/app.png | Bin 0 -> 1139 bytes apps/lato/icon.js | 1 + apps/lato/metadata.json | 16 +++++ apps/lato/screenshot1..png | Bin 0 -> 2666 bytes apps/lato/screenshot2.png | Bin 0 -> 2741 bytes apps/lato/screenshot3.png | Bin 0 -> 2723 bytes 8 files changed, 209 insertions(+) create mode 100644 apps/lato/README.md create mode 100644 apps/lato/app.js create mode 100644 apps/lato/app.png create mode 100644 apps/lato/icon.js create mode 100644 apps/lato/metadata.json create mode 100644 apps/lato/screenshot1..png create mode 100644 apps/lato/screenshot2.png create mode 100644 apps/lato/screenshot3.png diff --git a/apps/lato/README.md b/apps/lato/README.md new file mode 100644 index 000000000..556ee6fbc --- /dev/null +++ b/apps/lato/README.md @@ -0,0 +1,54 @@ +# Lato + +A simple clock with the Lato font, with fast load and clock_info + +![](screenshot1.png) +![](screenshot2.png) +![](screenshot3.png) + +This clock is a Lato version of Simplest++. Simplest++ provided the +smallest example of a clock that supports 'fast load' and 'clock +info'. Lato takes this one step further and adds the lovely Lato +font. The clock is derived from Simplest++ and inspired by the +Pastel Clock. + +## Usage + +* When the screen is unlocked, tap at the bottom of the csreen on the information text. + It should change color showing it is selected. + +* Swipe up or down to cycle through the info screens that can be displayed + when you have finished tap again towards the centre of the screen to unselect. + +* Swipe left or right to change the type of info screens displayed (by default + there is only one type of data so this will have no effect) + +* Settings are saved automatically and reloaded along with the clock. + +## About Clock Info's + +* The clock info modules enable all clocks to add the display of information to the clock face. + +* The default clock_info module provides a display of battery %, Steps, Heart Rate and Altitude. + +* Installing the [Sunrise ClockInfo](https://banglejs.com/apps/?id=clkinfosunrise) adds Sunrise and Sunset times into the list of info's. + + +## References + +* [What is Fast Load and how does it work](http://www.espruino.com/Bangle.js+Fast+Load) + +* [Clock Info Tutorial](http://www.espruino.com/Bangle.js+Clock+Info) + +* [How to load modules through the IDE](https://github.com/espruino/BangleApps/blob/master/modules/README.md) + + +## With Thanks + +* Gordon for support +* David Peer for his work on BW Clock + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/lato/app.js b/apps/lato/app.js new file mode 100644 index 000000000..6045d7f17 --- /dev/null +++ b/apps/lato/app.js @@ -0,0 +1,138 @@ +/** + * + * Lato Clock + * + * The entire clock code is contained within the block below this + * supports 'fast load' + * + * To add support for clock_info_supprt we add the code marked at [1] and [2] + * + */ + +Graphics.prototype.setFontLato = function(scale) { + // Actual height 50 (54 - 5) + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('ADkD8AHFg/wA4sP/AHVD44HHgPALD0OA40+F43+H4wHGn/8A4v/L4sH/5PFj//CxkD/6eFCw9/GooWHh//wAWLgP/TgoWHn5rFCw41BMYqCHaRDKGgzLYKAJgFv//LIhQBAAI7DWgIABU4adBAAJTDn4HCVAaOCQQhvDAYQuBDYaxBgJEDh4HBgYzDPgUDIYYECA5DUDgIHBg4HEEgIHfF44/EA45HDL4xvHP46PHT5CvHX47PDGYcDb4zvHf5AA/AA9wA4yoDZYq/DXAgHDXYQHEXYQHEj4HHXYQHDn6UCA4d/e4sAXYYHCd4gHCXwbADA86DFA/4HGAGA3Db40HA4UDe40Hc4YHCh7nDA4UfA4X/A4U/A4b/Cv7vGX4UB/A+CZ4YaCgf9A4sH+IHCHwfjA4JWDj/DA4s/wYHFv4kCA4f+A4pKBA4sD/AHCG4R9BA4YCBj/gA4s/4AECN4R5BA4f/gf/Mgn///+A4wZBA4d//6JBA4c/VATHEVASUEEwIHEAAbnDAGbyCAAg+DgKwDA4S4DLQSlCSYQHCn4HDFAV/bAX/4ADFCYgbCh4zHZ4SlBR4iSEA46XCe4QHCDgJWCngHOnwHGvwHRG4iFBI4ppBA4f4OIRnCN4MD9+AO4f///v8CHCDoP/54CBS4f/44CBU4f/wYHBX4f/EQLHDh6gB/6jDZQaTDAEUcA40/A4xODYoYHGgYHGh4HGNIIuG74uGz4uGj4uF/gHFh/4A4sf+AHFn/AA4q0BA4kBVgIHEFwIHFFwIHFj7jBA4guBA4rjCA4YuCA4guCA4r0BAATgBA75SEa4wHvAEEBA40DUYIAEg4HDgZ0Bh67BXAQHCZYJMBA4UHA4KPCA4SXEAgQHL4IEBgIHC/AMCgP4CQUDFgIHoIQY3DA4wCEDggHFO4YHB/iHDCQX+gE/S4IHCOIP/U4IHCv6CBA4k/A4K1CEQKpBEIIHDh//HILSDTQK+CAAd/f64Amn4GFgLxCAAZfBSIIADN4heDP4YeDR4Z5CEwN/U4IABg4NBj6ADEwLHDIoQtBVgQuCHoIHDFwIHBe4QLB/14A4kH/i1BeQQuB/AHFn/wA4pLBA4guBwAHELoMAA4o9BA4Q3BgYFBJ4gCCA4pqBvxvDf4T2Bh4HCIIc/R4MCKISfBS4aQCU4gHDX4ioBY4paBNwQAD/6uDAAUOf4wAjO4QHNdQYHYmAHGW4gUEA4kPA4z7BA4v/A4qYBY4QHCh63CA4c/V4QHDV4Y6DV4YHCDwYHDDwYHDv7ODA4MBZwgHBcwL1DA4MfdogHBDwgHB+LtFgf3DwhMCDwgHCDwhcFA4geEA4IeFA4IeFd5AArj77EsCgB/gGCg5QBOQkf/6oB/77D//DA4JrCv//44HB4DkC//n/E/MgIcCRIMPA4X8RIUHegQCBFoL8DA4cBA4QaBv4HGvwHBTgMHHQM+HgIHhF44HFJ5RfGN45/Bz6NBP4SPHT4XnT4ivHX47PHgCQCb4bvIAHxdBMgRfD/58CKgf/WgIADP4JlFR4J1ET4QHCiACBQwQEBuC/CDIIHBX4QtBn+Aa4sfZ4bvCh+Ah4HGUAUHA4d/AgIHEa4QHDwJyCA4eDKIQHDx5pCA4bPDG4c/RIRPCjwuCA4aJBUwZnCRAcBP4SgE/+D/7+ET4ImDA4jIEX4KvFh7HGgbXGgF+f6oAggZeBSgShEb4RYCagQHGh5iDA5QXEE443HADoA=='))), + 46, + atob("DhglJSUlJSUlJSUlEA=="), + 64+(scale<<8)+(1<<16) + ); + return this; +} + + +Graphics.prototype.setFontLatoSmall = function(scale) { + // Actual height 25 (24 - 0) + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("BQkKDw8UEgYICAoPBQkFCQ8PDw8PDw8PDw8GBg8PDwoVERAREw8OEhMICxENFxMUDxQQDQ8SERkQEBAICQgPCggNDgwODQgNDgYGDQYVDg4ODgoLCQ4NEw0NDAgICA8AAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAADAAFCQ8PDw8IDQgUCQwPABQICg8ICAgOEQcICAoMEhISChERERERERcRDw8PDwgICAgUExQUFBQUDxQSEhISEA8PDQ0NDQ0NFAwNDQ0NBgYGBg4ODg4ODg4PDg4ODg4NDg0="), + 25+(scale<<8)+(1<<16) + ); + return this; +} + + + +{ + // must be inside our own scope here so that when we are unloaded everything disappears + // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global + + let draw = function() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var h = g.getHeight(); + var w = g.getWidth(); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + //g.setFont('Vector', w/3); + g.setFontLato(); + g.setFontAlign(0, 0); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h/2); + clockInfoMenu.redraw(); // clock_info_support + + // schedule a draw for the next minute + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); + }; + + /** + * clock_info_support + * this is the callback function that get invoked by clockInfoMenu.redraw(); + * + * We will display the image and text on the same line and centre the combined + * length of the image+text + * + * + */ + let clockInfoDraw = (itm, info, options) => { + //g.reset().setFont('Vector',24).setBgColor(options.bg).setColor(options.fg); + g.reset().setFontLatoSmall(); + g.setBgColor(options.bg).setColor(options.fg); + + //use info.text.toString(), steps does not have length defined + var text_w = g.stringWidth(info.text.toString()); + // gap between image and text + var gap = 10; + // width of the image and text combined + var w = gap + (info.img ? 24 :0) + text_w; + // different fg color if we tapped on the menu + if (options.focus) g.setColor(options.hl); + + // clear the whole info line, allow additional 2 pixels in case LatoFont overflows area + g.clearRect(0, options.y -2, g.getWidth(), options.y+ 23 + 2); + + // draw the image if we have one + if (info.img) { + // image start + var x = (g.getWidth() / 2) - (w/2); + g.drawImage(info.img, x, options.y); + // draw the text to the side of the image (left/centre alignment) + g.setFontAlign(-1,0).drawString(info.text, x + 23 + gap, options.y+12); + } else { + // text only option, not tested yet + g.setFontAlign(0,0).drawString(info.text, g.getWidth() / 2, options.y+12); + } + + }; + + // clock_info_support + // retrieve all the clock_info modules that are installed + let clockInfoItems = require("clock_info").load(); + + // clock_info_support + // setup the way we wish to interact with the menu + // the hl property defines the color the of the info when the menu is selected after tapping on it + let clockInfoMenu = require("clock_info").addInteractive(clockInfoItems, { x:64, y:132, w:50, h:40, draw : clockInfoDraw, bg : g.theme.bg, fg : g.theme.fg, hl : "#0ff"} ); + + // timeout used to update every minute + var drawTimeout; + g.clear(); + + // Show launcher when middle button pressed, add updown button handlers + Bangle.setUI({ + mode : "clock", + remove : function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + // remove info menu + clockInfoMenu.remove(); + delete clockInfoMenu; + // delete the custom fonts + delete Graphics.prototype.setFontLato; + delete Graphics.prototype.setFontLatoSmall; + } + }); + + // Load widgets + Bangle.loadWidgets(); + draw(); + setTimeout(Bangle.drawWidgets,0); +} // end of clock diff --git a/apps/lato/app.png b/apps/lato/app.png new file mode 100644 index 0000000000000000000000000000000000000000..02a4031a3555201deaa5c5cc5a37aba65189d090 GIT binary patch literal 1139 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 A&j0`b literal 0 HcmV?d00001 diff --git a/apps/lato/screenshot2.png b/apps/lato/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..f40495c79a26a8cfb53c699f536072adaf38e8eb GIT binary patch literal 2741 zcmdUx`BxHX7sr)B1#QN}T~SNG4FwY|cdcAdTb*1Ga!gH|+ymTA@XfK*G&c&@3TrI) z&_PX;92XLo%t^BpcP+&baVxD}-ap{|^*!gk=REhG=id9A`^$Yk=X>ki8P}g>HDo0u zBz|_oI(dp?!+#D)TI}mt3;yCDN%V9*AyGF3{UjkF8|CJ7{6f6{TG>c!rR4#q(H}oX z=%ZF1G`)bL%6x@$2@!Z&J*w+9{ne`2_B-qdZgYpWAuM&b= z2RdZ7f&cg_Sn39(INUiL8as0;dQe$%!Jzm7oQl~rXCWlN6+EO}KJRHD3C_-c(?SEn zqq)xv3=1hh7q{OD9so$oWn7_>yCZ;6X5DOdr5%HXdK60&n8dr8LP%OS&ixC z$f`&_&+#hLG4hMmVUW#|f)|Q#orHj}e@!e@cdzL+_9%25-0pP_V-FY>pM1jRNMmjd z-(h8OK-`<%=f5j|aUvR8ow%==t!IblRUp4@xsZqC`$tPI2A{>El42O58oTpSF8MVp zSI6FC8`X{&&+vw8OWTEJs*ED8diL)Cd`VDw=XT%`9Tj?`Zd&bf={M;=ja0{87yw)s z21#kPO3Gc05VfA(nVW2dQH`D_`X@o&X!m^#xf$J*;MKS%3c%m}`0T2yRSAkT5RFApX*G@(G%sImPIaWiYuCIPD-e0tW7BDKS=dj}lV^ltwU zJA<8NI_K0_g`IJ^H!%4Tr?J)z*>&iOqm3upHv~U{#FOk<*Zj8ORGA+kXc5V_nwdCu zi%?m#VWw@WgN`OsZPUDRi`d7z6rx`~njE!WUgBjRIs9y#1C8R*Ewrbo75}6#mIt#5 zRUGjZ*|6~Kw|b7?7(*U+vm2uJph-hyp1_zoh8g}90_NYpoYMG`Z=BQApW%YIH6#i* zVD`@E99(%(aTTW;Zc!h;?+PwWU;JcL)*E6?uwaJo_kl{KlohVwMpv#SHDZY4Lbbh+ zZnd=-0j6*Q1}sncJV^;t3sV^M=AzUB)0-%|`}efxeP`uIP(lamL4`h~ubhH=2KW)Zqnn6p)WfY$2Az_z(b5W|gFr@xM+sB6WOw*MMhq_=(; zdd^#=z0%HLH0QMz1ZNu)(bN%q{EdIiLJck7Tw(>O5p%ciwOZE5q5rOq|GWj%E|Y}y zYym>BzK0#&JaCPx%5qOmrA|Z{!y9(;(ORidRAhNeb>v%bnI;sJJo82_T@$LTsI@#e zlvqIFJ>40*4Mn?b_*ERPNcwULnp*!$^5*LW1u1IkU+fRe7h8IlHd`%JXJh8>g~=vw z9y*rT+>{PYS^T3vprc>I?Ivk9&z$q#Rm32i$=_`Q;MqnzRs8aW1!&^t<8C5ym~Vm^ z54_&BJg&N11@l&tRfsp48_|-qf+blW-k`+6eL_BiyS}&P`G2if!qs!$$;W6(xe(tM zm|$4cc86maFuw}ux86}lqlb})M;a>w>wdy*y$+LW-!Tof<0M25;=kU!;TmK{oS0I4 z_2|8==YEo0yJMhAxDq!JQAB@^YH1$A<_r+>NduI(o~J|0J*v!FGtw2yhPb2RS47f8HWv`HUg9ZKz(%H-lkGC|lG-3D2k40ei? ze`nyYJ7qzm;Oa^Ij3VXgt5zU=!S`j4-K7A_x%lclu_iD(mtNxG2pC?heajJR0`;n{LGcbRZ;V|H20-o|xG=jU zmI%azFbgwD@G0r1(M0iYXl-xSpi_W)KY6wMx3TN;_pL(lHqu7PVjU{s=6uGf?nFS^ FzX7Jd162S3 literal 0 HcmV?d00001 diff --git a/apps/lato/screenshot3.png b/apps/lato/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf135a60bdeb64bea4957f56bbd923fd9ebe87c GIT binary patch literal 2723 zcmdT``#%#38=sxk*`kw8ZYOuWyj@ENG{1H z%VI8*r9(ALDnn&w$FL9^ayz*k@1OAg^nTtSp6B~{et16LU!L#x`DXd~p!V+haSs3h z*z4u#=D&mN{}g!lPH*5&gzbP5*&pQ!cr4VJ1_1Wpz1&U&CWXzFe!N;`ud?gi_V%C+ zlj9>(-Tg+i_dqSL`CxCgt5&ipB{em5bA9}Kpe9`5D!GlxecA~zIBXPJ0sw}$T{GGC zmN?&NroU(yP8sQR7B9%bA>@^DR8PQLB6JO!16w`-?ts#cFik@a(W1#WKoU zp<*&M1y+G3ZL+K4yAEcp{Lz>ZqL1Q9$*+p>UIh7tVw}`$DvD%?_{({0m2*bEreZK9 zf(8lBCrB%~zP;Hd)Q;Pfm+}r+h-pdcyEE9`M(z+5Xv<^$>QXEBXVu@g_!Dro$(AP=!c

cQOwCI~PFrxa zEfk{q(c}a7uPr>;oxv{<^r=Vx$|pWEbP=~^FoiV%k}=YFv$#XALtLlT!29m2APlcE zz7DC~rzm^%Hih8p(&I{?r!8-~+`KnRwRv8wtTbs>Qjx*ePVOsZ0Jf_y2paF?p8`

>P) zP5S>JRUD(PZZWDBACl0uzWUtmmfLc3Aic2Xo6NVJfa+eElH(pmG~{hqh*ISoyri-p zeJP@W0A=?Ejjca=5V;!n)aN{1of0V`X^wm#99>7o5q}#QuMGo-NFN-j?K3Yq$>a-m z+hmm+$`MAE2xAy(J#j**(V3@aYEIIxA-jU((e)NAuR0?i?X!CD4M+ zIETe@L>L+x`T{t=`AP8lz#+0#aBDUp)Rf)SDp(rEumrcd1wqi~g=CM;=hK4fi{Wq} zYN9_ry=lL07g}jvHE241G@)G^JA^pMhRY9J<*Mi|FabpO4}!C%RGZeo_Xpu@BYAt8 zdRDUjCu@Rpbi!0UEr+q}d;uqP2&566idvM$7R;?>QXkv1$1iuglM=2EL<>$ksW&M@ct}=L z7R{|a_5{YNvb8~m%MOe(ieouil%wq8ZOhqwLCtY}fbdt{IX=3(Y!VEeB-r^shfw#K zq4dId`&#mj-){2g9*r->X1G^IEEg0#YEJT6PPUFI;izLx#j2YolcG;Vwk_{mZJt1iF*1DiOnCc5(Z9s1m;`riNTME z9ntY)0?vB9y#jU`^i_L%%_(`|oUC-25QSI8;92WjIe&IbCJUBBfsTop&LUN*Bs7KIM*vis##-y$-tN zLpaA-H{@F%ilyFR{X>@%sSfE0ba#otU*Hyr|9q5!l^|i)Vthey&w2Y$TTaZzOYps2>d-|_&Cq0X1aS%} zMSp2G>KWAIIt3Ivx=J_$9mToaRY{e`)8Me#kBzIcp;k(SQpbOI5io>bnW-~M z!Z8RTzT}lO?>MRDGY@V$y)ZLwojmiv}45eNf7b>Wbxk_MV(ZS^_*ja;kMNqe< zMutymYwPF2T4uQ?p55l{h>a92EJR@L2_5lxapD#iI+B81)*u~Zz{@NYgU2FsI#Ll! zj`k}_bhohBG3g<5#oxcPf5OTxVe`D_%2J-#>u-r;gj@J$y4K-7l8%t|U<|ssjVAF??h7CHYK}KBBVEehMEff#2zHo_jx(IiQ+E;f?$j<2zodyk?dd8Ln&OaW?D} zL4Kx!qimUp8OBCX+P;*nm1}`@IznMff!ZQ(HyQ4c#oI^GmQRGR5yqe6S5{<2pZRrQ zff_}f;BJ3}1lItPu=CbH;y~l9ttKu{eLCN&H#hOC-%Y-zdeB@%;T?2bKKb0T)~v7* ze*LRqu5m^rL%M{VZXEmc?npf{CRHzQnDHi^$SUb%09K6|NWTtD@ zC#rko+qM3w&kZj^ZrF*BV_i~aR6!bXOwD|FpXiF92$~WVOs>DC8nj0_yj#*_?W|D=MicYU6orSoDzTyE^D6x<`|^$jcYmQwUt1~lV10sJHHx~AVL_Y z@gvP3|4Ih{>Gy>tkvsRO0;hVYx=5h!ahz-bu&Bc14R|LYq}xXqLR}=*`Jf+90H`QG zV!t&I9D0-CVhlD=fM-}Z4*<2-4|V~h1kyWEdZhQiBHaRV-;9MsKM^0;Nu2;McOSRM Iu7vb|09r^G=>Px# literal 0 HcmV?d00001