From 82f839bd3fcda5e64dc945ed03177618f54166eb Mon Sep 17 00:00:00 2001 From: seb Date: Thu, 15 Apr 2021 17:34:14 +0100 Subject: [PATCH] Added my "Where in the world?" application --- apps.json | 13 +++++++ apps/whereworld/ChangeLog | 1 + apps/whereworld/app-icon.js | 1 + apps/whereworld/app.js | 69 ++++++++++++++++++++++++++++++++++++ apps/whereworld/app.png | Bin 0 -> 1219 bytes apps/whereworld/worldmap | Bin 0 -> 7200 bytes 6 files changed, 84 insertions(+) create mode 100644 apps/whereworld/ChangeLog create mode 100644 apps/whereworld/app-icon.js create mode 100644 apps/whereworld/app.js create mode 100644 apps/whereworld/app.png create mode 100644 apps/whereworld/worldmap diff --git a/apps.json b/apps.json index db8e2d92f..b8dcda7fd 100644 --- a/apps.json +++ b/apps.json @@ -3132,5 +3132,18 @@ {"name":"hourstrike.boot.js","url":"boot.js"}, {"name":"hourstrike.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "whereworld", + "name": "Where in the World?", + "shortName" : "Where World", + "icon": "app.png", + "version": "0.01", + "description": "Shows your current location on the world map", + "tags": "gps", + "storage": [ + {"name":"whereworld.app.js","url":"app.js"}, + {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, + {"name":"whereworld.worldmap","url":"worldmap"} + ] } ] diff --git a/apps/whereworld/ChangeLog b/apps/whereworld/ChangeLog new file mode 100644 index 000000000..863a2e9a2 --- /dev/null +++ b/apps/whereworld/ChangeLog @@ -0,0 +1 @@ +0.01: Created app \ No newline at end of file diff --git a/apps/whereworld/app-icon.js b/apps/whereworld/app-icon.js new file mode 100644 index 000000000..00ff3a14b --- /dev/null +++ b/apps/whereworld/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+oIA/AANAFNFjtIrBoFoxmMGMopDtFpAgQvBGEgpDAYYwDHwYECG4tjHyonCsYuFtAkDxlpF49osiMSshbDLwwfDsdoKpCoBMCASBOgIsBAgIvFsaOGRYwcCCAYvMJwIrCCQRfIAAouDIgYGCtFpGJRbCAAIWBDgruEOwwQBOYqSBsZFEDQJZBsh7BCgQXDDwLGBF49AAwZfBUIoAFE4IoBCBBeCBYI6BJQYuFIQVpFpYAEtLiGc4oBBEwIuBLIg+CACZHEMA1AtJaCtLsFCwJILKJKiCWgIzFaQTxDf4qaCFRx3DeIp8IAwRACLq7sCJoyUJGIJfGRaRYDAA9pT5I/EZIL+ECw4aEF5Z+GCQ69CsbXBUAi9IRhCAJT5gwERhNpJZAhHZ4NoZx4ABSI6MKGA1otJRBIgwvHFgNpoNkNAJnBXYK8LG49osloSIpfIOAQLBAYJJBAoYAReoZIEoFkGQo+DCAILBAIRgSoKqLdgb/HsdkVQQNBBw5fMF45gDQwKqHAALCCAYIwUTZS/CGAzMEGQQvQtASGEIQKBDxDNGYh6kBRozAEDpQMBDQSOQIwVkCaCSIPIagIF4xCRVhQCCSBqzBUB4TCBjBfDcJIA/aq4utaBw+EAYIBEJKdAsYNMf4OMtFAsgEBAAoKBJSFoxgpHsYKBAIIADFxAxDJxBtCDINjEgQNFEZQANDwpJDJopAFsYuXZwhNKUIhdZLwhMLF4TVBFzJfGRQoPENgRvLAB1pVqFkoABBLzLdSRra/FF5oAdsi9BMYJSdeBzzDGFY=")) \ No newline at end of file diff --git a/apps/whereworld/app.js b/apps/whereworld/app.js new file mode 100644 index 000000000..48d0f7b0c --- /dev/null +++ b/apps/whereworld/app.js @@ -0,0 +1,69 @@ +const landColor = 0x8FAB, seaColor= 0x365D, markerColor = 0xF800; +let lastSuccess = true; + +const mapImg = { + width : 240, + height : 240, + palette: new Uint16Array([landColor, seaColor]), + buffer: require("Storage").read("whereworld.worldmap") +}; + +function getMarkerImg(x, y) { + const b = Graphics.createArrayBuffer(240, 240, 2, {msb:true}); + b.setColor(1); + b.drawLine(x, 0, x, b.getHeight()); + b.drawLine(0, y, b.getWidth(), y); + const pal = new Uint16Array([0, markerColor]); + return {width: 240, height: 240, bpp: 2, palette: pal, buffer: b.buffer, transparent: 0}; +} + +function degreesToRadians(deg) { + return (deg / 180) * Math.PI; +} + +function coordsToScreenLocation(lat, lon) { + const maxMapHeight = g.getHeight() - 1, maxMapWidth = g.getWidth() - 1; + const maxLong = 180; + const x = ((lon + maxLong) / (maxLong * 2)) * maxMapWidth; + const mercN = Math.log(Math.tan((Math.PI / 4) + (degreesToRadians(lat) / 2))); + const y = (maxMapHeight / 2) - (maxMapWidth * mercN / (2 * Math.PI)); + return {x: x, y: y}; +} + +function drawLocation(lat, lon) { + const location = coordsToScreenLocation(lat, lon); + g.drawImages([ + {image: mapImg}, + {image: getMarkerImg(location.x, location.y)} + ]); +} + +function drawNoFixMessage() { + const b = Graphics.createArrayBuffer(240, 216, 1, {msb:true}); + const throbber = ".".repeat(new Date().getSeconds() % 4); + b.setColor(1); + b.setFont("6x8", 2); + b.drawString("Finding GPS Fix" + throbber, 15, 94); + g.drawImage({ + width: b.getWidth(), + height: b.getHeight(), + palette: new Uint16Array([0, 0xF800]), + buffer: b.buffer + }, 0, 24); +} + +Bangle.setGPSPower(1); +Bangle.loadWidgets(); +Bangle.on('GPS', function(gps) { + if (gps.fix) { + drawLocation(gps.lat, gps.lon); + lastSuccess = true; + } + else { + if (lastSuccess) { + Bangle.drawWidgets(); + lastSuccess = false; + } + drawNoFixMessage(); + } +}); \ No newline at end of file diff --git a/apps/whereworld/app.png b/apps/whereworld/app.png new file mode 100644 index 0000000000000000000000000000000000000000..1e12db39d80b1989105b93ff388cfe13c6f51991 GIT binary patch literal 1219 zcmV;!1U&nRP)nqDdx-Q{h4NlA%Hn_TXM65#dhKt3@MSp6+ji@9e(z{S)5S^E zzhB^*hVxrq-<@sdg+tQFd+lyd*tImu;Z4`La_N0|>~mGytAFrjJ3vt+s7uwn zcI$S8@?LT1eqrI5MAFD|>3nPDh=TEATHT~{>UeJFf-}kFdhKpk+o(Iu)>_@8eeY^H z&Dmw*l2+TPh4Wl|?rS{G)jrSAVBnfN&DToRzCO>=JkHc-T zp>OAbgz{f&=7(I~pkCjcXylA==znbHhH~k9Slp&m+OBu(b57T{dhKw1?rM4MaDnk- zZRdnh*|JgCvQ5^xbLx6Q(9BcWuV&+rKhV!_=z(wNf@I>8UEZER(9TEH!aB{^T;8Ej z*t2Nljbh=JQrWOY(#A*A!c^L=H_Y5W&(M4AZCl-H$qy>&W(6{V*+1(0S-< zB8|AT(;p~EU+<{a&u`p8Q%d;bS*^n_is*shyWFq$QEGH$o+BQA86VSGsg!U>8iKG$ zrDW$5er7+zAVq2O*9*25`R1Nd4jZIr$>;1YE3D)_$I!&cXUa(0RJ98m9{%FxtNpT; zeI0U0u{vz_f8f46!+&4;n?jdvz72WA+zkAezE-j=`-ZfI&M-*t-Zwa8+!5rzraQiV z24JaE5IP9$`n3NqTWZbFZk1h!kSG|ng1p=RK;sWLfKfrJ@)2O}Q#~Yj9SX|lpfcWQ zRVG_p-2Whdn_*wA*KHQVrk@!ZYW_>zc|{8+>?E>^^RQ?%&%hTi1ot{Q!as=D^cc1*MS$NuaMZek hvI|I5m}%Vuj{#a{Upa3q6-)pC002ovPDHLkV1i=7ZioN? literal 0 HcmV?d00001 diff --git a/apps/whereworld/worldmap b/apps/whereworld/worldmap new file mode 100644 index 0000000000000000000000000000000000000000..d7e30424fa10d3c5ce0497b375417dd126be87ac GIT binary patch literal 7200 zcmeI0L2o5F5y#zhG@TXE^y3z!X#7@OI0hDpci3G&X{9}_w0wkc;yQ@SAVzBsbI1i0 zj$F`O_yGG2re`BD$N2zzm<~aj14!G^Af^MIHvg)!yWQ`-eiB@vq_pk&x$Nq4+3q~= z|1Ucu(3d;aLD^;dXsc#vRr*TVIqY)pl$oO{+e150HERocH%}XtDV5E6RjY3)rG7Qz zRizF-PAv&7J$4Az45-q-zYsi0?nbft=>TaRpEVY$hN`X zD6kE5t$Pbw?Gph#11^0pv7S<_K$FsLV*5;Gb)Yx6!%UzJ3$8Ga+`o00aqe;Db7 zsIL-w(yJoazJmIi!ad;bs8*!|)}ngqy$e++y7fCx&h-=obPM!xbb((`p2cv~)1u|d^kq>WlGa`+iehU;#nki7|AGBrHdWlNc#H(G{n z)MA;DZKQyp@R1aaI$kQ8H>H&Oz3Gf^-N{1PU|afYN?sDv`=;<;yZZ~JYqsqRe-)|j zF`dcX!EvN5a&@2=pogkbM~f1+76iFUF0*9TQF(Z9TEYSz*2?~a2|o-!kJL&xw0+_E z52}%BC-u{!;YD!jc!a8~r18VN;nxkvOX!gY`f(-{J_JGq4nUU2pcejy=0?$EP1a}F z`*^)kJ_*&cyv>Qmu|$3Cq+Awl;WH%iL~d(t9zGy?PC1iGS8?me6ns`RbkvT5^dr&g z99sZ^JmO}21ZpbFSJ{*nkv3+Vu6g@l9NT>0FKFa+-pXLRRG_B*01TARk1*{emfO@! z5k)$D?gxSx-<)G>YkEgbIRX0j(dXP3w25e6V|9sMwI_pZLG*?qudqTyZ`yI~OQfgA z)YN^+o9IQm8f-Pa;w!d=&cL=JAEL-jPb0%tgSxYbQ1+w|+dvbjJX61B9W8>JPy-F0 z7|?3e;vV5n-a->8g?U0PF$9;oW_UZFx*X04u_(4ETSkkQXr)PaFrgMLe)Tm?q}0)b zQUml*Ifm-U3T9tuS~^+ED$wJU8ln#8N3|B))izy$1RBpe9+^yi^-D(!LXzFGM&5`M z$2;7Jd=ulWODUZhnAan7&e-;Q@z$Ui2(8pf#Z0O9ku)q61EIC*zaQw&MI#a7*Y&mX zhwc z#uIu@UDL(4q+r1}YC`3BHi03~nSVnKUJlxE5TXBq_U;Mow;^GvQ*KG&J9@a9qZ-ng zrq`DAo<66%yRHoi9(j##)>TGL5{thouW4wexYpF;%owzTG&y(TkxvV+I@O!V=tV6x zm@Z2Hq*q@UQUs|iRm3anpL%CCDS|ZImudE#sVu4B?$IGC5)F-$=67FAC|_g}X9N2C z?mP}lC0~NFM#f+HKio|yeSd_r$@p7;emkLZ3%VtOXwj``zDY+G`ii_Jb#awKUn|}# z@Qcf**es96-H4q`2&zeW_0>ZC zVnX><0&V}P9Xl^QFfy-Vq^1Azo*9hmDa8k7U0%#l-+tb{d^OM*B#t*}`w!o}Nht>j zZ)8~6#gmX)2t%Ovh1Mrl@-?AY;S-_Nk?jevKuxhi5klzjdByvL@jxG0ZiD(euF=EE zswmZ3YEr;y0|s%jIQXZ-k_K;B#r_hxQBDJHgp>u%W+->7 zI3{cxYOI!A#7>s6;MIRXrEASe$8R*Tl_BZdmISLZ@mY+9@8Z%W6sf{C5-E&qs=|N6 zDm;1#Mr@)4eG{A8v@QJGNV{+_#y0#K|5d@rb_87OpW_S&vg2n2P5&r~bcz2#MQ6`G zI&6mN|CVg>%!jxkk0cmzC@y;)oA7^2dJ|Q6_ieFJwUb6jkr^b()Szqi0C5m*N*gYb zO}(_+2WB^5ZTDag#3$)KDp%cXk6qE2?fkzEp6?BS*+)COk8Y<++B<#%dQZ0$cJAwx z4!hC60J(lSZUpKz>_-2@`->`*>nYm5jFnz}j>8#Zq6XzaTl_Q6RPUf&9X_zsK|^C!Us(~<{Q%upM8fZmBK)NjKny4|`Z z_a#~nR#Jg3I7Qx9`>1i-^lzfVPaApzQuzKPI{c)xMX@k{j-`fat3X85&j Weq_+Ffp_;YF?Dugy_c5z=)VE6rAHJ1 literal 0 HcmV?d00001