From ce0e50ed949eeffc97bd2ec3db1fdb38830c3e4e Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 26 Nov 2021 20:25:28 +0000 Subject: [PATCH 01/21] 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/21] 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/21] 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/21] 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/21] 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 22d06c8cf6f6fb7a1e0c899480cb8c40785d81f0 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Mon, 29 Nov 2021 18:45:44 +0000 Subject: [PATCH 06/21] 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 07/21] 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 08/21] 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 09/21] 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 10/21] 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 11/21] 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 12/21] 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 13/21] 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 14/21] 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 15/21] 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 e3745f94fc0fd7bf367727a1fa2f43c26bde89b5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Tue, 30 Nov 2021 22:43:45 +0000 Subject: [PATCH 16/21] 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 17/21] 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 18/21] 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 19/21] 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 20/21] 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 21/21] 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