From de5fcd2efa0ab6aa051ffce52da1575e983ae188 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 4 Oct 2023 11:40:49 +0100 Subject: [PATCH] Add tool to count flashes of light using the HRM --- apps/flashcount/ChangeLog | 1 + apps/flashcount/app-icon.js | 1 + apps/flashcount/app.js | 59 ++++++++++++++++++++++++++++++++++ apps/flashcount/app.png | Bin 0 -> 1255 bytes apps/flashcount/metadata.json | 13 ++++++++ 5 files changed, 74 insertions(+) create mode 100644 apps/flashcount/ChangeLog create mode 100644 apps/flashcount/app-icon.js create mode 100644 apps/flashcount/app.js create mode 100644 apps/flashcount/app.png create mode 100644 apps/flashcount/metadata.json diff --git a/apps/flashcount/ChangeLog b/apps/flashcount/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/flashcount/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/flashcount/app-icon.js b/apps/flashcount/app-icon.js new file mode 100644 index 000000000..e1cf5fb54 --- /dev/null +++ b/apps/flashcount/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///x3ygHo8H1Jf8AgILLoALVgoLHggLCqAgJioLIqgLDGQsBqtAioOBqoYFqtUAIMVBY9VqwCBDIIAECYILCHowLBrWVBZFlrWWyptGgtq1WqJYI7GrQLCFxGrBYJHEBQNV1Wv9IEBEocFKIOq//qJAIZEAoNq3/+1QMBHoYYBrQLB1J4GitaEYZfGtfvBYJ3HtWr9WlNY0V1Nr1WlC4xIBrWmBZWVrJGFcYILBZY4LBoILIgoNBEILvHDIQ5BBY4IBBYMBMAwLBBA4LPBRMAKAoLRiALWAGw=")) \ No newline at end of file diff --git a/apps/flashcount/app.js b/apps/flashcount/app.js new file mode 100644 index 000000000..e3f925b27 --- /dev/null +++ b/apps/flashcount/app.js @@ -0,0 +1,59 @@ +Bangle.loadWidgets(); +Bangle.drawWidgets(); +E.showMessage("Loading..."); +Bangle.setOptions({hrmPollInterval:5}); +Bangle.setHRMPower(1); + +function drawCounter() { + g.reset().clearRect(0,24,175,90); + //g.drawRect(0,24,175,90); + g.setFontAlign(0,0).setFontVector(60); + g.drawString(count, 88, 60); +} + +function hadPulse() { + count++; + drawCounter(); + g.setColor("#f00").fillCircle(156,156,20); + setTimeout(function() { + g.setColor(g.theme.bg).fillCircle(156,156,20); + }, 500); +} + +if (parseFloat(process.env.VERSION.replace("v","0"))<2019) { + E.showMessage("You need at least firmware 2v19","Error"); +} else if (Bangle.hrmRd(0)!=33) { // wrong sensor - probably VC31 from original bangle.js 2 + E.showMessage("This Bangle.js doesn't have a VC31B HRM sensor","Error"); +} else { + Bangle.setOptions({hrmGreenAdjust:false, hrmWearDetect:false, hrmPushEnv:true}); + Bangle.hrmWr(0x10, 197&0xF8 | 4); // just SLOT2 + Bangle.hrmWr(0x16, 0); // force env to be used as fast as possible + + var samples = 0, samplesHi = 0; + var count = 0; + { + let last = 0; + Bangle.on('HRM-env',v => { + if (v) { + if (!last) hadPulse(); + samplesHi++; + } + last = v; + samples++; + }); + } + + drawCounter(); + setInterval(function() { + g.reset().clearRect(0,90,175,130); + g.setFontAlign(0,0).setFont("6x8:2"); + g.drawString(samples+" sps", 88, 100); + if (samplesHi*5 > samples) { + g.setBgColor("#f00").setColor("#fff"); + g.clearRect(0,110,175,130).drawString("TOO LIGHT",88,120); + } + samples=0; + samplesHi=0; + Bangle.setLCDPower(1); // force LCD on! + }, 1000); +} \ No newline at end of file diff --git a/apps/flashcount/app.png b/apps/flashcount/app.png new file mode 100644 index 0000000000000000000000000000000000000000..379b9d381cd737351d455d34cbfc7661a9b305f4 GIT binary patch literal 1255 zcmVEX>AG#Sgg__Xu%4YBDAu* z=j=o=SQ0f55rxt{XBQK*FFqJTA9&Ej#21m6*!aei(I^i-@}P-6_+a$K7k74cXXczO ziRf?6>}_Ut_Tpu>PO@L}C++NX=Kuc7_y1>$P#bNu;TwdKoVXoHZbw0dAnXGZ(?t|S zfRfrMFw+I5U!x#G#Ml`@7;wz)=#gXy1q}kzTatjZJfSC6+aJU+y=vn4GtD+{$@yXy zKJnkfW=n#wZyFJi&1)whFwMc~(_QF)(UhbZ)fz1fLaB2Gi!s}Kp%Sw%%f*YvT2o% zBp}T^@H`lMW+6Mg%euFk0DZY-&U-a;cI45rvzgE!WVh`p|L(Tj_+cjj%)XN{>bui0 zo$4%UwZQBLyA%4pu&1-xX#|;m+qI6hz~|1nq932}&1tU0`*|!r&oNuBTldes3F$R! z9L}q~2>53RvPUY{yvj#ls>xYml_jR<EJ(hI#1{ULD*%1>GyRTZ}u$cd&7`@ zXdKkLHdRGme;a}L5`j)D*Ni7|Q;H-CrIi+heZ>iVU*N=RCZ-3C6BoBM7j;4toUmW& z%H&iG)J=WPl6j%vwB5|>mCrNx4nubPJ)~sl9M*JZ#yOGE7sirdlsZ@uR zPRwp_!v6Gpcr*_BBL^Yf)m@haUoK=MJBuJQ;LKE}ZxGBw^R?vlwp=xg2-|`F4OW!o zXt8Ar)1E4*y z6LLGItd&9jY(;trfwtFUB6qEGC=kbNxn%_G(XVAvCQDgRLkM!C6V|Sj>Aj~iCw3pP z6S%X2lOrvUel3$4UvAp<8-a%_X97O+D&%(V2W@D~-N61GCI3$JEoZ_PJR{w}3{6S& zwk-PAkx;4!rdOqc$P%#hyZE`_(PAM%)8^o@YP^kZwOBXmKkhMWoYGNkp7 zICme+K5uj;=7jz%w_dbb;F!Hv-j!_5%Uy;?>F!3~N(h;S7*$q{fQZtwHOk{!y}yI$ zRA;e7uLw*(LaPNYmExGL