From 5c33007b1064ceb3af14c501003a5a3ac72a69b5 Mon Sep 17 00:00:00 2001 From: Brendan Sleight Date: Sat, 28 Sep 2024 23:25:56 +0100 Subject: [PATCH] First commit --- apps/exactwords/0100.png | Bin 0 -> 2285 bytes apps/exactwords/0634.png | Bin 0 -> 3230 bytes apps/exactwords/1200.png | Bin 0 -> 1967 bytes apps/exactwords/1517.png | Bin 0 -> 3303 bytes apps/exactwords/1616.png | Bin 0 -> 3151 bytes apps/exactwords/2358.png | Bin 0 -> 2572 bytes apps/exactwords/ChangeLog | 1 + apps/exactwords/README.md | 31 +++++ apps/exactwords/app-icon.js | 1 + apps/exactwords/app.js | 226 ++++++++++++++++++++++++++++++++++ apps/exactwords/app.png | Bin 0 -> 1620 bytes apps/exactwords/metadata.json | 10 ++ 12 files changed, 269 insertions(+) create mode 100644 apps/exactwords/0100.png create mode 100644 apps/exactwords/0634.png create mode 100644 apps/exactwords/1200.png create mode 100644 apps/exactwords/1517.png create mode 100644 apps/exactwords/1616.png create mode 100644 apps/exactwords/2358.png create mode 100644 apps/exactwords/ChangeLog create mode 100644 apps/exactwords/README.md create mode 100644 apps/exactwords/app-icon.js create mode 100644 apps/exactwords/app.js create mode 100644 apps/exactwords/app.png create mode 100644 apps/exactwords/metadata.json diff --git a/apps/exactwords/0100.png b/apps/exactwords/0100.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7ffb27934cbc77f2a10a6dd9664474ff9e82f0 GIT binary patch literal 2285 zcmeHJ`8V5%7XPL>!DtBQO;JmfnK@HSXRM=0ycU(JR(pzwEtJ~N&@z<7lA4YhCEiq3 zc}UY(nveuZEYWB>I@MRTlhhvCh<%GBhK85<3*I^J=lS8@&oB3W?m3@xKA&@cz2=M3 z(lpcr06@$8qUUuLHvd%`YO2m`|AbWmDD^tZ9bgO?F9U!^gSY2-{|xMU<^02`Q_y?g zZypUTci1O6t6|JM%qPNgW#19XX9nHnVwqGbJ)Aey{yI$r;d_^Q$ivkE1D)%x0H6BN z0|E4$OHc>SrezhVM;KgO2Y?15Y#V@rsV0DEY}*V@xN(XD2C7`#UW09*wdnxCulIfi zkbief8@RQyrvu~L{A&^f_?nn5fDF|BCjEajjX2KVR2-CBFom}(VwG0Ny~V@8l`V$2 zI@T=4g74VDAtbBC+eV3>RFnIcLa9AnkMGn(lY9WQ$W8ZCH905`+1oTWAJ*qO*gDt; zC`8Cc`u?=J-AC1Yb{}lB=7rSyAXNJn^GZf=_zQanpJvxL8H!KUu@gPt5Ms$yCdm`$ z#%x_Z4g@tk{LTPtO-cbw^Kk#B=H?zEq#{X0lr7cR58KmPUZ#B6`;`@fb>NcHvWLXE zRsN@~eAJFWk3^777f`FY&j!&jT3vS-xj(Mi?R9^Xvwd5dvdl@^i8dtQb?}#E=$YXc z8bCY3Fd#x4#+zN++kc(?C7;)BkoHXygv}MoLwj&P4NhO?Wf#j6As-gnCHs`N+cBHe zV2$Io@16tz{l_AZT;zNv8x!0%lf!)XOdRx9@As(ZvJ4WW7hKHkjB&&y6$V{H9_+lI z5dX0Q#~|aVI*3IK&aROG_lJjdxl7|JAo$vuRAm@83nD7xRpQQ_zRT`5i$8B{;ZULn z=t-(&cfE^4P7)Ob*e|w-?^q+0vcw=cw-MGo1|IZ(WvHD}(Z@$ zD}=#cCAIsKi#+Q_`C_VG*=>;TGoZ zVDb2a-N^@nP1GG)f}a=3N~M=(aQ9@_frwd_KqBlykS7S+M2Xb-m1@@ zKK*SIr6_&bKXjLt<&&B?$1~#Z>OIqQq9xIsXj*F~y0jG4aoZJx%J`6#l_)BfN24cg z*}bh$vK{2U#Wf}N&cO<@<~?qG=P?Dbg7xflMiZ%oD7OMg`2+CScOn6oj(*j})YEW$ zE$+8T{V1dT`6GzYzby0Okm-~(w&3|OyyK&%9Dykajb%Y%dFjmJgn$^Iy4FyZdeU(@ z+U>D*fTJF1pMgISabm00oD{~g z*+yv|IH_70qHf_ZE+Bn?lT|-EFE?+^ zIud2gI8u7=doqGl4BFjUzo6UxK|xa#Siyc$M_RQX>S|9>&9Ga_{8^@4#n84JL9+_U zt_sOvtS4t5iC&O#;c)?p_Umt4HxNUM9ZXE70>gVWvSVtr)|a+m%WtRrFaPn zK+r;YhZtoUZQ~A#x#BgBU-UGHpV@v|N&apQF0#KjyvjmDTyq;N!zcU{mfKK1{Stz< zNZXGkY!$xg1rUiNr6uAZX16n(;JN|ca%y3R8xhvAwsud!fU(V&Ur(3-5nX{r&?Nv+ eheEv5)eiv+by3Jpg3n+73*ddh*OTEMk@sKTJ11iR literal 0 HcmV?d00001 diff --git a/apps/exactwords/0634.png b/apps/exactwords/0634.png new file mode 100644 index 0000000000000000000000000000000000000000..e04ffa9ce49b33c69cb7bfe0dc957b37b4f85a6c GIT binary patch literal 3230 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 literal 0 HcmV?d00001 diff --git a/apps/exactwords/1616.png b/apps/exactwords/1616.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9d301b866598fe8224773dce00ae4288060e04 GIT binary patch literal 3151 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 literal 0 HcmV?d00001 diff --git a/apps/exactwords/2358.png b/apps/exactwords/2358.png new file mode 100644 index 0000000000000000000000000000000000000000..8163f59b2a08f1c6d2d8d19fde45ec0ac9143124 GIT binary patch literal 2572 zcmeH}`#TeSAIHBVR&pvSCF99my3HY^$SH2Dg&b!Nk3+0R(g43*!%VA_<%b6VSY*vZe^A|k7K0iD^eBSS0-q-cMuFrLSUe_np|C!y=J6gk-^4~E?lpDeZRI`uH1F)wZX>09q+kdI}a_rJlqswM zS;?1bK+r$`hdFq6J`@U?qJJnVuui$~AV9C!^1b9K+5boX`v&fIgYC`DO+&%YpADF; zMC=&qG&V+v)PDyUg2tJvDHF(nx+E2@@WtZ+0FR&%H($)Vy8Ou|^mqSGM6ANNo=mba zWUhJUyf+aM{(+(39b;RN2~z z>i6&Ge3(nVFJG#3Kgh46z4uFJyEUdHWrQyy-WybIk0S7lwe%L!7*` z)8vNgsgKR&Hp(i*4rjevYTSL`Sk!o<1Ot&QRV&QU54whtS2ht%9h0D!Wi~x}cU-v% zN{_8uXs0oLnEGPRYdx}>F7Y8Fu{!T(}t&}h0^3lLeuokuxF12nDy z6@Ct3W(^L5~1youd$X7 zlJd=S-oI8JI5!m-e{uEe!z<;7tIM#I4q}~dd!VDo?_U{B$p=lwKg9S!2GbvHQG6CZ z>qTZ{1VrY&L3A7Fb6voFU@^xlaukBSE(#puh9dvj5d*$5koDOu(dEo&&wKLNefg^AfL zJTqgn(CDl?Y*TLKUaL)kYJ3gZ5V2+}d)cqymH^k*xFt>c4Ta))(<|>I)-BZ3i4d_B z6o~Crp19z+Hsxh|>J{7ChzN^4czK6J3^=nzK&|B5qbiHlc)P)J{DbMP;Ck-I>}wBa zPp<*qC>)0oJA>iQ3(4u@?;DVOsRyynEfd+~+@sn5@JmIWBFUJGPd=l*MZ-%MtYSNG zBkpng>AXA_2|?w|SQSkhW0oKxC|;Hx5}B)4-|B&0k8p+rGEf_`9#xX7TWm?de>d%M zKq~TO*)Dfg1zBkUF*Mf6RsBM<17gMm6q%ZZ!;Cx_|i_ca}fY6 zTb}nq66oj#oxchNCQ-LOo=^jUq5C8a%>b*g?%tUl);pxDJQ#rhc9B{=5(>P0-V=M| zLBz~rsna>Y>OUrp*&(?R78>3U0r>|FH0mV(M=SpzQuq(PJz-3SmENifGhNRzU=rLW zdBfb>$RI3n_9?Ojs4FQbj+T^M_#uBUx1wZ!-RwQy&tl*!6}da2K8>0Q53#RV@!3dC zH}LK00dVy_qPn zKv@6yII0W3rKrpM{G^kzMaa@II{E8rmGV2S|9qj8j+P?CH+t|~3=HjXji-{>o z9F}Mf3ecW8Y_j(>9MKZ3t!IzgYGRq|I6>lJpVR87qdF{2y2rHV5q7(+pds)GDrcVu zg=#@1QIuAiK63ByWI~INXsToXnj1r`b*4ZeTuFTo^JhH zC?y}`F=C$l<=R8iVsP@IHXkzDf!kup);c-(_5^3@RoTx<_ocAtXPG8n@m$|`@tTz3$MvZp$=L$a_6CarY8Dgk zDyK=((XeM0O3{@&azd2dA?8ZkvT1p$d05VyN}ImP(nH@8SsU8);nK>0c0O1+m1Z1uZgn4EAYLxCSXA&_ zm18UCM;xXNa0(HlR@Dnyv8=}6-mZwa`ovulCTP;`}QJ3}>jBtXEhQ;wen=o{B?=y$53Nwb9 z6ezRD5_Yk$1jH$|VD^d$yA^fK!o30Z7bC8cbE3W=quw%Q;MYSwOaL?2f69dh51KhF z2u06b14Zja!Ct@Cv^Lo45IX90Yr--lp$2ioYH&dHtCR^e(kam}Bt8D_4{sx1Rwr>Cc literal 0 HcmV?d00001 diff --git a/apps/exactwords/ChangeLog b/apps/exactwords/ChangeLog new file mode 100644 index 000000000..2396003c4 --- /dev/null +++ b/apps/exactwords/ChangeLog @@ -0,0 +1 @@ +0.1: New App! Need to work out locale diff --git a/apps/exactwords/README.md b/apps/exactwords/README.md new file mode 100644 index 000000000..86d39b55c --- /dev/null +++ b/apps/exactwords/README.md @@ -0,0 +1,31 @@ +# Exact Words + +This is a clock for expressing the time in exact words. Each minute of +the day has a different phrase. + +Ranging form "Twelve" to "Coming up to midnight" to "A little after +twenty-five past four in the early hours" + +Screenshots best demonstrate + +![1200.png](1200.png) +![2358.png](2358.png) +![1616.png](1616.png) +![0100.png](0100.png) +![0634.png](0634.png) +![1517.png](1517.png) + + +## To Do + +Add localisation. + + +## Requests + +Written by: [Brendan Sleight](https://github.com/bmsleight/) For support and discussion please post in the Bangle JS Forum + + +## Creator + +[Brendan Sleight](https://github.com/bmsleight/) diff --git a/apps/exactwords/app-icon.js b/apps/exactwords/app-icon.js new file mode 100644 index 000000000..49232b838 --- /dev/null +++ b/apps/exactwords/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")) diff --git a/apps/exactwords/app.js b/apps/exactwords/app.js new file mode 100644 index 000000000..3e7842133 --- /dev/null +++ b/apps/exactwords/app.js @@ -0,0 +1,226 @@ +// timeout used to update every minute +var drawTimeout; + +// https://www.espruino.com/Bangle.js+Locale + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function wordsFromTime(h, m) +{ + + // Tests +/* +// Example 12:00 = Twelve +// h = 12; +// m = 0; + // Example 23:58 = Coming up to midnight +// h = 23; +// m = 58; + // Example 12:15 = Quarter past twelve +// h = 12; +// m = 15; + // Example 04:16 = Just gone quarter past four +// h = 16; +// m = 16; + // Example 01:00 = One at night +// h = 1; +// m = 0; + // Example 17:01 = Just gone five in the afternoon +// h = 17; +// m = 1; + // Example 05:25 = Twenty-five past five in the early hours +// h = 23; +// m = 33; + // Example 22:33 = coming up to eleven at night + // max + //words = "a little after twenty-five past four in the early hours"; +// h = 04; +// m = 27; +*/ + + + const HOUR_WORD_ARRAY = [ + "midnight", "one", "two", "three", "four", "five", "six", "seven", + "eight", "nine", "ten", "eleven", "twelve", "one", "two", "three", + "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", + "midnight"]; + const PART_DAY_WORD_ARRAY = ["", + " at night", + " in the early hours", + " in the early hours", + " in the early hours", + " in the early hours", + " in the morning", + " in the morning", + " in the morning", + " in the morning", + " in the morning", + " in the morning", + "", + " in the afternoon", + " in the afternoon", + " in the afternoon", + " in the afternoon", + " in the afternoon", + " in the evening", + " in the evening", + " in the evening", + " in the evening", + " at night", + " at night", + ""]; + const MINUTES_ROUGH_ARRAY = ["", + "five past ", + "ten past ", + "quarter past ", + "twenty past ", + "twenty-five past ", + "half past ", + "twenty-five to ", + "twenty to ", + "quarter to ", + "ten to ", + "five to ", + ""]; + const MINUTES_ACCURATE_ARRAY = ["", "just gone ", "a little after ", "coming up to ", "almost "]; + + var hourAdjusted = h; + var words = " ", hourWord = " ", partDayWord = " ", minutesRough = " ", minutesAccurate = " ", days = " "; + + // At 33 past the hours we start referign to the next hour + if (m > 32) { + hourAdjusted = (h+ 1) % 24; + } else { + hourAdjusted = h; + } + + hourWord = HOUR_WORD_ARRAY[hourAdjusted]; + partDayWord = PART_DAY_WORD_ARRAY[Math.round(hourAdjusted)]; + minutesRough = MINUTES_ROUGH_ARRAY[Math.round((m + 0 ) / 5)]; + minutesAccurate = MINUTES_ACCURATE_ARRAY[m % 5]; + + words = minutesAccurate + minutesRough + hourWord + partDayWord; + words = words.charAt(0).toUpperCase() + words.slice(1); + return words; +} + +function wordsFromDayMonth(day, date, month) +{ + // Tests + +// Example 12:00 = Twelve +// New Year's Day +// date = 1; +// month = 0; +// on the Ides of March +// date = 15; +// month = 2; +// , ERROR C Nonsense in BASIC +// date = 1; +// month = 3; +// - O'Canada +// date = 1; +// month = 6; +// - on Halloween +// date = 31; +// month = 9; +// - Christmas Eve +// date = 24; +// month = 11; +// - Christmas Day +// date = 25; +// month = 11; +// - Boxing day +// date = 26; +// month = 11; +// New Year's eve +// date = 31; +// month = 11; +// longest +// date = 29; +// month = 10; + + + const DAY_WORD_ARRAY = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; + const DATE_WORD_ARRAY = ["zero", "first", "second", "third", "fourth", "fifth", "sixth", "seventh","eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth","sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth", "twenty-first", "twenty-second", "twenty-third","twenty-fourth", "twenty-fifth", "twenty-sixth", "twenty-seventh", "twenty-eighth", "twenty-ninth", "thirtieth", "thirty-first"]; + const MONTH_WORD_ARRAY = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var words = " "; + words = DAY_WORD_ARRAY[day] + ", " + DATE_WORD_ARRAY[date] + " of " + MONTH_WORD_ARRAY[month]; + if ((date == 1) && (month == 0)) { + words = "New Year's Day"; + } else if ((date == 15) && (month == 2)) { + words = DAY_WORD_ARRAY[day] + " on the Ides of March"; + } else if ((date == 1) && (month == 3)) { + words = DAY_WORD_ARRAY[day] + ", ERROR C Nonsense in BASIC"; + } else if ((date == 1) && (month == 6)) { + words = DAY_WORD_ARRAY[day] + " - O'Canada"; + } else if ((date == 31) && (month == 9)) { + words = DAY_WORD_ARRAY[day] + " - on Halloween"; + } else if ((date == 24) && (month == 11)) { + words = "Christmas Eve"; + } else if ((date == 25) && (month == 11)) { + words = "Christmas Day"; + } else if ((date == 26) && (month == 11)) { + words = "Boxing Day"; + } else if ((date == 31) && (month == 11)) { + words = "New Year's eve"; + } + return words; +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2; + g.reset(); + + var d = new Date(); + var h = d.getHours(); + var m = d.getMinutes(); + var day = d.getDay(); + var date = d.getDate(); + var month = d.getMonth(); + + var timeStr = wordsFromTime(h,m); + var dateStr = wordsFromDayMonth(day, date, month); + + // draw time + // TO DO: Set Theme + g.setBgColor("#000000"); + g.setColor("#ffffff"); + g.clear(); + g.setFontAlign(0,0).setFont("Vector",24); + g.drawString(g.wrapString(timeStr, g.getWidth()).join("\n"),x,y-24*0); + // draw date + + g.setFontAlign(0,0).setFont("Vector",12); + g.drawString(g.wrapString(dateStr, g.getWidth()).join("\n"),x,y+12*6); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once/, at startup +g.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/exactwords/app.png b/apps/exactwords/app.png new file mode 100644 index 0000000000000000000000000000000000000000..582cb2e0853a5a2899a3afbd7eb19cde2ee7f6a0 GIT binary patch literal 1620 zcmV-a2CMmrP)1gXjloC|3_d8m;N2OpV(|i0q4YwBna<2! zK9thw%-*|urnNbV{Gax^?eD+#{x0kLJ~)lj_;W+1>qV*k8akT^^dvctZccUyj4}H~#M%Wwee_v` zHMv7o%BM8@dBrLshn{wGD9BDl?^eV5vSM3T96;NnHvtc6La=(qzq)xrX1d8bK-TN- zrd_f$_O`9nEmS+_S7HTXK<&u;LDIW|qlN&KJvM}tt6TVVqL-AvNv`B*{NzNpBfSQwQP5~Sf(Dp@Vq1+3Q`N9wBQN2`J_?M^u0FIMlt?p^8 z%U3%80kIwg!T{E9<8J18S&$k1`eO)@HP+=TZKo(z3_A3VFYJB=sn`2^Q$mRE>02(+W)np;)L1!GUvU2{O{<&F_nE6Qe#D~Xf|dD z+?d3-D1(IUiL`C2;PPv4CKw8H)v7h8^obJ&Z6D0CjVUe8Xq_NAymxUyPAMU^CCrIu z%1M71EC`5o2if_~7E&h??0jeQ1Y3N6p?}G72FmS*)xQD)%wBE=2tW6@(+MTi!fk9H1pWKew2(jTXVu4%vk26QvSQCbGmk`Z)Y! zBIhh)6vG2)h6mF8wC^|l$M(Eo9D?JiW}=_T2jUA>LC80foTera{^p)Wi`>}Gf;(|ZwEZQ zS^k|*9wyt=f4ZOo!xty7{%}HKD9tBZ50g$=%v&&vMa!#@Nsf>EkEEDA*ST6fiC+An zsNK1#>!x0obq@j$QqYU-ad3ZvbjqUU+%iw(0WahgmHV6yeLWqoYkSl4pzFQ(_Vp&I ztO{WI-48rGLwQb?#vgVvduyd9_6W)rFRoQJq3I(J?{Xmin45#=3l9BmL6Bp<*MZej zrsWN7oRPUr7IvrHoIHOjS=gPTCw>d)^LQK+B|=f2qbGjrWaOd5D<<9Dv>MTW0X3z> zyPy}9`<>1~?NCx@m8G$_@rRTy5zH12YM&P)=tU+L^fgY z^0Z&_6^qdVuwgN3wt_Ze(10?J@%{C2grBk42hsu74qEo^nd&v`X`IHN9lrxzS~GeF S(*#!l0000