From 128257c4bbf491688366c605dfe992db97cf9720 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:52:30 +0100 Subject: [PATCH 01/10] Create app.js --- apps/stressless/app.js | 303 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 apps/stressless/app.js diff --git a/apps/stressless/app.js b/apps/stressless/app.js new file mode 100644 index 000000000..b5e0ba8dd --- /dev/null +++ b/apps/stressless/app.js @@ -0,0 +1,303 @@ +var option = null; + +//debugging or analysis files +var logfile = require("Storage").open("HRV_log.csv", "w"); + +logfile = require("Storage").open("HRV_log.csv", "a"); + +var csv = [ + "time", + "sample count", + "HR", + "SDNN", + "RMSSD", + "Temp", + "movement" + ]; +logfile.write(csv.join(",")+"\n"); + +var debugging = true; +var samples = 0; // how many samples have we connected? +var collectData = false; // are we currently collecting data? + +var BPM_array = []; +var raw_HR_array = new Float32Array(1536); +var alternate_array = new Float32Array(3072); +var pulse_array = []; +var cutoff_threshold = 0.5; +var sample_frequency = 51.6; +var gap_threshold = 0.15; +var movement = 0; + +var px = g.getWidth()/2; +var py = g.getHeight()/2; +var accel; // interval for acceleration logging + +function storeMyData(data, file_type) { "ram" + log = raw_HR_array; + // shift elements backwards - note the 4, because a Float32 is 4 bytes + log.set(new Float32Array(log.buffer, 4 /*bytes*/)); + // add ad final element + log[log.length - 1] = data; +} + +function average(samples) { + return E.sum(samples) / samples.length; // faster builtin + /* var sum = 0; + for (var i = 0; i < samples.length; i++) { + sum += parseFloat(samples[i]); + } + var avg = sum / samples.length; + return avg;*/ +} + +function StandardDeviation (array) { + const n = array.length; + const mean = E.sum(array) / n; //array.reduce((a, b) => a + b) / n; + //return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n); + return Math.sqrt(E.variance(array, mean)); +} + +function turn_off() { + Bangle.setHRMPower(0); + + + g.clear(); + g.drawString("processing 1/5", px, py); + + rolling_average(raw_HR_array,5); + g.clear(); + g.drawString("processing 2/5", px, py); + + upscale(); + g.clear(); + g.drawString("processing 3/5", px, py); + + rolling_average(alternate_array,5); + g.clear(); + g.drawString("processing 4/5", px, py); + + apply_cutoff(); + find_peaks(); + + g.clear(); + g.drawString("processing 5/5", px, py); + + calculate_HRV(); +} + +function bernstein(A, B, C, D, E, t) { "ram" + s = 1 - t; + x = (A * Math.pow(s, 4)) + (B * 4 * Math.pow(s, 3) * t) + (C * 6 * s * s * t * t) + + (D * 4 * s * Math.pow(t, 3)) + (E * Math.pow(t, 4)); + return x; +} + +function upscale() { "ram" + var index = 0; + for (let i = raw_HR_array.length - 1; i > 5; i -= 5) { + p0 = raw_HR_array[i]; + p1 = raw_HR_array[i - 1]; + p2 = raw_HR_array[i - 2]; + p3 = raw_HR_array[i - 3]; + p4 = raw_HR_array[i - 4]; + for (let T = 0; T < 100; T += 10) { + x = T / 100; + D = bernstein(p0, p1, p2, p3, p4, x); + alternate_array[index] = D; + index++; + } + } +} + +function rolling_average(values, count) { "ram" + var temp_array = []; + + for (let i = 0; i < values.length; i++) { + temp_array = []; + for (let x = 0; x < count; x++) + temp_array.push(values[i + x]); + values[i] = average(temp_array); + } +} + +function apply_cutoff() { "ram" + var x; + for (let i = 0; i < alternate_array.length; i++) { + x = alternate_array[i]; + if (x < cutoff_threshold) + x = cutoff_threshold; + alternate_array[i] = x; + } +} + +function find_peaks() { "ram" + var previous; + var previous_slope = 0; + var slope; + var gap_size = 0; + var temp_array = []; + + for (let i = 0; i < alternate_array.length; i++) { + if (previous == null) + previous = alternate_array[i]; + slope = alternate_array[i] - previous; + if (slope * previous_slope < 0) { + if (gap_size > 30) { + pulse_array.push(gap_size); + gap_size = 0; + } + } + else { + gap_size++; + } + previous_slope = slope; + previous = alternate_array[i]; + } +} + +function RMSSD(samples){ "ram" + var sum = 0; + var square = 0; + var data = []; + var value = 0; + + for (let i = 0; i < samples.length-1; i++) { + value = Math.abs(samples[i]-samples[i+1])*((1 / (sample_frequency * 2)) * 1000); + data.push(value); + } + + for (let i = 0; i < data.length; i++) { + square = data[i] * data[i]; + Math.round(square); + sum += square; + } + + var meansquare = sum/data.length; + var RMS = Math.sqrt(meansquare); + RMS = parseInt(RMS); + return RMS; +} + +function calculate_HRV() { + var gap_average = average(pulse_array); + var temp_array = []; + var gap_max = (1 + gap_threshold) * gap_average; + var gap_min = (1 - gap_threshold) * gap_average; + for (let i = 0; i < pulse_array.length; i++) { + if (pulse_array[i] > gap_min && pulse_array[i] < gap_max) + temp_array.push(pulse_array[i]); + } + gap_average = average(temp_array); + var calculatedHR = (sample_frequency*60)/(gap_average/2); + if(option == 0) + Bangle.setLCDPower(1); + g.clear(); + //var display_stdv = StandardDeviation(pulse_array).toFixed(1); + var SDNN = (StandardDeviation(temp_array) * (1 / (sample_frequency * 2) * 1000)).toFixed(0); + var RMS_SD = RMSSD(temp_array); + g.drawString("SDNN:" + SDNN + +"\nRMSSD:" + RMS_SD + + "\nHR:" + calculatedHR.toFixed(0) + +"\nSample Count:" + temp_array.length, px, py); + Bangle.setLCDPower(1); + if(option == 0) { // single run + Bangle.buzz(500,1); + option = null; + drawButtons(); + } else { + var csv = [ + 0|getTime(), + temp_array.length, + calculatedHR.toFixed(0), + SDNN, + RMS_SD, + E.getTemperature(), + movement.toFixed(5) + ]; + logfile.write(csv.join(",")+"\n"); + + + // for (let i = 0; i < raw_HR_array.length; i++) { + // raw_HR_array[i] = null; + //} + + turn_on(); + } +} + +function btn1Pressed() { + if(option === null){ + g.clear(); + g.drawString("one-off assessment", px, py); + option = 0; + + turn_on(); + } +} + +function btn3Pressed() { + if(option === null){ + logfile.write(""); //reset HRV log + g.clear(); + g.drawString("continuous mode", px, py); + option = 1; + + turn_on(); + } +} + +function turn_on() { + BPM_array = []; + pulse_array = []; + samples = 0; + if (accel) clearInterval(accel); + movement = 0; + accel = setInterval(function () { + movement = movement + Bangle.getAccel().diff; + }, 1000); + Bangle.setHRMPower(1); + collectData = true; +} + +function drawButtons() { + g.setColor("#00ff7f"); + g.setFont("6x8", 2); + g.setFontAlign(-1,1); + g.drawString("continuous", 120, 210); + g.drawString("one-time", 140, 50); + g.setColor("#ffffff"); + g.setFontAlign(0, 0); +} + +g.clear(); + +drawButtons(); + +g.setFont("6x8", 2); +g.setColor("#ffffff"); +g.setFontAlign(0, 0); // center font +g.drawString("check app README\nfor more info", px, py); + +setWatch(btn1Pressed, BTN1, {repeat:true}); +setWatch(btn3Pressed, BTN3, {repeat:true}); + + + +Bangle.on('HRM-raw', function (e) { + if (!collectData) return; + storeMyData(e.raw, 0); + if (!(samples & 7)) { + Bangle.setLCDPower(1); + g.clearRect(0, py-10, g.getWidth(), py+22); + if (samples < 100) + g.drawString("setting up...\nremain still " + samples + "%", px, py, true); + else + g.drawString("logging: " + (samples*100/raw_HR_array.length).toFixed(0) + "%", px, py, true); + } + if (samples > raw_HR_array.length) { + collectData = false; + turn_off(); + } + samples++; +}); From fc28c7306f9aeaf041bf92024d26afb832681084 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:59:05 +0100 Subject: [PATCH 02/10] add png --- apps/stressless/stressless.png | Bin 0 -> 1838 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/stressless/stressless.png diff --git a/apps/stressless/stressless.png b/apps/stressless/stressless.png new file mode 100644 index 0000000000000000000000000000000000000000..6f79d7c838d5807b01f379c196c9e280a645b099 GIT binary patch literal 1838 zcmV+}2hsS6P)j z3jVg|@-`{BCtZe8u#-~ow>-h0z{dC&quRsqe3U2HQfp5Nekx;&ds*AIZ81!UeSW~e zRU^Mq3ic~0Sjuxb^{2r%f^X|@VCx9aWi3(dNtbO>qW*KWffszb=Q3Gopkig+(v96) zXitvg->%i38W*2d6?iG)%~J55>Ichu&*f<;_`^ASE_>9r)of4j9_g|rkv$(7{FJZv zPr{AeD@FXifq?h&NK}l3&H1QdR@29m|IG4=;m_#6zhxR0LWJKZJSr5S=|w z@W8inZMd{K0G)dG&y;-g^|Ez@K*~zOtx$Z0GgKHECfSM?Ofu&9C&aO;*qL{!X_YjuL^NI_1RQ^x`daqCK56*xE|o#4*9& z;5nNX{>rCw2K_ZZ&XC&idZumC9h5%No&mmob+4VtcLtFwCU8D7f#B5E$VNE*i4tsK zVMpu1`~lUhNx640w{IQb4<8Ahd-m@O(k!f*aK`F6aG-ArJ+>%F9}6BI{XwPNf5@pM z!r)u^9_X4r`hz2BI98l1d*~cmyObWQ;W!_KR6jIgw+#Zr>j2XD^bVoZ9(CphRsby z1B7*uK7Jy%$dx3&_1D!;nS$%?M7*IY@Vz8rcS)BeLu0A8c9A!+p=gk>4suiO+Esnu z+x4PgMUM!+#~w+Yfru2bIpG;u&74s2d_ZSDBsHV>JN?qnssr!xv~uH30|MV02|hhP zol0p~2dO<}_CJYu6`p4)Pq6vUV2X6(W9=@m+@N6{_^X!HHp{rVwDG(I|Hhz#&yg4( z`&!}b)Ta(Q&h)!&sHlRS?-~~y<6KO!cc7lj4weFtziX{Q+qx3*o1LK$YHa+tC-}xv zcSW^%p1)={lg?0!H;&KE-YVCc@4mgpbcR!8qW)HULaHTYJW+qUb14Yb)qPC5Y(=DN z^Wfr_y-ee8`=oQJiAwPLz_Vouu%k6^3x+frBHo;Ty0iNkTlCiJ2C+#4-0uvv7=Yy( zaeX!aMv^XnQwqKl-Plcec3#$qt1lYRPz=CQ1JI@s_azZsjo6_P&-%W9mjQTR1MKyE zf0{;IXAn;qfH#Qf69(X^Y`?!C;wX*yJp=GBgZOvtdAElI$n$Q{0B;+_cB9lIMD!^Q zu-o=E0Go;EDucK!`yAMIsu6?uf${xjU#WYv*0*WIH5%Y0BKovJBn|M*Bw|7XbQ-0& zLHwHrn5z*_8N@~Qz1I3xjksSUuCio}QuQH$Kmm3q5yxr(lSG`T5ziTbF$Qs=@B3fL zwvW|_^GV9@y3SW>rUvM?psXelCmE&U261b)-)IZO0KB3R zPy4=qcSyh>witkeVPBH+vlggEe8&L%!$!bYYL*7rWg|}A-JgjJo`^n@O^Y8{V;b?n zY-+SxG9dwL)TUJc3Segd)}{o&G6V2W4KPn5{?*n_7TB^}1Z;#5Piw@V7{u)cpwR#v zv+1M(JOglteQ&csBc9hOzkmrrihz}%ve+m&@K}1(uBEIi`*$!?!WWQ5Njns(W zwV}@TyCK_ea?r1{^I8os$5(0w5q;DsRcBKx8)a^51QEZKeU53w1=bPv*@CuFvF%lX c|9_JI0mlPN+v_lqkpKVy07*qoM6N<$f>$k$_W%F@ literal 0 HcmV?d00001 From 5c17492486879d8e4bc933b7b69bdbfbf27cfb28 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:02:37 +0100 Subject: [PATCH 03/10] Create app-icon.js --- apps/stressless/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/stressless/app-icon.js diff --git a/apps/stressless/app-icon.js b/apps/stressless/app-icon.js new file mode 100644 index 000000000..7eabcf2e9 --- /dev/null +++ b/apps/stressless/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("mEwwhC/AH4AVhnM5nABJ4ACBYIADBJojFAAYnCBJIkJEwYJJFw/NEwYuGGAwJE6gSHGBAkFoYXNNZEzC60/7gXPA4nN/8sMB4GE4f/ngXqIYPf+f9AwPEC53NCYNPmfyVZoXD4fzRwMyAYKTMU4fT+fcn9NC4ZjJX4kv/8tGIXc4n/nr4DmgXGgf//5FDn8sSYPyAQIABHAQXEgE/+ZgB+g0BnnT+Xz6YXHCwRIC4X/SIPfnlPnk/MIRHEFwYXC5oPC4f9JIJoBph2IAASJE4fyPIKYCUo4wF74nB4XzLALICFxQwC4b0CRoL4DFxQwC5oMCn4UCbAouHMIbtLCxBhCAAMvRYwuKGAnfRYwuKGAh7CFyAwDPYYuPPQwWSPQhFQGBIWQDAoWSDAZFPh5iFCwP/Cpnw/4CC+ADBBAkPAYIdG+AmBGAPwAAItC/4JBBQI9FF4oRBF4oABDoYvGCAIXDAAIDBIYQLBBoQAxA")) From f6231de549559fd4375ca1088661b18e98439945 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:04:58 +0100 Subject: [PATCH 04/10] Create metadata.json --- apps/stressless/metadata.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/stressless/metadata.json diff --git a/apps/stressless/metadata.json b/apps/stressless/metadata.json new file mode 100644 index 000000000..5d9786b4c --- /dev/null +++ b/apps/stressless/metadata.json @@ -0,0 +1,12 @@ +{ "id": "stressless", + "name": "Stressless", + "shortName":"Stressless", + "icon": "stressless.png", + "version":"0.01", + "description": "This is a heart activity tracker for PIIS stressless project", + "tags": "", + "storage": [ + {"name":"stressless.app.js","url":"app.js"}, + {"name":"stressless.img","url":"app-icon.js","evaluate":true} + ] +} From e0f9b5695aa51833235ca493d49e9f8c3fd62547 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:30:06 +0100 Subject: [PATCH 05/10] Update metadata.json --- apps/stressless/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/stressless/metadata.json b/apps/stressless/metadata.json index 5d9786b4c..8c27620d3 100644 --- a/apps/stressless/metadata.json +++ b/apps/stressless/metadata.json @@ -4,7 +4,8 @@ "icon": "stressless.png", "version":"0.01", "description": "This is a heart activity tracker for PIIS stressless project", - "tags": "", + "tags": "health", + "supports": ["BANGLEJS"], "storage": [ {"name":"stressless.app.js","url":"app.js"}, {"name":"stressless.img","url":"app-icon.js","evaluate":true} From 221138a98127a412b73e7486d65716d98e9079f6 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:34:34 +0100 Subject: [PATCH 06/10] Update app-icon.js --- apps/stressless/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/stressless/app-icon.js b/apps/stressless/app-icon.js index 7eabcf2e9..0dd5ec32a 100644 --- a/apps/stressless/app-icon.js +++ b/apps/stressless/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwwhC/AH4AVhnM5nABJ4ACBYIADBJojFAAYnCBJIkJEwYJJFw/NEwYuGGAwJE6gSHGBAkFoYXNNZEzC60/7gXPA4nN/8sMB4GE4f/ngXqIYPf+f9AwPEC53NCYNPmfyVZoXD4fzRwMyAYKTMU4fT+fcn9NC4ZjJX4kv/8tGIXc4n/nr4DmgXGgf//5FDn8sSYPyAQIABHAQXEgE/+ZgB+g0BnnT+Xz6YXHCwRIC4X/SIPfnlPnk/MIRHEFwYXC5oPC4f9JIJoBph2IAASJE4fyPIKYCUo4wF74nB4XzLALICFxQwC4b0CRoL4DFxQwC5oMCn4UCbAouHMIbtLCxBhCAAMvRYwuKGAnfRYwuKGAh7CFyAwDPYYuPPQwWSPQhFQGBIWQDAoWSDAZFPh5iFCwP/Cpnw/4CC+ADBBAkPAYIdG+AmBGAPwAAItC/4JBBQI9FF4oRBF4oABDoYvGCAIXDAAIDBIYQLBBoQAxA")) +E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AFW7AAgThDBQeNCaYaSDg4TTFygcFCaYuWDgYTTFyHB5AmRGCARK4XJF7bXR5PQF9vQ6/CF8COL6/XYDgwERxYvBYEKOM67AhLQwEDFwTAGYywvIXIIhCAgPQSILAE4RmWF5AnBMAQECA4gJDMCovDGAfBQ4PR4K+C4RiCZAr3UFwgvDJ4IAB5IrEYAgJBHwaoF6HQNRIvFEQItDXYaTEYAQ+EAogADZZIvFGAYTBAgIBBFQg0CRwQREF5wuGeQpNDQYSUDAYYyFR5guIF4jyCdQ3CMYY+DNwTtRMBSJCAwgyBNAI+HFygwEQoJ4EQwQpEHwwuVGAhPFGwIABFIY+GFywwDdoTAFe4ZgCFzjDFSAy4NFyowIF4PIF0gwHXAKYGFz4wHXBgubGAxeOFzT1KFsowQF0AwNF0QxKFsoxIEj/XGBgQDCJYrODQICHEgQDGAQoSECwhaNCoYJDAwgoHBxBfVJgpfJGIgOHL5haGPgoBDTxIBHAH4AkA==")) From dd82b80b86fa8fc7eaac5c29e4da82f7f77a00a0 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:35:39 +0100 Subject: [PATCH 07/10] Update app-icon.js --- apps/stressless/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/stressless/app-icon.js b/apps/stressless/app-icon.js index 0dd5ec32a..0d9739661 100644 --- a/apps/stressless/app-icon.js +++ b/apps/stressless/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AFW7AAgThDBQeNCaYaSDg4TTFygcFCaYuWDgYTTFyHB5AmRGCARK4XJF7bXR5PQF9vQ6/CF8COL6/XYDgwERxYvBYEKOM67AhLQwEDFwTAGYywvIXIIhCAgPQSILAE4RmWF5AnBMAQECA4gJDMCovDGAfBQ4PR4K+C4RiCZAr3UFwgvDJ4IAB5IrEYAgJBHwaoF6HQNRIvFEQItDXYaTEYAQ+EAogADZZIvFGAYTBAgIBBFQg0CRwQREF5wuGeQpNDQYSUDAYYyFR5guIF4jyCdQ3CMYY+DNwTtRMBSJCAwgyBNAI+HFygwEQoJ4EQwQpEHwwuVGAhPFGwIABFIY+GFywwDdoTAFe4ZgCFzjDFSAy4NFyowIF4PIF0gwHXAKYGFz4wHXBgubGAxeOFzT1KFsowQF0AwNF0QxKFsoxIEj/XGBgQDCJYrODQICHEgQDGAQoSECwhaNCoYJDAwgoHBxBfVJgpfJGIgOHL5haGPgoBDTxIBHAH4AkA==")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AFW7AAgThDBQeNCaYaSDg4TTFygcFCaYuWDgYTTFyHB5AmRGCARK4XJF7bXR5PQF9vQ6/CF8COL6/XYDgwERxYvBYEKOM67AhLQwEDFwTAGYywvIXIIhCAgPQSILAE4RmWF5AnBMAQECA4gJDMCovDGAfBQ4PR4K+C4RiCZAr3UFwgvDJ4IAB5IrEYAgJBHwaoF6HQNRIvFEQItDXYaTEYAQ+EAogADZZIvFGAYTBAgIBBFQg0CRwQREF5wuGeQpNDQYSUDAYYyFR5guIF4jyCdQ3CMYY+DNwTtRMBSJCAwgyBNAI+HFygwEQoJ4EQwQpEHwwuVGAhPFGwIABFIY+GFywwDdoTAFe4ZgCFzjDFSAy4NFyowIF4PIF0gwHXAKYGFz4wHXBgubGAxeOFzT1KFsowQF0AwNF0QxKFsoxIEj/XGBgQDCJYrODQICHEgQDGAQoSECwhaNCoYJDAwgoHBxBfVJgpfJGIgOHL5haGPgoBDTxIBHAH4AkA==")) From 8a4be166af798326319ccd7139ae7017561c4e96 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Wed, 3 Jan 2024 11:48:26 +0100 Subject: [PATCH 08/10] Create ChangeLog --- apps/stressless/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/stressless/ChangeLog diff --git a/apps/stressless/ChangeLog b/apps/stressless/ChangeLog new file mode 100644 index 000000000..55ebb3e4b --- /dev/null +++ b/apps/stressless/ChangeLog @@ -0,0 +1 @@ +0.01: New App From 0b2dfae94fe353880b72d25ffea69946367a64f9 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:54:24 +0100 Subject: [PATCH 09/10] Update app.js --- apps/stressless/app.js | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/apps/stressless/app.js b/apps/stressless/app.js index b5e0ba8dd..2caf7ac40 100644 --- a/apps/stressless/app.js +++ b/apps/stressless/app.js @@ -1,9 +1,9 @@ var option = null; //debugging or analysis files -var logfile = require("Storage").open("HRV_log.csv", "w"); +//var logfile = require("Storage").open("HRV_log.csv", "w"); -logfile = require("Storage").open("HRV_log.csv", "a"); +var logfile = require("Storage").open("HRV_log.csv", "a"); var csv = [ "time", @@ -16,11 +16,9 @@ var csv = [ ]; logfile.write(csv.join(",")+"\n"); -var debugging = true; var samples = 0; // how many samples have we connected? var collectData = false; // are we currently collecting data? -var BPM_array = []; var raw_HR_array = new Float32Array(1536); var alternate_array = new Float32Array(3072); var pulse_array = []; @@ -43,12 +41,6 @@ function storeMyData(data, file_type) { "ram" function average(samples) { return E.sum(samples) / samples.length; // faster builtin - /* var sum = 0; - for (var i = 0; i < samples.length; i++) { - sum += parseFloat(samples[i]); - } - var avg = sum / samples.length; - return avg;*/ } function StandardDeviation (array) { @@ -216,25 +208,11 @@ function calculate_HRV() { movement.toFixed(5) ]; logfile.write(csv.join(",")+"\n"); - - - // for (let i = 0; i < raw_HR_array.length; i++) { - // raw_HR_array[i] = null; - //} - turn_on(); } } -function btn1Pressed() { - if(option === null){ - g.clear(); - g.drawString("one-off assessment", px, py); - option = 0; - turn_on(); - } -} function btn3Pressed() { if(option === null){ @@ -248,7 +226,7 @@ function btn3Pressed() { } function turn_on() { - BPM_array = []; + pulse_array = []; samples = 0; if (accel) clearInterval(accel); @@ -265,7 +243,6 @@ function drawButtons() { g.setFont("6x8", 2); g.setFontAlign(-1,1); g.drawString("continuous", 120, 210); - g.drawString("one-time", 140, 50); g.setColor("#ffffff"); g.setFontAlign(0, 0); } @@ -277,13 +254,10 @@ drawButtons(); g.setFont("6x8", 2); g.setColor("#ffffff"); g.setFontAlign(0, 0); // center font -g.drawString("check app README\nfor more info", px, py); -setWatch(btn1Pressed, BTN1, {repeat:true}); setWatch(btn3Pressed, BTN3, {repeat:true}); - Bangle.on('HRM-raw', function (e) { if (!collectData) return; storeMyData(e.raw, 0); From a8ddde48dbee7baadcfcb30eb6a859eabf7c3ea2 Mon Sep 17 00:00:00 2001 From: hanna0616 <64650462+hanna0616@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:14:02 +0100 Subject: [PATCH 10/10] Update app.js --- apps/stressless/app.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/stressless/app.js b/apps/stressless/app.js index 2caf7ac40..b27c79a0d 100644 --- a/apps/stressless/app.js +++ b/apps/stressless/app.js @@ -3,7 +3,7 @@ var option = null; //debugging or analysis files //var logfile = require("Storage").open("HRV_log.csv", "w"); -var logfile = require("Storage").open("HRV_log.csv", "a"); +var logfile = require("Storage").open("HRV_logs.csv", "a"); var csv = [ "time", @@ -16,9 +16,11 @@ var csv = [ ]; logfile.write(csv.join(",")+"\n"); +var debugging = true; var samples = 0; // how many samples have we connected? var collectData = false; // are we currently collecting data? +var BPM_array = []; var raw_HR_array = new Float32Array(1536); var alternate_array = new Float32Array(3072); var pulse_array = []; @@ -41,6 +43,12 @@ function storeMyData(data, file_type) { "ram" function average(samples) { return E.sum(samples) / samples.length; // faster builtin + /* var sum = 0; + for (var i = 0; i < samples.length; i++) { + sum += parseFloat(samples[i]); + } + var avg = sum / samples.length; + return avg;*/ } function StandardDeviation (array) { @@ -208,12 +216,13 @@ function calculate_HRV() { movement.toFixed(5) ]; logfile.write(csv.join(",")+"\n"); + + turn_on(); } } - function btn3Pressed() { if(option === null){ logfile.write(""); //reset HRV log @@ -226,7 +235,7 @@ function btn3Pressed() { } function turn_on() { - + BPM_array = []; pulse_array = []; samples = 0; if (accel) clearInterval(accel); @@ -242,7 +251,7 @@ function drawButtons() { g.setColor("#00ff7f"); g.setFont("6x8", 2); g.setFontAlign(-1,1); - g.drawString("continuous", 120, 210); + g.drawString("start recording HRV", 120, 210); g.setColor("#ffffff"); g.setFontAlign(0, 0); } @@ -258,6 +267,7 @@ g.setFontAlign(0, 0); // center font setWatch(btn3Pressed, BTN3, {repeat:true}); + Bangle.on('HRM-raw', function (e) { if (!collectData) return; storeMyData(e.raw, 0);