recorder 0.08: Memory usage improvements for recorder app itself
parent
2831919d6e
commit
a1bcc2f9a3
|
|
@ -11,3 +11,4 @@
|
||||||
0.07: Add recording for Barometer
|
0.07: Add recording for Barometer
|
||||||
Record all HRM events
|
Record all HRM events
|
||||||
Move recording for CoreTemp to its own app
|
Move recording for CoreTemp to its own app
|
||||||
|
0.08: Memory usage improvements for recorder app itself
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ function showMainMenu() {
|
||||||
Object.keys(recorders).forEach(id=>{
|
Object.keys(recorders).forEach(id=>{
|
||||||
mainmenu["Log "+recorders[id]().name] = menuRecord(id);
|
mainmenu["Log "+recorders[id]().name] = menuRecord(id);
|
||||||
});
|
});
|
||||||
|
delete recorders;
|
||||||
return E.showMenu(mainmenu);
|
return E.showMenu(mainmenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,202 +218,201 @@ function viewTrack(filename, info) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
menu['< Back'] = () => { viewTracks(); };
|
menu['< Back'] = () => { viewTracks(); };
|
||||||
return E.showMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
function plotTrack(info) {
|
function plotTrack(info) { "ram"
|
||||||
"ram"
|
function distance(lat1,long1,lat2,long2) { "ram"
|
||||||
|
var x = (long1-long2) * Math.cos((lat1+lat2)*Math.PI/360);
|
||||||
function distance(lat1,long1,lat2,long2) { "ram"
|
var y = lat2 - lat1;
|
||||||
var x = (long1-long2) * Math.cos((lat1+lat2)*Math.PI/360);
|
return Math.sqrt(x*x + y*y) * 6371000 * Math.PI / 180;
|
||||||
var y = lat2 - lat1;
|
}
|
||||||
return Math.sqrt(x*x + y*y) * 6371000 * Math.PI / 180;
|
|
||||||
}
|
// Function to convert lat/lon to XY
|
||||||
|
var getMapXY;
|
||||||
// Function to convert lat/lon to XY
|
if (info.qOSTM) {
|
||||||
var getMapXY;
|
getMapXY = osm.latLonToXY.bind(osm);
|
||||||
if (info.qOSTM) {
|
} else {
|
||||||
getMapXY = osm.latLonToXY.bind(osm);
|
getMapXY = function(lat, lon) { "ram"
|
||||||
} else {
|
return {x:cx + Math.round((long - info.lon)*info.lfactor*info.scale),
|
||||||
getMapXY = function(lat, lon) { "ram"
|
y:cy + Math.round((info.lat - lat)*info.scale)};
|
||||||
return {x:cx + Math.round((long - info.lon)*info.lfactor*info.scale),
|
};
|
||||||
y:cy + Math.round((info.lat - lat)*info.scale)};
|
}
|
||||||
};
|
|
||||||
}
|
E.showMenu(); // remove menu
|
||||||
|
E.showMessage("Drawing...","Track "+info.fn);
|
||||||
E.showMenu(); // remove menu
|
g.flip(); // on buffered screens, draw a not saying we're busy
|
||||||
E.showMessage("Drawing...","Track "+info.fn);
|
g.clear(1);
|
||||||
g.flip(); // on buffered screens, draw a not saying we're busy
|
var s = require("Storage");
|
||||||
g.clear(1);
|
var W = g.getWidth();
|
||||||
var s = require("Storage");
|
var H = g.getHeight();
|
||||||
var W = g.getWidth();
|
var cx = W/2;
|
||||||
var H = g.getHeight();
|
var cy = 24 + (H-24)/2;
|
||||||
var cx = W/2;
|
if (!info.qOSTM) {
|
||||||
var cy = 24 + (H-24)/2;
|
g.setColor("#f00").fillRect(9,80,11,120).fillPoly([9,60,19,80,0,80]);
|
||||||
if (!info.qOSTM) {
|
g.setColor(g.theme.fg).setFont("6x8").setFontAlign(0,0).drawString("N",10,50);
|
||||||
g.setColor("#f00").fillRect(9,80,11,120).fillPoly([9,60,19,80,0,80]);
|
} else {
|
||||||
g.setColor(g.theme.fg).setFont("6x8").setFontAlign(0,0).drawString("N",10,50);
|
osm.lat = info.lat;
|
||||||
} else {
|
osm.lon = info.lon;
|
||||||
osm.lat = info.lat;
|
osm.draw();
|
||||||
osm.lon = info.lon;
|
g.setColor("#000");
|
||||||
osm.draw();
|
|
||||||
g.setColor("#000");
|
|
||||||
}
|
|
||||||
var latIdx = info.fields.indexOf("Latitude");
|
|
||||||
var lonIdx = info.fields.indexOf("Longitude");
|
|
||||||
g.drawString(asTime(info.duration),10,220);
|
|
||||||
var f = require("Storage").open(info.filename,"r");
|
|
||||||
if (f===undefined) return;
|
|
||||||
var l = f.readLine(f);
|
|
||||||
l = f.readLine(f); // skip headers
|
|
||||||
var ox=0;
|
|
||||||
var oy=0;
|
|
||||||
var olat,olong,dist=0;
|
|
||||||
var i=0, c = l.split(",");
|
|
||||||
// skip until we find our first data
|
|
||||||
while(l!==undefined && c[latIdx]=="") {
|
|
||||||
c = l.split(",");
|
|
||||||
l = f.readLine(f);
|
|
||||||
}
|
|
||||||
// now start plotting
|
|
||||||
var lat = +c[latIdx];
|
|
||||||
var long = +c[lonIdx];
|
|
||||||
var mp = getMapXY(lat, long);
|
|
||||||
g.moveTo(mp.x,mp.y);
|
|
||||||
g.setColor("#0f0");
|
|
||||||
g.fillCircle(mp.x,mp.y,5);
|
|
||||||
if (info.qOSTM) g.setColor("#f09");
|
|
||||||
else g.setColor(g.theme.fg);
|
|
||||||
l = f.readLine(f);
|
|
||||||
g.flip(); // force update
|
|
||||||
while(l!==undefined) {
|
|
||||||
c = l.split(",");l = f.readLine(f);
|
|
||||||
if (c[latIdx]=="")continue;
|
|
||||||
lat = +c[latIdx];
|
|
||||||
long = +c[lonIdx];
|
|
||||||
mp = getMapXY(lat, long);
|
|
||||||
g.lineTo(mp.x,mp.y);
|
|
||||||
if (info.qOSTM) g.fillCircle(mp.x,mp.y,2); // make the track more visible
|
|
||||||
var d = distance(olat,olong,lat,long);
|
|
||||||
if (!isNaN(d)) dist+=d;
|
|
||||||
olat = lat;
|
|
||||||
olong = long;
|
|
||||||
ox = mp.x;
|
|
||||||
oy = mp.y;
|
|
||||||
if (++i > 100) { g.flip();i=0; }
|
|
||||||
}
|
|
||||||
g.setColor("#f00");
|
|
||||||
g.fillCircle(ox,oy,5);
|
|
||||||
if (info.qOSTM) g.setColor("#000");
|
|
||||||
else g.setColor(g.theme.fg);
|
|
||||||
g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20);
|
|
||||||
g.setFont("6x8",2);
|
|
||||||
g.setFontAlign(0,0,3);
|
|
||||||
g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40);
|
|
||||||
setWatch(function() {
|
|
||||||
viewTrack(info.fn, info);
|
|
||||||
}, global.BTN3||BTN1);
|
|
||||||
Bangle.drawWidgets();
|
|
||||||
g.flip();
|
|
||||||
}
|
|
||||||
|
|
||||||
function plotGraph(info, style) {
|
|
||||||
"ram"
|
|
||||||
E.showMenu(); // remove menu
|
|
||||||
E.showMessage("Calculating...","Track "+info.fn);
|
|
||||||
var filename = info.filename;
|
|
||||||
var infn = new Float32Array(80);
|
|
||||||
var infc = new Uint16Array(80);
|
|
||||||
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);
|
|
||||||
l = f.readLine(f); // skip headers
|
|
||||||
var nl = 0, c, i;
|
|
||||||
var timeIdx = info.fields.indexOf("Time");
|
|
||||||
if (l!==undefined) {
|
|
||||||
c = l.split(",");
|
|
||||||
strt = c[timeIdx];
|
|
||||||
}
|
|
||||||
if (style=="Altitude") {
|
|
||||||
title = "Altitude (m)";
|
|
||||||
var altIdx = info.fields.indexOf("Altitude");
|
|
||||||
while(l!==undefined) {
|
|
||||||
++nl;c=l.split(",");l = f.readLine(f);
|
|
||||||
if (c[altIdx]=="") continue;
|
|
||||||
i = Math.round(80*(c[timeIdx] - strt)/dur);
|
|
||||||
infn[i]+=+c[altIdx];
|
|
||||||
infc[i]++;
|
|
||||||
}
|
}
|
||||||
} else if (style=="Speed") {
|
|
||||||
title = "Speed (m/s)";
|
|
||||||
var latIdx = info.fields.indexOf("Latitude");
|
var latIdx = info.fields.indexOf("Latitude");
|
||||||
var lonIdx = info.fields.indexOf("Longitude");
|
var lonIdx = info.fields.indexOf("Longitude");
|
||||||
|
g.drawString(asTime(info.duration),10,220);
|
||||||
|
var f = require("Storage").open(info.filename,"r");
|
||||||
|
if (f===undefined) return;
|
||||||
|
var l = f.readLine(f);
|
||||||
|
l = f.readLine(f); // skip headers
|
||||||
|
var ox=0;
|
||||||
|
var oy=0;
|
||||||
|
var olat,olong,dist=0;
|
||||||
|
var i=0, c = l.split(",");
|
||||||
// skip until we find our first data
|
// skip until we find our first data
|
||||||
while(l!==undefined && c[latIdx]=="") {
|
while(l!==undefined && c[latIdx]=="") {
|
||||||
c = l.split(",");
|
c = l.split(",");
|
||||||
l = f.readLine(f);
|
l = f.readLine(f);
|
||||||
}
|
}
|
||||||
// now iterate
|
// now start plotting
|
||||||
var p,lp = Bangle.project({lat:c[1],lon:c[2]});
|
var lat = +c[latIdx];
|
||||||
var t,dx,dy,d,lt = c[timeIdx];
|
var long = +c[lonIdx];
|
||||||
|
var mp = getMapXY(lat, long);
|
||||||
|
g.moveTo(mp.x,mp.y);
|
||||||
|
g.setColor("#0f0");
|
||||||
|
g.fillCircle(mp.x,mp.y,5);
|
||||||
|
if (info.qOSTM) g.setColor("#f09");
|
||||||
|
else g.setColor(g.theme.fg);
|
||||||
|
l = f.readLine(f);
|
||||||
|
g.flip(); // force update
|
||||||
while(l!==undefined) {
|
while(l!==undefined) {
|
||||||
++nl;c=l.split(",");
|
c = l.split(",");l = f.readLine(f);
|
||||||
l = f.readLine(f);
|
if (c[latIdx]=="")continue;
|
||||||
if (c[latIdx] == "") {
|
lat = +c[latIdx];
|
||||||
continue;
|
long = +c[lonIdx];
|
||||||
}
|
mp = getMapXY(lat, long);
|
||||||
t = c[timeIdx];
|
g.lineTo(mp.x,mp.y);
|
||||||
i = Math.round(80*(t - strt)/dur);
|
if (info.qOSTM) g.fillCircle(mp.x,mp.y,2); // make the track more visible
|
||||||
p = Bangle.project({lat:c[latIdx],lon:c[lonIdx]});
|
var d = distance(olat,olong,lat,long);
|
||||||
dx = p.x-lp.x;
|
if (!isNaN(d)) dist+=d;
|
||||||
dy = p.y-lp.y;
|
olat = lat;
|
||||||
d = Math.sqrt(dx*dx+dy*dy);
|
olong = long;
|
||||||
if (t!=lt) {
|
ox = mp.x;
|
||||||
infn[i]+=d / (t-lt); // speed
|
oy = mp.y;
|
||||||
|
if (++i > 100) { g.flip();i=0; }
|
||||||
|
}
|
||||||
|
g.setColor("#f00");
|
||||||
|
g.fillCircle(ox,oy,5);
|
||||||
|
if (info.qOSTM) g.setColor("#000");
|
||||||
|
else g.setColor(g.theme.fg);
|
||||||
|
g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20);
|
||||||
|
g.setFont("6x8",2);
|
||||||
|
g.setFontAlign(0,0,3);
|
||||||
|
g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40);
|
||||||
|
setWatch(function() {
|
||||||
|
viewTrack(info.fn, info);
|
||||||
|
}, global.BTN3||BTN1);
|
||||||
|
Bangle.drawWidgets();
|
||||||
|
g.flip();
|
||||||
|
}
|
||||||
|
|
||||||
|
function plotGraph(info, style) { "ram"
|
||||||
|
E.showMenu(); // remove menu
|
||||||
|
E.showMessage("Calculating...","Track "+info.fn);
|
||||||
|
var filename = info.filename;
|
||||||
|
var infn = new Float32Array(80);
|
||||||
|
var infc = new Uint16Array(80);
|
||||||
|
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);
|
||||||
|
l = f.readLine(f); // skip headers
|
||||||
|
var nl = 0, c, i;
|
||||||
|
var timeIdx = info.fields.indexOf("Time");
|
||||||
|
if (l!==undefined) {
|
||||||
|
c = l.split(",");
|
||||||
|
strt = c[timeIdx];
|
||||||
|
}
|
||||||
|
if (style=="Altitude") {
|
||||||
|
title = "Altitude (m)";
|
||||||
|
var altIdx = info.fields.indexOf("Altitude");
|
||||||
|
while(l!==undefined) {
|
||||||
|
++nl;c=l.split(",");l = f.readLine(f);
|
||||||
|
if (c[altIdx]=="") continue;
|
||||||
|
i = Math.round(80*(c[timeIdx] - strt)/dur);
|
||||||
|
infn[i]+=+c[altIdx];
|
||||||
infc[i]++;
|
infc[i]++;
|
||||||
}
|
}
|
||||||
lp = p;
|
} else if (style=="Speed") {
|
||||||
lt = t;
|
title = "Speed (m/s)";
|
||||||
|
var latIdx = info.fields.indexOf("Latitude");
|
||||||
|
var lonIdx = info.fields.indexOf("Longitude");
|
||||||
|
// skip until we find our first data
|
||||||
|
while(l!==undefined && c[latIdx]=="") {
|
||||||
|
c = l.split(",");
|
||||||
|
l = f.readLine(f);
|
||||||
|
}
|
||||||
|
// now iterate
|
||||||
|
var p,lp = Bangle.project({lat:c[1],lon:c[2]});
|
||||||
|
var t,dx,dy,d,lt = c[timeIdx];
|
||||||
|
while(l!==undefined) {
|
||||||
|
++nl;c=l.split(",");
|
||||||
|
l = f.readLine(f);
|
||||||
|
if (c[latIdx] == "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
t = c[timeIdx];
|
||||||
|
i = Math.round(80*(t - strt)/dur);
|
||||||
|
p = Bangle.project({lat:c[latIdx],lon:c[lonIdx]});
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
} else throw new Error("Unknown type "+style);
|
||||||
|
var min=100000,max=-100000;
|
||||||
|
for (var i=0;i<infn.length;i++) {
|
||||||
|
if (infc[i]>0) infn[i]/=infc[i];
|
||||||
|
var n = infn[i];
|
||||||
|
if (n>max) max=n;
|
||||||
|
if (n<min) min=n;
|
||||||
}
|
}
|
||||||
} else throw new Error("Unknown type "+style);
|
// work out a nice grid value
|
||||||
var min=100000,max=-100000;
|
var heightDiff = max-min;
|
||||||
for (var i=0;i<infn.length;i++) {
|
var grid = 1;
|
||||||
if (infc[i]>0) infn[i]/=infc[i];
|
while (heightDiff/grid > 8) {
|
||||||
var n = infn[i];
|
grid*=2;
|
||||||
if (n>max) max=n;
|
}
|
||||||
if (n<min) min=n;
|
// draw
|
||||||
|
g.clear(1).setFont("6x8",1);
|
||||||
|
var r = require("graph").drawLine(g, infn, {
|
||||||
|
x:4,y:24,
|
||||||
|
width: g.getWidth()-24,
|
||||||
|
height: g.getHeight()-(24+8),
|
||||||
|
axes : true,
|
||||||
|
gridy : grid,
|
||||||
|
gridx : infn.length / 3,
|
||||||
|
title: title,
|
||||||
|
miny: min,
|
||||||
|
maxy: max,
|
||||||
|
xlabel : x=>Math.round(x*dur/(60*infn.length))+" min" // minutes
|
||||||
|
});
|
||||||
|
g.setFont("6x8",2);
|
||||||
|
g.setFontAlign(0,0,3);
|
||||||
|
g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40);
|
||||||
|
setWatch(function() {
|
||||||
|
viewTrack(info.filename, info);
|
||||||
|
}, global.BTN3||BTN1);
|
||||||
|
g.flip();
|
||||||
}
|
}
|
||||||
// work out a nice grid value
|
|
||||||
var heightDiff = max-min;
|
return E.showMenu(menu);
|
||||||
var grid = 1;
|
|
||||||
while (heightDiff/grid > 8) {
|
|
||||||
grid*=2;
|
|
||||||
}
|
|
||||||
// draw
|
|
||||||
g.clear(1).setFont("6x8",1);
|
|
||||||
var r = require("graph").drawLine(g, infn, {
|
|
||||||
x:4,y:24,
|
|
||||||
width: g.getWidth()-24,
|
|
||||||
height: g.getHeight()-(24+8),
|
|
||||||
axes : true,
|
|
||||||
gridy : grid,
|
|
||||||
gridx : infn.length / 3,
|
|
||||||
title: title,
|
|
||||||
miny: min,
|
|
||||||
maxy: max,
|
|
||||||
xlabel : x=>Math.round(x*dur/(60*infn.length))+" min" // minutes
|
|
||||||
});
|
|
||||||
g.setFont("6x8",2);
|
|
||||||
g.setFontAlign(0,0,3);
|
|
||||||
g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40);
|
|
||||||
setWatch(function() {
|
|
||||||
viewTrack(info.filename, info);
|
|
||||||
}, global.BTN3||BTN1);
|
|
||||||
g.flip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "recorder",
|
"id": "recorder",
|
||||||
"name": "Recorder",
|
"name": "Recorder",
|
||||||
"shortName": "Recorder",
|
"shortName": "Recorder",
|
||||||
"version": "0.07",
|
"version": "0.08",
|
||||||
"description": "Record GPS position, heart rate and more in the background, then download to your PC.",
|
"description": "Record GPS position, heart rate and more in the background, then download to your PC.",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"tags": "tool,outdoors,gps,widget",
|
"tags": "tool,outdoors,gps,widget",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue