diff --git a/apps/alpinenav/app.js b/apps/alpinenav/app.js new file mode 100644 index 000000000..29eeab0c9 --- /dev/null +++ b/apps/alpinenav/app.js @@ -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); +});