From b08d8ce0f41789420e240cef46b449deffda7818 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Sun, 31 May 2020 15:06:31 +0100 Subject: [PATCH] gpsrec can now graph altitude & speed --- apps.json | 4 +- apps/gpsrec/ChangeLog | 1 + apps/gpsrec/app.js | 92 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 75f010fcd..e96b19d63 100644 --- a/apps.json +++ b/apps.json @@ -317,7 +317,7 @@ { "id": "gpsrec", "name": "GPS Recorder", "icon": "app.png", - "version":"0.09", + "version":"0.10", "interface": "interface.html", "description": "Application that allows you to record a GPS track. Can run in background", "tags": "tool,outdoors,gps,widget", @@ -1826,7 +1826,7 @@ {"name":"animclk.img","url":"app-icon.js","evaluate":true} ] }, - { + { "id": "verticalface", "name": "Vertical watch face", "shortName":"Vertical Face", diff --git a/apps/gpsrec/ChangeLog b/apps/gpsrec/ChangeLog index 469671b38..489e2d366 100644 --- a/apps/gpsrec/ChangeLog +++ b/apps/gpsrec/ChangeLog @@ -10,3 +10,4 @@ 0.09: Change default GPS period to 10 (1 is overkill for most uses and makes things slow) Added RAM keyword to functions & other tweaks to speed up rendering Going 'back' from track view now doesn't load again +0.10: Can now graph altitude & speed diff --git a/apps/gpsrec/app.js b/apps/gpsrec/app.js index aeea18bc2..10aa0ebbf 100644 --- a/apps/gpsrec/app.js +++ b/apps/gpsrec/app.js @@ -129,9 +129,15 @@ function viewTrack(n, info) { menu[info.time.toISOString().substr(0,16).replace("T"," ")] = function(){}; menu["Duration"] = { value : asTime(info.duration)}; menu["Records"] = { value : ""+info.records }; - menu['Plot'] = function() { + menu['Plot Map'] = function() { plotTrack(info); }; + menu['Plot Alt.'] = function() { + plotGraph(info, "altitude"); + }; + menu['Plot Speed'] = function() { + plotGraph(info, "speed"); + }; menu['Erase'] = function() { E.showPrompt("Delete Track?").then(function(v) { if (v) { @@ -215,6 +221,90 @@ function plotTrack(info) { setWatch(function() { viewTrack(info.fn, info); }, BTN3); + g.flip(); +} + +function plotGraph(info, style) { + "ram" + E.showMenu(); // remove menu + E.showMessage("Calculating...","GPS Track "+info.fn); + var filename = getFN(info.fn); + var infn = new Float32Array(200); + var infc = new Uint16Array(200); + var title; + var lt = 0; // last time + var tn = 0; // count for each time period + var strt, dur = info.duration; + var f = require("Storage").open(filename,"r"); + if (f===undefined) return; + var l = f.readLine(f); + var nl = 0, c, i; + if (l!==undefined) { + c = l.split(","); + strt = c[0]/1000; + } + if (style=="altitude") { + title = "Altitude (m)"; + while(l!==undefined) { + ++nl;c=l.split(","); + i = Math.round(200*(c[0]/1000 - strt)/dur); + infn[i]+=+c[3]; + infc[i]++; + l = f.readLine(f); + } + } else if (style=="speed") { + title = "Speed (m/s)"; + var p,lp = Bangle.project({lat:c[1],lon:c[2]}); + var t,dx,dy,d,lt = c[0]/1000; + while(l!==undefined) { + ++nl;c=l.split(","); + i = Math.round(200*(c[0]/1000 - strt)/dur); + t = c[0]/1000; + p = Bangle.project({lat:c[1],lon:c[2]}); + dx = p.x-lp.x; + dy = p.y-lp.y; + d = Math.sqrt(dx*dx+dy*dy); + if (t!=lt) { + infn[i]+=d / (t-lt); // speed + infc[i]++; + } + lp = p; + lt = t; + l = f.readLine(f); + } + } else throw new Error("Unknown type"); + var min=100000,max=-100000; + for (var i=0;i0) infn[i]/=infc[i]; + var n = infn[i]; + if (n>max) max=n; + if (n 8) { + grid*=2; + } + // draw + g.clear(1).setFont("6x8",1); + var r = require("graph").drawLine(g, infn, { + x:4,y:0, + width: g.getWidth()-24, + height: g.getHeight()-8, + axes : true, + gridy : grid, + gridx : 50, + title: title, + xlabel : x=>Math.round(x*dur/(60*infn.length))+" min" // minutes + }); + g.setFont("6x8",2); + g.setFontAlign(0,0,3); + g.drawString("Back",230,200); + setWatch(function() { + viewTrack(info.fn, info); + }, BTN3); + g.flip(); } showMainMenu();