From ced26c57e370bae5c17301f331e0fff4050b0592 Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Tue, 15 Feb 2022 17:05:08 +1300 Subject: [PATCH] Initial Upload --- apps/Rolex/app-icon.js | 1 + apps/Rolex/app.js | 144 ++++++++++++++++++++++++++++++++++++++ apps/Rolex/metadata.json | 17 +++++ apps/Rolex/rolex.png | Bin 0 -> 2406 bytes apps/Rolex/screenshot.png | Bin 0 -> 3683 bytes 5 files changed, 162 insertions(+) create mode 100644 apps/Rolex/app-icon.js create mode 100644 apps/Rolex/app.js create mode 100644 apps/Rolex/metadata.json create mode 100644 apps/Rolex/rolex.png create mode 100644 apps/Rolex/screenshot.png diff --git a/apps/Rolex/app-icon.js b/apps/Rolex/app-icon.js new file mode 100644 index 000000000..563a4a78b --- /dev/null +++ b/apps/Rolex/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkEBxURiIlUgMxiUQC6cCiMhmAqPmQEDkUhF4cjGhUD/4FDn/zAof/GhYMEC4kCEQgAHl/xGoYcDj/yC5ZIFJgnwPBglIn6rNBpEBXp8QiQSBiMQFpMCS4sDXgMjgMhgYXFEgIDBh//kA/EiEhiURiMBBYs/FYSwB+YdBCQIBBkAYBiUQkACBCwTOEUYKaBkUhAAIXCDYMRkYxBIILNDAAMTHgZxBiBFBFQKOCgMvbRUBgUxIYJ3BSYUBmYJBU5QsCkIDBgQIBkcyYJwAFkczeBoAGiYWVgYWTbQMCmchfojgBDxc/+f/mUjC4abBkEf/4ABDY0C+cvmQKFgcxkTyBC47pBC4LgDAAUPmMyh4IEiUQiUyiJHBIwJ9GmMxC4kBmXyGYcBdQMykIPEcIIlBFgMikMzIAxiBkSPEIYqSKmX/mLWTgEimRiGAB0T+bwTVocCMBEAj51GAA4aGif/+AXNh//FAcC//ziEBgEhiCxBiADCXAIDBCIYdFgLCBaIMCkKNBkQIBkQTBgZBDgRdEiIsBGoMBAoLoDLQRxIkMhewMigMyiESiRrNWqpMB+QJHl4hMh/zBI//a5IlDYQcBFQcf+IWKgLJEj4cDgY5IBgf/AoYXEEQp2HHggXEKQIXKAAoXFACIXkA")) \ No newline at end of file diff --git a/apps/Rolex/app.js b/apps/Rolex/app.js new file mode 100644 index 000000000..adfe8a2c7 --- /dev/null +++ b/apps/Rolex/app.js @@ -0,0 +1,144 @@ +/* Set background image */ + +var imgBg = { + width : 176, height : 176, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("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")) +}; + +/* Set hour hand image */ + +var imgHour = { + width : 19, height : 62, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("/wAF64AEBgwQJChYRJCY4RLCYoRNCQYROCYYS/CWKXSXqbjTCZYRHCZIRJCY4RLCQVWqwSQwOBCX4S/CXb1VCRYRGChIJC1hJDAYYTFA4QMBCQuB1gTFCIoSFCYokGCQyJEBQwSHA4ISSCYIKFqwSRSgiKCCQwhBM4QAFEpAMEDA1WCQgyHHwy9JChASRchYkJCYpNBAAQQICYxaHCZwRKCYTTCCR6ZCCR62BLoIRMawoSNJgQSRCKASmCYQSRCKASmABIA=")) +}; + +/* Set minute hand image */ + +var imgMin = { + width : 10, height : 80, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("/wAL64ABA44ADBBAKCBKQAdHhJQILZBtIBLwKEHRoTKBMlWqwJIwIJ/BP4J/BKDbJBM2BBP4J/BKgADBJoKEBAgJoBQYJIBAwJoBQIJIABw=")) +}; + +/* Set second hand image */ + +var imgSec = { + width : 8, height : 116, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("/3XAAf+AAIHEBAQHMC4QIEA4wGDBAYH/A/4HsayD0BBYj9DBowDLC44nIHAxHGR/4H/A/4H/A9IGBA4YFCAAYHHAAmsAomBqwABA4gICA4oIBC5YICGZRAGK5Cf/A/4H/A7YGFA4oA==")) +}; + +/* Set variables to get screen width, height and center points */ + +let W = g.getWidth(); +let H = g.getHeight(); +let cx = W/2; +let cy = H/2; +let Timeout; + +/* set font */ + +require("Font4x5Numeric").add(Graphics); + +Bangle.loadWidgets(); + +/* Custom version of Bangle.drawWidgets (does not clear the widget areas) Thanks to rozek */ + +Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); // also loads the current theme + + try { + for (var wd of WIDGETS) { + g.setClipRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + + g.reset(); // clears the clipping rectangle! + } + }; + +/* Draws the clock hands and date */ + +function drawHands() { + let d = new Date(); + + let hour = d.getHours() % 12; + let min = d.getMinutes(); + let sec = d.getSeconds(); + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let hourAngle = (hour+(min/60))/12 * twoPi - Pi; + let minAngle = (min/60) * twoPi - Pi; + let secAngle = (sec/60) * twoPi - Pi; + + let hourSin = Math.sin(hourAngle); + let hourCos = Math.cos(hourAngle); + let minSin = Math.sin(minAngle); + let minCos = Math.cos(minAngle); + let secSin = Math.sin(secAngle); + let secCos = Math.cos(secAngle); + + g.drawImage(imgHour,cx-22*hourSin,cy+22*hourCos,{rotate:hourAngle}); + g.drawImage(imgMin,cx-34*minSin,cy+34*minCos,{rotate:minAngle}); + g.drawImage(imgSec,cx-25*secSin,cy+25*secCos,{rotate:secAngle}); + g.setFont("4x5Numeric:3"); + g.drawString(d.getDate(),157,81); +} + +function drawBackground() { + g.setBgColor(0,0,0); + g.setColor(1,1,1); + g.clear(); + g.drawImage(imgBg,0,0); + g.reset(); +} + +/* Refresh the display every second */ + +function displayRefresh() { + g.clear(true); + drawBackground(); + drawHands(); + Bangle.drawWidgets(); + + let Pause = 1000 - (Date.now() % 1000); + Timeout = setTimeout(displayRefresh,Pause); +} +setTimeout(displayRefresh,500); + +Bangle.on('lcdPower', (on) => { + if (on) { + if (Timeout != null) { clearTimeout(Timeout); Timeout = undefined;} + displayRefresh(); + } +}); + +Bangle.loadWidgets(); +Bangle.setUI("clock"); \ No newline at end of file diff --git a/apps/Rolex/metadata.json b/apps/Rolex/metadata.json new file mode 100644 index 000000000..2c4437b35 --- /dev/null +++ b/apps/Rolex/metadata.json @@ -0,0 +1,17 @@ +{ "id": "rolex", + "name": "rolex", + "shortName":"rolex", + "icon": "rolex.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.01", + "description": "A rolex like watch face", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"rolex.app.js","url":"app.js"}, + {"name":"rolex.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file diff --git a/apps/Rolex/rolex.png b/apps/Rolex/rolex.png new file mode 100644 index 0000000000000000000000000000000000000000..2e204376341d56b7fc5bf294e3da2e9eb23be6cc GIT binary patch literal 2406 zcmV-s37PhZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2>VGyK~!i%#aU&D zRBaSK>#n&5b|-cxc7qr{>{bj6LD8;3lqyw9(xge_vxuHVynsxZGD)gb?zdsW8#Zi^bm`Jb z*|KHj)TvW4W5x{0moJ~sB6w_2R_~S2qi#5oaNNmkby%fS>p6 z+b6mpeol_0PoLiRNu*!De)9SAXWzHT#JaL@s_D@>o*Zq~tQk+kcFluY2R*CidZQ`O zG;P|H?$oknOEY=$WV%D!wry!stXMJArcE18v__2@CVTem^!>k>v|oc-Sty(qd(W8fGdKF!OOrJho+O=y(o4R%DN~1=NeTS=1$@YuB!P@!h+3`BDgILi6U$rD)Nj+>H+(K1jK8<>bzt zJA7#2!i8nmu3eIlkRYc|pO&XjpK>9O9zBwR1q({vym@8Mo;{K?XHI$f@+Gfz?AVd- z#Crmza^=dhZrwT=HENXP$dQ95hD}BC`1I)$ZTv2Ti^v4Uix-#U$B%Oi4_816;xHLA zW)wwYJ`fM-+_^I!iiP7O)W1pM-oAaytb%)Ci)&a67KrOutj2@XsZ)m=f%k%TID+S# zJb99?hfD_=g3lUPd`_Sw2@EJe3P9urF1m}RRjXD6stz4G71KJnqrn>S|S#ED649F5aIR)G&A_}l^w?r`ne zHM&*BiWRxb*j;Gp(xrKN*wy#%-^=jf!)5vMUko;~I9&=cBsrGtKp2fN%Hi-K5%B0Q??2%Vrx!t%E71V5yo$NwF_nxM2G9>0=FKubN^- zJ-|$91^pc95Pm*>{CFbv&!0azzG>4Y898z!fyzyAFK{QZAdSbM8uEP)5(Jrpc9Du! zWUPaMBS-=V4jdrzVo?ang9i_a@+MBKOqnvwHf}Ov#0cr#yEhX7f*eQ;eA%&Mhi-oe z0rAp%lcj?P59TwrZrw^^r#o&mI~m<=)1W~Eqm!`S7fP>Rzs|x)vl^d)3hvOMLwrZX z^*|^A4xp6+!Ud`U!H$DIfLDPM%$_})X;zCDUiT{CQ;sOW5@+x(NL*l15h#h>2l*aQ z4oKg*b0<3viom1+pca@I$Q(#lo;-P&|G_vx7eMB)DA+5i27#9s!E*s}5Og>IfV%no z?kR}-_U$WU$Bre5>ej8BOqnu;{s#t%Sg{GX41yRf7AJtgMzL7L1Qw}oAxDoMb#1pm zfa>bfB#ww3=Rc4?XaS(c2t4dACIA|MD~3Py>KNA-yUh%c4b#d=`<3zo7ZA1aX7OBObss5u9*UxMrl;$&n<-;wT{gZ~8u= z6vaGn2AF_40l1+tk)&M-H}=4ftb;6QG+mi-sG6`C|apm1YN7x^yWE5Xi-g7n%2O-@eW7$i?s8 zy<;^6Yyb!X88HU31=Q6NkhUOg=s*DcFjlW#J+@$ws&OB>AMx?=EPT+(Kull^#Xmq4 zxgL!MjNv{2sg|iMngW{){w(AK67oNC|EyWFMC;+8iVP3a0)%-Slel{IDg*NT`SV;f z2plrY(4j*~BhdfRdYC_mRIgrLwrttL$zZbpfKDKT+yQ?O&?{D~@HZ78C_xu2Sm5t5 zVQzSq1Aaki6hMQtHfho%S9AoR)v8sCI}b2=`0ybofD#iE$HK4?*xg&VZV^c_Sxg%B zG5%MnQiYTnHb80so15UI@hguKME-XqSvY{Ad&rO>+$j|3csX1M{09^PTm_%8AW&cI zx+VjrN$fBd47Y(xXer6f0MQF4pbuy=1bPJo-y%{Vx01M^vA_Vs=fLks0=8dtoXlej z&Ir^x=&ESuI+-Dvbu1NmUP+$OfMv7SX5&GvgCP|aob!7Y3UZr`S5?>Y|73+a*=FNG zt%D(T$&w{}A;b+}(18QmLfzWv{rmUlvovM0HE**Cqt-#I;+P%5LTomUg55e2uIq5+ z$`#t-rz_1!RvQ(^b07*qoM6N<$f@eB;cK`qY literal 0 HcmV?d00001 diff --git a/apps/Rolex/screenshot.png b/apps/Rolex/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..288c82cf4d68e39b11a7ba4e19af7fd6d0f04c01 GIT binary patch literal 3683 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