From 368ae251d20070e51e1b9c1a06b237809f914020 Mon Sep 17 00:00:00 2001 From: pinq- Date: Tue, 2 Jul 2024 21:35:55 +0300 Subject: [PATCH] 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 --- apps/accelrec/app.js | 358 ++++++++++++++++++++++++++----------------- apps/pebblepp/app.js | 4 +- 2 files changed, 217 insertions(+), 145 deletions(-) diff --git a/apps/accelrec/app.js b/apps/accelrec/app.js index fd28b3440..0665a0229 100644 --- a/apps/accelrec/app.js +++ b/apps/accelrec/app.js @@ -1,6 +1,6 @@ //var acc; var HZ = 100; -var SAMPLES = 5*HZ; // 5 seconds +var SAMPLES = 5 * HZ; // 5 seconds var SCALE = 2000; var THRESH = 1.4; var accelx = new Int16Array(SAMPLES); @@ -9,173 +9,243 @@ var accelz = new Int16Array(SAMPLES); // Into clock face var timestep = new Int16Array(SAMPLES); // Into clock face var accelIdx = 0; var lastAccel; -function accelHandlerTrigger(a) {"ram" - if (a.mag*2>THRESH) { // *2 because 8g mode - tStart = getTime(); - g.drawString("Recording",g.getWidth()/2,g.getHeight()/2,1); - Bangle.removeListener('accel',accelHandlerTrigger); - Bangle.on('accel',accelHandlerRecord); - lastAccel.forEach(accelHandlerRecord); - accelHandlerRecord(a); - } else { - if (lastAccel.length>10) lastAccel.shift(); - lastAccel.push(a); - } + +function accelHandlerTrigger(a) { + "ram" + if (a.mag * 2 > THRESH) { // *2 because 8g mode + tStart = getTime(); + g.drawString("Recording", g.getWidth() / 2, g.getHeight() / 2, 1); + Bangle.removeListener('accel', accelHandlerTrigger); + Bangle.on('accel', accelHandlerRecord); + lastAccel.forEach(accelHandlerRecord); + accelHandlerRecord(a); + } else { + if (lastAccel.length > 10) lastAccel.shift(); + lastAccel.push(a); + } } -function accelHandlerRecord(a) {"ram" - var i = accelIdx++; - accelx[i] = a.x*SCALE*2; // *2 because of 8g mode - accely[i] = -a.y*SCALE*2; - accelz[i] = a.z*SCALE*2; - timestep[i] = (getTime() - tStart)*1000; - if (accelIdx>=SAMPLES) recordStop(); + +function accelHandlerRecord(a) { + "ram" + var i = accelIdx++; + accelx[i] = a.x * SCALE * 2; // *2 because of 8g mode + accely[i] = -a.y * SCALE * 2; + accelz[i] = a.z * SCALE * 2; + timestep[i] = (getTime() - tStart) * 1000; + if (accelIdx >= SAMPLES) recordStop(); } -function recordStart() {"ram" - Bangle.setLCDTimeout(0); // force LCD on - accelIdx = 0; - lastAccel = []; - Bangle.accelWr(0x18,0b01110100); // off, +-8g - Bangle.accelWr(0x1B,0x03 | 0x40); // 100hz output, ODR/2 filter - Bangle.accelWr(0x18,0b11110100); // +-8g - Bangle.setPollInterval(10); // 100hz input - setTimeout(function() { - Bangle.on('accel',accelHandlerTrigger); - g.clear(1).setFont("6x8",2).setFontAlign(0,0); - g.drawString("Waiting",g.getWidth()/2,g.getHeight()/2); - }, 200); + +function recordStart() { + "ram" + Bangle.setLCDTimeout(0); // force LCD on + accelIdx = 0; + lastAccel = []; + Bangle.accelWr(0x18, 0b01110100); // off, +-8g + Bangle.accelWr(0x1B, 0x03 | 0x40); // 100hz output, ODR/2 filter + Bangle.accelWr(0x18, 0b11110100); // +-8g + Bangle.setPollInterval(10); // 100hz input + setTimeout(function() { + Bangle.on('accel', accelHandlerTrigger); + g.clear(1).setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Waiting", g.getWidth() / 2, g.getHeight() / 2); + }, 200); } -function recordStop() {"ram" - //console.log("Length:",getTime()-tStart); - Bangle.setPollInterval(80); // default poll interval - Bangle.accelWr(0x18,0b01101100); // off, +-4g - Bangle.accelWr(0x1B,0x0); // default 12.5hz output - Bangle.accelWr(0x18,0b11101100); // +-4g - Bangle.removeListener('accel',accelHandlerRecord); - E.showMessage("Finished"); - showData(); +function recordStop() { + "ram" + //console.log("Length:",getTime()-tStart); + Bangle.setPollInterval(80); // default poll interval + Bangle.accelWr(0x18, 0b01101100); // off, +-4g + Bangle.accelWr(0x1B, 0x0); // default 12.5hz output + Bangle.accelWr(0x18, 0b11101100); // +-4g + Bangle.removeListener('accel', accelHandlerRecord); + E.showMessage("Finished"); + showData(); } function showData() { - g.clear(1); - var w = g.getWidth()-20; // width - var m = g.getHeight()/2; // middle - var s = 12; // how many pixels per G - g.fillRect(9,0,9,g.getHeight()); - g.setFontAlign(0,0); - for (var l=-8;l<=8;l++) - g.drawString(l, 5, m - l*s); + g.clear(1); + let csv_files_N = require("Storage").list(/^acc.*.csv$/).length; + 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 + g.fillRect(9, 0, 9, g.getHeight()); + g.setFontAlign(0, 0); + for (var l = -8; l <= 8; l++) + g.drawString(l, 5, m - l * s); - function plot(a) { - g.moveTo(10,m - a[0]*s/SCALE); - for (var i=0;i0.1) { - if (itEnd) tEnd=i; + function plot(a) { + g.moveTo(10, m - a[0] * s / SCALE); + for (var i = 0; i < SAMPLES; i++) + g.lineTo(10 + i * w / SAMPLES, m - a[i] * s / SCALE); } - if (a>maxAccel) maxAccel=a; - vel += a/HZ; - if (vel>maxVel) maxVel=vel; - } - g.reset(); - g.setFont("6x8").setFontAlign(1,0); - g.drawString("Max Y 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("Time moving: "+(tEnd-tStart)/HZ+" s",g.getWidth()-14,g.getHeight()-30); - //console.log("End Velocity "+vel); - g.setFont("6x8").setFontAlign(0,0,1); - g.drawString("FINISH",g.getWidth()-4,g.getHeight()/2); - setWatch(function() { - showMenu(); - }, global.BTN2?BTN2:BTN); + g.setColor("#FFFA5F"); + plot(accelz); + g.setColor("#ff0000"); + plot(accelx); + g.setColor("#00ff00"); + plot(accely); + + // work out stats + var maxAccel = 0; + var tStart = SAMPLES, + tEnd = 0; + var vel = 0, + maxVel = 0; + for (var i = 0; i < SAMPLES; i++) { + var a = Math.abs(accely[i] / SCALE); + 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_yz > maxVel) maxVel = a_yz; + } + g.reset(); + g.setFont("6x8").setFontAlign(1, 0); + g.drawString("Max X Accel: " + maxAccel.toFixed(2) + " g", g.getWidth() - 14, g.getHeight() - 50); + 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.setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("File num: " + (csv_files_N + 1), w_full / 2, h - 20); + g.setFont("6x8").setFontAlign(0, 0, 1); + g.drawString("FINISH", g.getWidth() - 4, g.getHeight() / 2); + setWatch(function() { + showMenu(); + }, global.BTN2 ? BTN2 : BTN); } function showBig(txt) { - g.clear(1); - g.setFontVector(80).setFontAlign(0,0); - g.drawString(txt,g.getWidth()/2, g.getHeight()/2); - g.flip(); + g.clear(1); + g.setFontVector(80).setFontAlign(0, 0); + g.drawString(txt, g.getWidth() / 2, g.getHeight() / 2); + g.flip(); } function countDown() { - showBig(3); - setTimeout(function() { - showBig(2); + showBig(3); setTimeout(function() { - showBig(1); - setTimeout(function() { - recordStart(); - }, 800); + showBig(2); + setTimeout(function() { + showBig(1); + setTimeout(function() { + recordStart(); + }, 800); + }, 1000); }, 1000); - }, 1000); } function showMenu() { - Bangle.setLCDTimeout(10); // set timeout for LCD in menu - var menu = { - "" : { title : "Acceleration Rec" }, - "Start" : function() { - E.showMenu(); - if (accelIdx==0) countDown(); - else E.showPrompt("Overwrite Recording?").then(ok=>{ - if (ok) countDown(); else showMenu(); - }); - }, - "Plot" : function() { - E.showMenu(); - if (accelIdx) showData(); - else E.showAlert("No Data").then(()=>{ - showMenu(); - }); - }, - "Save" : function() { - E.showMenu(); - if (accelIdx) showSaveMenu(); - else E.showAlert("No Data").then(()=>{ - showMenu(); - }); - }, - "Exit" : function() { - load(); - }, - }; - E.showMenu(menu); + Bangle.setLCDTimeout(10); // set timeout for LCD in menu + var menu = { + "": { title: "Acceleration Rec" }, + "Start": function() { + E.showMenu(); + if (accelIdx == 0) countDown(); + else E.showPrompt("Overwrite Recording?").then(ok => { + if (ok) countDown(); + else showMenu(); + }); + }, + "Plot": function() { + E.showMenu(); + if (accelIdx) showData(); + else E.showAlert("No Data").then(() => { + showMenu(); + }); + }, + "Storage": function() { + E.showMenu(); + if (require("Storage").list(/^acc.*.csv$/).length) + StorageMenu(); + else + E.showAlert("No Data").then(() => { + showMenu(); + }); + }, + "Exit": function() { + load(); + }, + }; + E.showMenu(menu); } function showSaveMenu() { - var menu = { - "" : { title : "Save" } - }; - [1,2,3,4,5,6].forEach(i=>{ - var fn = "accelrec."+i+".csv"; - var exists = require("Storage").read(fn)!==undefined; - menu["Recording "+i+(exists?" *":"")] = function() { - var csv = ""; - for (var i=0;i { + if (ok) + SaveFile(); + else + 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(); + }; + 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(); \ No newline at end of file diff --git a/apps/pebblepp/app.js b/apps/pebblepp/app.js index 2c8e24192..5ffd82a9e 100644 --- a/apps/pebblepp/app.js +++ b/apps/pebblepp/app.js @@ -38,6 +38,8 @@ let draw = function() { g.reset(); 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.setColor(theme.fg); g.drawString(time, w/2, h2 + 8); @@ -133,7 +135,7 @@ background.fillRect(Bangle.appRect); // start off with completely clear backgrou // contrast bar (top) g.setColor(theme.fg).fillRect(0, h2 - 6, w, h2); // 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(); }