diff --git a/apps.json b/apps.json index 99f9aa0ea..8e2423bfd 100644 --- a/apps.json +++ b/apps.json @@ -2189,6 +2189,23 @@ {"wildcard":"accelrec.?.csv" } ] }, + { "id": "accellog", + "name": "Acceleration Logger", + "shortName":"Accel Log", + "icon": "app.png", + "version":"0.01", + "interface": "interface.html", + "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", + "tags": "outdoor", + "readme": "README.md", + "storage": [ + {"name":"accellog.app.js","url":"app.js"}, + {"name":"accellog.img","url":"app-icon.js","evaluate":true} + ], + "data": [ + {"wildcard":"accellog.?.csv" } + ] + }, { "id": "cprassist", "name":"CPR Assist", diff --git a/apps/accellog/ChangeLog b/apps/accellog/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/accellog/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/accellog/README.md b/apps/accellog/README.md new file mode 100644 index 000000000..d053ecfe5 --- /dev/null +++ b/apps/accellog/README.md @@ -0,0 +1,25 @@ +# Acceleration Logger + +Logs XYZ acceleration data (at the normal 12.5Hz) to a CSV file that can be downloaded to your PC. + + + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name diff --git a/apps/accellog/app-icon.js b/apps/accellog/app-icon.js new file mode 100644 index 000000000..994ffd076 --- /dev/null +++ b/apps/accellog/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("oFAwhC/AH4A2xAedhGIwA+dAAI+dAAJAcEAJ/fD/4f5hAJIYSo6JIihaKxBATxAACC4YnBAAQ+TD7o/CFRJfTP5a/eb6pEOD/7JFwczAA0ybgwfUkUjD4QaDD6syiMSD4ZABCIa8JD547BCIY/ZHQQ+LD6Z/cHZYf/f6E4D6uCD4gACD6wgBkQACBAYfWABYf/D/4fPwf/ABgf/D6czABBf/P/5f/P/5f/D+WIABwfuAH4A/ADo=")) diff --git a/apps/accellog/app.js b/apps/accellog/app.js new file mode 100644 index 000000000..cd52309ab --- /dev/null +++ b/apps/accellog/app.js @@ -0,0 +1,132 @@ +var fileNumber = 0; +var MAXLOGS = 9; + +function getFileName(n) { + return "accellog."+n+".csv"; +} + +function showMenu() { + var menu = { + "" : { title : "Accel Logger" }, + "File No" : { + value : fileNumber, + min : 0, + max : MAXLOGS, + onchange : v => { fileNumber=v; } + }, + "Start" : function() { + E.showMenu(); + startRecord(); + }, + "View Logs" : function() { + viewLogs(); + }, + "Exit" : function() { + load(); + }, + }; + E.showMenu(menu); +} + +function viewLog(n) { + E.showMessage("Loading..."); + var f = require("Storage").open(getFileName(n), "r"); + var records = 0, l = "", ll=""; + while (l=f.readLine()) {records++;ll=l}; + var length = 0; + if (ll) length = (ll.split(",")[0]|0)/1000; + + var menu = { + "" : { title : "Log "+n } + }; + menu[records+" Records"] = ""; + menu[length+" Seconds"] = ""; + menu["DELETE"] = function() { + E.showPrompt("Delete Log "+n).then(ok=>{ + if (ok) { + E.showMessage("Erasing..."); + f.erase(); + viewLogs(); + } else viewLog(n); + }); + }; + menu["< Back"] = function() { + viewLogs(); + }; + + E.showMenu(menu); +} + +function viewLogs() { + var menu = { + "" : { title : "Logs" } + }; + + 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["Log "+i] = () => viewLog(i); + })(i); + hadLogs = true; + } + } + if (!hadLogs) + menu["No Logs Found"] = function(){}; + menu["< Back"] = function() { showMenu(); }; + E.showMenu(menu); +} + +function startRecord(force) { + if (!force) { + // check for existing file + var f = require("Storage").open(getFileName(fileNumber), "r"); + if (f.readLine()!==undefined) + return E.showPrompt("Overwrite Log "+fileNumber+"?").then(ok=>{ + if (ok) startRecord(true); else showMenu(); + }); + } + // display + g.clear(1); + Bangle.drawWidgets(); + var w = g.getWidth(); + var h = g.getHeight(); + g.setColor("#ff0000").fillRect(0,h-48,w,h); + g.setColor("#ffffff").setFont("6x8",2).setFontAlign(0,0).drawString("RECORDING", w/2,h-24); + g.setFont("6x8").drawString("Samples:",w/2,h/3 - 20); + g.setFont("6x8").drawString("Time:",w/2,h*2/3 - 20); + g.setFont("6x8",2).setFontAlign(0,0,1).drawString("STOP",w-10,h/2); + + // now start writing + f = require("Storage").open(getFileName(fileNumber), "w"); + f.write("Time (ms),X,Y,Z\n"); + var start = getTime(); + var sampleCount = 0; + + function accelHandler(accel) { + var t = getTime()-start; + f.write([ + t*1000, + accel.x*8192, + accel.y*8192, + accel.z*8192].map(n=>Math.round(n)).join(",")+"\n"); + + sampleCount++; + g.reset().setFont("6x8",2).setFontAlign(0,0); + g.drawString(" "+sampleCount+" ",w/2,h/3,true); + g.drawString(" "+Math.round(t)+"s ",w/2,h*2/3,true); + } + + Bangle.setPollInterval(80); // 12.5 Hz + Bangle.on('accel', accelHandler); + setWatch(()=>{ + Bangle.removeListener('accel', accelHandler); + showMenu(); + }, BTN2); +} + + +Bangle.loadWidgets(); +Bangle.drawWidgets(); +showMenu(); diff --git a/apps/accellog/app.png b/apps/accellog/app.png new file mode 100644 index 000000000..4908b2473 Binary files /dev/null and b/apps/accellog/app.png differ diff --git a/apps/accellog/interface.html b/apps/accellog/interface.html new file mode 100644 index 000000000..9f50c3953 --- /dev/null +++ b/apps/accellog/interface.html @@ -0,0 +1,107 @@ + +
+ + + + + + + + +