mirror of https://github.com/espruino/BangleApps
238 lines
6.6 KiB
JavaScript
238 lines
6.6 KiB
JavaScript
var background_colour = "#000000";
|
|
var foregound_colour = "#ccff99";
|
|
var position_colour = "#ff3329";
|
|
var log_limit = 1000;
|
|
var max_array_size = 50;
|
|
var pause_tracker = false;
|
|
var temp;
|
|
var file;
|
|
var d;
|
|
var origin_lat;
|
|
var origin_lon;
|
|
var current_lat;
|
|
var current_lon;
|
|
var current_speed;
|
|
var distance_from_origin = 0;
|
|
var distane_travelled = 0;
|
|
var log_size;
|
|
var waypoints = [];
|
|
var start_alt = 0;
|
|
var current_alt = 0;
|
|
var button_lock = false;
|
|
var display_waypoints = [];
|
|
var waypoint = {
|
|
lat: "",
|
|
lon: ""
|
|
};
|
|
var compass_heading = "---";
|
|
|
|
function calcCrow(lat1, lon1, lat2, lon2) {
|
|
var R = 6371e3;
|
|
var dLat = toRad(lat2 - lat1);
|
|
var dLon = toRad(lon2 - lon1);
|
|
lat1 = toRad(lat1);
|
|
lat2 = toRad(lat2);
|
|
|
|
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
|
|
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
var d = R * c;
|
|
return d;
|
|
}
|
|
|
|
function toRad(Value) {
|
|
return Value * Math.PI / 180;
|
|
}
|
|
|
|
function draw() {
|
|
if (pause_tracker)
|
|
g.setColor(background_colour);
|
|
else
|
|
g.setColor(foregound_colour);
|
|
g.setFont("6x8", 2);
|
|
g.setFontAlign(0, 1);
|
|
g.drawString(distance_from_origin.toFixed(0), 40, 220, true);
|
|
g.drawString(distane_travelled.toFixed(0), 200, 220, true);
|
|
g.setFont("6x8", 1);
|
|
g.drawString(start_alt.toFixed(0), 40, 120, true);
|
|
g.drawString(current_alt.toFixed(0), 200, 120, true);
|
|
if (button_lock) {
|
|
g.setFont("6x8", 2);
|
|
g.setFontAlign(0, 0);
|
|
g.drawString("X", 120, 220, true);
|
|
g.setFont("6x8", 1);
|
|
}
|
|
}
|
|
|
|
function cull_array() {
|
|
for (var i = 2; i <= waypoints.length; i += 2)
|
|
waypoints.splice(i, 1);
|
|
}
|
|
|
|
function process_and_display() {
|
|
g.setColor(background_colour);
|
|
g.fillRect(10, 65, 230, 230);
|
|
g.setColor(foregound_colour);
|
|
if (waypoints.length > max_array_size)
|
|
cull_array();
|
|
rescale();
|
|
if (display_waypoints.length > 0) {
|
|
for (let x = 0; x < display_waypoints.length - 1; x++) {
|
|
g.reset();
|
|
g.setColor(foregound_colour);
|
|
g.drawLine(display_waypoints[x].lon, display_waypoints[x].lat, display_waypoints[x + 1].lon, display_waypoints[x + 1].lat);
|
|
}
|
|
g.reset();
|
|
g.setColor(position_colour);
|
|
g.fillCircle(display_waypoints[display_waypoints.length - 1].lon, display_waypoints[display_waypoints.length - 1].lat, 3);
|
|
}
|
|
}
|
|
|
|
function process_GPS() {
|
|
if (waypoints.length > 0) {
|
|
//check distance
|
|
temp_distance = calcCrow(current_lat, current_lon, waypoints[waypoints.length - 1].lat, waypoints[waypoints.length - 1].lon);
|
|
if (temp_distance > 5) {
|
|
var temp = Object.create(waypoint);
|
|
temp.lat = current_lat;
|
|
temp.lon = current_lon;
|
|
waypoints.push(temp);
|
|
distane_travelled += temp_distance;
|
|
distance_from_origin = calcCrow(current_lat, current_lon, waypoints[0].lat, waypoints[0].lon);
|
|
process_and_display();
|
|
if (log_size < log_limit) {
|
|
var csv = [
|
|
d,
|
|
origin_lat - current_lat,
|
|
current_lon - origin_lon,
|
|
current_speed,
|
|
current_alt
|
|
];
|
|
file.write(csv.join(",") + "\n");
|
|
log_size += 1;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
g.setColor(position_colour);
|
|
g.fillCircle(120, 120, 3);
|
|
}
|
|
draw();
|
|
}
|
|
|
|
function rescale() {
|
|
var max_val = 0;
|
|
display_waypoints = [];
|
|
|
|
for (let x = 0; x < waypoints.length; x++) {
|
|
if (Math.abs(waypoints[x].lat) > max_val)
|
|
max_val = Math.abs(waypoints[x].lat);
|
|
if (Math.abs(waypoints[x].lon) > max_val)
|
|
max_val = Math.abs(waypoints[x].lon);
|
|
}
|
|
|
|
scaler = 60 / max_val;
|
|
|
|
for (let x = 0; x < waypoints.length; x++) {
|
|
temp = Object.create(waypoint);
|
|
temp.lat = 140 - Math.round(waypoints[x].lat * scaler);
|
|
temp.lon = 120 - Math.round(waypoints[x].lon * scaler);
|
|
display_waypoints.push(temp);
|
|
}
|
|
}
|
|
|
|
Bangle.setCompassPower(1);
|
|
Bangle.setGPSPower(1);
|
|
g.clear();
|
|
process_GPS();
|
|
var poll_GPS = setInterval(process_GPS, 9000);
|
|
|
|
setWatch(function () {
|
|
if (!button_lock) {
|
|
waypoints.splice(1);
|
|
process_GPS();
|
|
}
|
|
}, BTN2, { repeat: true, edge: "falling" });
|
|
|
|
setWatch(function () {
|
|
if (!button_lock) {
|
|
if (!pause_tracker) {
|
|
Bangle.setCompassPower(0);
|
|
Bangle.setGPSPower(0);
|
|
pause_tracker = true;
|
|
}
|
|
else {
|
|
Bangle.setCompassPower(1);
|
|
Bangle.setGPSPower(1);
|
|
pause_tracker = false;
|
|
}
|
|
}
|
|
}, BTN3, { repeat: true, edge: "falling" });
|
|
|
|
setWatch(function () {
|
|
if (button_lock) {
|
|
button_lock = false;
|
|
g.setFontAlign(0, 0);
|
|
g.drawString(" ", 120, 220, true);
|
|
}
|
|
else {
|
|
button_lock = true;
|
|
g.setFontAlign(0, 0);
|
|
g.drawString("X", 120, 220, true);
|
|
}
|
|
}, BTN1, { repeat: true, edge: "falling" });
|
|
|
|
Bangle.on('GPS', function (g) {
|
|
if (g.fix) {
|
|
if (waypoints.length == 0) {
|
|
file = require("Storage").open("alpine_log.csv", "w");
|
|
file.write("");
|
|
file = require("Storage").open("alpine_log.csv", "a");
|
|
Bangle.buzz();
|
|
position_colour = 0xF81F;
|
|
origin_lat = g.lat;
|
|
origin_lon = g.lon;
|
|
start_alt = g.alt;
|
|
current_speed = g.speed;
|
|
sat_count = g.satellites;
|
|
var csv = [
|
|
d,
|
|
origin_lat,
|
|
origin_lon,
|
|
current_speed,
|
|
current_alt
|
|
];
|
|
file.write(csv.join(",") + "\n");
|
|
var temp = Object.create(waypoint);
|
|
temp.lat = 0;
|
|
temp.lon = 0;
|
|
process_GPS();
|
|
waypoints.push(temp);
|
|
}
|
|
else {
|
|
current_lat = g.lat - origin_lat;
|
|
current_lon = origin_lon - g.lon;
|
|
current_speed = g.speed;
|
|
sat_count = g.satellites;
|
|
current_alt = g.alt;
|
|
gps_time = g.time;
|
|
}
|
|
}
|
|
});
|
|
|
|
Bangle.on('mag', function (m) {
|
|
if (isNaN(m.heading))
|
|
compass_heading = "---";
|
|
else
|
|
compass_heading = 360 - Math.round(m.heading);
|
|
current_colour = g.getColor();
|
|
g.reset();
|
|
g.setColor(background_colour);
|
|
g.fillRect(140, 30, 190, 55);
|
|
g.setColor(foregound_colour);
|
|
g.setFont("6x8", 2);
|
|
if(compass_heading<100)
|
|
compass_heading = " " + compass_heading.toString();
|
|
g.drawString(compass_heading, 150, 15, true);
|
|
});
|