From 8acb48a97c1b320bf97c3c288c146613421fe908 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Tue, 22 Jul 2025 22:43:36 +0200 Subject: [PATCH] trail: Start map draw around current position. --- apps/trail/trail.app.js | 128 ++++++++++++++++++++++++++++++---------- 1 file changed, 96 insertions(+), 32 deletions(-) diff --git a/apps/trail/trail.app.js b/apps/trail/trail.app.js index 591f30b49..3785e93a1 100644 --- a/apps/trail/trail.app.js +++ b/apps/trail/trail.app.js @@ -496,7 +496,7 @@ function angleDifference(angle1, angle2) { /* These are initialized by read() function, below */ var start = {}, destination = {}, num = 0, dist = 0; -function read(pp, n) { +function read(pp, n, candy) { let f = require("Storage").open(n+".st", "r"); let l = f.readLine(); let prev = 0; @@ -513,12 +513,15 @@ function read(pp, n) { if (pp.g) paint(pp, prev, p, 1); } else { - zoom.geoNew(p, 3000); + if (candy) + zoom.geoNew(p, 3000); start = p; + if (candy) { pp.lat = p.lat; pp.lon = p.lon; + } /* FIXME: won't init destination */ - return; + //return; } prev = p; } @@ -526,10 +529,10 @@ function read(pp, n) { if (!(num % 30)) { g.clear(); zoom.geoPaint(prev, 0, 2500); - g.drawString(num + "\n" + fmt.fmtDist(dist / 1000), 3, 3); + g.drawString(num + "\n" + fmt.fmtDist(dist / 1000) + "\n" + track_name, 3, 3); g.flip(); print(num, "points"); - if (!(num % 300)) { + if (candy && !(num % 300)) { zoom.geoNew(prev, 3000); } } @@ -539,8 +542,9 @@ function read(pp, n) { destination = prev; } -/* Convert to storagefile, and find out start/stop points (and display some eye-candy) */ -function time_read(n) { +/* Find out start/stop points (and display some eye-candy) */ +function time_read() { + let n = track_name ui.drawMsg("Converting"); print("Converting..."); to_storage(n); @@ -552,7 +556,7 @@ function time_read(n) { pp.x = 176/2; pp.y = 176/2; pp.g = zoom.buf; - read(pp, n); + read(pp, n, 1); // { rotate: Math.PI / 4 + i/100, scale: 1-i/100 } let v2 = getTime(); @@ -681,43 +685,59 @@ function step_to(pp, pass_all) { return quiet; } -var demo_mode = 0; +var demo_mode = 0, zoom_mode = 0; function step() { const fast = 0; + let follow = 0; + switch (ui.display) { + case 0: follow = 1; break; + case 1: break; + case 2: follow = 1; break; + } + let v1 = getTime(); g.reset().clear(); let fix = gps.getGPSFix(); - - let have_more = load_next(); + let have_more = 1; + if (follow) + have_more = load_next(); let pp = fix; pp.ppm = 0.08 * 3; /* Pixels per meter */ pp.g = g; - if (demo_mode || !fix.fix) { + if (follow && (demo_mode || !fix.fix)) { let i = 2; pp.lat = track[i].lat; pp.lon = track[i].lon; pp.course = fmt.bearing(track[i], track[i+1]); } - let quiet = step_to(pp, 1); - if (1) { + let quiet = {}; + if (follow) + quiet = step_to(pp, 1); + let zoom_scale = 0; + switch (zoom_mode) { + case 0: zoom_scale = 500; break; + case 1: zoom_scale = 1500; break; + case 2: zoom_scale = 2500; break; + } + switch (ui.display) { + case 0: break; + case 1: break; + case 2: + ui.drawMsg("Stats\n" + fmt.fmtDist(0 / 1000) + "\n" + point_num + "/" + num); + zoom_scale = 0; + break; + } + if (zoom_scale) { g.setColor(0, 0, 0); - let zoom_scale = 0; - switch (ui.display) { - case 0: zoom_scale = 500; break; - case 1: zoom_scale = 1500; break; - case 2: zoom_scale = 2500; break; - case 3: /* draw some statistics? */ break; - } - if (zoom_scale) - zoom.geoPaint(pp, -pp.course, zoom_scale); + zoom.geoPaint(pp, -pp.course, zoom_scale); } - { + if (zoom_scale) { /* Draw arrow representing current position */ pp.x = ui.w/2; pp.y = ui.h*0.5; @@ -728,7 +748,7 @@ function step() { } g.setColor(0, 0, 0); - if (!fast) { + if (follow && !fast) { g.setFont("Vector", 31); g.setFontAlign(-1, -1); let msg = "\noff " + fmt.fmtDist(quiet.offtrack/1000); @@ -737,7 +757,7 @@ function step() { } g.drawString(fmt.fmtFix(fix, getTime()-gps.gps_start) + msg, 3, 3); } - if (!fast) { + if (zoom_scale && !fast) { g.setFont("Vector", 23); g.setColor(0, 0, 0); g.setFontAlign(-1, 1); @@ -785,7 +805,33 @@ function recover() { step_to(pp, 1); if (!load_next()) break; - ui.drawMsg("Recover\n" + fmt.fmtDist(d / 1000) + "\n" + point_num + "/" + num); + if (!(point_num % 30)) + ui.drawMsg("Recover\n" + fmt.fmtDist(d / 1000) + "\n" + point_num + "/" + num + "\n" + track_name); + } +} + +/* Draw map around current position */ +function draw_map() { + ui.drawMsg("Draw..."); + let fix = gps.getGPSFix(); + if (!fix.fix) { + print("Can't draw with no fix\n"); + fix.lat = 50.010507; /* FIXME */ + fix.lon = 14.765840; + } + let pp = fix; + pp.ppm = 0.008 * 5; /* Pixels per meter */ + pp.course = 0; + pp.x = 176/2; + pp.y = 176/2; + pp.g = zoom.buf; + let d = 0; + //load_next(); + zoom.geoNew(pp, 3000); + { + read(pp, track_name, 0); + ui.drawMsg("Drawn\n" + fmt.fmtDist(d / 1000) + "\n" + point_num + "/" + num); + step_init(); } } @@ -820,21 +866,39 @@ print(l); /* After user selected the track, we can switch to main interface */ function load_track(x) { ui.init(); - ui.numScreens = 4; -ui.screens = [ "Detail", "Mid", "Overview", "Stats" ]; + ui.numScreens = 3; + ui.screens = [ "Follow", "Map", "Stats" ]; Bangle.buzz(50, 1); ui.drawMsg("Loading\n"+x); track_name = x; - time_read(x); + time_read(); Bangle.on("drag", (b) => ui.touchHandler(b)); Bangle.setUI({ mode : "custom", clock : 0 }); - ui.topLeft = () => { ui.drawMsg("Demo mode"); demo_mode = 1; } - ui.topRight = () => { ui.drawMsg("Recover"); recover(); }; + ui.topLeft = () => { + switch (ui.display) { + case 0: + case 1: + zoom_mode++; + if (zoom_mode == 3) + zoom_mode = 0; + ui.drawMsg("Zoom mode " + zoom_mode); + break; + case 2: demo_mode = !demo_mode; + ui.drawMsg("Demo mode " + demo_mode); + break; + } + } + ui.topRight = () => { + switch (ui.display) { + case 0: ui.drawMsg("Recover"); recover(); break; + case 1: ui.drawMsg("Draw map"); draw_map(); break; + } + }; } /* Display menu with tracks. */