mirror of https://github.com/espruino/BangleApps
parent
cac608394c
commit
e14d046071
105
apps/HRV/app.js
105
apps/HRV/app.js
|
@ -1,11 +1,25 @@
|
||||||
|
var option = null;
|
||||||
|
|
||||||
var file = require("Storage").open("HR_log.csv", "w");
|
var file = require("Storage").open("HR_log.csv", "w");
|
||||||
file.write(""); //reset log
|
file.write(""); //reset log
|
||||||
|
|
||||||
file = require("Storage").open("HR_log.csv", "a");
|
file = require("Storage").open("HR_log.csv", "a");
|
||||||
|
|
||||||
//debugging or analysis files
|
//debugging or analysis files
|
||||||
var cutoff_file = require("Storage").open("cuttoff.csv", "w");
|
var logfile = require("Storage").open("HRV_log.csv", "w");
|
||||||
var peaks_file = require("Storage").open("peaks.csv", "w");
|
logfile.write(""); //reset HRV log
|
||||||
|
|
||||||
|
logfile = require("Storage").open("HRV_log.csv", "a");
|
||||||
|
|
||||||
|
var timestamp = getTime();
|
||||||
|
var csv = [
|
||||||
|
"time",
|
||||||
|
"sample count",
|
||||||
|
"HR",
|
||||||
|
"HRV"
|
||||||
|
];
|
||||||
|
logfile.write(csv.join(",")+"\n");
|
||||||
|
|
||||||
var debugging = true;
|
var debugging = true;
|
||||||
|
|
||||||
var first_signals = 0; // ignore the first several signals
|
var first_signals = 0; // ignore the first several signals
|
||||||
|
@ -21,9 +35,6 @@ var gap_threshold = 0.15;
|
||||||
var hr_min = 40;
|
var hr_min = 40;
|
||||||
var hr_max = 160;
|
var hr_max = 160;
|
||||||
|
|
||||||
g.setFontAlign(0, 0); // center font
|
|
||||||
g.setFont("6x8", 2);
|
|
||||||
|
|
||||||
function storeMyData(data, file_type) {
|
function storeMyData(data, file_type) {
|
||||||
log = raw_HR_array;
|
log = raw_HR_array;
|
||||||
// shift elements backwards - note the 4, because a Float32 is 4 bytes
|
// shift elements backwards - note the 4, because a Float32 is 4 bytes
|
||||||
|
@ -67,16 +78,8 @@ function turn_off() {
|
||||||
g.drawString("processing 4/5", 120, 120);
|
g.drawString("processing 4/5", 120, 120);
|
||||||
|
|
||||||
apply_cutoff();
|
apply_cutoff();
|
||||||
if(debugging)
|
|
||||||
for (let i = 0; i < 256; i++) {
|
|
||||||
cutoff_file.write(alternate_array[i] + "," + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
find_peaks();
|
find_peaks();
|
||||||
if(debugging)
|
|
||||||
for (let i = 0; i < pulse_array.length; i++) {
|
|
||||||
peaks_file.write(pulse_array[i] + "," + "\n");
|
|
||||||
}
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawString("processing 5/5", 120, 120);
|
g.drawString("processing 5/5", 120, 120);
|
||||||
|
|
||||||
|
@ -108,7 +111,7 @@ function upscale() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function rolling_average(values, count) {
|
function rolling_average(values, count) {
|
||||||
temp_array = [];
|
var temp_array = [];
|
||||||
|
|
||||||
for (let i = 0; i < values.length; i++) {
|
for (let i = 0; i < values.length; i++) {
|
||||||
temp_array = [];
|
temp_array = [];
|
||||||
|
@ -165,23 +168,81 @@ function calculate_HRV() {
|
||||||
}
|
}
|
||||||
gap_average = average(temp_array);
|
gap_average = average(temp_array);
|
||||||
var calculatedHR = (sample_frequency*60)/(gap_average/2);
|
var calculatedHR = (sample_frequency*60)/(gap_average/2);
|
||||||
g.flip();
|
if(option == 0)
|
||||||
|
g.flip();
|
||||||
g.clear();
|
g.clear();
|
||||||
//var display_stdv = StandardDeviation(pulse_array).toFixed(1);
|
//var display_stdv = StandardDeviation(pulse_array).toFixed(1);
|
||||||
var HRV = (StandardDeviation(temp_array) * (1 / (sample_frequency * 2) * 1000)).toFixed(0);
|
var HRV = (StandardDeviation(temp_array) * (1 / (sample_frequency * 2) * 1000)).toFixed(0);
|
||||||
g.drawString("HRV:" + HRV + "\nHR:" + calculatedHR.toFixed(0)
|
g.drawString("HRV:" + HRV + "\nHR:" + calculatedHR.toFixed(0)
|
||||||
+"\nSample Count:" + temp_array.length, 120, 120);
|
+"\nSample Count:" + temp_array.length, 120, 120);
|
||||||
Bangle.buzz(500,1);
|
|
||||||
|
if(option == 0){
|
||||||
|
Bangle.buzz(500,1);
|
||||||
|
clearInterval(routine);
|
||||||
|
}
|
||||||
|
|
||||||
|
else{
|
||||||
|
var csv = [
|
||||||
|
0|getTime(),
|
||||||
|
temp_array.length,
|
||||||
|
calculatedHR.toFixed(0),
|
||||||
|
HRV
|
||||||
|
];
|
||||||
|
logfile.write(csv.join(",")+"\n");
|
||||||
|
|
||||||
|
for (let i = 0; i < raw_HR_array.length; i++) {
|
||||||
|
raw_HR_array[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g.clear();
|
function btn1Pressed() {
|
||||||
g.drawString("preparing", 120, 120);
|
if(option === null){
|
||||||
|
g.clear();
|
||||||
|
g.drawString("one-off assessment", 120, 120);
|
||||||
|
option = 0;
|
||||||
|
Bangle.setHRMPower(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Bangle.setHRMPower(1);
|
function btn3Pressed() {
|
||||||
|
if(option === null){
|
||||||
|
g.clear();
|
||||||
|
g.drawString("continuous mode", 120, 120);
|
||||||
|
option = 1;
|
||||||
|
Bangle.setHRMPower(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var routine = setInterval(function () {
|
||||||
|
first_signals = 0; // ignore the first several signals
|
||||||
|
pulsecount = 0;
|
||||||
|
BPM_array = [];
|
||||||
|
heartrate = [];
|
||||||
|
pulse_array = [];
|
||||||
|
Bangle.setHRMPower(1);
|
||||||
|
}, 300000);
|
||||||
|
|
||||||
|
g.clear();
|
||||||
|
g.setColor("#00ff7f");
|
||||||
|
g.setFont("6x8", 2);
|
||||||
|
g.setFontAlign(-1,1);
|
||||||
|
g.drawString("continuous", 120, 210);
|
||||||
|
g.setFontAlign(-1,1);
|
||||||
|
g.drawString("one-time", 140, 50);
|
||||||
|
|
||||||
|
g.setColor("#ffffff");
|
||||||
|
g.setFontAlign(0, 0); // center font
|
||||||
|
g.drawString("read app change log", 120, 120);
|
||||||
|
g.drawString("for more info", 120, 140);
|
||||||
|
|
||||||
|
setWatch(btn1Pressed, BTN1, {repeat:true});
|
||||||
|
setWatch(btn3Pressed, BTN3, {repeat:true});
|
||||||
|
|
||||||
Bangle.on('HRM', function (hrm) {
|
Bangle.on('HRM', function (hrm) {
|
||||||
g.flip();
|
if(option == 0)
|
||||||
if (first_signals < 5) {
|
g.flip();
|
||||||
|
if (first_signals < 3) {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.drawString("setting up...\nremain still " + first_signals * 20 + "%", 120, 120);
|
g.drawString("setting up...\nremain still " + first_signals * 20 + "%", 120, 120);
|
||||||
first_signals++;
|
first_signals++;
|
||||||
|
|
Loading…
Reference in New Issue