mirror of https://github.com/espruino/BangleApps
159 lines
4.7 KiB
HTML
159 lines
4.7 KiB
HTML
<html>
|
|
<head>
|
|
<link rel="stylesheet" href="../../css/spectre.min.css">
|
|
</head>
|
|
<body>
|
|
<div id="tracks"></div>
|
|
|
|
<script src="../../core/lib/interface.js"></script>
|
|
<script>
|
|
var domTracks = document.getElementById("tracks");
|
|
|
|
function saveKML(track,title) {
|
|
var kml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
<kml xmlns="http://www.opengis.net/kml/2.2">
|
|
<Document>
|
|
<Placemark>
|
|
<name>${title}</name>
|
|
<LineString>
|
|
<coordinates>
|
|
${track.map(pt=>[pt.lon, pt.lat, pt.alt].join(",")).join("\n ")}
|
|
</coordinates>
|
|
</LineString>
|
|
</Placemark>
|
|
</Document>
|
|
</kml>`;
|
|
Util.saveFile(title+".kml", "application/vnd.google-earth.kml+xml", kml);
|
|
}
|
|
|
|
function saveGPX(track, title) {
|
|
var gpx = `<?xml version="1.0" encoding="UTF-8"?>
|
|
<gpx creator="Bangle.js" version="1.1">
|
|
<metadata>
|
|
<time>${track[0].date.toISOString()}</time>
|
|
</metadata>
|
|
<trk>
|
|
<name>${title}</name>
|
|
<trkseg>`;
|
|
track.forEach(pt=>{
|
|
gpx += `
|
|
<trkpt lat="${pt.lat}" lon="${pt.lon}">
|
|
<ele>${pt.alt}</ele>
|
|
<time>${pt.date.toISOString()}</time>
|
|
</trkpt>`;
|
|
});
|
|
gpx += `
|
|
</trkseg>
|
|
</trk>
|
|
</gpx>`;
|
|
Util.saveFile(title+".gpx", "application/gpx+xml", gpx);
|
|
}
|
|
|
|
function trackLineToObject(l, hasTrackNumber) {
|
|
var t = l.trim().split(",");
|
|
var n = hasTrackNumber ? 1 : 0;
|
|
var o = {
|
|
date : new Date(parseInt(t[n+0])),
|
|
lat : parseFloat(t[n+1]),
|
|
lon : parseFloat(t[n+2]),
|
|
alt : parseFloat(t[n+3])
|
|
};
|
|
if (hasTrackNumber)
|
|
o.number = t[0];
|
|
return o;
|
|
}
|
|
|
|
function downloadTrack(trackid, callback) {
|
|
Util.showModal("Downloading Track...");
|
|
Util.readStorageFile(`.gpsrc${trackid.toString(36)}`,data=>{
|
|
Util.hideModal();
|
|
var track = data.trim().split("\n").map(l=>trackLineToObject(l,false));
|
|
callback(track);
|
|
});
|
|
}
|
|
function getTrackList() {
|
|
Util.showModal("Loading Tracks...");
|
|
domTracks.innerHTML = "";
|
|
Puck.write(`\x10(function() {
|
|
Bluetooth.println("");
|
|
for (var n=0;n<36;n++) {
|
|
var f = require("Storage").open(".gpsrc"+n.toString(36),"r");
|
|
var l = f.readLine();
|
|
Bluetooth.println((l!==undefined) ? (n + "," + l.trim()) : "");
|
|
}
|
|
})()\n`,tracklist=>{
|
|
var trackLines = tracklist.trim().split("\n").filter(l=>l!="");
|
|
var html = `<div class="container">
|
|
<div class="columns">\n`;
|
|
trackLines.forEach(l => {
|
|
var track = trackLineToObject(l, true /*has track number*/);
|
|
html += `
|
|
<div class="column col-12">
|
|
<div class="card-header">
|
|
<div class="card-title h5">Track ${track.number}</div>
|
|
<div class="card-subtitle text-gray">${track.date.toString().substr(0,24)}</div>
|
|
</div>
|
|
<div class="card-image">
|
|
<iframe
|
|
width="100%"
|
|
height="250"
|
|
frameborder="0" style="border:0"
|
|
src="https://www.google.com/maps/embed/v1/place?key=AIzaSyBxTcwrrVOh2piz7EmIs1Xn4FsRxJWeVH4&q=${track.lat},${track.lon}&zoom=10" allowfullscreen>
|
|
</iframe>
|
|
</div>
|
|
<div class="card-body"></div>
|
|
<div class="card-footer">
|
|
<button class="btn btn-primary" trackid="${track.number}" task="downloadkml">Download KML</button>
|
|
<button class="btn btn-primary" trackid="${track.number}" task="downloadgpx">Download GPX</button>
|
|
<button class="btn btn-default" trackid="${track.number}" task="delete">Delete</button>
|
|
</div>
|
|
</div>
|
|
`;
|
|
});
|
|
if (trackLines.length==0) {
|
|
html += `
|
|
<div class="column col-12">
|
|
<div class="card-header">
|
|
<div class="card-title h5">No tracks</div>
|
|
<div class="card-subtitle text-gray">No GPS tracks found</div>
|
|
</div>
|
|
</div>
|
|
`;
|
|
}
|
|
html += `
|
|
</div>
|
|
</div>`;
|
|
domTracks.innerHTML = html;
|
|
Util.hideModal();
|
|
var buttons = domTracks.querySelectorAll("button");
|
|
for (var i=0;i<buttons.length;i++) {
|
|
buttons[i].addEventListener("click",event => {
|
|
var button = event.currentTarget;
|
|
var trackid = parseInt(button.getAttribute("trackid"));
|
|
var task = button.getAttribute("task");
|
|
if (task=="delete") {
|
|
Util.showModal("Deleting Track...");
|
|
Util.eraseStorageFile(`.gpsrc${trackid.toString(36)}`,()=>{
|
|
Util.hideModal();
|
|
getTrackList();
|
|
});
|
|
}
|
|
if (task=="downloadkml") {
|
|
downloadTrack(trackid, track => saveKML(track, `Bangle.js Track ${trackid}`));
|
|
}
|
|
if (task=="downloadgpx") {
|
|
downloadTrack(trackid, track => saveGPX(track, `Bangle.js Track ${trackid}`));
|
|
}
|
|
});
|
|
}
|
|
})
|
|
}
|
|
|
|
function onInit() {
|
|
getTrackList();
|
|
}
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|