forked from FOSS/BangleApps
fix file saving
parent
6841bb2d00
commit
0627d757b3
|
@ -4,6 +4,7 @@ let lcdTimeout;
|
||||||
let logData = [];
|
let logData = [];
|
||||||
let bpmValues = [];
|
let bpmValues = [];
|
||||||
let lastLogTime = 0;
|
let lastLogTime = 0;
|
||||||
|
const MAX_LOGS = 9;
|
||||||
|
|
||||||
function startMeasure() {
|
function startMeasure() {
|
||||||
isMeasuring = true;
|
isMeasuring = true;
|
||||||
|
@ -58,7 +59,6 @@ function handleHeartRate(hrm) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function calcSDNN() {
|
function calcSDNN() {
|
||||||
if (bpmValues.length < 5) return 0; // No calculation if insufficient data
|
if (bpmValues.length < 5) return 0; // No calculation if insufficient data
|
||||||
|
|
||||||
|
@ -111,7 +111,6 @@ function drawScreen(message) {
|
||||||
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 20);
|
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 20);
|
||||||
g.setFont('6x8', 1.6);
|
g.setFont('6x8', 1.6);
|
||||||
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 20);
|
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 20);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw instructions
|
// Draw instructions
|
||||||
|
@ -126,7 +125,6 @@ function drawScreen(message) {
|
||||||
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 10);
|
g.drawString(currentHR.toString(), g.getWidth() / 2, g.getHeight() / 2 + 10);
|
||||||
g.setFont('6x8', 1.6);
|
g.setFont('6x8', 1.6);
|
||||||
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 12);
|
g.drawString(' BPM', g.getWidth() / 2 + 42, g.getHeight() / 2 + 12);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
g.setFont('6x8', 2);
|
g.setFont('6x8', 2);
|
||||||
g.drawString('No data', g.getWidth() / 2, g.getHeight() / 2 + 10);
|
g.drawString('No data', g.getWidth() / 2, g.getHeight() / 2 + 10);
|
||||||
|
@ -144,7 +142,15 @@ function saveDataToCSV() {
|
||||||
logData.forEach(entry => {
|
logData.forEach(entry => {
|
||||||
csvContent += `${entry.timestamp},${entry.heartRate},${entry.hrv}\n`;
|
csvContent += `${entry.timestamp},${entry.heartRate},${entry.hrv}\n`;
|
||||||
});
|
});
|
||||||
require("Storage").write("heart_rate_data.csv", csvContent);
|
|
||||||
|
// Find an available file number
|
||||||
|
let fileNum = 0;
|
||||||
|
while (require("Storage").read(`heart_rate_data_${fileNum}.csv`) !== undefined && fileNum <= MAX_LOGS) {
|
||||||
|
fileNum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write data to a CSV file
|
||||||
|
require("Storage").write(`heart_rate_data_${fileNum}.csv`, csvContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
setWatch(function() {
|
setWatch(function() {
|
||||||
|
|
|
@ -9,36 +9,54 @@
|
||||||
<script>
|
<script>
|
||||||
var dataElement = document.getElementById("data");
|
var dataElement = document.getElementById("data");
|
||||||
|
|
||||||
function getHeartRateData() {
|
function getData() {
|
||||||
|
// show loading window
|
||||||
Util.showModal("Loading...");
|
Util.showModal("Loading...");
|
||||||
|
// get the data
|
||||||
dataElement.innerHTML = "";
|
dataElement.innerHTML = "";
|
||||||
|
var promise = Promise.resolve();
|
||||||
Puck.eval('require("Storage").list(/heart_rate_data\\.csv\\x01/)', files => {
|
Puck.eval('require("Storage").list(/heart_rate_data\\.csv\\x01/)', files => {
|
||||||
if (files.length == 0) {
|
if (files.length == 0) {
|
||||||
dataElement.innerHTML = "<p>No heart rate data found</p>";
|
dataElement.innerHTML = "<p>No heart rate data found</p>";
|
||||||
} else {
|
} else {
|
||||||
files.forEach(fn => {
|
files.forEach(fn => {
|
||||||
fn = fn.slice(0, -1);
|
fn = fn.slice(0, -1);
|
||||||
var link = document.createElement("a");
|
dataElement.innerHTML += `
|
||||||
link.setAttribute("href", "#");
|
<div class="card">
|
||||||
link.textContent = fn;
|
<div class="card-header">
|
||||||
link.addEventListener("click", function() {
|
<div class="card-title h5">${fn}</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<button class="btn btn-primary" fn="${fn}" act="save">Save</button>
|
||||||
|
<button class="btn" fn="${fn}" act="delete">Delete</button>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
promise = promise.then(function() {
|
||||||
|
document.querySelector(`.btn[fn='${fn}'][act='save']`).addEventListener("click", function() {
|
||||||
Util.showModal("Downloading...");
|
Util.showModal("Downloading...");
|
||||||
Util.readStorageFile(fn, function(data) {
|
Util.readStorageFile(fn, function(data) {
|
||||||
Util.saveCSV(fn.slice(0, -4), data);
|
Util.saveCSV(fn.slice(0, -4), data);
|
||||||
Util.hideModal();
|
Util.hideModal();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
dataElement.appendChild(link);
|
document.querySelector(`.btn[fn='${fn}'][act='delete']`).addEventListener("click", function() {
|
||||||
dataElement.appendChild(document.createElement("br"));
|
Util.showModal("Deleting...");
|
||||||
|
Util.eraseStorageFile(fn, function() {
|
||||||
|
Util.hideModal();
|
||||||
|
getData();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// remove window
|
||||||
Util.hideModal();
|
Util.hideModal();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called when app starts
|
// Called when app starts
|
||||||
function onInit() {
|
function onInit() {
|
||||||
getHeartRateData();
|
getData();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -8,11 +8,9 @@
|
||||||
"interface": "interface.html",
|
"interface": "interface.html",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"supports": ["BANGLEJS2"],
|
"supports": ["BANGLEJS2"],
|
||||||
"permissions": {
|
|
||||||
"read": ["file"]
|
|
||||||
},
|
|
||||||
"storage": [
|
"storage": [
|
||||||
{"name":"phystrax.app.js","url":"app.js"},
|
{"name":"phystrax.app.js","url":"app.js"},
|
||||||
{"name":"phystrax.img","url":"app-icon.js","evaluate":true}
|
{"name":"phystrax.img","url":"app-icon.js","evaluate":true}
|
||||||
]
|
],
|
||||||
|
"data": [{"wildcard":"heart_rate_data.?.csv"}]
|
||||||
}
|
}
|
Loading…
Reference in New Issue