From 5a3fd1d9e31468f64728f8c49dde8b1f532e7d00 Mon Sep 17 00:00:00 2001 From: The Dod Date: Wed, 15 Dec 2021 14:10:29 +0200 Subject: [PATCH] Initial commit of `lapcounter` app --- apps.json | 17 +++++++++++ apps/lapcounter/ChangeLog | 1 + apps/lapcounter/README.md | 19 ++++++++++++ apps/lapcounter/app-icon.js | 1 + apps/lapcounter/app.js | 53 +++++++++++++++++++++++++++++++++ apps/lapcounter/app.png | Bin 0 -> 749 bytes apps/lapcounter/screenshot.png | Bin 0 -> 6557 bytes 7 files changed, 91 insertions(+) create mode 100644 apps/lapcounter/ChangeLog create mode 100644 apps/lapcounter/README.md create mode 100644 apps/lapcounter/app-icon.js create mode 100644 apps/lapcounter/app.js create mode 100644 apps/lapcounter/app.png create mode 100644 apps/lapcounter/screenshot.png diff --git a/apps.json b/apps.json index fd46de1d8..c379a1de4 100644 --- a/apps.json +++ b/apps.json @@ -4986,5 +4986,22 @@ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "lapcounter", + "name": "Lap Counter", + "version": "0.01", + "description": "Click button to count laps. Shows count and total time snapshot (like a stopwatch, but laid back).", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "app", + "tags": "tool,outdoors", + "readme":"README.md", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"lapcounter.app.js","url":"app.js"}, + {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/lapcounter/ChangeLog b/apps/lapcounter/ChangeLog new file mode 100644 index 000000000..9db0e26c5 --- /dev/null +++ b/apps/lapcounter/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/lapcounter/README.md b/apps/lapcounter/README.md new file mode 100644 index 000000000..8866955e4 --- /dev/null +++ b/apps/lapcounter/README.md @@ -0,0 +1,19 @@ +# Lap Counter + +Click button to count laps (e.g. in a swimming pool). +Also shows total duration snapshot (like a stopwatch, but laid back). + +![Screenshot](screenshot.png) + +## Usage + +* Click BTN1 to start counting. Counter becomes `0`, duration becomes `00:00.0` +* Each time you click BTN1, counter is incremented, and you see duration between first and last clicks. + +## Features + +Disables LCD timeout (so that you can be _sure_ what BTN1 would do). + +## Creator + +[Nimrod Kerrett](https://zzzen.com) diff --git a/apps/lapcounter/app-icon.js b/apps/lapcounter/app-icon.js new file mode 100644 index 000000000..c5cae2388 --- /dev/null +++ b/apps/lapcounter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")); diff --git a/apps/lapcounter/app.js b/apps/lapcounter/app.js new file mode 100644 index 000000000..215f6140a --- /dev/null +++ b/apps/lapcounter/app.js @@ -0,0 +1,53 @@ +const w = g.getWidth(); +const h = g.getHeight(); +const wid_h = 24; +let tStart; +let tNow; +let counter=-1; + +const icon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")); + +function timeToText(t) { // Courtesy of stopwatch app + let hrs = Math.floor(t/3600000); + let mins = Math.floor(t/60000)%60; + let secs = Math.floor(t/1000)%60; + let tnth = Math.floor(t/100)%10; + let text; + + if (hrs === 0) + text = ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2) + "." + tnth; + else + text = ("0"+hrs) + ":" + ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2); + //log_debug(text); + return text; +} + +function doCounter() { + if (counter<0) { + tStart = Date.now(); + tNow = tStart; + } else { + tNow = Date.now(); + } + counter++; + let dT = tNow-tStart; + + g.clearRect(0,wid_h,w,h-wid_h); + g.setFontAlign(0,0); + g.setFont("Vector",72); + g.drawString(counter,w/2,h/2); + g.setFont("Vector",24); + g.drawString(timeToText(dT),w/2,h/2+50); +} + +setWatch(doCounter, BTN1, true); + +g.clear(true); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setLCDTimeout(0); +g.drawImage(icon,w/2-24,h/2-24); +g.setFontAlign(0,0); +require("Font8x12").add(Graphics); +g.setFont("8x12"); +g.drawString("Click button to count.", w/2, h/2+22); diff --git a/apps/lapcounter/app.png b/apps/lapcounter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6ca83174b3247d0f82e74ed8ec0712998038e7 GIT binary patch literal 749 zcmVEX>4Tx04R}tkv&MmKpe$iTcxE`1nnT=kfAzR6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(p zP9}tGZdC}rB7!jbFouxCOnpuiQ}7&L_we!cF3z*O&;2=il)T9RpFljzbi*RvAfDc| zbk6(4QC5-^;&b9rgDyz?$aUG}H_kjWYY7*QDULk!Ey()lA#h$5yuo&qkMnX zWrgz=XSGset$XqpM)KOqGS_JiA&EsSL4*JqHIz|-g*dGmDJIgipYZSxI)0H{GP%lN z5bWxZD8-o^;8O94SE4Unl_YXY@@up#K&KuerUo_Hp_EWT>mu4RCM> zj1(z*-Q(S%&ffk#)9UXBT1#@BF?hPm00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-^!4GkN-0f&@VpiFrSm1{3=hydkQ#fP+wck#v}z|=f*$Ai@q zvxO8u0W8~0QEeGKlx@Dv6ODyj&mCkT1^A-?QQBs%g_hbT8VfD8jVz=9DF#T&HdDoi zw2ilgLKGkJqkc6i$1jj*0~nxi6raQjTw@K8&Aje0_IKa{-0YKeT?5cGP3trM3yRd= f8wMeS5F#SpSZ5h(LPy<<00000NkvXXu0mjfZYxA6 literal 0 HcmV?d00001 diff --git a/apps/lapcounter/screenshot.png b/apps/lapcounter/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f3113d86ee87fe8e0ce067038da76550e3a5117f GIT binary patch literal 6557 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%0Dv%Z*_4v-PN}s>l>@o4!57kd3*>vCJ z4dYh&JLI{zBRt_7^(4;kRGNI%548lX^|@g;g%%NM5-O7Dl>`JYSw~!v*|xle#`#~8 zM>Z~v@Xg!fF~-ZkmI+6qBqh-fjbN*#VrNNirn@@F7Y#}>;cJhv*fx}=sAY(7stMP`L|D)l zzikEZP~b6~NW(5YQ!olRv%OZQEW9JzH*xoOJl?tnC}|r+Q?IWRP>k!|b_{lk8T&up zsg?B5S&6w7ISVcaylAv&ma2+!NdNwuh2K7>ydapaN=EKTNZ7>x82~9em*NFP_fS@s zN8iE0$3PQ;NpwSzkdWhEdeOHp`t9!xjb$(iY}#k@$$arKq@oIr^7$*V`6G>eb|!`M z@Zb+Tc6E`xE*ULzNz@~igU7QH!t|h3C_&HoQZOE4n5P5K-MT6eJ@@AYQ;=Vp?`<9e zWtY^YU)c$$D;_;FSAO2rlC#fpE_<{xYY?-*o(KcX2wY zu$`;Ep2m7Hy_`-!Z}AYwDH;3@fkSsT*$BGC=XKg7OSo%|`#p37CBK5-ZTm%KrYxYC z_172#VrLd(esgxNgVslH&H1QX^bO>onNj2*!p-PdH4mBih$#SJFc|~}1qu!j4ZvtY z0DjrVz994#{~HN|5&nnZ02N-4|APPT@g_W;OP!+aADUgEVX!xmox$cHY{=U-S+aAI z4J;#sZaC+*WNw5H{p!<6sT~g?j|GA2{lVk4GZux@=BCD4GVa2x`+$%q%Q=_I8{$$} zR8F@+N!R7`Tpy6u@-n+0NbB-2r(pQ-PaT@m24%IHFe+sEpBHHRP$k1Y$CCr1;^(hP z>xVlDq=qQi)Mn;U6cFOQ*Q8+Jz>CBGfQE_#93UYB=LT=siouJ@tG`2m_=>4OGZsrn zC?KaFxH}A2hyLG>$NMM@M8xTSYQhk*V{u(*Le5`cUnfXe+9o}(*S$}nFvW)AijOl5 zpwL=kO?oZA5LPD^p>Fk__;agHD|ckEYao@BFJssnC>|HQTNeMKSubN<NHTW?;%;+UiDt)m4 zCc0w;pYEQWle<3nXSyT&{5p{8*}4on!>zxyO;~$9J+8z{v&ywmc863_NDlw320kz<>8EyMn@O9hO)ed+!tAk(EkOfXi-uC literal 0 HcmV?d00001