From ce0e50ed949eeffc97bd2ec3db1fdb38830c3e4e Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 26 Nov 2021 20:25:28 +0000 Subject: [PATCH 01/42] MyLocation - adds menu to set preferred city or setup from GPS --- apps.json | 15 +++++ apps/mylocation/ChangeLog | 1 + apps/mylocation/README.md | 44 +++++++++++++++ apps/mylocation/mylocation.png | Bin 0 -> 1909 bytes apps/mylocation/mylocation.settings.js | 73 +++++++++++++++++++++++++ apps/mylocation/screenshot_1.png | Bin 0 -> 2847 bytes apps/mylocation/screenshot_2.png | Bin 0 -> 2642 bytes apps/mylocation/screenshot_3.png | Bin 0 -> 15562 bytes apps/mylocation/screenshot_4.png | Bin 0 -> 2818 bytes apps/pastel/pastel.app.js | 30 ++++++++++ 10 files changed, 163 insertions(+) create mode 100644 apps/mylocation/ChangeLog create mode 100644 apps/mylocation/README.md create mode 100644 apps/mylocation/mylocation.png create mode 100644 apps/mylocation/mylocation.settings.js create mode 100644 apps/mylocation/screenshot_1.png create mode 100644 apps/mylocation/screenshot_2.png create mode 100644 apps/mylocation/screenshot_3.png create mode 100644 apps/mylocation/screenshot_4.png diff --git a/apps.json b/apps.json index a7a74f4cb..8b1fb586e 100644 --- a/apps.json +++ b/apps.json @@ -4456,5 +4456,20 @@ "storage": [ {"name":"timecal.app.js","url":"timecal.app.js"} ] + }, + { "id": "mylocation", + "name": "My Location", + "shortName":"My Location", + "icon": "mylocation.png", + "screenshots": [{"url":"screenshot_1.png"}], + "version":"0.01", + "description": "My Locations adds a menu in the Settings app to set your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", + "readme": "README.md", + "tags": "tool,utility", + "type": "app", + "supports": ["BANGLEJS", "BANGLEJS2"], + "storage": [ + {"name":"mylocation.settings.js","url":"mylocation.settings.js"} + ] } ] diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/mylocation/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/mylocation/README.md b/apps/mylocation/README.md new file mode 100644 index 000000000..3b39aa947 --- /dev/null +++ b/apps/mylocation/README.md @@ -0,0 +1,44 @@ +# My Location + + *a adds a My Location settings menu, stores GPS lat and lon of your preferred city* + +* My Location is a service app that adds a 'My Location' menu to the settings menu +* Select one of the preset Cities or setup through the GPS +* Other Apps can read this information to do calculations based on location +* When the City shows ??? it means the location has been set through the GPS + +## Example Code + + const LOCATION_FILE = "mylocation.json"; + let location; + + // requires the myLocation app + function loadLocation() { + location = require("Storage").readJSON(LOCATION_FILE,1)||{"lat":51.5072,"lon":0.1276,"location":"London"}; + } + +## Screenshots + +### Select one of the Preset Cities + +* The presets are London, Newcastle, Edinbrough, Paris, New York, Tokyo + +![](screenshot_1.png) + +### Or select 'Set By GPS' to start the GPS + +![](screenshot_2.png) + +### While the GPS is running you will see: + +![](screenshot_3.png) + +### When a GPS fix is received you will see: + +![](screenshot_4.png) + + + +## Creator + +[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/mylocation/mylocation.png b/apps/mylocation/mylocation.png new file mode 100644 index 0000000000000000000000000000000000000000..7148990a42a1c8858d933d2a4cb35b80123a5505 GIT binary patch literal 1909 zcmV-*2a5QKP)1f{oIeq9#IX zOf{({O-*cUKk%VRxp+%YMPU&efj|3B}%Gtc{uFh$VRFTVr&05N+hmOTqw5{SsK zRq^~hp6S9jhcVu7mJ0i>}op)z!;xQ{&^&`R#GVwH9WEaeQfJ>BoptFh|R8ypn@@g4s~Z+ zAOYPL+%Al}QXb#%&nSE%3DC#3-bG{mOV}Y--E|?8ANqHT!{ow5VmbiFlKYm+Yg=}jras6GBg@72L>|d5wlEoY`!pQ*klg6p{<$e z$#!B+vczB%x_gHNTpqkfI)1CXn97GaO}wJx(crv3fxPd-g^QPyJirPX+zpdCg^qxx z+HRqt@!gU}&xek#ArY4!IV}HL*|GI}Ifw8OaN;kPoErn37e~l@O--0YqB?4}jo;XW z*U%8=mBiSa!W_zufTp%x&$Q$*##94z^*}BUmc@nj>xj>20>D?LI9MS6!ACTmJw@}W zPjPbDl6>wJS1@?fHzeuwyndoVNc@M_IV<<#JS9jLwtYTe^dcPFZP|{G#NA zlgSN{2MP=3kB|pQ=anAUMi(und(mRV7+O9)PRobKFmvbPee)(_Gnx?~K1@36D!HN| zS5(~V7IWpn{S!nFBaT@20KbkVz;V7ka%>d(M#~j{+-=jB^-&!?SIeSj(PB=tUQ5!k zSUh92Ov)9N&a{tbv?PbILn;!{`^pIjoCBIlH4$@0Z_e~!=%m%MmQoabrG3DgK)wPj z(^M+(Vh2xRNvvr}{R0V3DRW1-p-)Eq3plK9B6Tdbwq%Z^|H#*Eeo|Ca)kc3|kqQ{}9i za){L#)Eq3JXbu73e@4gyARh*`1`D{VK4fhn>?vm| zUkgcMFSt8_dAjvflrXX3}lk(J;L2)mG{uD2UIU%<)dn04%Z zEU)a#GDqILT9#&60f4T3HS0f@UoEZawVs}5zn+It; zdy05}f2An_o|m1Qe_YO3egpt4e-p;OpMX&aLZYviL|-qn{&AGzv_{fbwj#|<)So#+ zqO&6k=}X9h_hgvEXk8A+is_A_SuwHg<-WKLC`J%q##516Wri@bM_#-pp+b46X zY+vZ7kIu)_zXP*srd1hwu>7xwE#@y_@(}=J`&0ix`2m%$U21`%`amV*p+W%wvTO5x z;F+pvRoszmlU-Y0tJJ+>0RVKIco>y8B9p2V!U1N)9*q_f5&DyjEjZR+for11PJ&PI z%yN0Itv52fIQpwCdv<~ZK{z!JVy{A8q8gjsZ+0gfxxXiC>NABhx4bH?2lq4Q zgK!ZSufKt_x339aD2(DTqT80vkG~=!p>r%WONZ(l9n_B#jQ0IcjU&x&LnG%_t>)Zqt1BlDAiAc(cJB&x2{WGTFW%7{v){1Cd|LGtdNV$Q1rxsO zqDp*V00i8|rf9@RleF8mSrIlTCe3=LS63z+-Bahtf^q!F6_u=O$a{+G>s0Q6c>=#T zmiO?o`St$_bFBEXobD{%;>7Hq#T{;TET&slX{Z98uXqMLqxi%Bc~>b^wn3H#4hy{I ziTBF#1@-@~B&e!Qn=`6)^!VSkExB1lz9JT_7Bt(I)LTMa1WN!BB;y)72K)iQ2g!hT vfnGqRQ;-viIVr;N(+lDs-76CL)93#HbI`dUZ#9t@00000NkvXXu0mjf9c-jw literal 0 HcmV?d00001 diff --git a/apps/mylocation/mylocation.settings.js b/apps/mylocation/mylocation.settings.js new file mode 100644 index 000000000..6936e9e69 --- /dev/null +++ b/apps/mylocation/mylocation.settings.js @@ -0,0 +1,73 @@ +(function(back) { + const SETTINGS_FILE = "mylocation.json"; + + // initialize with default settings... + let s = { + 'lat': 51.5072, + 'lon': 0.1276, + 'location': "London" + } + + // ...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) || {} + const saved = settings || {} + for (const key in saved) { + s[key] = saved[key] + } + + function save() { + settings = s + storage.write(SETTINGS_FILE, settings) + } + + const locations = ["London", "Newcastle", "Edinburgh", "Paris", "New York", "Tokyo","???"]; + const lats = [51.5072 ,54.9783 ,55.9533 ,48.8566 ,40.7128 ,35.6762, 0.0]; + const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; + + E.showMenu({ + '': { 'title': 'My Location' }, + '< Back': back, + 'City': { + value: 0 | locations.indexOf(s.location), + min: 0, max: 6, + format: v => locations[v], + onchange: v => { + if (v != 6) { + s.location = locations[v]; + s.lat = lats[v]; + s.lon = lons[v]; + save(); + } + }, + }, + 'Set From GPS': ()=>setFromGPS() + }) + + function setFromGPS() { + console.log("set from GPS"); + Bangle.setGPSPower(1); + E.showMessage("Waiting for GPS fix. Place watch in the open. Could take 10 minutes. Long press to abort", "GPS Running"); + Bangle.setUI("updown", undefined); + } + + Bangle.on('GPS', (gps) => { + //console.log("."); + if (gps.fix === 0) return; + //console.log("fix from GPS"); + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } + Bangle.buzz(1500); // buzz on first position + Bangle.setGPSPower(0); + save(); + + Bangle.setUI("updown", ()=>{ load() }); + E.showPrompt("Location has been saved from the GPS fix",{ + title:"Location Saved", + buttons : {"OK":1} + }).then(function(v) { + load(); // load default clock + }); + }); + +}) diff --git a/apps/mylocation/screenshot_1.png b/apps/mylocation/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c61b6b35272dabcd77f7262d0ae6a2e9099057 GIT binary patch literal 2847 zcmeHJX*`sT9(`tdj6tJeh#^Z^do88mZD>N4QI)x;T<^E+#aA~Xs}2G@$ZgN9v2Y>jlqEg*DD`m%hRa;pL!7t{o6EBwJva6|zJI&ao4NFi8B2XU@d}{= zp^OCpEOgwB$x!Dv<8+vdo+`;DVb(U%`kx4sX_dY85{s(6|Th2LvD>&(-3GSCz) z5HCz4o0oLfU1=p%E76aq4(hkxcl4j}FOM5ilTpu>I1-2N#=}LG^=rR1`(H4!ps$;3 z)&KHGxMe{7N-esDREc7VlZqs#U&W(BbHvZB^M6H#Z(&1iHU?i{G5zi3qOrg@e@mZN z7C>M;_6qu;Ov=@ov5X?!ZYienws0{MHMK~}$$NJ;J|zKu3a!7(kxSHvigBmS4KNU8 zahM-9B5L|cuCjm^wd;|oI)|Dw$@=&~Dn;=YR4!_?q)4iDTe%2!Akl7%3scBK4bqXI zPKbPW5+8jiP^TrLD6i*6GT=(t=i?`93*u7;4`zyT)9Sy8n9_gIWX?`k0;yxL%2ljV z>H#HT7q<6d$GE4d9=vq@f%WTzIVwH1@HF|20yHl7-chDXrfB>0l@V(Xnqc}1g|Kcj zx5CW$^JCp^I#HJ7a3L@ZosecKx1b`zKHW$1tyY z{05Vg_9{TCM$J5shE@YhzfDTHXoXqyM41sC6P8(*raDSF>TR=)`QVx|UE`@{Y!cvl zy;$39Kq_{Fv6BBPOS(Kv{oUuXR#RTOuJ-Zl%JrTDWszD&tG`?5ijukS>!<`Vf9-s) z%L5}$!3S_hul7HeffaXM9r>AdKsz7d=I070P^WEm7Ro?8Om~C!(z$3@WMN8;L*b~n zJor{(D&S_iIRR**vc}jAwUUCYNuMFglV(}hzEy%lnB{Xb{oDq^yZ2E8GD2c+#CZ+y zSq-%3zWH_h*!FG`R>L82OB4CMQ0GgG7-6kv0_F4DVKENX`Euzf7Tg@>=Cf;9}(zL5P$QoqbK@*6TtI}#kBb+4&F9@MKFpy@*J&FD#DS~VuJ4*I%)j& zjSlmnx?^mSDR>18zHG{qJ$PO#u}x1mAppz;{4N@9+cqVZhzHXu?zyiKx%;5~=pL<* z%`&g7D2dl1i0M^q;qrPy2BR_=;)fgiwi`^UOou-h{g+6Uo?;d4eAGlqUf zk({3^)j!)^4lVF4RB*`HHKbr{t;92OPVFV300|t9^+spUsv9;F!7j9j!Y~K}f>Fdi z1)rBM5UeM@Gvl)I1D<yaBs<35`#$y^#nUgB&*xz^@?k02L_ znmf6R+YPqVF8I;fM1X-D?a_>}>usxDN@^ANy~zZ!zj})7Hzxkiz9Gnf5qY7s~*|QVS-**z?@unQ?(Mg*^>FPM|1^ zmpGMH)d$P+86H%4vfUeZU+%_Pd+!8Mq+%0astUwVI~9;GG8G-5sqg3GqwCi7P&J=H z{RidF+IzwK%dc<3ndn^UKdiju?)b%2g_LqSZOO0SV_Y!>ScWgAm89qBgDkHrm3 zzirzsPj8<%aG?G_J5*jkR7Qn(2G*^F?cZEpHBj|vNdh)|5P|K>eRDOr&57M+sKeifi_28K;!Vp&P)rX}koxrrOiIgZ5hCeJ`FA4I!!@!11Oc4f)#)!tSdtQIu zx=F_N#MaFwQ8l!s(AAU*GUAGlTJ+}{3ArnbNFqYN-4J1pt81Z5pU>?Km~PVB!&o?E$8EO7Go`{@cfuwSIPV-jk9_1|Vi;3bJB)z#gd8ffgV?^dm-$2WhH-CpaG0?ZOf5}ve*bMmcJ$v!E++BJ5t?jj| z$*oV}wVOf3Qnc$L7hK1XXzq)#L>m&_ctAE>t@`yd*4Z!k~ z3a}orGZ-3t7GtKhs~+cqL&x)7(gfyoVw9o5mQ04`Z2(3VqmY8Fz~B6huf^CEAt#x; Pix)U!N-|*?xyAkq*A-bw literal 0 HcmV?d00001 diff --git a/apps/mylocation/screenshot_2.png b/apps/mylocation/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4404540ffebeec33f1a4dbdcdd560d25fbf936 GIT binary patch literal 2642 zcmeHJ`#;l-7oU&G$iu8uQm&1jgrv(Jxg~d%9#3SO%Q8%+2xYdpOv)v!DYpzI)%WW* znIRcVM2SV&a*2J7q-|}5nWxmFKjQoS>3d$UbI$91Ugw8%-sg2*uXpyTlkUH%Z&wF_ zK)-oXdYTX{DIX@@v(?yeSo-tz zdn?Jv{mtkCi#0@;{1ZKN7wG`v`Rk=GzbrEqO867d0;deW9G3V1kX(q>2@oZuoh(ZD z@r7{f@&ne0tH4(*)$Tw|<;|4#K)&ne7v{%pYKwBbv$gB@SW!*X$+0P&${tmeJOj|r3?$L!4T(_Rs^4Mg7Oni$!3J(Bdv2PFT%4{W(F;k; zrHc5(4K3<33(@9d$Y^j&79(|1m=P%WXz9Y!IA^g$O)5!ZY@LJ=(8>nIP5f;js;Fbb|n{LHB zrsVaP>#o+TFXWrZ@>wh0PMGpL{-&d_^x~vCuUK*x2+%q!toDNtij$aY;TtO8{i`Q{ zQP`sMk+1IyKvvDuO?6V6-Qbi;)O1`mggnsH$-M(rBu6C=(1Q2Giq^O$=VFfdT&-Ez zYoEOByl~;k!@n3g;Tbj3~MqIgFV)hLxrQ759}r-RmDZeIG6)k&~z?b#|j;aYQVUaKDU~Ta4V_cK-Xcch~rsBHQ zcqaDS*mqLj2k{sIH{+jsMv0W0mT>t52592=sZ*ZrFfW~?NpZVcX#nNCF1^a7? z6m2qa|FIC;*y1Sz^>Tmwr_4fMmoO@+WnB`t{$4);jqay zCXV>5R$Ale?|J z*xk)Bo8~Pj=9m}<%e+RJzzX@QTHB!knYCcbVKSK;ENKWxOvru zLZW!d@Om2A;9Y_FF$}(lo9<2*sr6U(gsVrtxG>kQ?`U5FkA3k3N(;K~kCrwl!?=5z zaQ!|7mX8M13}gQY zg`I{u3B1~SEX`v7w(POSOW}+C8|~)q8Buc6aQJx9alZ+!#mKzq7MtxWy^>+_hrVHd zV1Zc<;?Gg}w;5T7)+A|Xfo{NO?tQiT>=(q2F6sBk2?J|4m6qKoW!BKV;x@RhJ>N?= zTW^a(Tr-yPVHG>l*K)5sh*>Qit@V)9jGt5^2bNIx8W}5-tn7nH&Hh2?0ag6l_r+ay z-dRkrKh7kEeo;BHFm_E?q^0vUMe6KQV57{iy4jwoo!T^^`P08?R67F0a^uf3?f!K; zsmsi_2+H65!xE{js4mdnov2N@n5!LYVbo+07LbnW>$~<6nYb&BlUP?1dz|*-L6szY zoqKM7ju* zvH-IAXr9NTeM;cqHblapX(OHUs`K)2sXDN6{fn+% zKgN#+994d_uE<5rjF7UjZ>_!gJyFZ^EBaG`)2DGH1q$mRoX@V^ehgqZIH)c+RCsn-8>YCi8^9t1e*ku&Et2^~6_IWCx0k zEmp@A&l~!PzpQ~5`vEvA_9;OKka$5RqQ~~TYGv#eo3#ms4X#fn7QRB{kGO<|oN5zW z=Be2=ea_i@Q7?R!9(k6HMYLT1a8wYDOYLFC%n)syX0eXO!d%Y8WA=N^S}S``l5?w9 z_}pU3CzlH|UM!>;fvh*U=UQUK;=U|0SvrA2U!qwDbfX@jY-D5aD%SFIR|$6wN>MxP z4hD4Otr;jJGH0 z$EfkgZKIa0eKS1JcnzG-OiLv)eTC3^A&sbAIsJazTUjYGK?&UE@ zyuh93&rM@7>jL3Yr)0O)xBA%$SUAQPfb8u((G(3p=qGLw{*V5bOr$EkXP_#pj;2kn Pi$sv8>q(aeXH5D(w(Zo_ literal 0 HcmV?d00001 diff --git a/apps/mylocation/screenshot_3.png b/apps/mylocation/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..81570670b7988aa92f6e6fedc007c5bedc2a387d GIT binary patch literal 15562 zcmeHL%W~sJ40Nhe<;(s}t~uqHs{I$;{9E~s{FH<4#%n}TA|;M1TjqGl!8CwI4`$@Y z{`K?UKi@e1w)YQv{;{v$-hK!6$>)>Pr>#CQ*6@#WoE0yWU{?Dqgkr`TnlyoyE%@@9nKlCQr&W zU!R-&+fJ*Za6KVPFHGW919Y$bT}d0PS-h*IA$!I+h<8D=0G<=SpjiOV@%}nl{P6R- zV(a$!)x{2A3faG($jr~3xJU%^NnVJI&zR&6(%_Cy;ox|*n98f3a?jCI*F(LwAC`Zl zvHO+4K2G4ZO4MXkq)?^fET7hUI4>K3BQK?DhYNP~aPJzkc>6)$(nPH9V5{mz*38VF z#hV588ck#~_p-G3V^|uYn-h5Rwps~ZG}MSE%JRzUCNKt}5$`eA(AH+J&SiKBY(!dr1$H1mzBN*@!w&t zZ&_YYh@f*o2svWj8!ev13tFf4o2c4X>LA)5Y(RHbh~kO1*IZt-%j&YU>f-$NmG(riPj^|~Id_&##Hn2MJ0C*fi z8eW=RZ|CZE(AaD+_X9|_BMn#h;+=Ww@4{aIBU^ZRZdom`nX8cxVk)l%Hq-p$Du4xA zOrzBTn;A4cmhLg8yMHO0_rv$n?~0)GVp%&5i+9dqY~9~zKxT#w(1udei)FBtwa%+} zC+WFP!b#tnZ}EDD2V6yT)ag>v^Ss!qnq$SQV%J+JLTp65s*)jbC6Y7aj^t&1XrK(1 z4M-?lu0Fh2#-m^b6gI4}p%`v)dXcwCDIH5)Bp6YTGhKm7O@D{S_tbMO>?K|tSyNZk zWerNT@Tyn47y@VU4n_LH8_}U_yB+hjYkfV7_f|#Ky5)Hddxlq+-!gSSAfRmA4&9Kv zC%$C(J+;$#qjG9Q-l_5?55P?@)RfzktQ8KMRPx-};A zTFF%9(qb)L4vu;aO#Di;>z%;Mnmj!_AMoF@>4Bv5QftC+4TDS!H~4toUTdvoin;Gi z9@m>|Gwx^J_jaCUGs!d82-N}-q4MiyBSpGqB4U^uEK*+NJTy3We3>} zFd`dc3vX0X#`rchIGG8&rH&=MtST*4$4)Tc*E^pV^y_yIV>>h26<_5@zwr2+cl`H_kX>>=F7LB=ONaELox)OiA{G0{8v3gXkt{Fs zg3tcBUXubwsUEdIQdxfJy?k7($#Zy1FSSbX@GdP|Eb6sByk{Sd+dZx uGlus8FYwx9qjPmTbG8`H#n5hV$-NiTxw?HXXNzyv_epd!#}*;qB<4S8=}L+K literal 0 HcmV?d00001 diff --git a/apps/mylocation/screenshot_4.png b/apps/mylocation/screenshot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ffae679c9dd8828f966f5873891f1d6e51961248 GIT binary patch literal 2818 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 '' }, ID_DATE: { calc: () => {var d = (new Date).toString().split(" "); return d[2] + ' ' + d[1] + ' ' + d[3];} }, ID_DAY: { calc: () => {var d = require("locale").dow(new Date).toLowerCase(); return d[0].toUpperCase() + d.substring(1);} }, + ID_SR: { calc: () => 'Sunrise: ' + sunRise }, + ID_SS: { calc: () => 'Sunset: ' + sunSet }, ID_STEP: { calc: () => 'Steps: ' + stepsWidget().getSteps() }, ID_BATT: { calc: () => 'Battery: ' + E.getBattery() + '%' }, ID_MEM: { calc: () => {var val = process.memory(); return 'Ram: ' + Math.round(val.usage*100/val.total) + '%';} }, @@ -169,6 +196,9 @@ Bangle.setUI("clockupdown", btn=> { loadSettings(); loadFonts(); +loadLocation(); +updateSunRiseSunSet(new Date(), location.lat, location.lon); + g.clear(); var secondInterval = setInterval(draw, 1000); draw(); From 070558a0a62027fc67e9d54b45ef81e2166d6fab Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 26 Nov 2021 20:48:27 +0000 Subject: [PATCH 02/42] MyLocation - adds menu to set preferred city or setup from GPS --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8b1fb586e..dc5d748a8 100644 --- a/apps.json +++ b/apps.json @@ -4466,7 +4466,7 @@ "description": "My Locations adds a menu in the Settings app to set your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", - "type": "app", + "type": "widget", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"mylocation.settings.js","url":"mylocation.settings.js"} From b426c479a32595b592acc1eb68a202e3ed5f0c17 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 26 Nov 2021 21:29:46 +0000 Subject: [PATCH 03/42] Pastel added dependancy on MyLocation app, display sunrise,sunset times --- apps.json | 3 ++- apps/pastel/ChangeLog | 3 ++- apps/pastel/README.md | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index dc5d748a8..1c4b074dc 100644 --- a/apps.json +++ b/apps.json @@ -4085,9 +4085,10 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.06", + "version": "0.08", "description": "A Configurable clock with custom fonts and background", "icon": "pastel.png", + "dependencies": {"mylocation":"type"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index 6bfd2ce59..2ede0e161 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -3,5 +3,6 @@ 0.03: Make it work with Gadgetbridge, Notifications fullscreen on a Bangle 2 0.04: Leave space at the bottom for Chrono widget, set back option at first option 0.05: Added 2 new fonts -0.06: COnverted fonts to font modules +0.06: Converted fonts to font modules 0.07: Added info line that cycles on BTN1/BTN3 (or vitual buttons on a bangle 2) +0.08: Added dependancy on MyLocation diff --git a/apps/pastel/README.md b/apps/pastel/README.md index f183005a9..151837a66 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -8,6 +8,7 @@ * Has a settings menu, change font, enable/disable the grid * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) +* Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location I came up with the name Pastel due to the shade of the grid background. From 21fe6e7ea486ee553bd1bac8399d153c50171380 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 26 Nov 2021 21:52:05 +0000 Subject: [PATCH 04/42] Pastel added dependancy on MyLocation app, display sunrise,sunset times --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1c4b074dc..f659fcbc4 100644 --- a/apps.json +++ b/apps.json @@ -4088,7 +4088,7 @@ "version": "0.08", "description": "A Configurable clock with custom fonts and background", "icon": "pastel.png", - "dependencies": {"mylocation":"type"}, + "dependencies": {"mylocation":"widget"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", From 3fbb46b046c65d8d9f1a37b600bddc0ee1e16e03 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 27 Nov 2021 11:23:03 +0000 Subject: [PATCH 05/42] Pastel, recalc sunrise,sunset every hour --- apps.json | 2 +- apps/pastel/pastel.app.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f659fcbc4..322a90d96 100644 --- a/apps.json +++ b/apps.json @@ -4086,7 +4086,7 @@ "name": "Pastel Clock", "shortName": "Pastel", "version": "0.08", - "description": "A Configurable clock with custom fonts and background", + "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"widget"}, "screenshots": [{"url":"screenshot_pastel.png"}], diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index 8007ac031..aa4f6abf8 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -23,6 +23,7 @@ function extractTime(d){ var sunRise = "00:00"; var sunSet = "00:00"; +var drawCount = 0; function updateSunRiseSunSet(now, lat, lon, line){ // get today's sunlight times for lat/lon @@ -175,6 +176,10 @@ function draw() { g.setFontLatoSmall(); g.setFontAlign(0, -1); g.drawString((infoData[infoMode].calc()), w/2, h - 24 - 24); + + if (drawCount % 3600 == 0) + updateSunRiseSunSet(new Date(), location.lat, location.lon); + drawCount++; } // Only update when display turns on @@ -197,7 +202,6 @@ Bangle.setUI("clockupdown", btn=> { loadSettings(); loadFonts(); loadLocation(); -updateSunRiseSunSet(new Date(), location.lat, location.lon); g.clear(); var secondInterval = setInterval(draw, 1000); From 38c6e16010837c73e32022bb7ce999402f1a44b4 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 29 Nov 2021 16:29:34 +0000 Subject: [PATCH 06/42] new about pixels --- apps.json | 2 +- apps/about/ChangeLog | 1 + apps/about/app-bangle2.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index d59636f57..925d1f655 100644 --- a/apps.json +++ b/apps.json @@ -135,7 +135,7 @@ { "id": "about", "name": "About", - "version": "0.11", + "version": "0.12", "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", "icon": "app.png", "tags": "tool,system", diff --git a/apps/about/ChangeLog b/apps/about/ChangeLog index 03e920a9a..f5638fdd2 100644 --- a/apps/about/ChangeLog +++ b/apps/about/ChangeLog @@ -9,3 +9,4 @@ 0.09: Actual Bangle.js 1 pixels as of 13 Oct 2021 0.10: Added separate Bangle.js 2 file with Bangle.js 2 kickstarter pixels (as of 28 Oct 2021) 0.11: Bangle.js2: New pixels, btn1 to exit +0.12: Actual pixels as of 29th Nov 2021 diff --git a/apps/about/app-bangle2.js b/apps/about/app-bangle2.js index 32e5bafae..978d36193 100644 --- a/apps/about/app-bangle2.js +++ b/apps/about/app-bangle2.js @@ -6,7 +6,7 @@ var ENV = process.env; var MEM = process.memory(); var s = require("Storage"); -var img = atob("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"); +var img = atob("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n/2wAAABBCQAEGEmBJFoAABIoooxwgPoAddoCEkFFFAEwwAGwAHJIIJBAAAG2AjDAG/n+AABBBBAggXi3/xI13/////4AAABICQDEk0mBAFqABIHCSH2wkgw4FDCCHnAooAoGAAAAAwFttGAAAAGGAkkkkn/ttrADAAAAAX6nPhStv////+mmbYBBCQZY2AGAAACABIoqSookEAAADFCSEnbbbAFigAAAMEAFA2wAAA/q6gEkAA4AAFBBEAkgEHghJiR13////880cYBAIDLLAAAAAkCABAHCSHCAkBBHAJKCDbFArAAEEgkIMkAFAGAAAAvq6DE8AYGPOFAAEAggEUiOOIJbf////+mmbYAAABZZA2wEggiQQQAowoAQCBIHBICIDAFFYA2GEEENMEAFAGAQQYtqSw0kDDAHAFCCEYggcHgJxIAfb////840BJA9FALIAAAggkACCkEnAHACopB/JJJJDbFrDSww0AEAIwAFAkgSTZJmBwwgjbGIOFBJEYkgcAAH/BpbbAAADAAmIQHFoABHMkkEAggAAgkgggEgEDbG222PvvFdCAwwwBJJIAAAAAAQQZBgB2wgjbAAAADAAbADYAUg4FFkjAAHDgE0IQA9FAABMkgAAgEAAkEEABJJJDr2GG2PvvFAoSDADBJJAAGWAAAoABJgBwwAAAAAARP8gYYYYAWg4FIijbDDbkEmQSQAAAAEkkgAAAAgAAAAggAAgjb2222PvvbDbADYbBJJAACiAAAooBhk5YDH/CACCBP8gbADYAUg4BFkjDADDgk0gQQkgAAGAAAGABJg2AAHEHAAEAF2AA1PvvDbAYDDDYBAYAGWAAAoEkA/ADY//6CCARP8gSQAAAbbYAAtrADDDwAmgSQAkkkAYDAFGSIkGAAASkkAggA+228N//AYDDDAAbBAYAbYAAAov/gA/DY446HCCAJJFQFAEkAYAMgSrDDDDSQMEkB4AAwGADAouWIIGAAAW0kA44AFotBJASbaQYDAAGxYYYYYAAos//8HAYD446A6AQABFQFAEAgbYIESrDDAbQBIoQYEgGAAYAYFCWJBwAAASkkAIIkQDAADbabaAA2AAABbbYbYgAtt778AAAA//6/6CAABFQFAEAgYYIEtobAAgSIIGABAAAAGADDDH/JBAAAA4A4ABAigFAASTiaahABgdoBAAAAFtAAAn/gAAtoH/CQSAQIBFSVAEkAbJMgJIBJEgRAIqSA4gAAAYDYYfnAAAHHAAH/AIIkQBQAATjTThABgYqBAAA2ttoAAd8YJAAoA+2SWywBIFtFtEAgYYAA54BAggAAECABkgAAGADADH/AAAHHAAAAAAAigoDAATcccZhhgdqCH/AwssoAAbzYIAFAAGACGAQ4w4w4w4w4bYAAJIBBkkAAACSP/4AAAYAdvQQAAAAAGAAAA/AH+AEAATbjjYgggaCSJJA2ttoAAYYYIAAAA+GAGAwbbgEJMMAAAAAA2wBJAgAg5//J/4AAGAAF/CAAAAGWWWWLI/GH4AoAQQbbbAEAkiSA//AwllgAAYRYJAA3AH2AAGwbbAAG2wAG2wAAOIAAAAEEPJJJP8kkAEUlvCJIAAAwwwwLIAGJJGAACJASQYAAAACAIAA2EkAAAaIYBAA/AHFAAAADAAAwAG2wnOAAEAAAAX4E5/JJJ8nkFEigAC/4AAAwxwwLIAGJB4AAAIIAQb7AwASQYAAAgAkgARIEBAAA/4AAAAHHHEn8gA2AIgAAggAQAH4gAAAJJM/8tEkSAAtqSJAGAGAAAgAIhIEAAIOCG4GAAGFzbYuAgAgACIBtJAAA44EAA5IggEn8gGAwgIM3EACQAAEkAAbe20nkFEAQQ1wAQIIwxwwkgkkkACYAAIIQAYAwwwAQYGAIgAkgRABoAAAAAomgoxgkgEn8gADY5hg+EAAAFtAAH4YGSkkkAICCCGuCQIIAAAAoA222AAAAAJASQ4AG2AAozAGAgAAgIJItAAAAAAECA8gEAAAAAAoFQDPcggAQFFAQAADEkkngBxAQQA1wAJA23gJFAkkkAFwQAQAGAD7AwAQUEAoAkgkgFEkoGDtoooAWSACAQAAAAAHAQYAxggGwFtDbbAAYAE//AIACAAAAAJIOk/JAoAAgAHIUkQAAABJAAAGEgGMIAAAArsJtwztFFFFSSQSQQAkQ/9AoEAGGVQk1AAFroAbYAEngBxFtAA/HABBG4kISQ4EAAAAQQQCCFFotAFFsEtAAAAAFdEMAwDdoooAQSCCCQAmgJIbAkkG2qoG2wADrtoqSJEACAIFkoAAHABGOE4IAAAkkAAAiSgCCAIAIAAAAAAAAH//FoFFAGbbYAAAACACAQAUgSQSX4AGGqsE2ASDbvooABEATQbdkoI/HQAAACQAkkgAAAAAkEgAAFJANGG2GAYAAYHAQQFFAAwZJAAEgkBIAA444QQQX6SSSVUkxwXUgttqSBEAQQYdtBI/AAAAAQCw/X4w84AAgggAQFIINGGAGADADknAEAYAYwwZAH/EEEIAAABJASQSABAiBqsE2ISU8oooBBECACbdAOxICSAAAWyA6S4AigAAgAgAQFIBNGAGGADDD2nGEGD7AGAZBHPEEEIAAAAgAQAQQBkEBVUExwQUgooqSJMgFAYFFhJJSSQAAQCAkkgA84AAgAgCCFIAN2G2GwAYY03A2wXAH/6ZJH/EAEBIAAHHAQASABgkB"); var imgHeight = g.imageMetrics(img).height; var imgScroll = Math.floor(Math.random()*imgHeight); From 22d06c8cf6f6fb7a1e0c899480cb8c40785d81f0 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 18:45:44 +0000 Subject: [PATCH 07/42] Pastel changed dependancy on MyLocation to type app --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 322a90d96..eec32218b 100644 --- a/apps.json +++ b/apps.json @@ -4088,7 +4088,7 @@ "version": "0.08", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", - "dependencies": {"mylocation":"widget"}, + "dependencies": {"mylocation":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", From 6510e4b7d2965f34404f8973c5d802adfa933d6c Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 19:02:01 +0000 Subject: [PATCH 08/42] Pastel added dependancy on widpedom --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index fa33df5ed..770f2a286 100644 --- a/apps.json +++ b/apps.json @@ -4110,6 +4110,7 @@ "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app"}, + "dependencies": {"widpedom":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", From 3fa435e57ddde56b59c75074adc0831f9ae2ba67 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 19:58:19 +0000 Subject: [PATCH 09/42] Pastel, MyLocation updated README files --- apps/mylocation/README.md | 4 +--- apps/pastel/README.md | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/mylocation/README.md b/apps/mylocation/README.md index 3b39aa947..6ae1dd530 100644 --- a/apps/mylocation/README.md +++ b/apps/mylocation/README.md @@ -39,6 +39,4 @@ -## Creator - -[Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) +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/pastel/README.md b/apps/pastel/README.md index 151837a66..66ae0e189 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -1,6 +1,6 @@ # Pastel Clock - *a configurable clock with custom fonts and background* + *a configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times* * Designed specifically for Bangle 1 and Bangle 2 * A choice of 7 different custom fonts @@ -9,12 +9,12 @@ * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location - +* Uses pedometer widget to get latest step count +* Dependant apps are installed when Pastel installs I came up with the name Pastel due to the shade of the grid background. -## Creator -[Hugh Barney](https://github.com/hughbarney) +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/) ## Lato ![](screenshot_lato.png) From b50faa919a9f8c50687a16435d7db946771b674b Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 20:12:25 +0000 Subject: [PATCH 10/42] Pebble - long live the rebellion --- apps.json | 18 ++++- apps/pebble/ChangeLog | 1 + apps/pebble/icons8-sport-shoes-64.png | Bin 0 -> 2522 bytes apps/pebble/pebble.app.js | 103 ++++++++++++++++++++++++++ apps/pebble/pebble.png | Bin 0 -> 1213 bytes apps/pebble/pebble.settings.js | 38 ++++++++++ apps/pebble/pebble_screenshot.png | Bin 0 -> 2799 bytes apps/pebble/pebble_screenshot2.png | Bin 0 -> 2736 bytes apps/pebble/pebble_screenshot3.png | Bin 0 -> 2788 bytes 9 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 apps/pebble/ChangeLog create mode 100644 apps/pebble/icons8-sport-shoes-64.png create mode 100644 apps/pebble/pebble.app.js create mode 100644 apps/pebble/pebble.png create mode 100644 apps/pebble/pebble.settings.js create mode 100644 apps/pebble/pebble_screenshot.png create mode 100644 apps/pebble/pebble_screenshot2.png create mode 100644 apps/pebble/pebble_screenshot3.png diff --git a/apps.json b/apps.json index 770f2a286..cfac33be3 100644 --- a/apps.json +++ b/apps.json @@ -4543,5 +4543,21 @@ "storage": [ {"name":"mylocation.settings.js","url":"mylocation.settings.js"} ] - } + }, + { + "id": "pebble", + "name": "Pebble Clock", + "shortName": "Pebble", + "version": "0.01", + "description": "A pebble style clock to keep the rebellion going", + "icon": "pebble.png", + "dependencies": {"widpedom":"app"}, + "screenshots": [{"url":"screenshot_pebble.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"pebble.app.js","url":"pebble.app.js"}, + {"name":"pebble.img","url":"pebble.icon.js","evaluate":true}, + } ] diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog new file mode 100644 index 000000000..9db0e26c5 --- /dev/null +++ b/apps/pebble/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/pebble/icons8-sport-shoes-64.png b/apps/pebble/icons8-sport-shoes-64.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae00db96a02ace82a8f08eb43bbf32a0c08b255 GIT binary patch literal 2522 zcmV<02_^Q4P)^p0K_gw z1`vtanBN840CC8$+eCW@$F4@i1Bt-#o7uUZkXtz34#08V!o^I#dk!{g4V4vT7!3Ns zfG6Mzd=HdcShvqu`WbBmNKHJ8T%jQN&dJz2IClNs7B~xh0VDv&EUe#aES&*yKy+1Q zxs{`nGwz;Vq$Zui*3OP4D;`CuR8mz@CKCj~5AXsUfq&C(+|57+oCGF!X-fd^1*-cP zb2;#_m6ej^k3NN~n|rq}KYo8ZmE~n!oAkg(KnQRNn9)bwJ|PFz1I}IAynxxjK0w=t znEAk5K`^W~QUnHh09Z1s(+yKoaKc=vU;J@7Plfr}vWU?pGxQUFtb z8PHLn>;oe1d2Ah_5m9K2ZM?HOnv(onfQ!It-~?BUZ~>;Zw@(3(D-?vxyq7skAI5uR zK&OBpn20;{B{3hqOJ#8Z08Y-Xj2Rn@w~sGQPA*s}m7V7o7hWXx`@@tL7j`t2051c( z0Aqg{unPF+=oxcZ_}pf^U7TocsAuaF4^ohwaoqrFJ9}nCEN0f?Xk0wJu6drxWF-EZ z1Ko`1C3Qe@mm>wp;|8$J7$_}xDrB&O^ z9V7g??RFo&-nW;wHXZXO4`F7=Kvr&!qe*LE+_YItoIM|aps8VWZ>aFa_2ud`uV@CL{Z!dxB+XyycqHY7~&rYK%2?pGtE`RA3i`qRyy_$ zj!c*`oz%p$RF;=A*j>ZArK8w&=sbxzwYYkCF>l4=*NxTCswb-LfSa$CO_Uno^7tW`G53cnAN(Mask!vJh~Vmx}I zz>7PQ09dkSJ=Q84i|GbU4ddY#Hh28H9nf5r>{`76qaavJv?p%&9?shJn;7ov$H`;g z(W2EdHOPa7(}(fO&SYvEb&MQ8fzZ3dEv|jn{QL14GY-sq6AyOIcN=F0p;Xym=jz7r zG2@vrHv<2Vi5BmGNw23e*E|qcS5=U7_D2-*0c`tI2$>ff*s(tsxm?ae&up}~b_ZdR zOUX@100{4v0eW34b)`j|KKKQjS4Hviib$$Ui!CO+?dd=A^t>tPTg(;p_lFK32m+7X z=Yzku6Kl4g!Dtc)yMGyjhx=Mg_ow)d4e9t8&}o1^W;zXfrjqbhFdL(8!`)FyPSRPP zdteTEsfjl%diuyg5@L_ga``eMke!iAQNaaV9aX&ea3K4R7jh!05_>0SA|G3G!+O`l z*2$&gqg%HO(5U2$9%jq)k;BM*FO)w_bf=~HGOs-u-PigZFqhQ3-!u z?Lh!GJrabq)c~IT`#As>t$qfLy+fb1u8oLRZy>Lvn9p{;*U@f;M28!Ad2ie zRn3l<|H?}{|I;Vw13TZNuCg2tuR#Qi4d&#rBQ#xVB*@2w=Jk)}2S*=b3f{&FuFvEO0Tcg}Ri>lXb3WHR1=+?TklMsgC*aPq`)0zxLB zQdpso%aF@{zGA8_E#}~^4?rekR`>!gHP&+`E*6;#-uiPWMU~CG`B?@snT+MnZbCMo z_f?o6iU^{JNf6PSjOa}QI)jl*&CR68e#^P9KBugG;FZZ_xVYXzU2P3O;m@vm95o77 z%^t|6Jq4UT9D}>x=w5Yh@0JZ1^lf!*SMx&9X(>$2q-pazQXVK|R1k4Oa z@El5RO0fEs`p1yBpP#%DJ& zafD-!LBq$nvT08NrP=Ad>P&vZkL1K3$4aRrFmy8IC54m}T)zXg4Z*8Huv7Y+UVrokYDalHuI5QQ4?#h;;*PtN;1y8_t%(P_UV~T#b?scf)PDzQ^_)_Ibc&x?Fe%T?fH(z^l5V z3^&h#m;?cNA4cSUM- literal 0 HcmV?d00001 diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js new file mode 100644 index 000000000..5ef8099c6 --- /dev/null +++ b/apps/pebble/pebble.app.js @@ -0,0 +1,103 @@ +// inspired by +//https://apps.rebble.io/en_US/application/55cf75fc61e031bb4b000025?dev_settings=true§ion=watchfaces + +Graphics.prototype.setFontQahiri = function(scale) { + // Actual height 60 (60 - 1) + g.setFontCustom(atob("AAAAAAAAfAAAAAAAAAAAAP4AAAAAAAAAAAD/AAAAAAAAAAAB/wAAAAAAAAAAAf8AAAAAAAAAAAH/AAAAAAAAAAAA/wAAAAAAAAAAAH4AAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAB8AAAAAAAAAAAD/gAAAAAAAAAAH/4AAAAAAAAAAP/8AAAAAAAAAAP/4AAAAAAAAAAf/4AAAAAAAAAA//wAAAAAAAAAB//gAAAAAAAAAD//AAAAAAAAAAD//AAAAAAAAAAH/+AAAAAAAAAAP/8AAAAAAAAAAf/4AAAAAAAAAAf/4AAAAAAAAAA//wAAAAAAAAAB//gAAAAAAAAAD//AAAAAAAAAAH/+AAAAAAAAAAH/+AAAAAAAAAAP/8AAAAAAAAAAH/4AAAAAAAAAAB/wAAAAAAAAAAAPwAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/AAAD/AAAAAAA/wAAA/wAAAAAAP8AAAP8AAAAAAD/AAAD/AAAAAAA/wAAA/wAAAAAAP8AAAP8AAAAAAD/AAAD/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAH///gH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAD//8AAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAD//8AAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAH8A///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAH8A///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAfAAAAAAAAAfwAP4AAAAAAAAP8AD/AAAAAAAAD/gB/wAAAAAAAA/4Af8AAAAAAAAP+AH/AAAAAAAAD/AA/wAAAAAAAAfgAH4AAAAAAAABwAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DR0bDBsbGxsbGxsbDQ=="), 80+(scale<<8)+(1<<16)); +} + +const SETTINGS_FILE = "pebble.json"; +let settings; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; +} + +var img = require("heatshrink").decompress(atob("oFAwkGswA/AH4A/AH4A/AH4A/AFEAD74gdsAfBELlggMhD70iILsAiUAIKQRBgxAHgUiIKQQJUAMSD4JBQsBVBIAq/DEAJBCJ45VHkAxEDwKfDIIUREBq2BmcQCAQeCkczmRBEiAgND4MxSoYGBAAQgCAAohKDARhBG4IeDEAQ8BAA5fJABgpBgFDgEiQgJEHT4IeMmMBkMFAYJJDEQaYDiYfMkECiEEoEDBAX//8ykJsBD4MAWwIALiBeCqAyDn//BoYgBgAeMYAMhgE0CRIOBD58BkEEmCRKkEGD5szkUQqdASJUxD4MAgKBKmUigFEGJZgBAATODFw0CkEBmoOJAAQdB7owBOBDdCgbdED5fd6pRIgDdCeBkxD4fdeAgNEkMFmheLdgIfE6BgGmDdCoDdKDwYfD6gzGiBeBrpLHXYUQXIMgD4NND4SAFZgMRgAKBPwroBBYIeBIAL/CADESL4VmsAcWgMRkQeDAAMAkQAWMAQeCD4MSDqqdBDwgfBAC8GDwiAXDowA/AH4A/AH4A/AH4A/AEA")); + +const h = g.getHeight(); +const w = g.getWidth(); +const ha = 2*h/5 - 8; +const h2 = 3*h/5 - 10; +const h3 = 7*h/8; + +function draw() { + var date = new Date(); + var da = date.toString().split(" "); + //var timeStr = require("locale").time(date,1); // causes screen corruption ??? + var timeStr = da[4].substr(0,5); + const t = 6; + + g.reset(); + g.setColor(settings.bg); + g.fillRect(0, 0, w, h2 - t); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h2 - t, w, h2); + + // day and steps + g.setColor('#000'); // really needs to be black regardless of theme + g.setFont('Vector', 22); + g.setFontAlign(0, -1); + g.drawString(da[0], w/4, ha); // day of week + g.drawString(getSteps(), 3*w/4, ha); + + // time + g.setColor(g.theme.bg); + g.fillRect(0, h2, w, h3); + g.setFontQahiri(); + g.setFontAlign(0, -1); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h2 - 8); + + // contrast bar + g.setColor(g.theme.fg); + g.fillRect(0, h3, w, h3 + t); + + // the bottom + g.setColor(settings.bg); + g.fillRect(0, h3 + t, w, h); + + g.setColor(settings.bg); + g.drawImage(img, w/2 + ((w/2) - 64)/2, 10, { scale: 1 }); + drawCalendar(((w/2) - 48)/2, 10, 48, 4, da[2]); +} + +// at x,y width:wi thicknes:th +function drawCalendar(x,y,wi,th,str) { + g.setColor(g.theme.fg); + g.fillRect(x, y, x + wi, y + wi); + g.setColor(g.theme.bg); + g.fillRect(x + th, y + th, x + wi - th, y + wi - th); + g.setColor(g.theme.fg); + + var hook_t = 6; + // first calendar hook, one third in + g.fillRect(x + (wi/3) - (th/2), y - hook_t, x + wi/3 + th - (th/2), y + hook_t); + // second calendar hook, two thirds in + g.fillRect(x + (2*wi/3) -(th/2), y - hook_t, x + 2*wi/3 + th - (th/2), y + hook_t); + + g.setFont('Vector', 22); + g.setFontAlign(0, 0); + g.drawString(str, x + wi/2 + th/2, y + wi/2 + th/2); +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return '????'; +} + +g.clear(); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget + */ +for (var wd of WIDGETS) {wd.draw=()=>{};} +loadSettings(); +setInterval(draw, 15000); // refresh every 15s +draw(); +Bangle.setUI("clock"); diff --git a/apps/pebble/pebble.png b/apps/pebble/pebble.png new file mode 100644 index 0000000000000000000000000000000000000000..10f5adb56b224f3e4d037c4d195fbd9efc81b959 GIT binary patch literal 1213 zcmV;u1Va0XP)POM$%3@Whhhyn@nYhxDeg-e<-cZ zYFr2k?%buN)IY$D3u)c7&`lO@rMoJkr~#QIf+Nxtsa1-};Ey=&+{^zdH@zOnM{mX zvjtWIh=|(&%XQtCm^E8qH2}cN%z6O8ZE6bK^H45MbUEA#JEV9`wMn*=ov6V^% zySuwkO0~5~DF?#<%d&1sDYbW0Hk-xj>T1XM!^1;VDwVeD28LA&YzBCqmmwl;+y4GO zgb;{C^xd7DoZ$HQ*iU*PlgY#ig+iSt(^m8u_dq(G-UG14rPmA*y;>|5zciuESp-cK zzzd8G0~P~16+jM57D5&SEX%sZrKQ7UAq-RlmX?-oDy4Ra==sOnq?EQ&YLqXv|L}5|Ola!1|954-`%Wb(F@@^;gu`v9KmHh$=b zz?A|0PN3hg)_~-=MDC3mBG9he1EGlU<1aQo_~dDZ%=}?Bz_u0A^B$@-pn9+O6{;nG zYf}<`Kd>0H)5AUs5CP97fT*MJ>ls1HVDZr?Fg>Z@^Z2lhdcFPy5q)~`|M@n#Ym7~U z@i=f}MB(%|LZi#=!uS}FOsYUTu4=XV)%yDS`#mKI!$r`xf!P^_vHy8YA_Oo!r7#)r z!*gJK77zlsHtGN2E=(GYo6bbfrL6?V#{kEEG$bCJKfoG|15-%_#@%gTE_Ep!jRH5W zKPrx~n8GvTm)X0XOWzAv5#aiC_;mso1HT!XnVETOb91x#hsS?5Ha6yc10G}G4G==a z0W_D;`+?$l(-}Oj4Cr?P{buM5U@d|Tm+;LG`eQJ?aQA2PHJY`D-~SMJ@1qG$N#hLt z5V$g+-wE`afj8jn?CfJ9#B)u53qj%sekt5&H16ecxu1HCANV^UEJJTVs3G8Y_SYob z=a51f;5ZH($KlGQF9aO|PtK#9bBHKZPJs*{qGFiNOdzGa6DB^;5D-GVDW%+j=2&bW z4obR2luslQ`(eacDoQGqdX0!a=g{)uPN`Hf^6CuNH258Wo{y_`LBW(Tivi_w`7Z!> zIka>rrJig9&iR&6s|Cxlj2XbW7bpP8>Kf+e=CHQ52Fud_-hX;}itX)f?MqVtJlnQI zRr*e_8K9IZ_^r}bR#vdQyxcMV;NU>}(iDKQsrQ8d-aFu;5Vn2IdwY9OO8KrDkB*Ky zy)$y0J8xG=4+z` b5C9$mizYm;5j?(%00000NkvXXu0mjfggZkP literal 0 HcmV?d00001 diff --git a/apps/pebble/pebble.settings.js b/apps/pebble/pebble.settings.js new file mode 100644 index 000000000..b60600316 --- /dev/null +++ b/apps/pebble/pebble.settings.js @@ -0,0 +1,38 @@ +(function(back) { + const SETTINGS_FILE = "pebble.json"; + + // initialize with default settings... + let s = {'bg': '#0f0', 'color': 'Green'} + + // ...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) + } + + var color_options = ['Green','Orange','Cyan','Perple','Red','Blue']; + var bg_code = ['#0f0','#ff0','#0ff','#f0f','#f00','#00f']; + + E.showMenu({ + '': { 'title': 'Pebble Clock' }, + '< Back': back, + 'Colour': { + value: 0 | color_options.indexOf(s.color), + min: 0, max: 5, + format: v => color_options[v], + onchange: v => { + s.color = color_options[v]; + s.bg = bg_code[v]; + save(); + }, + } + }); +}) diff --git a/apps/pebble/pebble_screenshot.png b/apps/pebble/pebble_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d618368db84657fdc60e478c4507fac2bb9c931f GIT binary patch literal 2799 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 Z1IS-lm>yN9{UNZe0B!4JQ)!J${WlQI5-k7# literal 0 HcmV?d00001 From 6642b216066519d90e1bb0b46c1c8b731ff270b8 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 20:27:25 +0000 Subject: [PATCH 11/42] added pebble icon --- apps/pebble/pebble.app.js | 35 +++++++++++++++++++++++++---------- apps/pebble/pebble.icon.js | 1 + 2 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 apps/pebble/pebble.icon.js diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 5ef8099c6..6b7f7b492 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -1,5 +1,3 @@ -// inspired by -//https://apps.rebble.io/en_US/application/55cf75fc61e031bb4b000025?dev_settings=true§ion=watchfaces Graphics.prototype.setFontQahiri = function(scale) { // Actual height 60 (60 - 1) @@ -21,13 +19,26 @@ const ha = 2*h/5 - 8; const h2 = 3*h/5 - 10; const h3 = 7*h/8; +let batterWarning = false; + function draw() { - var date = new Date(); - var da = date.toString().split(" "); - //var timeStr = require("locale").time(date,1); // causes screen corruption ??? - var timeStr = da[4].substr(0,5); + let date = new Date(); + let da = date.toString().split(" "); + //let timeStr = require("locale").time(date,1); // causes screen corruption ??? + let timeStr = da[4].substr(0,5); const t = 6; + // turn the warning on once we have dipped below 30% + if (E.getBattery() < 30) + batterWarning = true; + + // turn the warning off once we have dipped above 40% + if (E.getBattery() > 40) + batterWarning = false; + + // for testing only + batterWarning = true; + g.reset(); g.setColor(settings.bg); g.fillRect(0, 0, w, h2 - t); @@ -37,14 +48,18 @@ function draw() { g.fillRect(0, h2 - t, w, h2); // day and steps - g.setColor('#000'); // really needs to be black regardless of theme + if (settings.color == 'Blue' || settings.color == 'Red') + g.setColor('#fff'); // white on blue or red best contrast + else + g.setColor('#000'); // otherwise black regardless of theme + g.setFont('Vector', 22); g.setFontAlign(0, -1); g.drawString(da[0], w/4, ha); // day of week g.drawString(getSteps(), 3*w/4, ha); // time - g.setColor(g.theme.bg); + g.setColor(!batteryWarning ? g.theme.bg ? '#f00'); g.fillRect(0, h2, w, h3); g.setFontQahiri(); g.setFontAlign(0, -1); @@ -72,7 +87,7 @@ function drawCalendar(x,y,wi,th,str) { g.fillRect(x + th, y + th, x + wi - th, y + wi - th); g.setColor(g.theme.fg); - var hook_t = 6; + let hook_t = 6; // first calendar hook, one third in g.fillRect(x + (wi/3) - (th/2), y - hook_t, x + wi/3 + th - (th/2), y + hook_t); // second calendar hook, two thirds in @@ -96,7 +111,7 @@ Bangle.loadWidgets(); * we are not drawing the widgets as we are taking over the whole screen * so we will blank out the draw() functions of each widget */ -for (var wd of WIDGETS) {wd.draw=()=>{};} +for (let wd of WIDGETS) {wd.draw=()=>{};} loadSettings(); setInterval(draw, 15000); // refresh every 15s draw(); diff --git a/apps/pebble/pebble.icon.js b/apps/pebble/pebble.icon.js new file mode 100644 index 000000000..ecd7feb7f --- /dev/null +++ b/apps/pebble/pebble.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("oFAwgNKiIAIFqofegIf/DAUzAAMyAwUQD60T/4ACD7Q/cPxIf/YCofcDhYiSXYYfuUZgf/D/4f/D6USkUgD/4fuogAID6vtDw/UD6vu6geF73kb6vuEAtN9wfYMIneD7JADDwIfaIAJdBD7YgBHwQfbAAgfkf6Qf/D/4feogAID6oAND/4f/iAdJD/4f/D/4fUDxYABD74iODiAftTZgfnYYczAAMyD7UT/4ACH/S+bD8DAKD9Y=")) From ac1425ca7cfaf46041790a3223e1f3383f7a2ae2 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 13:07:56 +0000 Subject: [PATCH 12/42] set mylocation to an app --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cfac33be3..e77ef0840 100644 --- a/apps.json +++ b/apps.json @@ -4538,7 +4538,7 @@ "description": "My Locations adds a menu in the Settings app to set your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", - "type": "widget", + "type": "app", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"mylocation.settings.js","url":"mylocation.settings.js"} From 5b7bbd83db31769a8b255821729d1cad5d5a81c8 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 13:30:13 +0000 Subject: [PATCH 13/42] Pebble: added README, battery warning if below 30% --- apps.json | 1 + apps/pebble/README.md | 17 +++++++++++++++++ apps/pebble/pebble.app.js | 14 ++++++-------- 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 apps/pebble/README.md diff --git a/apps.json b/apps.json index ab74c9ee1..13838a962 100644 --- a/apps.json +++ b/apps.json @@ -4581,6 +4581,7 @@ "shortName": "Pebble", "version": "0.01", "description": "A pebble style clock to keep the rebellion going", + "readme": "README.md", "icon": "pebble.png", "dependencies": {"widpedom":"app"}, "screenshots": [{"url":"screenshot_pebble.png"}], diff --git a/apps/pebble/README.md b/apps/pebble/README.md new file mode 100644 index 000000000..f0de5ce73 --- /dev/null +++ b/apps/pebble/README.md @@ -0,0 +1,17 @@ +# Pebble + + *a Pebble style clock with configurable background color, to keep the revolution going* + +* Designed specifically for Bangle 2 +* A choice of 6 different background colous through its setting menu +* Supports the Light and Dark themes +* Uses pedometer widget to get latest step count +* Dependant apps are installed when Pebble installs +* Uses the whole screen, widgets are made invisible but still run in the background +* When battery is less than 30% main screen goes Red + +![](pebble_screenshot.png) +![](pebble_screenshot2.png) +![](pebble_screenshot3.png) + +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/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 6b7f7b492..62159055d 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -19,7 +19,7 @@ const ha = 2*h/5 - 8; const h2 = 3*h/5 - 10; const h3 = 7*h/8; -let batterWarning = false; +let batteryWarning = false; function draw() { let date = new Date(); @@ -30,14 +30,11 @@ function draw() { // turn the warning on once we have dipped below 30% if (E.getBattery() < 30) - batterWarning = true; + batteryWarning = true; // turn the warning off once we have dipped above 40% if (E.getBattery() > 40) - batterWarning = false; - - // for testing only - batterWarning = true; + batteryWarning = false; g.reset(); g.setColor(settings.bg); @@ -59,11 +56,12 @@ function draw() { g.drawString(getSteps(), 3*w/4, ha); // time - g.setColor(!batteryWarning ? g.theme.bg ? '#f00'); + // white on red for battery warning + g.setColor(!batteryWarning ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); g.setFontQahiri(); g.setFontAlign(0, -1); - g.setColor(g.theme.fg); + g.setColor(!batteryWarning ? g.theme.fg : '#fff'); g.drawString(timeStr, w/2, h2 - 8); // contrast bar From 78c3791c1e6af33dc127418a172a22b0b9c96df9 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 13:48:20 +0000 Subject: [PATCH 14/42] Pebble screenshot updated --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 13838a962..4c1b0bed6 100644 --- a/apps.json +++ b/apps.json @@ -4584,7 +4584,7 @@ "readme": "README.md", "icon": "pebble.png", "dependencies": {"widpedom":"app"}, - "screenshots": [{"url":"screenshot_pebble.png"}], + "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], From 0e3b17be6757527c1f372fa8b9d5bbc8f3985035 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 16:12:47 +0000 Subject: [PATCH 15/42] Added icon for mylocation --- apps.json | 5 ++--- apps/mylocation/mylocation.icon.js | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 apps/mylocation/mylocation.icon.js diff --git a/apps.json b/apps.json index 4c1b0bed6..8c6d5c9c5 100644 --- a/apps.json +++ b/apps.json @@ -4110,7 +4110,6 @@ "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app"}, - "dependencies": {"widpedom":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", @@ -4572,7 +4571,8 @@ "type": "app", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ - {"name":"mylocation.settings.js","url":"mylocation.settings.js"} + {"name":"mylocation.settings.js","url":"mylocation.settings.js"}, + {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } ] }, { @@ -4583,7 +4583,6 @@ "description": "A pebble style clock to keep the rebellion going", "readme": "README.md", "icon": "pebble.png", - "dependencies": {"widpedom":"app"}, "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock", diff --git a/apps/mylocation/mylocation.icon.js b/apps/mylocation/mylocation.icon.js new file mode 100644 index 000000000..bfb38d5ac --- /dev/null +++ b/apps/mylocation/mylocation.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///t/7j/P3/vB4cBqtVoAbHBQIABBQ0FBYdQBYsVBYdUERIkGHIQADHoguEGAwuEGAwKFBZg8DHQw8EBYNf/1Vq3/8oLDIwNf/Wpv//0oLG9Wq3/qBYJUCBYuqBaBqBBYW+BepHEBbybCBYP+BYSnErYLDyoLFAANq/r8Ga5T7MBZZUBAAhSCfhA6DBZhIGBQg8FHQg8GHQgwGFwowFBQwwDFwwLMlS7Bqta1AKEn2q1K1C1WgBYf/1WqBYIDB1QKCgYLC0taBYoXB/QICBY0//7vBAAQ8EEgIABCwwME9QVEA")) From 4669099645a46062a63a9e77771b7ab1cf531ef2 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 18:11:08 +0000 Subject: [PATCH 16/42] MyLocation added mylocation.app.js --- apps.json | 1 + apps/mylocation/mylocation.app.js | 74 +++++++++++++++++++++++++ apps/mylocation/mylocation.settings.js | 75 ++------------------------ 3 files changed, 78 insertions(+), 72 deletions(-) create mode 100644 apps/mylocation/mylocation.app.js diff --git a/apps.json b/apps.json index 8c6d5c9c5..0f2d7b738 100644 --- a/apps.json +++ b/apps.json @@ -4571,6 +4571,7 @@ "type": "app", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ + {"name":"mylocation.apps.js","url":"mylocation.app.js"}, {"name":"mylocation.settings.js","url":"mylocation.settings.js"}, {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } ] diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js new file mode 100644 index 000000000..49e74a025 --- /dev/null +++ b/apps/mylocation/mylocation.app.js @@ -0,0 +1,74 @@ +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +const SETTINGS_FILE = "mylocation.json"; + +// initialize with default settings... +let s = { + 'lat': 51.5072, + 'lon': 0.1276, + 'location': "London" +} + +// ...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) || {} +const saved = settings || {} +for (const key in saved) { + s[key] = saved[key] +} + +function save() { + settings = s + storage.write(SETTINGS_FILE, settings) +} + +const locations = ["London", "Newcastle", "Edinburgh", "Paris", "New York", "Tokyo","???"]; +const lats = [51.5072 ,54.9783 ,55.9533 ,48.8566 ,40.7128 ,35.6762, 0.0]; +const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; + +function setFromGPS() { + console.log("set from GPS"); + Bangle.setGPSPower(1); + E.showMessage("Waiting for GPS fix. Place watch in the open. Could take 10 minutes. Long press to abort", "GPS Running"); + Bangle.setUI("updown", undefined); +} + +Bangle.on('GPS', (gps) => { + //console.log("."); + if (gps.fix === 0) return; + //console.log("fix from GPS"); + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } + Bangle.buzz(1500); // buzz on first position + Bangle.setGPSPower(0); + save(); + + Bangle.setUI("updown", ()=>{ load() }); + E.showPrompt("Location has been saved from the GPS fix",{ + title:"Location Saved", + buttons : {"OK":1} + }).then(function(v) { + load(); // load default clock + }); +}); + + +E.showMenu({ + '': { 'title': 'My Location' }, + '< Back': back, + 'City': { + value: 0 | locations.indexOf(s.location), + min: 0, max: 6, + format: v => locations[v], + onchange: v => { + if (v != 6) { + s.location = locations[v]; + s.lat = lats[v]; + s.lon = lons[v]; + save(); + } + }, + }, + 'Set From GPS': ()=>setFromGPS() +}); diff --git a/apps/mylocation/mylocation.settings.js b/apps/mylocation/mylocation.settings.js index 6936e9e69..4767c4732 100644 --- a/apps/mylocation/mylocation.settings.js +++ b/apps/mylocation/mylocation.settings.js @@ -1,73 +1,4 @@ (function(back) { - const SETTINGS_FILE = "mylocation.json"; - - // initialize with default settings... - let s = { - 'lat': 51.5072, - 'lon': 0.1276, - 'location': "London" - } - - // ...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) || {} - const saved = settings || {} - for (const key in saved) { - s[key] = saved[key] - } - - function save() { - settings = s - storage.write(SETTINGS_FILE, settings) - } - - const locations = ["London", "Newcastle", "Edinburgh", "Paris", "New York", "Tokyo","???"]; - const lats = [51.5072 ,54.9783 ,55.9533 ,48.8566 ,40.7128 ,35.6762, 0.0]; - const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; - - E.showMenu({ - '': { 'title': 'My Location' }, - '< Back': back, - 'City': { - value: 0 | locations.indexOf(s.location), - min: 0, max: 6, - format: v => locations[v], - onchange: v => { - if (v != 6) { - s.location = locations[v]; - s.lat = lats[v]; - s.lon = lons[v]; - save(); - } - }, - }, - 'Set From GPS': ()=>setFromGPS() - }) - - function setFromGPS() { - console.log("set from GPS"); - Bangle.setGPSPower(1); - E.showMessage("Waiting for GPS fix. Place watch in the open. Could take 10 minutes. Long press to abort", "GPS Running"); - Bangle.setUI("updown", undefined); - } - - Bangle.on('GPS', (gps) => { - //console.log("."); - if (gps.fix === 0) return; - //console.log("fix from GPS"); - s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } - Bangle.buzz(1500); // buzz on first position - Bangle.setGPSPower(0); - save(); - - Bangle.setUI("updown", ()=>{ load() }); - E.showPrompt("Location has been saved from the GPS fix",{ - title:"Location Saved", - buttons : {"OK":1} - }).then(function(v) { - load(); // load default clock - }); - }); - -}) + // just go right to our app + load("mylocation.app.js"); +})(); From 7caac64a8653f06f95650228abc98018de8df9b8 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 30 Nov 2021 20:40:33 +0100 Subject: [PATCH 17/42] widbars: new widget --- apps.json | 17 +++++++++- apps/widbars/ChangeLog | 1 + apps/widbars/README.md | 14 ++++++++ apps/widbars/icon.png | Bin 0 -> 2294 bytes apps/widbars/screenshot.png | Bin 0 -> 2377 bytes apps/widbars/widget.js | 62 ++++++++++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 apps/widbars/ChangeLog create mode 100644 apps/widbars/README.md create mode 100644 apps/widbars/icon.png create mode 100644 apps/widbars/screenshot.png create mode 100644 apps/widbars/widget.js diff --git a/apps.json b/apps.json index 2e338a432..bca8d6cbd 100644 --- a/apps.json +++ b/apps.json @@ -4557,5 +4557,20 @@ { "name": "sensible.app.js", "url": "sensible.js" }, { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } ] -} +}, + { + "id": "widbars", + "name": "Bars Widget", + "version": "0.01", + "description": "Display several measurements as vertical bars.", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widbars.wid.js","url":"widget.js"} + ] + } ] diff --git a/apps/widbars/ChangeLog b/apps/widbars/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/widbars/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! diff --git a/apps/widbars/README.md b/apps/widbars/README.md new file mode 100644 index 000000000..eba5cc347 --- /dev/null +++ b/apps/widbars/README.md @@ -0,0 +1,14 @@ +# Bars Widget + +A simple widget that display several measurements as vertical bars. + +![Screenshot](screenshot.png) + +## Measurements from left to right: + +- Current heart rate, on a scale from 0-200 bpm (*red*)
+ Only if available: this widget does not turn on HRM monitoring by itself. +- Device temperature, on a scale from 0-50 °C (*yellow*) +- Flash storage space used (*blue/cyan*) +- Memory usage (*magenta*) +- Battery charge (*green*) \ No newline at end of file diff --git a/apps/widbars/icon.png b/apps/widbars/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..59f78d66623a8aaf97376d6290bbfba9afcfe99b GIT binary patch literal 2294 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+Ra#5mg6=I{O2ih1QJ|89)}y=%MEh;6i7*4#-3?s z`X#a2qRa&aqOeeH=3jq``2!!~l1+%5Q%T9<6G|vl@sREQly!GDto!=-V+g+=`pq>! z=<>IjT#xw`{qeTo#BlAg-{fP2@*&7wg0}{Wtk2_KN%Yh1ci|9J=6*;e^S!F=5Y&%} zOO@jrF12=}zs*Aj!%8Cp$P-QPyj}OaHSqd%zT&HQ@7Fx^YELp~f*>k(RF8iDWXp8e2oEm@Tzu;H7YseQ!=Vv94zzp`^MjE^Mi!ZScQqtf zG#wtbjO|V_nAl))zm_FjjBmsaI8fD`H%5!&N74uC}`l6$4FT zv_u_5X1~djwmo9GMmW9_{2JN)Eytmb|^p&jvra zj7V1#Ih!wAK`&Cjh8oJ8-Z2Y=I5~KW%fRP#&~NYj2d)YR<1(|dS8dxOT68zx@{4DW zc@ganA!m3T0$?IwM<|032+k(wqf5>*5jzJvW)M`NIr%^h47eC+KuHSTCo)W#6dP;U zt+^B_k#-|DY54f$8Qc_KK~@M6{=*@|hiddO#28cLm`yCPCZ9rzDJ4#tHmFIXE|=lWu7N1@u(dPE=QRLTZlYjOMC_Wvcw zmn=qdm=fT3WjZc`J#$CG6s;qHr4w_F@Jg|*Yj49eZF8;SN2NBsm&V>W9x!|7$wOvy z)3;WoWeK#VA1J8#8)u=wzz-;3LCgZ$FegZsIeL%6__Ls-bDndyIWd@YFF=AC$XWlI zv3-wqBllsYXS=%LNRrB$(y(6-Kf7CK@;9mUTF^gG$eihHFeo|7(#s1_$w0@O8-=7H3To9PntLe~#fHNVjL%c`2Ux_+pt`P{6p zRW+ZR^|fI0xmjPg=5w>&2JEVTIE=MU21P4a8Hr_z)*$IP7NIo3>!(|xP%Te{r6xfBTr!U$q*)xLofM_d)SiP!4qdPN{=#N`Nd2&z~- zjFh}8X`Ye$#QEz$*Z^*hnGm+|+#BH}_RcZ!jQ~OCKQNa z`&D!M&;=QI6&)d=qw-GIIHBv-AR9Wjtf#WlM32B-W~zE-6I2G7wEf>Rd`-m}a55qg zW%hM8?CO%y)$Udufn!3o&H- z{Mu@DiCT${6(VbTcoJ&z5fjI9jR_FA*cfgFk49}L4Q^+5aAVtu$28aGtY5*cmDc8T zL^s|Ac66hz4PPEMm)q==c03*!CxX6Ln-c^-_Ca?6fvXeh#MvlQUz_e|(JERBtf2q( ztI7%0hQk8bg%)77NiO>G7?*2Q2@nO}8bMJfX*yBTVW^4s`qsqYY(9KLX7e2+FY57j z_b45kJ>;wRJZBMm}1n0+8UUYwsnH@ z=WD~Fn@8Oq?4x94!-SM34S(=aym&}t?{FGfK2uO~UL$=K$Sfq?%LRkIM7S6y9Bm5T zH+LLsuDHebkF9w(@M-&@AnX{iV*Uok=WuD3z2z?e00D$)LqkwWLqi~Na&Km7Y-Iod zc$|HaJxIeq9K~N#rJ@ywb`TNCP@OD@iaKf)icq1{3avVrT>1q~8j=(jN5Qq=;KyRs z!Nplu2UkH5`~Y!tb5eAX691PJTEuv8+>dwn9(V5mpttSBkO z=ftB1U6A;Z>$1yloC^*MJTq*hQ}e`OVzJQ1avQUvp%PCLM-)|~d?Dkq!g-6cTCTF@ zJ^2fRIc;T`>of-u$0C-Hga{c`lu(9+D6JYPCQ`H?^Y9Ni{v^3%a+Scyv49FxNRA); z4}N!R<|oG8q+kr_e6j71VIZ&zG-|f}eQeu}6TtrrTxl(Tr4Gz|l3r_Rkt3jQ8@RY` zY4RR$xdZe+>5?HilAorK&jasg^i5eHbPIH^xxF>_arywHsjI{daBv8W6exS$RA}Dq+5rlHAPfc2ExP}e*99CAMJBzS zz~^u1q^zn~xwcrm0A|u{3p#T5? literal 0 HcmV?d00001 diff --git a/apps/widbars/screenshot.png b/apps/widbars/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..146e085e3bd42a99fc342e62a86a5a88471d815a GIT binary patch literal 2377 zcmds({Xf%tAICr6&D^Yn6Sg{}uW+Wd%@-kDD{7>M;5WfELo7^xF{{MV===J7l_=ls%g~)}MQy zb|o5e$Mz}5CJH!L=dLyA>}<37sHm>4F0fj@$EZLI0&|&BP>TTwBwm97qg4J24P1l> zsEqR6pr@933BszEte7VkG;xd|A{hcXT&Co|h>GGg)%MTl`K94Ykc1gVw0z=ZoURt= zpn9jVTJTk`(-1J~mi8MHK)D;yAAp`2t0ZLrqy2Pa62|Q(mU9U;%nZT9^6Wf5rgMU}brkmY_fuaia;?Uw&JVy9Fdy*1G>dNPcxq z4$h@YhV`XuFYC5zF`lpfrN0FYc98a&MH@=;czR7QuDNz$@L=IwQTIi(QX)@k3sPIi zD!6hFF{n1MD$@}PPr>Fnp;ZTcmhX(jF$lccicT+0Ox~0y`AaSY5E5@SuJpX zr{kL$bS!ruz=3m-_j=*gL+Uh2;y0YSln;7M^;`ADZ}wlR#yYL<$^pjC@{Qg{Iw=c| zfTDfOYNUIL^%lzzRba;GwgPtHp0-*~vwX{)z=$zKgz#%c2JsBdPGG)f zG9xKEAVqc5?n^wfx?)++cNiy4G-&nTUgSnjCwd6O*^s3zO<}E}i<}Ic^ShQ9$;6?cg7_jp2z6 zG|CRv$15EXCUF(br#-*zy)Y?Yi`y!X9~+8Sued`Kncu!Ohn)1VO%~=t!7kWZUAHfJ zc~qCIX)KsH(tYX?FE8d(bnUwOP1d4JW6w>U5F;-*;ouB6#`EVW*a<_M5sBTajQV~? z8qnbTQnO(j<12XU$ola=I>|ciW*Ard)}j^5nJ@k-v@C1(Awzl2`IZdo41r%Qp^oHJd>#g4DcY@^9LM8C)4 z>-=p9xFk|xl;C&+hu&r@;QxgZKI|Ra*1ku5oPWClRV})yvnJ8WiaCJ`4r8A@jOI9vwf#ugwM2Z`}BjlljiRR#+JHv$>onbpQ2$d*)6GmcdpP zzC&1$Q|LP9;ZmNw>_RG{3VnQQaO4L3!ZC%o&WL?pJD@Fe>3FMVFzc{DjTYsbSSTQ@ z^d{`FX?Izn%hR0`1ayQ>&1_J_`wqu8!i_AN=c(UHbeqlo(Hjj>GaWj`3v z-)=WQbxf%THtq2*cOVQu2szXur9a*U;j|10CN<54hmNI$EK;7^|BCl?fmsJ=l$$rt zBq+bLN?nPkEi&i-wk98I-8@>&}I;P&YJ+a%zP2 z{Fd>(;yC`Flo(Dz(XHK|nnyNPX4`qO2MhsI@+j(7T{H)^`|yA)!x|BGZhW>QAWLx{ z_Cg#Vq3aj;C7BaB<3S9IK=R95-rc-}cF9`~N9>&0+@|0Niap*p9De;Tr%GkdhN=n2 z+US+@WMblZ<&Q_8uIer@=E>os;acJAJ~d7&57bp&ue(RSBCPy7)|_LP#OEcSaFJc@ zve}Ft+BTaXB{a& { + const h=24, // widget height + w=3, // width of single bar + bars=3; // number of bars + + // We show HRM if available, but don't turn it on + let bpm,rst,con=10; // always ignore HRM with confidence below 10% + function noHrm() { // last value is no longer valid + if (rst) clearTimeout(rst); + rst=bpm=undefined; con=10; + WIDGETS["bars"].draw(); + } + Bangle.on('HRM', hrm=>{ + if (hrm.confidence>con || hrm.confidence>=80) { + bpm=hrm.confidence; + con=hrm.confidence; + WIDGETS["bars"].draw(); + if (rst) clearTimeout(rst); + rst = setTimeout(noHrm, 10*60*1000); // forget HRM after 10 minutes + } + }); + + /** + * Draw a bar + * + * @param {int} x left + * @param {int} y top (of full bar) + * @param {string} col Color + * @param {number} f Fraction of bar to draw + */ + function bar(x,y, col,f) { + if (!f) f = 0; // for f=NaN: set it to 0 -> don't even draw the bottom pixel + if (f>1) f = 1; + if (f<0) f = 0; + const top = Math.round((h-1)*(1-f)); + // use Math.min/max to make sure we stay within widget boundaries for f=0/f=1 + if (top) g .clearRect(x,y, x+w-1,y+top-1); // erase above bar + if (f) g.setColor(col).fillRect(x,y+top, x+w-1,y+h-1); // even for f=0.001 this is still 1 pixel high + } + function draw() { + g.reset(); + const x = this.x, y = this.y, + m = process.memory(); + let b=0; + bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space + bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C + bar(x+(w*b++),y,g.theme.dark?'#0ff':'#00f'/*cyan/blue*/,1-(require('Storage').getFree() / process.env.STORAGE)); + bar(x+(w*b++),y,'#f0f'/*magenta*/,m.usage/m.total); + bar(x+(w*b++),y,'#0f0'/*green */,E.getBattery()/100); + } + + let redraw; + Bangle.on('lcdPower', on => { + if (redraw) clearInterval(redraw) + redraw = undefined; + if (on) { + WIDGETS["bars"].draw(); + redraw = setInterval(()=>WIDGETS["bars"].draw, 10*1000); // redraw every 10 seconds + } + }); + WIDGETS["bars"]={area:"tr",width: bars*w,draw:draw}; +})() From 8580952e69609f53736089e72e1028117fd5c09f Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 30 Nov 2021 21:06:23 +0100 Subject: [PATCH 18/42] widbars: comment out HRM/temperature They didn't seem very useful --- apps/widbars/README.md | 3 ++- apps/widbars/icon.png | Bin 2294 -> 2085 bytes apps/widbars/screenshot.png | Bin 2377 -> 9787 bytes apps/widbars/widget.js | 41 ++++++++++++++++++++---------------- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/widbars/README.md b/apps/widbars/README.md index eba5cc347..c1cb73a96 100644 --- a/apps/widbars/README.md +++ b/apps/widbars/README.md @@ -5,10 +5,11 @@ A simple widget that display several measurements as vertical bars. ![Screenshot](screenshot.png) ## Measurements from left to right: - + - Flash storage space used (*blue/cyan*) - Memory usage (*magenta*) - Battery charge (*green*) \ No newline at end of file diff --git a/apps/widbars/icon.png b/apps/widbars/icon.png index 59f78d66623a8aaf97376d6290bbfba9afcfe99b..3d6fcb053ae67d78eb078acb8a54ab2c15585db7 100644 GIT binary patch delta 1623 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 Y0EKxHVo(JBI{*Lx07*qoM6N<$f@~~kod5s; diff --git a/apps/widbars/screenshot.png b/apps/widbars/screenshot.png index 146e085e3bd42a99fc342e62a86a5a88471d815a..ae85e42f5512bea974b069e37fe222c870db9e20 100644 GIT binary patch literal 9787 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∓xa5}{Mq#4?OGe$!443PswLE9c|w!vYX*^6l~;8pKjczC%+RqS{>gqdl_ z^J0O2D4VD*csRtvfAph(n$)1@u)-1zUY8T1;!E%Fm#8$S!y6^`|ntA@nNd#P=;zN1_uWj!iAov+4)NO?~_0GgYR$u zvORqNBgr5-x8eV6+8Rz6iAa{w002Nm*hxvL$xBK7FAe;k@|_=;DkAqooOIY!v!WC) z+6xnFT&;jPCQi^EFHWsw5&4^7w$U4$GI1I%0cZfcyE|&WG%&2Mi=Zok`2qOi?yljH ziv2eW*I>xUbu-!fnaukdP-0?TyT$=uooiLT&%u#yj0e+rGJq+GXl`I$DVn83w=2+p zwRdoCoMGcz^zQz^B#;gzn(C8z8YR;!Aq=)V&3}&lQP03QbUaiBZ=CXydfqbWl8=Ip zBFyDju6aN7*}Qpf#Eqo2v;GUyxMYS7SfB=U+9F5qO9bIy%`HAu z@@I-B6mI+W-+_)Bi8zqIs77`y!4>FJ0cj=Vy9`80%=8+ zDYG!wHV?}GG%OU4#;!h|=Pz%7@|wCKG*?%|1Y8FHt%EJ&%f8?Km1{c~wM1@xJy>(q z|5g*=%@sk?|NOu6D%BJG&mpAM2}C^-KyC_rvL;lCh)hrF^3!Y>puoKMUI;eE*f z035fxw1n2bwS}$oq;d*O@z0kpe;PO69sUVkvR_DE`rSKPF}<)PM5+3;*vL|Gg3gySN!9;eRj$^4}2Kiqx7r_6L7s?-|1;M%43p5svas^Bj&PemL^ItZsnjVM#~(4E zOwJp*iQfG5R`FMGSVdOMoWC-;z}a%<@y>Dkj<>hfg~Dz=^kq%RHq&*^Sl=dfL8s}} zE-cEjh1%q^mu$SjZvJk2?&Ki>AEu=z)8sVOG%DY3r-~`s@}g zZ8qQ0#VJe_*@L6^@cWzf*b=jU`rvuRkG+f#0`1 zo5;1d_eEdQz^iL(;O~AqzXITWQk6zsjH-x0j}r{}(v^{bL#e@;yUpFQYP-qYdBDG(dPW=zGN z`)P|opU-KRg0i$q(}czOTtMdHPHGp5%22gtrNfcsE3K7A%AJXrZGLMpHj1B-^TWi)BWRNAfKWgn#rur zdi;p`{-IZf8#QMT+nY5KDdW)E{&37Tr?1TJ#pfI?L!U;po&r$H#vkRtzXidn|p~Fz8{%3}qNxzJ(6`m@Wo20AV-D6E$r5h4@JF`D~%nEq+ zRfw_S68aXQ;Hj!y^_rTLE8#HKyERc_uf zvK+^pkbv|1E!8jeH5j`k1MI2y1uZg(ub9?ExxHK7o;o+&H-cvUI$8H4nKtt7AIPwD z8%9LqR%_nDXmX(E^Gw75Z?2M#LG59YDG9oIHVPmdUxQXWabQNndS;^GLnL*hyIUD``6P|Cf#aH;4S6O!8kG0{BNl k;s1!~f8qa!mShjfO$C>0pjsLKvlIr9mr;>!kTeVXAI$A3ApigX literal 2377 zcmds({Xf%tAICr6&D^Yn6Sg{}uW+Wd%@-kDD{7>M;5WfELo7^xF{{MV===J7l_=ls%g~)}MQy zb|o5e$Mz}5CJH!L=dLyA>}<37sHm>4F0fj@$EZLI0&|&BP>TTwBwm97qg4J24P1l> zsEqR6pr@933BszEte7VkG;xd|A{hcXT&Co|h>GGg)%MTl`K94Ykc1gVw0z=ZoURt= zpn9jVTJTk`(-1J~mi8MHK)D;yAAp`2t0ZLrqy2Pa62|Q(mU9U;%nZT9^6Wf5rgMU}brkmY_fuaia;?Uw&JVy9Fdy*1G>dNPcxq z4$h@YhV`XuFYC5zF`lpfrN0FYc98a&MH@=;czR7QuDNz$@L=IwQTIi(QX)@k3sPIi zD!6hFF{n1MD$@}PPr>Fnp;ZTcmhX(jF$lccicT+0Ox~0y`AaSY5E5@SuJpX zr{kL$bS!ruz=3m-_j=*gL+Uh2;y0YSln;7M^;`ADZ}wlR#yYL<$^pjC@{Qg{Iw=c| zfTDfOYNUIL^%lzzRba;GwgPtHp0-*~vwX{)z=$zKgz#%c2JsBdPGG)f zG9xKEAVqc5?n^wfx?)++cNiy4G-&nTUgSnjCwd6O*^s3zO<}E}i<}Ic^ShQ9$;6?cg7_jp2z6 zG|CRv$15EXCUF(br#-*zy)Y?Yi`y!X9~+8Sued`Kncu!Ohn)1VO%~=t!7kWZUAHfJ zc~qCIX)KsH(tYX?FE8d(bnUwOP1d4JW6w>U5F;-*;ouB6#`EVW*a<_M5sBTajQV~? z8qnbTQnO(j<12XU$ola=I>|ciW*Ard)}j^5nJ@k-v@C1(Awzl2`IZdo41r%Qp^oHJd>#g4DcY@^9LM8C)4 z>-=p9xFk|xl;C&+hu&r@;QxgZKI|Ra*1ku5oPWClRV})yvnJ8WiaCJ`4r8A@jOI9vwf#ugwM2Z`}BjlljiRR#+JHv$>onbpQ2$d*)6GmcdpP zzC&1$Q|LP9;ZmNw>_RG{3VnQQaO4L3!ZC%o&WL?pJD@Fe>3FMVFzc{DjTYsbSSTQ@ z^d{`FX?Izn%hR0`1ayQ>&1_J_`wqu8!i_AN=c(UHbeqlo(Hjj>GaWj`3v z-)=WQbxf%THtq2*cOVQu2szXur9a*U;j|10CN<54hmNI$EK;7^|BCl?fmsJ=l$$rt zBq+bLN?nPkEi&i-wk98I-8@>&}I;P&YJ+a%zP2 z{Fd>(;yC`Flo(Dz(XHK|nnyNPX4`qO2MhsI@+j(7T{H)^`|yA)!x|BGZhW>QAWLx{ z_Cg#Vq3aj;C7BaB<3S9IK=R95-rc-}cF9`~N9>&0+@|0Niap*p9De;Tr%GkdhN=n2 z+US+@WMblZ<&Q_8uIer@=E>os;acJAJ~d7&57bp&ue(RSBCPy7)|_LP#OEcSaFJc@ zve}Ft+BTaXB{a&{ - if (hrm.confidence>con || hrm.confidence>=80) { - bpm=hrm.confidence; - con=hrm.confidence; - WIDGETS["bars"].draw(); - if (rst) clearTimeout(rst); - rst = setTimeout(noHrm, 10*60*1000); // forget HRM after 10 minutes - } - }); + // Note: HRM/temperature are commented out (they didn't seem very useful) + // If re-adding them, also adjust `bars` + + // ==HRM start== + // // We show HRM if available, but don't turn it on + // let bpm,rst,con=10; // always ignore HRM with confidence below 10% + // function noHrm() { // last value is no longer valid + // if (rst) clearTimeout(rst); + // rst=bpm=undefined; con=10; + // WIDGETS["bars"].draw(); + // } + // Bangle.on('HRM', hrm=>{ + // if (hrm.confidence>con || hrm.confidence>=80) { + // bpm=hrm.confidence; + // con=hrm.confidence; + // WIDGETS["bars"].draw(); + // if (rst) clearTimeout(rst); + // rst = setTimeout(noHrm, 10*60*1000); // forget HRM after 10 minutes + // } + // }); + // ==HRM end== /** * Draw a bar @@ -42,8 +47,8 @@ const x = this.x, y = this.y, m = process.memory(); let b=0; - bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space - bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C + // ==HRM== bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space + // ==Temperature== bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C bar(x+(w*b++),y,g.theme.dark?'#0ff':'#00f'/*cyan/blue*/,1-(require('Storage').getFree() / process.env.STORAGE)); bar(x+(w*b++),y,'#f0f'/*magenta*/,m.usage/m.total); bar(x+(w*b++),y,'#0f0'/*green */,E.getBattery()/100); From a44d542053941c7bb588e3d444aeb02ad6aba676 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 30 Nov 2021 22:30:28 +0100 Subject: [PATCH 19/42] widbatpc: Fix drawing the bar when charging --- apps.json | 2 +- apps/widbatpc/ChangeLog | 1 + apps/widbatpc/README.md | 4 ++-- apps/widbatpc/widget.js | 16 ++++++++-------- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/apps.json b/apps.json index 2e338a432..351d03bd8 100644 --- a/apps.json +++ b/apps.json @@ -872,7 +872,7 @@ "id": "widbatpc", "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", - "version": "0.13", + "version": "0.14", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "icon": "widget.png", "type": "widget", diff --git a/apps/widbatpc/ChangeLog b/apps/widbatpc/ChangeLog index 09e4fabf4..99822b5a9 100644 --- a/apps/widbatpc/ChangeLog +++ b/apps/widbatpc/ChangeLog @@ -10,3 +10,4 @@ 0.11: Don't overwrite existing settings on app update 0.12: Fixed for Bangle 2 0.13: Fillbar setting added, see README +0.14: Fix drawing the bar when charging diff --git a/apps/widbatpc/README.md b/apps/widbatpc/README.md index c75154f72..48c6070f4 100644 --- a/apps/widbatpc/README.md +++ b/apps/widbatpc/README.md @@ -5,12 +5,12 @@ Show the current battery level and charging status in the top right of the clock Works with Bangle 1 and Bangle 2 When the fillbar setting is on the level colour will fill the entire -bar. This makes for an easier to read dsiplay when the charge is +bar. This makes for an easier to read display when the charge is below 50%. ![](widbatpc.full.jpg) -When the fillbar setting is off the level colour will follow the battry percentage +When the fillbar setting is off the level colour will follow the battery percentage ![](widbatpc.part.jpg) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index caecf8ae4..3e5ff47b4 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -79,20 +79,20 @@ // else... var s = 39; var x = this.x, y = this.y; - const l = E.getBattery(); - let xl = x+4+l*(s-12)/100; + const l = E.getBattery(), + c = levelColor(l); - // show bar full in the level color, as you cant see the color if the bar is too small - if (setting('fillbar')) - xl = x+4+100*(s-12)/100; - - c = levelColor(l); - if (Bangle.isCharging() && setting('charger')) { g.setColor(chargerColor()).drawImage(atob( "DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); x+=16; } + + let xl = x+4+l*(s-12)/100; + // show bar full in the level color, as you can't see the color if the bar is too small + if (setting('fillbar')) + xl = x+4+100*(s-12)/100; + g.setColor(g.theme.fg); g.fillRect(x,y+2,x+s-4,y+21); g.clearRect(x+2,y+4,x+s-6,y+19); From e3745f94fc0fd7bf367727a1fa2f43c26bde89b5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 22:43:45 +0000 Subject: [PATCH 20/42] Mylocation: make into an app --- apps.json | 6 +- apps/mylocation/mylocation.app.js | 94 +++++++++++++++++-------------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/apps.json b/apps.json index 0f2d7b738..5442c4d88 100644 --- a/apps.json +++ b/apps.json @@ -4568,13 +4568,15 @@ "description": "My Locations adds a menu in the Settings app to set your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", - "type": "app", "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ - {"name":"mylocation.apps.js","url":"mylocation.app.js"}, + {"name":"mylocation.app.js","url":"mylocation.app.js"}, {"name":"mylocation.settings.js","url":"mylocation.settings.js"}, {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } ] + "data": [ + {"name":"mylocation.json"} + ] }, { "id": "pebble", diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index 49e74a025..43d6addb1 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -1,7 +1,9 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); +console.log("myloc start"); const SETTINGS_FILE = "mylocation.json"; +let settings; // initialize with default settings... let s = { @@ -10,18 +12,14 @@ let s = { 'location': "London" } -// ...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) || {} -const saved = settings || {} -for (const key in saved) { - s[key] = saved[key] +function loadSettings() { + console.log("loadSettings()"); + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || s; } function save() { settings = s - storage.write(SETTINGS_FILE, settings) + require('Storage').write(SETTINGS_FILE, settings) } const locations = ["London", "Newcastle", "Edinburgh", "Paris", "New York", "Tokyo","???"]; @@ -30,45 +28,55 @@ const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; function setFromGPS() { console.log("set from GPS"); + Bangle.on('GPS', (gps) => { + //console.log("."); + if (gps.fix === 0) return; + //console.log("fix from GPS"); + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } + Bangle.buzz(1500); // buzz on first position + Bangle.setGPSPower(0); + save(); + + Bangle.setUI("updown", ()=>{ load() }); + E.showPrompt("Location has been saved from the GPS fix",{ + title:"Location Saved", + buttons : {"OK":1} + }).then(function(v) { + load(); // load default clock + }); + }); + Bangle.setGPSPower(1); E.showMessage("Waiting for GPS fix. Place watch in the open. Could take 10 minutes. Long press to abort", "GPS Running"); Bangle.setUI("updown", undefined); } -Bangle.on('GPS', (gps) => { - //console.log("."); - if (gps.fix === 0) return; - //console.log("fix from GPS"); - s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } - Bangle.buzz(1500); // buzz on first position - Bangle.setGPSPower(0); - save(); - - Bangle.setUI("updown", ()=>{ load() }); - E.showPrompt("Location has been saved from the GPS fix",{ - title:"Location Saved", - buttons : {"OK":1} - }).then(function(v) { - load(); // load default clock - }); -}); - - -E.showMenu({ - '': { 'title': 'My Location' }, - '< Back': back, - 'City': { - value: 0 | locations.indexOf(s.location), - min: 0, max: 6, - format: v => locations[v], - onchange: v => { - if (v != 6) { - s.location = locations[v]; - s.lat = lats[v]; - s.lon = lons[v]; - save(); +function showMainMenu() { + console.log("showMainMenu"); + const mainmenu = { + '': { 'title': 'My Location' }, + '{ load(); }, + 'City': { + value: 0 | locations.indexOf(s.location), + min: 0, max: 6, + format: v => locations[v], + onchange: v => { + if (v != 6) { + s.location = locations[v]; + s.lat = lats[v]; + s.lon = lons[v]; + save(); + } } }, - }, - 'Set From GPS': ()=>setFromGPS() -}); + 'Set From GPS': ()=>{ setFromGPS(); } + } + + console.log("showMainMenu 2"); + + return E.showMenu(mainmenu); +} + +loadSettings(); +showMainMenu(); +console.log("myloc end"); From 4cbd7e8ea63c5aef83f72ceedcad7a2cc811917d Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 22:46:37 +0000 Subject: [PATCH 21/42] Mylocation: make into an app --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5442c4d88..fc40f83bc 100644 --- a/apps.json +++ b/apps.json @@ -4573,7 +4573,7 @@ {"name":"mylocation.app.js","url":"mylocation.app.js"}, {"name":"mylocation.settings.js","url":"mylocation.settings.js"}, {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } - ] + ], "data": [ {"name":"mylocation.json"} ] From 8e56dce22c49a1a80b4dc9142092ea5238ab34ad Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 23:10:36 +0000 Subject: [PATCH 22/42] Mylocation: make into an app --- apps/mylocation/mylocation.app.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index 43d6addb1..fb2f73fa7 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -1,6 +1,5 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); -console.log("myloc start"); const SETTINGS_FILE = "mylocation.json"; let settings; @@ -13,7 +12,6 @@ let s = { } function loadSettings() { - console.log("loadSettings()"); settings = require('Storage').readJSON(SETTINGS_FILE, 1) || s; } @@ -27,7 +25,6 @@ const lats = [51.5072 ,54.9783 ,55.9533 ,48.8566 ,40.7128 ,35.6762, 0.0]; const lons = [-0.1276 ,-1.6178 ,-3.1883 ,2.3522 , -74.0060 ,139.6503, 0.0]; function setFromGPS() { - console.log("set from GPS"); Bangle.on('GPS', (gps) => { //console.log("."); if (gps.fix === 0) return; @@ -71,12 +68,8 @@ function showMainMenu() { }, 'Set From GPS': ()=>{ setFromGPS(); } } - - console.log("showMainMenu 2"); - return E.showMenu(mainmenu); } loadSettings(); showMainMenu(); -console.log("myloc end"); From 8ad8ed15dc8e9fe4091d2f3a5b1faf7b828bb0c5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 23:15:45 +0000 Subject: [PATCH 23/42] Mylocation: make into an app --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index fc40f83bc..1fab6aa98 100644 --- a/apps.json +++ b/apps.json @@ -4571,7 +4571,6 @@ "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"mylocation.app.js","url":"mylocation.app.js"}, - {"name":"mylocation.settings.js","url":"mylocation.settings.js"}, {"name":"mylocation.img","url":"mylocation.icon.js","evaluate": true } ], "data": [ From 848ccd2be996e5127d09e36960775e5cb45a4143 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 23:16:56 +0000 Subject: [PATCH 24/42] Mylocation: make into an app --- apps/mylocation/mylocation.settings.js | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 apps/mylocation/mylocation.settings.js diff --git a/apps/mylocation/mylocation.settings.js b/apps/mylocation/mylocation.settings.js deleted file mode 100644 index 4767c4732..000000000 --- a/apps/mylocation/mylocation.settings.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(back) { - // just go right to our app - load("mylocation.app.js"); -})(); From 7785c7ea56867250df5985d0a27a7fd35478e501 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 23:38:29 +0000 Subject: [PATCH 25/42] Mylocation: make into an app --- apps.json | 3 ++- apps/mylocation/README.md | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 1fab6aa98..371a4f2f3 100644 --- a/apps.json +++ b/apps.json @@ -4563,9 +4563,10 @@ "name": "My Location", "shortName":"My Location", "icon": "mylocation.png", + "type": "app", "screenshots": [{"url":"screenshot_1.png"}], "version":"0.01", - "description": "My Locations adds a menu in the Settings app to set your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", + "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", "supports": ["BANGLEJS", "BANGLEJS2"], diff --git a/apps/mylocation/README.md b/apps/mylocation/README.md index 6ae1dd530..aa9a04b81 100644 --- a/apps/mylocation/README.md +++ b/apps/mylocation/README.md @@ -1,8 +1,7 @@ # My Location - *a adds a My Location settings menu, stores GPS lat and lon of your preferred city* + *Sets and stores GPS lat and lon of your preferred city* -* My Location is a service app that adds a 'My Location' menu to the settings menu * Select one of the preset Cities or setup through the GPS * Other Apps can read this information to do calculations based on location * When the City shows ??? it means the location has been set through the GPS From 312bed6491d7a9341c7f9de4d1f309e2f85b3fe5 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:00:58 +0900 Subject: [PATCH 26/42] Create app.js --- apps/a_speech_timer/app.js | 173 +++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 apps/a_speech_timer/app.js diff --git a/apps/a_speech_timer/app.js b/apps/a_speech_timer/app.js new file mode 100644 index 000000000..dae2545b2 --- /dev/null +++ b/apps/a_speech_timer/app.js @@ -0,0 +1,173 @@ +Graphics.prototype.setFontMichroma36 = function() { +g.setFontCustom(atob("AAAAAAAAAAAAAAAAeAAAAAeAAAAAeAAAAAeAAAAAAAAAAAAAAAAAAAAAAAGAAAAA+AAAAD+AAAAP+AAAA/8AAAD/wAAAf/AAAB/4AAAH/gAAAf+AAAB/4AAAH/gAAAf+AAAAfwAAAAfAAAAAcAAAAAAAAAAAAAAAAAAAAAAAA///AAD///wAH///4AP///8APwAD+APAAAeAeAAAeAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAPAeAAAeAPAAAeAPwAD+AP///8AH///4AD///wAA///AAAAAAAAAAAAAAAAAAAAAEAAAAAOAAAAAfAAAAA+AAAAB8AAAAD8AAAAH4AAAAPwAAAAPgAAAAfAAAAAf///+Af///+Af///+Af///+AAAAAAAAAAAAAAAAAAAAAAAAAA/Af+AD/A/+AH/B/+AP/D/+APwD4eAPADweAfADweAeADweAeADweAeADweAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAHgeAeAPgeAeAPAeAeAPAeAeAPAeAeAPAeAfAPAeAPw/AeAP/+AeAH/+AeAD/8AeAB/wAOAAAAAAAAAAAAAAAAAAAAAAAAAB8APgAD8AP4AH8AP8AP8AP8APgAB+AfAAAeAeAAAeAeAAAPAeAAAPAeAAAPAeAAAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAPAeAeAeAfAeAeAPx/h+AP///+AH///8AD///4AB/h/gAAAAAAAAAAAAAAAAAAAAAAeAAAAA/AAAAA/AAAAB/AAAAD/AAAAH/AAAAPvAAAAPPAAAAfPAAAA+PAAAB8PAAAD4PAAADwPAAAHwPAAAPgPAAAfAPAAA+APAAA8APAAB8APAAD4APAAHwAPAAPgAPAAPAAPAAfAAPAAf///+Af///+Af///+Af///+AAAAPAAAAAPAAAAAPAAAAAPAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAf/8PgAf/8P4Af/8P8Af/8P8AeB4A+AeB4AeAeDwAeAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAPAeDwAfAeDwAeAeD4A+AeD+D+AeB//8AeB//4AeA//4AAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAA///AAD///wAH///4AH///8AP4fB+APAeAeAfA8AeAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAfA8APAPA+AeAPgeAeAP8fh+AH8f/8AD8P/8AA8H/4AAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAeAAAAAeAAAAAeAAAAAeAAAAAeAAACAeAAAGAeAAAOAeAAAeAeAAA+AeAAD+AeAAH8AeAAP4AeAAfwAeAA/gAeAB/AAeAD+AAeAP4AAeAfwAAeA/gAAeB/AAAeD+AAAeH8AAAefwAAAe/gAAAf/AAAAf+AAAAf8AAAAf4AAAAfgAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAMAAB+B/wAD/j/4AH/3/8AP///+AP//A+AfB+AeAeA+AeAeA+APAeA+APAeA+APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA8APAeA+APAeA+APAeA+APAeA+AOAeA+AeAPh/A+AP///+AP/3/8AH/3/8AB/D/wAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAD/4HAAH/8HwAP/+H4AP5/H8AfAfA8AeAPAeAeAPAeAeAPAeAeAHgfAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHgPAeAHAPAeAPAOAeAPAeAPAPAeAPwfB+AP///8AH///4AD///wAA///AAAAAAAAAAAAAAAAAAAAAAAAAAAB8DwAAB8HwAAB8HwAAB8DwAAAAAAAAAAAAA"), 46, atob("CBIkESMjJCMjIyMjCA=="), 36+(1<<8)+(1<<16)); +}; + +Graphics.prototype.setFontMichroma16 = function(scale) { +g.setFontCustom(atob("AAAAGAAYAAAAGAB4A/APwD4AeADgAAAAAAA/8H/4YBjAGMAcwBzAHMAcwBzAHMAYYBh/+D/wAAAAABgAOABwAGAA//h/+AAAAAA4+Hn4YZjhmMOYw5jDmMMYwxjDGOMYYxh/GD4YAAAAADBwcHhgGOAYwBzHHMccxxzHHMcc5xhnGH/4PfAAAAAAAOAB4APgB2AGYAxgHGA4YDBgYGD/+P/4AOAAYAAAAAD+cP547BjsGOwc7BzsHOwc7BzsHOwY7zjv+APgAAAAAD/wf/hmGOYYxhzGHMYcxhzGHOYYZhh3uDP4AeAAAEAA4ADgAOAI4DjgeODw4eDjgOcA7gD8APgA8AAAAAAAAAA58H/4bxjmGMYcxhzGHMYcxhzGHOYYbxh/+DnwAAAAADxgfnBnOOMYwxjDHMMcwxzDHMMY4xhjOH/4P/AAAAAABnAGcAAA"), 46, atob("BAgQCBAQEBAQEBAQBA=="), 16+(scale<<8)+(1<<16)); +}; + +function timeToString(duration) { + var hrs = ~~(duration / 3600); + var mins = ~~((duration % 3600) / 60); + var secs = ~~duration % 60; + var ret = ""; + if (hrs > 0) { + ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); + } + ret += "" + mins + ":" + (secs < 10 ? "0" : ""); + ret += "" + secs; + return ret; +} + +var newtimer_left_from = 60; +var newtimer_left_to = 2*60; + +var newtimer_right_from = 5*60; +var newtimer_right_to = 7*60; + +var current_from = 5*60; +var current_mid = 6*60; +var current_to = 7*60; +var current_value = 0; + +var timerinterval; +var istimeron = false; + +var islocked = false; + +function countDown() { + current_value++; + draw(); + + if (current_value == current_from) { + Bangle.buzz(500); + } else if (current_value == current_mid) { + Bangle.buzz(400).then(()=>{ + return new Promise(resolve=>setTimeout(resolve, 800)); + }).then(()=>{ + return Bangle.buzz(500); + }); + } else if (current_value == current_to) { + Bangle.buzz(300).then(()=>{ + return new Promise(resolve=>setTimeout(resolve, 600)); + }).then(()=>{ + Bangle.buzz(300).then(()=>{ + return new Promise(resolve=>setTimeout(resolve, 600)); + }).then(()=>{ + return Bangle.buzz(500); + }); + }); + } + +} + +Bangle.on('touch',(touchside, touchdata)=>{ + if (!islocked && istimeron && touchdata.y > (100+10)) { + Bangle.buzz(40); + istimeron = false; + clearInterval(timerinterval); + } else if (touchdata.y > 24 && touchdata.y < (100-10)) { + Bangle.buzz(40); + islocked = !islocked; + } else if (!islocked && touchdata.y > (100+10) && touchdata.x > 88 + 10) { + Bangle.buzz(40); + current_from = newtimer_right_from; + current_to = newtimer_right_to; + current_mid = (current_from + current_to) / 2; + current_value = 0; + if (timerinterval) clearInterval(timerinterval); + timerinterval = setInterval(countDown, 1000); + istimeron = true; + } else if (!islocked && touchdata.y > (100+10) && touchdata.x < 88 - 10) { + Bangle.buzz(40); + current_from = newtimer_left_from; + current_to = newtimer_left_to; + current_mid = (current_from + current_to) / 2; + current_value = 0; + if (timerinterval) clearInterval(timerinterval); + timerinterval = setInterval(countDown, 1000); + istimeron = true; + } + showInstructions = false; + draw(); +}); + +Bangle.on('swipe',(swiperight, swipedown)=>{ + console.log(swiperight); + console.log(swipedown); + + if (swiperight == -1) { + if (newtimer_left_from >= 60) { + newtimer_left_from += 60; + newtimer_left_to += 60; + } else { // special case for 0:30 to 1:00 + newtimer_left_from = 60; + newtimer_left_to = 120; + } + newtimer_right_from += 60; + newtimer_right_to += 60; + draw(); + } else if (swiperight == 1) { + if (newtimer_left_from > 60) { + newtimer_left_from -= 60; + newtimer_left_to -= 60; + } else { // special case for 0:30 to 1:00 + newtimer_left_from = 30; + newtimer_left_to = 60; + } + + if (newtimer_right_from > 120) { + newtimer_right_from -= 60; + newtimer_right_to -= 60; + } + draw(); + } +}); + +var drawTimeout; +var showInstructions = true; + +function draw() { + g.reset(); + if (current_value >= current_to) { g.setBgColor("#F00"); } + else if (current_value >= current_mid) { g.setBgColor("#FF0"); } + else if (current_value >= current_from) { g.setBgColor("#8F8"); } + g.clearRect(0,24,176,176); + + g.reset(); + g.setFontAlign(0, 0); + + g.setFont("Michroma36").drawString(timeToString(current_value), 88, 62); + + g.setFont("HaxorNarrow7x17"); + g.drawString(timeToString(current_from), 44, 62+26); + g.drawString(timeToString(current_mid), 88, 62+26); + g.drawString(timeToString(current_to), 132, 62+26); + + if (current_value >= current_from) { g.drawRect(44-1,62+26+9,44+1,62+26+9+1); } + if (current_value >= current_mid) { g.drawRect(88-1,62+26+9,88+1,62+26+9+1); } + if (current_value >= current_to) { g.drawRect(132-1,62+26+9,132+1,62+26+9+1); } + + if (showInstructions) { + g.setFont("6x8").drawString("Tapping timer locks buttons", 88, 100+5); + g.setFont("6x8").drawString("<= Swipe to change time =>", 88, 168); + } + + g.setColor(islocked ? "#444" : "#000"); + g.setFont("Michroma16"); + g.drawString(timeToString(newtimer_left_from), 44, 138-9); + g.drawString(timeToString(newtimer_left_to), 44, 138+9); + g.drawString(timeToString(newtimer_right_from), 132, 138-9); + g.drawString(timeToString(newtimer_right_to), 132, 138+9); + + g.drawRect(0+8,138-24, 88-9+1, 138+22+1); + g.drawRect(0+8,138-24, 88-9, 138+22); + g.drawRect(88+8,138-24, 176-10+1, 138+22+1); + g.drawRect(88+8,138-24, 176-10, 138+22); +} + +require("FontHaxorNarrow7x17").add(Graphics); +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From 673fa8820f779a79bcfa46819990e5717a4d49ba Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:01:48 +0900 Subject: [PATCH 27/42] Add files via upload --- apps/a_speech_timer/app.png | Bin 0 -> 3036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/a_speech_timer/app.png diff --git a/apps/a_speech_timer/app.png b/apps/a_speech_timer/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb777fa7988b5d0a44e31d7238925f0ca47027a GIT binary patch literal 3036 zcmaJ@3p`Z$7r!HUj7_!?B{4>i$zz^u&6t_Q$XoJCMH*&gm7T#^Y#jC4Ec1rSneYmM!f8k4B7!W3=T`g;)ob59BV=ZWegs`71mpW zD&=6Cy*vO=0XH2|=zlRJNH2(<$bM!H+ ze;g*D1uuZ+ld<3E051S(=FRrM#EQWHUHCS$rnjNa!yrz6kXE zFW?fz5+Im+q9a&|bQ+&VrSTaQS@|1damE;|8(97(cp}Es5JMo!Qu{C4&v-0D86d+K zSmv8(Da#VeFL7`~-MCy9<=;KM;KMw6(Pj}&Ldz<8Nrf-8&-^afKNKj4{JR$^(23~i zJ^)adwx#ZH^HjcdR%o+lzgnYYD!(Q1uAQq?6ESlhF}fq!qhPi4bsWnFSrnj`506*+ zdQ?>81vNOTu7ZQ+2Z)e{2Kxf=sT!w~>?Bj+;}bzo%x>4c?~Q1?MG;JkM&_P3pPeA% zdH&D6*1aDb-C|_K8hEz1%s+K&RGNz;siY&|&kygrud_$GE5>W0X1xaRc>GEo(i$Bd z)n|z3lmX@TWKDD~Nr>YQwLhy%xLGvPbA#vZ-dUHh(wm-QnG57GYGWWOnkfFBts#B& z7k8bjy1&M{E_D?G6VNWcV4qc`vU%gijhi;fwp(Iy$q^oV_cGlI3IxRVHky$@psxTRdE~h>`Z{(6U104+r9Bn$P0T?@V=(rtq0lZ^;fx(Itn|4G+>k%)R41zRD{|5NaB%~Lw>w$Qt!dRL9I5}S`y>w?Qahq_sNRbS1)o_Yw!Cd z`D|CgiSsR|r2UN|kq&uA^mL`w^vI)2fkU@pv4dAye((Iz-rk;Ed{gkMZ*t_(_NbYM z)k2=?!$y&=9;wwdX}J;A;R^7g2bo$c(%t@H?tM9@H@x`_);`mS*;#zrVQ%gno_QyE zmFC(X){@vqxX}?lr@}`_h419UUF%85y>@399R*HBk}q zA~}0SKbvQ2`HcISm6q5mzD`c6zs%L2fWbC7Y>Rx0dHnk2fnz;4#2c#p zTXU58rVqCMY)2iuOslI38&~ZGQ~6{d59M8De%JC8OIp4KfrwK*?M{n+_j+*PUd8}< zXnOqVAv&FEZCwT-_PSnlQa+dWs=slz#WEIR{)@uB}_@7b(;2x8vredha zJe7jC+4mH?NlbbDdYiYTsr}}knPhBgQ2cP0=A9KM9gezN?s^ zEf>_9L#T9r1hX@fvv9N9q~iROs`j?uI7fDh)|>5==4}7AX3Xb#6VpoX!tqjL^`osJ z^7V2BX4Eb2;G5ZK=wjmaRod!%=fFO)x3Ov0tbOFGLqimbj(4QRbX{PTTP16-g6^Kw zGxR7y8W=!FqhngFVxF9(UpYMD5heW9QYY=DG5?)&nm#;pcWlp3`zy{{iy9gl`qIE} zOmAg~rLnoXRzzXj~B%aEQKeqLAH00wSCC`!wh8i%#MVt_U|M>}vK{Q@Gu{N<&}W+cQ9m7-o`4 zsLFJ(p_8KLwz*x>R8`@Pf!xQ=f0xx3SlM;2%WH^)AmVN_YFmR#N%*#S32VjC~%Lglw6 z#l^)r{Xks1QpxqLw(IWQu>NpWGqqmnqH+6nH*gYU# yJ4%fcGfsA|u23h2XeHGe^>e7deLFk-@M$Mu_WQQ7zPGYpR9h=2YN^G+xW54KKFVwW literal 0 HcmV?d00001 From 9033db08bf1a56d1f852a60795eb75d2bdee0f70 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:03:45 +0900 Subject: [PATCH 28/42] Create app-icon.js --- apps/a_speech_timer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/a_speech_timer/app-icon.js diff --git a/apps/a_speech_timer/app-icon.js b/apps/a_speech_timer/app-icon.js new file mode 100644 index 000000000..1fdb2c509 --- /dev/null +++ b/apps/a_speech_timer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgP//kAj//AAP5/+PApH7//PAonvAoXzAonj//nApHggEHAoWAgA5BAAJCCAoU/IYIFCv///w0CAonrv/HAoXLv+DAogLFgPeAoV+nlOAoV4/8+AoV79+eFIVzAof7u/v5xBCs4FL84FE//O74FBu4FB64FD73TAoNz/+eAoV5IIIFCvl8vwFCv8A/wFDO4IFFFIQFCGoSVFUIqtDh65D/1vYof+Y4LLDw7dD/0ndIYRCeoQFC/P/z/+i///oFBGoX8gEfAgI=")) From da133e2ccd7ee837d078430095733180929fff4b Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:09:06 +0900 Subject: [PATCH 29/42] Create ChangeLog --- apps/a_speech_timer/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/a_speech_timer/ChangeLog diff --git a/apps/a_speech_timer/ChangeLog b/apps/a_speech_timer/ChangeLog new file mode 100644 index 000000000..4a8e3fbe7 --- /dev/null +++ b/apps/a_speech_timer/ChangeLog @@ -0,0 +1 @@ +1.00: Release (2021/12/01) From 18c3461e6e4191433897f3b1e10a9f68f7b97fa8 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:20:41 +0900 Subject: [PATCH 30/42] Create README.md --- apps/a_speech_timer/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/a_speech_timer/README.md diff --git a/apps/a_speech_timer/README.md b/apps/a_speech_timer/README.md new file mode 100644 index 000000000..98d2d4517 --- /dev/null +++ b/apps/a_speech_timer/README.md @@ -0,0 +1,12 @@ +# A Speech Timer + +* A timer designed to help keeping your speeches and presentations to time +* Vibrates 1-2-3 times and changes screen color within the target time range. + * Example for a 5 to 7 minutes speech: vibrates once at 5:00 (green), twice at 6:00 (yellow), thrice at 7:00 (red). +* Use the buttons to start a timer +* Swipe left or right to choose different target times + +![](screenshot.png) + +## Creator +[@alainsaas](https://github.com/alainsaas) From 13b01fe82955ca3ba595ed115fd1bfc6acd7a4fc Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:20:52 +0900 Subject: [PATCH 31/42] Add files via upload --- apps/a_speech_timer/screenshot0.png | Bin 0 -> 3276 bytes apps/a_speech_timer/screenshot1.png | Bin 0 -> 3457 bytes apps/a_speech_timer/screenshot2.png | Bin 0 -> 3401 bytes apps/a_speech_timer/screenshot3.png | Bin 0 -> 3374 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/a_speech_timer/screenshot0.png create mode 100644 apps/a_speech_timer/screenshot1.png create mode 100644 apps/a_speech_timer/screenshot2.png create mode 100644 apps/a_speech_timer/screenshot3.png diff --git a/apps/a_speech_timer/screenshot0.png b/apps/a_speech_timer/screenshot0.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3ababc1abf849d688e97c5ceb8d3ae8180f05c GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/apps/a_speech_timer/screenshot1.png b/apps/a_speech_timer/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..69ea91e95332e8b97e6de3205f72319215bd6195 GIT binary patch literal 3457 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 literal 0 HcmV?d00001 diff --git a/apps/a_speech_timer/screenshot3.png b/apps/a_speech_timer/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..7b67b6f0156354dc839f5194e1a1fbc1c54ed9a1 GIT binary patch literal 3374 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 bvNGFCP4eAd222Y+K)?liN4u7DzS;i;FilcV literal 0 HcmV?d00001 From 8f0856d8716af6e1058a9923e0e5850734303d72 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:21:21 +0900 Subject: [PATCH 32/42] Update README.md --- apps/a_speech_timer/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/a_speech_timer/README.md b/apps/a_speech_timer/README.md index 98d2d4517..a6568649f 100644 --- a/apps/a_speech_timer/README.md +++ b/apps/a_speech_timer/README.md @@ -6,7 +6,10 @@ * Use the buttons to start a timer * Swipe left or right to choose different target times -![](screenshot.png) +![](screenshot0.png) +![](screenshot1.png) +![](screenshot2.png) +![](screenshot3.png) ## Creator [@alainsaas](https://github.com/alainsaas) From 541adf4c16c7bf2e522c3343b7675831b9e13343 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:22:44 +0900 Subject: [PATCH 33/42] Update README.md --- apps/a_speech_timer/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/a_speech_timer/README.md b/apps/a_speech_timer/README.md index a6568649f..098c352f3 100644 --- a/apps/a_speech_timer/README.md +++ b/apps/a_speech_timer/README.md @@ -5,6 +5,7 @@ * Example for a 5 to 7 minutes speech: vibrates once at 5:00 (green), twice at 6:00 (yellow), thrice at 7:00 (red). * Use the buttons to start a timer * Swipe left or right to choose different target times +* Touching the timer on the upper part of the screen locks (or unlocks) the buttons to prevent accidental changes ![](screenshot0.png) ![](screenshot1.png) From 3507dcde457b78beede4ee033af1f38090a1a71d Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:26:52 +0900 Subject: [PATCH 34/42] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index 36102264e..cb8a460f7 100644 --- a/apps.json +++ b/apps.json @@ -4557,5 +4557,19 @@ { "name": "sensible.app.js", "url": "sensible.js" }, { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } ] +}, +{ + "id":"a_speech_timer", + "name":"A Speech TImer", + "icon": "app.png", + "version":"1.00", + "description": "A timer designed to help keeping your speeches and presentations to time.", + "tags": "tool,timer", + "readme":"README.md", + "supports":["BANGLEJS2"], + "storage": [ + {"name":"a_speech_timer.app.js","url":"app.js"}, + {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} + ] } ] From 3c7d6b795d50aac5d6c3945a4a9af1ee013154ad Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Wed, 1 Dec 2021 15:28:23 +0900 Subject: [PATCH 35/42] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cb8a460f7..50f02c953 100644 --- a/apps.json +++ b/apps.json @@ -4560,7 +4560,7 @@ }, { "id":"a_speech_timer", - "name":"A Speech TImer", + "name":"A Speech Timer", "icon": "app.png", "version":"1.00", "description": "A timer designed to help keeping your speeches and presentations to time.", From 43312a782a58cbbe6cf2f8c4d49ae1d898bc82d5 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 10:23:07 +0100 Subject: [PATCH 36/42] Update README.md Fix spelling of the Scottish capital city in the README :) --- apps/mylocation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mylocation/README.md b/apps/mylocation/README.md index aa9a04b81..fd597397a 100644 --- a/apps/mylocation/README.md +++ b/apps/mylocation/README.md @@ -20,7 +20,7 @@ ### Select one of the Preset Cities -* The presets are London, Newcastle, Edinbrough, Paris, New York, Tokyo +* The presets are London, Newcastle, Edinburgh, Paris, New York, Tokyo ![](screenshot_1.png) From f3dffdb3e1d43cce05fde4a1bd31d043c758eedb Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:44:12 +0100 Subject: [PATCH 37/42] Change app icon to white --- apps/poweroff/app.png | Bin 882 -> 425 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/poweroff/app.png b/apps/poweroff/app.png index 5c199c3baa43660d2ff1589bfcef3fc8826da228..2b088b7216ce9d0ff9b61ea41f3002ce6bca7ad8 100644 GIT binary patch delta 399 zcmV;A0dW5E2B`y(B!3BTNLh0L01FZT01FZU(%pXi00047NklefJI>4dkt7M*1d%l z7LWzD2qX6yuCM@)nE6OCHJ^G23Gf`LG~(5IoLWdofG*H`uK}Is?W-7v0xT!0#9EYv zWpV4;LjgMZ8~2m|%dv_;7LyWCX|%g`1av!^#hVFa9qZ1&cLM^C{Z&DIH2&ukihLoX z4kC}m{P_ul{(q~n-06Df75vf!EMh#1NUUOnCLoP?MC>FwFiR7F!(JoEStC=kV#ql> z0ZERK9!;YILwdnV36P>l0{~~@kpU}aT7UqYB_i9r^g;D%PDHLkV1mB0t8@SW delta 859 zcmZ3<{E2OXNJhzJaYXwRLK1vi?bN-y#`FD1c#Cc4 zC&Vr=3D#hISA8sQvtJ$m1(n*TyFWe2U!1A8j$UHGB6Zz4sza+g&HNt~EJ*=w*Tfqw}G(ozolBxK3`Z zTYEJ0WI}8lb8o}@Mf-IZG^}0p|E$x2JulvesTnKGVvDSOUM-oya;Ed2XR49wgniGs zDh1~}{m;I-Z{39Yr%Rc1IwF?q%7izz71Ss;G;}MuEtb9A;=aVZSekdTJe!znPy4j+ zbo~$BEHe&03sGjA$9doPOLyz6=q25kT|5Oj3vNID-d6hQ!Kx?P{u?yAe3vIC+e2-O=-|M*ZO1zv8xab_?%ki#`*0`E=c7u?Fh{h4l&Yd7>+~+0SQq zSGI92GrP0;{X~`-XFZm9RCn&)U7ISf!)uq@lT6<`neH1b*C&d6XPW2k!CW2?P_=T) zpUVroZl9Jpy4SP!wXiZW);2J(GBB7nRdgAOj@gTe~DWM4fNdsc$ From 2d190278f224253b969b8a0c742166d4fe193147 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:45:24 +0100 Subject: [PATCH 38/42] Change app icon color to white --- apps/poweroff/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/poweroff/app-icon.js b/apps/poweroff/app-icon.js index 7caf256a2..16c0ad8e7 100644 --- a/apps/poweroff/app-icon.js +++ b/apps/poweroff/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/4Ak/k/ArX8AoIGC/F8n0fAoPwAoMPAoPgAoMHAoPAC4MDAoPBAoODAoODAoPBAoOHAoPhAo8HAoPgAoMPAoPwArRQCFIRQCGoQCBHYYFEKARNCAQQIC4ACBMoXgv/+EwXwn/8GQX4g/gRIX8b4KVC/wFBv6iCwDnE+AcCAF4=")) +require("heatshrink").decompress(atob("mEwwIpmgfAAqkCAoNAAoMHAoPgAoMPwfB+AFBj/D4f4AoM/AoP8AoQRBAoV/DoP+AoN+AoN+AoP8AoM/Ao/4AoMfAsBQCAo5QDAo5KCAQV/AQJZCn+AgIUD4EDAoUf+EPFgUP///RIUHAoKVCgYFBVAYFBWYc/EQQAvA")) From e2a4428be2a8369d51c30b4b34d367983f35c672 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:48:03 +0100 Subject: [PATCH 39/42] Fix gramar and link in README --- apps/poweroff/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/poweroff/README.md b/apps/poweroff/README.md index 3aeff5e8d..9fcb250a1 100644 --- a/apps/poweroff/README.md +++ b/apps/poweroff/README.md @@ -4,10 +4,10 @@ Simple app to power off your Bangle.js ## Usage -Start the app shutdowns your Bangle.js watch after a short delay. +Start the app to shutdown your Bangle.js watch after a short delay. ## Creator -Marco (@myxor) +Marco ([myxor](https://github.com/myxor)) ## Icon Icon taken from https://materialdesignicons.com/ Apache License 2.0 From 871c345cea41816a167170ef019fd6f041f0ccb0 Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:49:25 +0100 Subject: [PATCH 40/42] Update README.md --- apps/poweroff/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/poweroff/README.md b/apps/poweroff/README.md index 9fcb250a1..d9d7a8dbc 100644 --- a/apps/poweroff/README.md +++ b/apps/poweroff/README.md @@ -10,4 +10,4 @@ Start the app to shutdown your Bangle.js watch after a short delay. Marco ([myxor](https://github.com/myxor)) ## Icon -Icon taken from https://materialdesignicons.com/ Apache License 2.0 +Icon taken from [materialdesignicons](https://materialdesignicons.com) under Apache License 2.0 From ca6b73e3e48c2a2b1ee157a6d02d166a0195324c Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:54:49 +0100 Subject: [PATCH 41/42] Icon white with 1px black border --- apps/poweroff/app.png | Bin 425 -> 620 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/poweroff/app.png b/apps/poweroff/app.png index 2b088b7216ce9d0ff9b61ea41f3002ce6bca7ad8..aa186ab200fbadea33ae991b14989b237d77095c 100644 GIT binary patch delta 575 zcmV-F0>J&L1MCElIDY~jNklLNbI20=a0hUbM zT;Q$+EcALwAneQKGTV&6jKE7rU>U^z3vjOj`v&uG@$BDD!>?$-G>l;TF#`0Nm~ZO< z?s41_*n67`>(gL89#Gig>$2Qyfc0=5iPhywj21tipjFC5;D2jyoYrw8y;xkwHO>qY z$wUt2)B?$<2LZ1_d$0)8)vE>-f-MI!IpJWRoaF&g$@f;FE8wmw%E5wUOJ0OUD?JW0 zBLRo`2hj1R?QOTD(^}uO-2y;)fQYCK~}5!>WILUKh;urXtK91tANnNA1JiTh^tw8b5lXrq}62 zl{~}V!f71!8rqYI5tvo?s###sYE`F594z(XRY{?+_a2CK9f+_|)_+5t7)_p>9^!;uJ+pG*-f`ORsCLQ^ zAl+3(9yksljC3ZiC{L%z0 zVmymTtYU;FAajj)MC>FwFiR7F!(JoEStC=kV#ql>0ZERK9!;YILwdnV36P>l0{~~@ zkpU}aT7UqYB_i9r^g;BdjJ3c From a789e0bea4945dd4461469b26f25744a9a3dc46d Mon Sep 17 00:00:00 2001 From: Marco H Date: Wed, 1 Dec 2021 13:55:25 +0100 Subject: [PATCH 42/42] Icon white with 1px black border --- apps/poweroff/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/poweroff/app-icon.js b/apps/poweroff/app-icon.js index 16c0ad8e7..81a2527b5 100644 --- a/apps/poweroff/app-icon.js +++ b/apps/poweroff/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIpmgfAAqkCAoNAAoMHAoPgAoMPwfB+AFBj/D4f4AoM/AoP8AoQRBAoV/DoP+AoN+AoN+AoP8AoM/Ao/4AoMfAsBQCAo5QDAo5KCAQV/AQJZCn+AgIUD4EDAoUf+EPFgUP///RIUHAoKVCgYFBVAYFBWYc/EQQAvA")) +require("heatshrink").decompress(atob("mEwgIolgfAAqkCAoNAAoMHAoPgAoMPwfB+AFBj/D4f4AoM/AoP8AoQRBAoV/DoP+AoN+AoN+AoP8AoM/Ao/4AoMfAsBQCAo5QDAo5KCAQV/AQJZCn+AgIUD4EDAoUf+EPFgUP///RIUHAoKVCgYFBVAYFBWYc/EQQAvA"))