From 55a3fb08d313ff86a4e5722d6e14bd5cec86ef2b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 3 Feb 2021 10:06:00 +0000 Subject: [PATCH] add acceleration logger --- apps.json | 17 +++++ apps/accellog/ChangeLog | 1 + apps/accellog/README.md | 25 +++++++ apps/accellog/app-icon.js | 1 + apps/accellog/app.js | 132 +++++++++++++++++++++++++++++++++++ apps/accellog/app.png | Bin 0 -> 1390 bytes apps/accellog/interface.html | 107 ++++++++++++++++++++++++++++ 7 files changed, 283 insertions(+) create mode 100644 apps/accellog/ChangeLog create mode 100644 apps/accellog/README.md create mode 100644 apps/accellog/app-icon.js create mode 100644 apps/accellog/app.js create mode 100644 apps/accellog/app.png create mode 100644 apps/accellog/interface.html 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 0000000000000000000000000000000000000000..4908b2473e62ffa4c32ae7f0d4da76e464d5a3f1 GIT binary patch literal 1390 zcmV-!1(EuRP)0grfO5#GjYx7w0s)m!4>V510jWK; zPzi(t98gi?B)5o4K_D&^32{WCNCi$63ZgXBA!-torr7DO6UW}&;Sf7=Vtc)tjJ<2& zPqLJqnSJx-&&-=QV*@Q(v}n;p^v$MwS=!@R8ml+Tj5cf-{BKG^`0LqLu z3`zLVstqCJBNN;hG0Dr8#{9yF-DF8{;A7n=Zgm_XUs|GK5i-0q*`S5ev?yBn8xD!uNBOi)Rv?*q6@2${P- z9(wbr_F~iOD`Z#5pF}A;diQ*%TCJ@ow!vgvz5?I_#%5~{-gCsRZ@y?%uOuGdP!g)H zB-C}Qc74~?fq|*@kexnV-v&!rnhgJJRZj`w2?dWDelJeS3wHY~GxWmjYLGLuE&$MV zP1dt|Sz7sQ#5^7#rf9bl(dWxVf@OgUe`?ah)vPZI04bfUEWX`eF;LZ$G66W6IYT*e z69CM-0eve~_R?T~07}@&5jAF;7(Oy}4T70W28)aL z_CD!UxtK*L=unWCz8jcYu(ftsQP&udOy0-mb8~yoFO7`i%-OS5+n0#2Hxpvh>RW{3 zQlY^Ug{EO8q5f5P>((>t^7$XG68$hfdSV+a<={+M8kc7Q%mX+Hpg23Y!t#gN`&lC zhzZPSsu@rZEN1{AmG#M+_KbIT_u%z6&h0&Sb#?8l&zbHYMlA*4{Xvk70BY>tWp1zL za555rP{aRlIE?2`pRQQkGrwv&ETJ_dM(|9uc_3E;K^Zc{S`1brNY z2Fax5%!UU>O92MEgSa;KWW%nG?>)-lwXc`aNDVCix4p;2hTfa^cZd+U#wJIO&H_8R zJaofg>Oepe!Ex?|B1ZzOZTyS0%J#~xzvn5m1R!rZ~ls0Deh?zv54gnitC?d@0R#&#%SuW*&Nj&%>58;MU(6jNVv+RO|Ye w5f3wZLyy9MjU}+Lb?7f%TeN7=qJ`J_4^+#d`2s8izyJUM07*qoM6N<$f=!`=IsgCw literal 0 HcmV?d00001 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 @@ + + + + + +
+ + + + +