BangleApps/apps/phystrax/app.js

132 lines
4.0 KiB
JavaScript
Raw Normal View History

2024-04-16 18:38:33 +00:00
let isMeasuring = false;
let currentHR = null;
let lcdTimeout;
let logData = [];
2024-04-06 02:57:04 +00:00
function startMeasure() {
2024-04-17 16:08:50 +00:00
logData = [];
2024-04-06 02:57:04 +00:00
isMeasuring = true;
Bangle.setLCDTimeout(0);
lcdTimeout = setTimeout(() => {
Bangle.setLCDTimeout(50);
}, 50000);
setTimeout(() => {
2024-04-16 18:38:33 +00:00
Bangle.setHRMPower(1); // starts HRM
Bangle.on('HRM', handleHeartRate); // Use function handleHeartRate
2024-04-16 18:38:33 +00:00
Bangle.buzz(200, 10); // Buzz to indicate measurement start
2024-04-06 02:57:04 +00:00
drawScreen();
}, 500);
} // startMeasure
2024-04-06 02:57:04 +00:00
function stopMeasure() {
isMeasuring = false;
clearTimeout(lcdTimeout);
Bangle.setLCDTimeout(10);
Bangle.setHRMPower(0);
2024-04-16 18:38:33 +00:00
Bangle.removeAllListeners('HRM'); //stop HRM
saveDataToCSV(); // Save data to CSV when measurement stops
Bangle.buzz(200, 10); // Buzz to indicate measurement stop
2024-04-06 02:57:04 +00:00
drawScreen();
} //stopMeasure
2024-04-06 02:57:04 +00:00
2024-04-16 18:38:33 +00:00
function handleHeartRate(hrm) {
2024-04-18 18:28:40 +00:00
if (isMeasuring && hrm.confidence > 90) {
// Build the timestamp
2024-04-18 18:28:40 +00:00
let date = new Date();
let dateStr = require("locale").date(date);
let timeStr = require("locale").time(date, 1);
let seconds = date.getSeconds();
let milliseconds = date.getMilliseconds();
// Concatenate date, time, seconds, & milliseconds
let timestamp = `${dateStr} ${timeStr}:${seconds}.${milliseconds}`;
2024-04-18 18:28:40 +00:00
currentHR = hrm.bpm;
2024-04-17 16:08:50 +00:00
2024-04-18 18:28:40 +00:00
logData.push({ timestamp: timestamp, heartRate: currentHR });
2024-04-16 18:38:33 +00:00
drawScreen();
} // if
} // handleHeartRate
2024-04-16 18:38:33 +00:00
2024-04-06 02:57:04 +00:00
function drawScreen(message) {
g.clear(); // Clear the display
// Set the background color
2024-04-16 20:48:04 +00:00
g.setColor('#95E7FF');
2024-04-06 02:57:04 +00:00
// Fill the entire display with the background color
g.fillRect(0, 0, g.getWidth(), g.getHeight());
// Set font and alignment for drawing text
g.setFontAlign(0, 0);
2024-04-16 20:48:04 +00:00
g.setFont('Vector', 15);
2024-04-06 02:57:04 +00:00
// Draw the title
g.setColor('#000000'); // Set text color to black
g.drawString('Heart Rate Monitor', g.getWidth() / 2, 10);
if (isMeasuring) {
// Draw measuring status
g.setFont('6x8', 2);
g.drawString('Measuring...', g.getWidth() / 2, g.getHeight() / 2 - 10);
2024-04-16 18:38:33 +00:00
// Draw current heart rate if available
g.setFont('6x8', 4);
if (currentHR !== null) {
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 20);
2024-04-06 02:57:04 +00:00
g.setFont('6x8', 1.6);
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 20);
}
// Draw instructions
g.setFont('6x8', 1.5);
g.drawString('Press button to stop', g.getWidth() / 2, g.getHeight() / 2 + 42);
} else {
// Draw last heart rate
2024-04-16 18:38:33 +00:00
if (currentHR !== null && currentHR > 0) {
2024-04-17 16:08:50 +00:00
g.setFont('Vector', 12);
g.drawString('Last Heart Rate:', g.getWidth() / 2, g.getHeight() / 2 - 20);
2024-04-06 02:57:04 +00:00
g.setFont('6x8', 4);
2024-04-16 18:38:33 +00:00
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 10);
2024-04-16 03:08:51 +00:00
g.setFont('6x8', 1.6);
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 12);
2024-04-06 02:57:04 +00:00
} else {
g.setFont('6x8', 2);
2024-04-17 16:44:47 +00:00
g.drawString('No data', g.getWidth() / 2, g.getHeight() / 2 + 5);
2024-04-06 02:57:04 +00:00
g.setFont('6x8', 1);
2024-04-16 18:38:33 +00:00
g.drawString(message || 'Press button to start', g.getWidth() / 2, g.getHeight() / 2 + 30);
} // if
} // if
2024-04-06 02:57:04 +00:00
// Update the display
g.flip();
} // drawScreen
2024-04-06 02:57:04 +00:00
function saveDataToCSV() {
let fileName = "phystrax_hrm.csv";
2024-04-17 16:44:47 +00:00
let file = require("Storage").open(fileName, "a"); // Open the file for appending
// Check if the file is empty (i.e., newly created)
if (file.getLength() === 0) {
// Write the header if the file is empty
file.write("Timestamp,Heart Rate(bpm)\n");
} // if
2024-04-17 16:44:47 +00:00
// Append the data
2024-04-16 18:38:33 +00:00
logData.forEach(entry => {
file.write(`${entry.timestamp},${entry.heartRate}\n`);
2024-04-06 02:57:04 +00:00
});
2024-04-16 20:48:04 +00:00
2024-04-06 02:57:04 +00:00
}
2024-04-16 18:38:33 +00:00
setWatch(function() {
2024-04-06 02:57:04 +00:00
if (!isMeasuring) {
startMeasure();
} else {
stopMeasure();
} // if
}, BTN1, { repeat: true, edge: 'rising' }); // setWatch
2024-04-06 02:57:04 +00:00
2024-04-17 14:57:45 +00:00
drawScreen();