Create app.js

pull/645/head
Ben Jabituya 2021-01-25 18:55:22 +00:00 committed by GitHub
parent 738aef34ea
commit a1bc97001a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 237 additions and 0 deletions

237
apps/alpinenav/app.js Normal file
View File

@ -0,0 +1,237 @@
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);
});