From 3d84679ff52df63c6a04e749a18e5d63972f7d63 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 20 Apr 2025 10:57:12 -0400 Subject: [PATCH] smaller icon; properly scoped app; testing on hw --- apps/jsonclock/README.md | 1 + apps/jsonclock/app-icon.js | 2 +- apps/jsonclock/app.js | 62 ++++++++++++++----------------- apps/jsonclock/app.png | Bin 3773 -> 2514 bytes apps/jsonclock/dark-emulator.png | Bin 0 -> 3773 bytes apps/jsonclock/metadata.json | 15 +++----- 6 files changed, 34 insertions(+), 46 deletions(-) create mode 100644 apps/jsonclock/dark-emulator.png diff --git a/apps/jsonclock/README.md b/apps/jsonclock/README.md index d449daad7..96a1cdd71 100644 --- a/apps/jsonclock/README.md +++ b/apps/jsonclock/README.md @@ -17,3 +17,4 @@ inspired by [This FitBit face](https://github.com/Sharkgrammer/clockface.json) ![](white.png) ![](no_steps.png) ![](no_location.png) +![](dark-emulator.png) \ No newline at end of file diff --git a/apps/jsonclock/app-icon.js b/apps/jsonclock/app-icon.js index 8c2888b97..dcac31aa3 100644 --- a/apps/jsonclock/app-icon.js +++ b/apps/jsonclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("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")) +require("heatshrink").decompress(atob("mEwwcCBhEcuPHAQsDwE48AQDnEDx048YCEDQ/AEZAxEnADCEZAKBg5HQCIxiJuARPAEZHBgEBwQGBwE04VNmBHHXYXDhlAg0YsIbBEY8AZQmDhBHcFwcg4AOE4YpCI4swI4NgAQUAAQRHDg0IkAdDkGSAoRBNiBZWjgDCI4UBLAqPHKQMgCJQWFQIIROI6BzD4DXBw0YI5EAhEhwwIBoEwdQwAEWYIDBEYJIYa4REBSQKBBI5kJkmCgECpkwQIprEgcMmOAEZCPVJQYANhwRQaiIjRABqPCgLPEkilBNYxoCmHDa4L+BDAqzFgUIkGCjEgHhwxGAA4uEGYxHImPAahBHDgxEByEAAIIAqI4T+DABXgEaICEADoA=")) diff --git a/apps/jsonclock/app.js b/apps/jsonclock/app.js index 2bfd549b5..1e22615ea 100644 --- a/apps/jsonclock/app.js +++ b/apps/jsonclock/app.js @@ -1,4 +1,5 @@ -var SunCalc = require("suncalc"); // from modules folder +{ +const SunCalc = require("suncalc"); // from modules folder const storage = require('Storage'); const widget_utils = require('widget_utils'); const global_settings = storage.readJSON("setting.json", true) || {}; @@ -42,14 +43,14 @@ const maxLines = Math.floor(usableHeight / lineHeight); var numWidth = 0; // requires the myLocation app -function loadLocation() { +let loadLocation = function() { location = require("Storage").readJSON(LOCATION_FILE, 1) || {}; location.lat = location.lat || 0; location.lon = location.lon || 0; location.location = location.location || null; -} +}; -function getHr(h) { +let getHr = function(h) { var amPm = ""; if (settings.hr_12) { amPm = h < 12 ? "AM" : "PM"; @@ -57,17 +58,17 @@ function getHr(h) { if (h == 0) h = 12; } return [h, amPm]; -} +}; -function extractTime(d) { +let extractTime = function(d) { const out = getHr(d.getHours()); const h = out[0]; const amPm = out[1]; const m = d.getMinutes(); return `${h}:${("0"+m).substr(-2)}${amPm}`; -} +}; -function extractDate(d) { +let extractDate = function(d) { const weekdays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" @@ -78,9 +79,9 @@ function extractDate(d) { const day = d.getDate(); return `${weekday} ${month} ${day}`; -} +}; -function getSteps() { +let getSteps = function() { try { return Bangle.getHealthStatus("day").steps; } catch (e) { @@ -89,9 +90,9 @@ function getSteps() { else return null; } -} +}; -function getVal(now, loc) { +let getVal = function(now, loc) { const vals = {}; const currentDateStr = extractDate(now); if (loc.location) { @@ -107,10 +108,9 @@ function getVal(now, loc) { vals.batt_pct = E.getBattery(); vals.steps = getSteps(); return vals; -} +}; - -function loadJson() { +let loadJson = function() { const now = new Date(); vals = getVal(now, location); //vals.steps = null; // For testing; uncomment to see the steps not appear @@ -142,9 +142,9 @@ function loadJson() { jsonText = JSON.stringify(raw, null, 2); // just stringify the object lines = jsonText.split("\n"); -} +}; -function draw() { +let draw = function() { g.clear(); g.setFontAlign(-1, -1); g.setFont("Vector", 10); @@ -169,9 +169,9 @@ function draw() { } redraw(); -} +}; -function redraw() { +let redraw = function() { for (let i = 0; i < maxLines; i++) { const lineIndex = i; const line = lines[lineIndex]; @@ -217,19 +217,18 @@ function redraw() { g.drawString(line, numWidth, y); } } - Bangle.drawWidgets(); -} +}; -function clearVals() { +let clearVals = function() { g.setFont("Vector", fontSize); g.setFontAlign(-1, -1); valuePositions.forEach(pos => { g.setColor(clrs.bg); g.fillRect(pos.x, pos.y, w, pos.y + lineHeight); }); -} +}; -function redrawValues() { +let redrawValues = function() { loadJson(); clearVals(); redraw(); @@ -238,12 +237,12 @@ function redrawValues() { drawTimeout = undefined; redrawValues(); }, 60000 - (Date.now() % 60000)); -} +}; Bangle.on('touch', (zone, e) => { if (e.x >= (buttonY - buttonHeight) && e.x <= (buttonX + buttonHeight) && (e.y >= (buttonY - buttonHeight) && e.y <= (buttonY + buttonHeight))) { - load(); // Exit app + Bangle.showLauncher(); // Exit app } }); @@ -253,16 +252,9 @@ Bangle.on('backlight', function(on) { } }); -Bangle.setUI({ - mode: "clock", - remove: function() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - +Bangle.setUI("clock"); loadLocation(); Bangle.loadWidgets(); widget_utils.hide(); draw(); -setTimeout(Bangle.drawWidgets, 0); \ No newline at end of file +} \ No newline at end of file diff --git a/apps/jsonclock/app.png b/apps/jsonclock/app.png index 88e06c4ef24ac012d13fc7ab382611afc6f8c2a9..ab6c821f4cbfd67229bed3d7c1090240fc5a7a03 100644 GIT binary patch literal 2514 zcmV;@2`%=CP)y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2k8V86&))Bj!K*W00|aJL_t(&-sPEpP*m3y$3O2qV9{NcUC1uNMg;dW-0!*jzW1H;?z!hmfZ#5cqM{2EOYqqVIFzp5!%|?&}y|93X7;Pd$q zLfllxD);$(1mxxAF=x&knwy)+%ge)LG7%UUNPK)eO-)UlIdg{e^mIZ(LI?~D#AGrN z6%~a>qaiUdk&uuOgb<{rrs8lo0I=C?ELyaP`ucii%$R|qC`gioq9_0;ih`mj$g(^p zxg<$QfQX8UqPMq~kdP3%ySoVs3!}fk|C$+mRqk{;5kjzb?OG};EAjb!c)i|hzkPju zY}&Mm*49?+b~}2#p2Wn&yJAAu2!w@&QBY98n{U2(gZ)-iR8U%4Iwl{mSS&)Whi(h`S$x>~QfcFbN)blI*ZvYPXgEP`e(KC~yuyMLo>FAClsrX8^RpFxddV zd=>uQJT?LW04XUcsMTtkn@5@Lm27x+JLsoCK@xb>5N?2M0q5Ic^OLy00?&R0_N<49 zPzdutbTpjphqz$S>0nkdnD2o72LL!64!XL!2nYxm9o_miB>fng55r&&=%$0m4vK%z zNLT=MHP_*L4?$`ysD_}o4}zW0@HsTu{o~J-K^rBaRl%47tY=>kjwtb(jeLH1k$ zh|J8)Yq)LOwu!W~wDAq*?$r_iP+D4wN~L1Qjvd(T_Sxa`N@n0DQO$oEKrh39tPYo-K#Ca5!=a5)CjV7&cVH{pX$(&M-h1ycI5=FF}YFcK-ajEbD3T zxM1!Qs8|j5t33Y%JQxd+DtM~_a#G=H3tSk02c|)97bL{PnQjPIVD1W&yTI}U^4VThXz$B$EhKf!h3pg-`k2g3Alm=+4T8SsD%F_GZW zfWZV(2Q*z6gAZJ~bP1!;NM~o~H`5x}4OO2&kPkE(XlMre35bk@n%@wUOr7&w>RDMg`Z`*E4V4yopEPW@* zxVV_^?rvt!o;_g*{C{L6mMvSx^5x434h|kUE3v*7o_GvC`Um&|{n@Fk-luVB1e&VGg`~@DA<700x6$bmXf`;l)2d z=^tUp0Z}?QHvr~97z+1e=2+mFGWe_s!cEZqK4=nQ{SxNR>1Q8c427djFhA`M`aoM- z8#bG5^kB|=8Jy?9^#!!sps5R7$Kj#}0wzP*8<095Y!0}15`w>g>eJx#L01>Cir>F% zXCURW9>(;Fk+1c46AKzAN7i3!fZOe+0 zaoH;b#hb77Hx(m(xBM<=B^EDUjL~Q$Ha3>p+S*&wywnT17MNoNV-Q44hxl~3&;Su} z&~Y5@ON77tmF$Q|HZt;^4bajBk+IOw3K2=5bAeL} zgMrZLg{W!Jw3{jIo6!&F&UInn3LJ;5#HdNFFRLU8)M^2WK&|(;EhX2-hv!hK5Q^fL zsX%DecQG@OkdPn%k)ED@(;XQgtX8WiDk_?|x0EF%B`jXNn4Fv(Hg4Q_)9b0Lt7FNM zB@;KCcDvo^bULnFxq?Qcxe3tU-#_xj-$XbQcXV{%@py2%-R#=6>n6aeRjY8hToabS cJs-^d2TJ1=Us%nk^#A|>07*qoM6N<$f)D?IcK`qY literal 3773 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 pO&|ud9kz$1y`u z`<0`u;AVM#{Vvv*FJBtP_b!36{h2~QQpNYin8WDkn3$O55GNggsl500g@q_Udvz*X zo$Jf!&>G}k7QpkczNTmJBgsW?_yc45ovnAV!ppt-wp(dSCbI=>-?_%GL(K7mG72}D zn_GYzU`CXt$zVmy>Z_o?@cR1$@{zl_%mM_Kk#cKN1_FiRNN00pW`p+)02?VA;DS{C z@INbgxcB7hp%;wV10~Q)F?+v1Ip^gU_HhH01W%W z?npxm0dgE3bRJmD2MI6*;ljX{ia6s2D0mXza;ElRY+sREqB0%g{E-)lXyGdJ+P2B# z1Emw$(|Aq;FZ_8nifVdMMKE6SfDD7G-`6Xb*mu zP=GlpXY@!B3B)@2pA3Qy0|10$=2MA~0O8;wljUA9WH3H8c!ptG=M&(s&Oo*FX(Lwh0x>Cs zzxEA%Tn^A4cpv_Cv37>yNA2Zs%hTF^BPcV;dq$b-hRO80-l6ZJ%Arc;#yVxvQD+ms z4Y%5+TWrt*KGC=n`UJCQ@OqTHT zorK>cLrK5aSQiyA5)zIj{ANn^p!s11nKt;T(+wo@pt$5(T^*}BfK zU$^W~oL+aSx04#S)>k}Vi}SFn>?KUlOr$! zvZd8K{O5gHtAg_TnclPPBBgZJCsQ)qG@tj?|-h~#2t71IFGhATGw*m*)n zeflhT%|S*nhy!q{qGCmoj7EbB0gT3z%j3piK=@K%DF~>m-jUD-AYi8e0I<&rp#-&d ztSs7%aW6aQi+t$K@}-i*qtr{{`HDo9LE3`jGwXAaCqMLC-17J}BhAMwogz7U2{64T zKKs7Ce;dXfn=Sl?%4efwaOZrfXxwe#l5alNM8x^$cd9|O(gf6SkM}oU$(P5i8qh^E ziO>imes*{g2V2Uu_iSw9;}s7y1}xUu#{;IC>t4 zJ!At zI(pGJRJB7T&F^q-T4Xhj*V>#xbNs$8QaXD@Z!(n6uWukRCXrFZ;i_+b?XgNmm0jg9 zmn@XSW*(P(k=;Nmvu%~akgMk=Ep`}+DL8pWj4vYRN89sWnfMguPd+$hXfRHlh*U_s z>*qAKh$lx*J?{p~=vvB02tnN_jn5|zHVOt({oCYwD?eZGtJ)3X%Nos+hm3Pgbv2)s z-u5MGp?`TvjfU+QrmMCqaQs2?hkf(r*`iI=*D+11wWoFO&hYC}90sj>(44nk_a+2w zEDAfIepkXX9-QdCh{0`JMRJ~rxKG)5IT4%qgHUceUJ*AJX`>%k-waV1DY+x88ri9e z+n}{%K78V$SyA#4ChA+g>c5m!OJdW$a(rFc75wh|PY`ou@l6}yh+=43d_n6G?McI$ zxWGaX@ZBoY*S`(|EMs2f{;z{e$F{qo+^_Zad7Pb3rAA$J{xx$$>P4sfwE>g0Xtels zb3K1dhae;0tUtBZy}(P{|5Snc<86~iIR^21j5D=8yazKN6E~81qhFUa1^vyp&wdsi ze_3|!ST%>h z5FIt0kkMU&CfHW~x^}v>T!=1!Z2wU)WFu=>p2s9^a7ZH`T%xDR{@)--ozvzpsr>8f9NLUH&@(sIxsv z5yeenfFU<`GAlA?Iekm%S90?s0a=EU)|jJ(0CSKA&@N67x!x6EZn~tCg_+mLy`eVt zr2esh;1h_ciLr_R*+V;kET)dqx(WuiPnqe4p9Z#b2zp*4{};*8(5v{&ei<{^&059T zeI;l8HFd2bWJ2@pH*Wg#FGA$FLU(yRNA#habrXG+p{_oe(fMw6RXpZ90wZIj6-6W+_Tx}N`0KTd^D z&$!R@CE5(+NkMvQ-c{$ikej$+i|iN%^ri6Sx`vF^%xf`jRvr-|D&>_M$T*ZGytI+E zuuQXvEt^8ud@WH%R3`M7W#suhB~%lx9M1KLfG0LS&&2Ou^YrKchpVDSI%~2=pun2E zvUU)U{7BG*5EXsbyXC@IKcD0!jVxjthgc0>3?z0vN)NuBcXC8A)tw5xc>E39_na?R zvu|01!-#jow1}IIAWmN3srFf{uh2swxH#qKp0=$55LM{$T15faJ7p%WW$|CpQSyMP zW<7I7Su6delg zDjiE5^D?~|lSEjFcP@1Aw(BewQ!W=UiqY&>qOXr^!R=df3x-=N+6wlV$u!SyR$^LU zB7QYb)~p0bVMCGz+l&;d8^I4nD0skRQcXWdFUkA zU15;Ms(y4As|)QTYB&P515t(KuG9$R% pO&|ud9k