1
0
Fork 0
BangleApps/apps/accellog/app.js

206 lines
5.1 KiB
JavaScript

var fileNumber = 0;
var MAXLOGS = 9;
var logRawData = false;
function getFileName(n) {
return "accellog."+n+".csv";
}
function showMenu() {
var menu = {
"" : { title : /*LANG*/"Accel Logger" },
"< Back" : function() {
load();
},
/*LANG*/"File No" : {
value : fileNumber,
min : 0,
max : MAXLOGS,
onchange : v => { fileNumber=v; }
},
/*LANG*/"Start" : function() {
E.showMenu();
startRecord();
},
/*LANG*/"View Logs" : function() {
viewLogs();
},
/*LANG*/"Log raw data" : {
value : !!logRawData,
onchange : v => { logRawData=v; }
},
};
E.showMenu(menu);
}
function viewLog(n) {
E.showMessage(/*LANG*/"Loading...");
var f = require("Storage").open(getFileName(n), "r");
var records = 0, l = "", ll="";
while ((l=f.readLine())!==undefined) {records++;ll=l;}
var length = 0;
if (ll) length = Math.round( (ll.split(",")[0]|0)/1000 );
var menu = {
"" : { title : "Log "+n },
"< Back" : () => { viewLogs(); }
};
menu[records+/*LANG*/" Records"] = "";
menu[length+/*LANG*/" Seconds"] = "";
menu[/*LANG*/"DELETE"] = function() {
E.showPrompt(/*LANG*/"Delete Log "+n).then(ok=>{
if (ok) {
E.showMessage(/*LANG*/"Erasing...");
f.erase();
viewLogs();
} else viewLog(n);
});
};
E.showMenu(menu);
}
function viewLogs() {
var menu = {
"" : { title : /*LANG*/"Logs" },
"< Back" : () => { showMenu(); }
};
var hadLogs = false;
for (var i=0;i<=MAXLOGS;i++) {
var f = require("Storage").open(getFileName(i), "r");
if (f.readLine()!==undefined) {
(function(i) {
menu[/*LANG*/"Log "+i] = () => viewLog(i);
})(i);
hadLogs = true;
}
}
if (!hadLogs)
menu[/*LANG*/"No Logs Found"] = function(){};
E.showMenu(menu);
}
function startRecord(force) {
var stopped = false;
if (!force) {
// check for existing file
var f = require("Storage").open(getFileName(fileNumber), "r");
if (f.readLine()!==undefined)
return E.showPrompt(/*LANG*/"Overwrite Log "+fileNumber+"?").then(ok=>{
if (ok) startRecord(true); else showMenu();
});
}
// display
g.clear(1);
Bangle.drawWidgets();
var Layout = require("Layout");
var layout = new Layout({ type: "v", c: [
{ type: "h", c: [
{ type: "v", c: [
{type:"txt", font:"6x8", label:/*LANG*/"Samples", pad:2},
{type:"txt", id:"samples", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg},
]},
{ type: "v", c: [
{type:"txt", font:"6x8", label:/*LANG*/"Time", pad:2},
{type:"txt", id:"time", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg},
]},
]},
{ type: "h", c: [
{ type: "v", c: [
{type:"txt", font:"6x8", label:/*LANG*/"Max X", pad:2},
{type:"txt", id:"maxX", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg},
]},
{ type: "v", c: [
{type:"txt", font:"6x8", label:/*LANG*/"Max Y", pad:2},
{type:"txt", id:"maxY", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg},
]},
{ type: "v", c: [
{type:"txt", font:"6x8", label:/*LANG*/"Max Z", pad:2},
{type:"txt", id:"maxZ", font:"6x8", label:" - ", pad:5, bgCol:g.theme.bg},
]},
]},
{type:"txt", font:"6x8", label:/*LANG*/"Max G", pad:2},
{type:"txt", id:"maxMag", font:"6x8:4", label:" - ", pad:5, bgCol:g.theme.bg},
{type:"txt", id:"state", font:"6x8:2", label:/*LANG*/"RECORDING", bgCol:"#f00", pad:5, fillx:1},
]},
{
btns:[ // Buttons...
{id: "btnStop", label:/*LANG*/"STOP", cb:()=>{
if (stopped) {
showMenu();
}
else {
Bangle.removeListener('accel', accelHandler);
layout.state.label = /*LANG*/"STOPPED";
layout.state.bgCol = /*LANG*/"#0f0";
stopped = true;
layout.render();
}
}}
]});
layout.render();
// now start writing
var f = require("Storage").open(getFileName(fileNumber), "w");
f.write("Time (ms),X,Y,Z,Total\n");
var start = getTime();
var sampleCount = 0;
var maxMag = 0;
var maxX = 0;
var maxY = 0;
var maxZ = 0;
function accelHandler(accel) {
var t = getTime()-start;
if (logRawData) {
f.write([
t*1000,
accel.x*8192,
accel.y*8192,
accel.z*8192,
accel.mag*8192,
].map(n=>Math.round(n)).join(",")+"\n");
} else {
f.write([
Math.round(t*1000),
accel.x,
accel.y,
accel.z,
accel.mag,
].join(",")+"\n");
}
if (accel.mag > maxMag) {
maxMag = accel.mag.toFixed(2);
}
if (accel.x > maxX) {
maxX = accel.x.toFixed(2);
}
if (accel.y > maxY) {
maxY = accel.y.toFixed(2);
}
if (accel.z > maxZ) {
maxZ = accel.z.toFixed(2);
}
sampleCount++;
layout.samples.label = sampleCount;
layout.time.label = Math.round(t)+"s";
layout.maxX.label = maxX;
layout.maxY.label = maxY;
layout.maxZ.label = maxZ;
layout.maxMag.label = maxMag;
layout.render();
}
Bangle.setPollInterval(80); // 12.5 Hz - the default
Bangle.on('accel', accelHandler);
}
Bangle.loadWidgets();
Bangle.drawWidgets();
showMenu();