Update pebblepp and accelrec app

Pebbleapp
  * Add date on the bottom of the screen
Accelratino
   * Change zline color to yellow
   * Auto save to file without selecting the file
      * Timestamp on the file name
   * Storage option to delet records
master
pinq- 2024-07-02 21:35:55 +03:00
parent 7466078356
commit 368ae251d2
2 changed files with 217 additions and 145 deletions

View File

@ -1,6 +1,6 @@
//var acc; //var acc;
var HZ = 100; var HZ = 100;
var SAMPLES = 5*HZ; // 5 seconds var SAMPLES = 5 * HZ; // 5 seconds
var SCALE = 2000; var SCALE = 2000;
var THRESH = 1.4; var THRESH = 1.4;
var accelx = new Int16Array(SAMPLES); var accelx = new Int16Array(SAMPLES);
@ -9,50 +9,57 @@ var accelz = new Int16Array(SAMPLES); // Into clock face
var timestep = new Int16Array(SAMPLES); // Into clock face var timestep = new Int16Array(SAMPLES); // Into clock face
var accelIdx = 0; var accelIdx = 0;
var lastAccel; var lastAccel;
function accelHandlerTrigger(a) {"ram"
if (a.mag*2>THRESH) { // *2 because 8g mode function accelHandlerTrigger(a) {
"ram"
if (a.mag * 2 > THRESH) { // *2 because 8g mode
tStart = getTime(); tStart = getTime();
g.drawString("Recording",g.getWidth()/2,g.getHeight()/2,1); g.drawString("Recording", g.getWidth() / 2, g.getHeight() / 2, 1);
Bangle.removeListener('accel',accelHandlerTrigger); Bangle.removeListener('accel', accelHandlerTrigger);
Bangle.on('accel',accelHandlerRecord); Bangle.on('accel', accelHandlerRecord);
lastAccel.forEach(accelHandlerRecord); lastAccel.forEach(accelHandlerRecord);
accelHandlerRecord(a); accelHandlerRecord(a);
} else { } else {
if (lastAccel.length>10) lastAccel.shift(); if (lastAccel.length > 10) lastAccel.shift();
lastAccel.push(a); lastAccel.push(a);
} }
} }
function accelHandlerRecord(a) {"ram"
function accelHandlerRecord(a) {
"ram"
var i = accelIdx++; var i = accelIdx++;
accelx[i] = a.x*SCALE*2; // *2 because of 8g mode accelx[i] = a.x * SCALE * 2; // *2 because of 8g mode
accely[i] = -a.y*SCALE*2; accely[i] = -a.y * SCALE * 2;
accelz[i] = a.z*SCALE*2; accelz[i] = a.z * SCALE * 2;
timestep[i] = (getTime() - tStart)*1000; timestep[i] = (getTime() - tStart) * 1000;
if (accelIdx>=SAMPLES) recordStop(); if (accelIdx >= SAMPLES) recordStop();
} }
function recordStart() {"ram"
function recordStart() {
"ram"
Bangle.setLCDTimeout(0); // force LCD on Bangle.setLCDTimeout(0); // force LCD on
accelIdx = 0; accelIdx = 0;
lastAccel = []; lastAccel = [];
Bangle.accelWr(0x18,0b01110100); // off, +-8g Bangle.accelWr(0x18, 0b01110100); // off, +-8g
Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter Bangle.accelWr(0x1B, 0x03 | 0x40); // 100hz output, ODR/2 filter
Bangle.accelWr(0x18,0b11110100); // +-8g Bangle.accelWr(0x18, 0b11110100); // +-8g
Bangle.setPollInterval(10); // 100hz input Bangle.setPollInterval(10); // 100hz input
setTimeout(function() { setTimeout(function() {
Bangle.on('accel',accelHandlerTrigger); Bangle.on('accel', accelHandlerTrigger);
g.clear(1).setFont("6x8",2).setFontAlign(0,0); g.clear(1).setFont("6x8", 2).setFontAlign(0, 0);
g.drawString("Waiting",g.getWidth()/2,g.getHeight()/2); g.drawString("Waiting", g.getWidth() / 2, g.getHeight() / 2);
}, 200); }, 200);
} }
function recordStop() {"ram" function recordStop() {
"ram"
//console.log("Length:",getTime()-tStart); //console.log("Length:",getTime()-tStart);
Bangle.setPollInterval(80); // default poll interval Bangle.setPollInterval(80); // default poll interval
Bangle.accelWr(0x18,0b01101100); // off, +-4g Bangle.accelWr(0x18, 0b01101100); // off, +-4g
Bangle.accelWr(0x1B,0x0); // default 12.5hz output Bangle.accelWr(0x1B, 0x0); // default 12.5hz output
Bangle.accelWr(0x18,0b11101100); // +-4g Bangle.accelWr(0x18, 0b11101100); // +-4g
Bangle.removeListener('accel',accelHandlerRecord); Bangle.removeListener('accel', accelHandlerRecord);
E.showMessage("Finished"); E.showMessage("Finished");
showData(); showData();
} }
@ -60,20 +67,23 @@ function recordStop() {"ram"
function showData() { function showData() {
g.clear(1); g.clear(1);
var w = g.getWidth()-20; // width let csv_files_N = require("Storage").list(/^acc.*.csv$/).length;
var m = g.getHeight()/2; // middle let w_full = g.getWidth();
let h = g.getHeight();
var w = g.getWidth() - 20; // width
var m = g.getHeight() / 2; // middle
var s = 12; // how many pixels per G var s = 12; // how many pixels per G
g.fillRect(9,0,9,g.getHeight()); g.fillRect(9, 0, 9, g.getHeight());
g.setFontAlign(0,0); g.setFontAlign(0, 0);
for (var l=-8;l<=8;l++) for (var l = -8; l <= 8; l++)
g.drawString(l, 5, m - l*s); g.drawString(l, 5, m - l * s);
function plot(a) { function plot(a) {
g.moveTo(10,m - a[0]*s/SCALE); g.moveTo(10, m - a[0] * s / SCALE);
for (var i=0;i<SAMPLES;i++) for (var i = 0; i < SAMPLES; i++)
g.lineTo(10+i*w/SAMPLES, m - a[i]*s/SCALE); g.lineTo(10 + i * w / SAMPLES, m - a[i] * s / SCALE);
} }
g.setColor("#0000ff"); g.setColor("#FFFA5F");
plot(accelz); plot(accelz);
g.setColor("#ff0000"); g.setColor("#ff0000");
plot(accelx); plot(accelx);
@ -82,35 +92,38 @@ function showData() {
// work out stats // work out stats
var maxAccel = 0; var maxAccel = 0;
var tStart = SAMPLES, tEnd = 0; var tStart = SAMPLES,
var vel = 0, maxVel = 0; tEnd = 0;
for (var i=0;i<SAMPLES;i++) { var vel = 0,
var a = accely[i]/SCALE; maxVel = 0;
if (a>0.1) { for (var i = 0; i < SAMPLES; i++) {
if (i<tStart) tStart=i; var a = Math.abs(accely[i] / SCALE);
if (i>tEnd) tEnd=i; let a_yz = Math.sqrt(Math.pow(accely[i] / SCALE, 2) + Math.pow(accelz[i] / SCALE, 2));
if (a > 0.1) {
if (i < tStart) tStart = i;
if (i > tEnd) tEnd = i;
} }
if (a>maxAccel) maxAccel=a; if (a > maxAccel) maxAccel = a;
vel += a/HZ; if (a_yz > maxVel) maxVel = a_yz;
if (vel>maxVel) maxVel=vel;
} }
g.reset(); g.reset();
g.setFont("6x8").setFontAlign(1,0); g.setFont("6x8").setFontAlign(1, 0);
g.drawString("Max Y Accel: "+maxAccel.toFixed(2)+" g",g.getWidth()-14,g.getHeight()-50); g.drawString("Max X Accel: " + maxAccel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 50);
g.drawString("Max Y Vel: "+maxVel.toFixed(2)+" m/s",g.getWidth()-14,g.getHeight()-40); g.drawString("Max YZ Accel: " + maxVel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 40);
g.drawString("Time moving: "+(tEnd-tStart)/HZ+" s",g.getWidth()-14,g.getHeight()-30); g.drawString("Time moving: " + (tEnd - tStart) / HZ + " s", g.getWidth() - 14, g.getHeight() - 30);
//console.log("End Velocity "+vel); g.setFont("6x8", 2).setFontAlign(0, 0);
g.setFont("6x8").setFontAlign(0,0,1); g.drawString("File num: " + (csv_files_N + 1), w_full / 2, h - 20);
g.drawString("FINISH",g.getWidth()-4,g.getHeight()/2); g.setFont("6x8").setFontAlign(0, 0, 1);
g.drawString("FINISH", g.getWidth() - 4, g.getHeight() / 2);
setWatch(function() { setWatch(function() {
showMenu(); showMenu();
}, global.BTN2?BTN2:BTN); }, global.BTN2 ? BTN2 : BTN);
} }
function showBig(txt) { function showBig(txt) {
g.clear(1); g.clear(1);
g.setFontVector(80).setFontAlign(0,0); g.setFontVector(80).setFontAlign(0, 0);
g.drawString(txt,g.getWidth()/2, g.getHeight()/2); g.drawString(txt, g.getWidth() / 2, g.getHeight() / 2);
g.flip(); g.flip();
} }
@ -130,29 +143,32 @@ function countDown() {
function showMenu() { function showMenu() {
Bangle.setLCDTimeout(10); // set timeout for LCD in menu Bangle.setLCDTimeout(10); // set timeout for LCD in menu
var menu = { var menu = {
"" : { title : "Acceleration Rec" }, "": { title: "Acceleration Rec" },
"Start" : function() { "Start": function() {
E.showMenu(); E.showMenu();
if (accelIdx==0) countDown(); if (accelIdx == 0) countDown();
else E.showPrompt("Overwrite Recording?").then(ok=>{ else E.showPrompt("Overwrite Recording?").then(ok => {
if (ok) countDown(); else showMenu(); if (ok) countDown();
else showMenu();
}); });
}, },
"Plot" : function() { "Plot": function() {
E.showMenu(); E.showMenu();
if (accelIdx) showData(); if (accelIdx) showData();
else E.showAlert("No Data").then(()=>{ else E.showAlert("No Data").then(() => {
showMenu(); showMenu();
}); });
}, },
"Save" : function() { "Storage": function() {
E.showMenu(); E.showMenu();
if (accelIdx) showSaveMenu(); if (require("Storage").list(/^acc.*.csv$/).length)
else E.showAlert("No Data").then(()=>{ StorageMenu();
else
E.showAlert("No Data").then(() => {
showMenu(); showMenu();
}); });
}, },
"Exit" : function() { "Exit": function() {
load(); load();
}, },
}; };
@ -160,22 +176,76 @@ function showMenu() {
} }
function showSaveMenu() { function showSaveMenu() {
var menu = { E.showPrompt("Save recording?").then(ok => {
"" : { title : "Save" } if (ok)
}; SaveFile();
[1,2,3,4,5,6].forEach(i=>{ else
var fn = "accelrec."+i+".csv";
var exists = require("Storage").read(fn)!==undefined;
menu["Recording "+i+(exists?" *":"")] = function() {
var csv = "";
for (var i=0;i<SAMPLES;i++)
csv += `${timestep[i]},${accelx[i]/SCALE},${accely[i]/SCALE},${accelz[i]/SCALE}\n`;
require("Storage").write(fn,csv);
showMenu(); showMenu();
});
}
function SaveFile() {
let csv_files_N = require("Storage").list(/^acc.*.csv$/).length;
//if (csv_files_N > 20)
// E.showMessage("Storage is full");
// showMenu();
let csv = "";
let date = new Date();
let fn = "accelrec_" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "_" + (csv_files_N + 1) + ".csv";
E.showMessage("Saveing to file \n" + fn);
for (var i = 0; i < SAMPLES; i++)
csv += `${timestep[i]},${accelx[i]/SCALE},${accely[i]/SCALE},${accelz[i]/SCALE}\n`;
require("Storage").write(fn, csv);
showMenu();
}
function StorageMenu() {
var menu = {
"": {
title: "Storage"
}
};
let csv_files = require("Storage").list(/^acc.*.csv$/);
var inx = 0;
csv_files.forEach(fn => {
inx++;
menu[inx + ". " + fn] = function() {
StorageOptions(fn);
}; };
}); });
menu["< Back"] = function() {showMenu();}; menu["< Back"] = function() {
showMenu();
};
E.showMenu(menu); E.showMenu(menu);
} }
function StorageOptions(file) {
let menu = {
"": {
title: "Options"
},
"Plot": function() {
showMenu();
},
"Delete": function() {
E.showMenu();
E.showPrompt("Delete recording?").then(ok => {
if (ok)
DeleteRecord(file);
else
StorageMenu();
});
},
"< Back": function() {
StorageMenu();
},
};
E.showMenu(menu);
}
function DeleteRecord(file) {
E.showMessage("Deleteing file \n" + file);
require("Storage").erase(file);
StorageMenu();
}
showMenu(); showMenu();

View File

@ -38,6 +38,8 @@ let draw = function() {
g.reset(); g.reset();
g.setBgColor(theme.bg).clearRect(0, h2, w, h3); g.setBgColor(theme.bg).clearRect(0, h2, w, h3);
g.setFontLECO1976Regular22().setFontAlign(0, -1);
g.setColor(0, 0, 0).drawString(date.getDay() + "." + (date.getMonth() + 1), w / 2, h3 + 5);
g.setFontLECO1976Regular42().setFontAlign(0, -1); g.setFontLECO1976Regular42().setFontAlign(0, -1);
g.setColor(theme.fg); g.setColor(theme.fg);
g.drawString(time, w/2, h2 + 8); g.drawString(time, w/2, h2 + 8);
@ -133,7 +135,7 @@ background.fillRect(Bangle.appRect); // start off with completely clear backgrou
// contrast bar (top) // contrast bar (top)
g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2); g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2);
// contrast bar (bottom) // contrast bar (bottom)
g.setColor(theme.fg).fillRect(0, h3, w, h3 + 6); g.setColor(theme.fg).fillRect(w / 2 - 30, h3, w / 2 + 30, h);
draw(); draw();
} }