sixths: move state into struct so we can save it

master
Pavel Machek 2024-07-27 19:27:41 +02:00
parent fda027fa18
commit 522a53c5b7
1 changed files with 43 additions and 39 deletions

View File

@ -16,17 +16,23 @@ var note_limit = 0;
var mode = 0, mode_time = 0; // 0 .. normal, 1 .. note, 2.. mark name var mode = 0, mode_time = 0; // 0 .. normal, 1 .. note, 2.. mark name
var disp_mode = 0; // 0 .. normal, 1 .. small time var disp_mode = 0; // 0 .. normal, 1 .. small time
var state = {
gps_limit: 0, // timeout -- when to stop recording
gps_speed_limit: 0,
prev_fix: null,
gps_dist: 0,
// Marks
cur_mark: null,
};
// GPS handling // GPS handling
var gps_on = 0, // time GPS was turned on var gps_on = 0, // time GPS was turned on
last_fix = 0, // time of last fix last_fix = 0, // time of last fix
last_restart = 0, last_pause = 0; // utime last_restart = 0, last_pause = 0; // utime
last_fstart = 0; // utime, time of start of last fix last_fstart = 0; // utime, time of start of last fix
var gps_needed = 0, // how long to wait for a fix var gps_needed = 0, // how long to wait for a fix
gps_limit = 0, // timeout -- when to stop recording
gps_speed_limit = 0,
keep_fix_for = 10; keep_fix_for = 10;
var prev_fix = null;
var gps_dist = 0;
var mark_heading = -1; var mark_heading = -1;
@ -39,9 +45,6 @@ var is_level = false;
var cur_altitude = 0; var cur_altitude = 0;
var cur_temperature = 0; var cur_temperature = 0;
// Marks
var cur_mark = null;
// Icons // Icons
var icon_alt = "\0\x08\x1a\1\x00\x00\x00\x20\x30\x78\x7C\xFE\xFF\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00"; var icon_alt = "\0\x08\x1a\1\x00\x00\x00\x20\x30\x78\x7C\xFE\xFF\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00";
@ -87,8 +90,8 @@ function gpsPause() {
last_pause = getTime(); last_pause = getTime();
} }
function gpsReset() { function gpsReset() {
prev_fix = null; state.prev_fix = null;
gps_dist = 0; state.gps_dist = 0;
} }
function gpsOn() { function gpsOn() {
gps_on = getTime(); gps_on = getTime();
@ -110,10 +113,10 @@ function fmtTimeDiff(d) {
return ""+d.toFixed(0)+"m"; return ""+d.toFixed(0)+"m";
} }
function gpsHandleFix(fix) { function gpsHandleFix(fix) {
if (!prev_fix) { if (!state.prev_fix) {
showMsg("GPS acquired", 10); showMsg("GPS acquired", 10);
doBuzz(" ."); doBuzz(" .");
prev_fix = fix; state.prev_fix = fix;
} }
if (0) { if (0) {
/* Display error between GPS and system time */ /* Display error between GPS and system time */
@ -124,10 +127,10 @@ function gpsHandleFix(fix) {
debug2 = "te "+(n2-n1)+"s"; debug2 = "te "+(n2-n1)+"s";
} }
loggps(fix); loggps(fix);
let d = calcDistance(fix, prev_fix); let d = calcDistance(fix, state.prev_fix);
if (d > 30) { if (d > 30) {
prev_fix = fix; state.prev_fix = fix;
gps_dist += d/1000; state.gps_dist += d/1000;
} }
} }
function gpsHandle() { function gpsHandle() {
@ -182,33 +185,33 @@ function gpsHandle() {
print("Pausing, next try", gps_needed); print("Pausing, next try", gps_needed);
} }
} }
msg += " "+gps_dist.toFixed(1)+icon_km; msg += " "+state.gps_dist.toFixed(1)+icon_km;
return msg; return msg;
} }
function markNew() { function markNew() {
let r = {}; let r = {};
r.time = getTime(); r.time = getTime();
r.fix = prev_fix; r.fix = state.prev_fix;
r.steps = Bangle.getHealthStatus("day").steps; r.steps = Bangle.getHealthStatus("day").steps;
r.gps_dist = gps_dist; r.gps_dist = state.gps_dist;
r.altitude = cur_altitude; r.altitude = cur_altitude;
r.name = "auto"; r.name = "auto";
return r; return r;
} }
function markHandle() { function markHandle() {
let m = cur_mark; let m = state.cur_mark;
let msg = m.name + ">"; let msg = m.name + ">";
if (m.time) { if (m.time) {
msg += fmtTimeDiff(getTime()- m.time); msg += fmtTimeDiff(getTime()- m.time);
} }
if (prev_fix && prev_fix.fix && m.fix && m.fix.fix) { if (state.prev_fix && state.prev_fix.fix && m.fix && m.fix.fix) {
let s = fmtDist(calcDistance(m.fix, prev_fix)/1000) + icon_km; let s = fmtDist(calcDistance(m.fix, state.prev_fix)/1000) + icon_km;
msg += " " + s; msg += " " + s;
debug = "wp>" + s; debug = "wp>" + s;
mark_heading = 180 + calcBearing(m.fix, prev_fix); mark_heading = 180 + calcBearing(m.fix, state.prev_fix);
debug2 = "wp>" + mark_heading; debug2 = "wp>" + mark_heading;
} else { } else {
msg += " w" + fmtDist(gps_dist - m.gps_dist); msg += " w" + fmtDist(state.gps_dist - m.gps_dist);
} }
return msg; return msg;
} }
@ -217,7 +220,7 @@ function entryDone() {
doBuzz(" ."); doBuzz(" .");
switch (mode) { switch (mode) {
case 1: logstamp(">" + in_str); break; case 1: logstamp(">" + in_str); break;
case 2: cur_mark.name = in_str; break; case 2: state.cur_mark.name = in_str; break;
} }
in_str = 0; in_str = 0;
mode = 0; mode = 0;
@ -240,15 +243,15 @@ function selectWP(i) {
showMsg("No WPs", 60); showMsg("No WPs", 60);
} }
let wp = waypoints[sel_wp]; let wp = waypoints[sel_wp];
cur_mark = {}; state.cur_mark = {};
cur_mark.name = wp.name; state.cur_mark.name = wp.name;
cur_mark.gps_dist = 0; /* HACK */ state.cur_mark.gps_dist = 0; /* HACK */
cur_mark.fix = {}; state.cur_mark.fix = {};
cur_mark.fix.fix = 1; state.cur_mark.fix.fix = 1;
cur_mark.fix.lat = wp.lat; state.cur_mark.fix.lat = wp.lat;
cur_mark.fix.lon = wp.lon; state.cur_mark.fix.lon = wp.lon;
showMsg("WP:"+wp.name, 60); showMsg("WP:"+wp.name, 60);
print("Select waypoint: ", cur_mark); print("Select waypoint: ", state.cur_mark);
} }
function ack(cmd) { function ack(cmd) {
showMsg(cmd, 3); showMsg(cmd, 3);
@ -283,7 +286,7 @@ function inputHandler(s) {
} }
case 'D': doBuzz(' .'); selectWP(1); break; case 'D': doBuzz(' .'); selectWP(1); break;
case 'F': gpsOff(); ack("GPS off"); break; case 'F': gpsOff(); ack("GPS off"); break;
case 'T': gpsOn(); gps_limit = getTime() + 60*60*4; ack("GPS on"); break; case 'T': gpsOn(); state.gps_limit = getTime() + 60*60*4; ack("GPS on"); break;
case 'I': case 'I':
doBuzz(' .'); doBuzz(' .');
disp_mode += 1; disp_mode += 1;
@ -292,12 +295,12 @@ function inputHandler(s) {
} }
break; break;
case 'L': aload("altimeter.app.js"); break; case 'L': aload("altimeter.app.js"); break;
case 'M': doBuzz(' .'); mode = 2; showMsg("M>", 10); cur_mark = markNew(); mode_time = getTime(); break; case 'M': doBuzz(' .'); mode = 2; showMsg("M>", 10); state.cur_mark = markNew(); mode_time = getTime(); break;
case 'N': doBuzz(' .'); mode = 1; showMsg(">", 10); mode_time = getTime(); break; case 'N': doBuzz(' .'); mode = 1; showMsg(">", 10); mode_time = getTime(); break;
case 'O': aload("orloj.app.js"); break; case 'O': aload("orloj.app.js"); break;
case 'R': gpsReset(); ack("GPS reset"); break; case 'R': gpsReset(); ack("GPS reset"); break;
case 'P': aload("runplus.app.js"); break; case 'P': aload("runplus.app.js"); break;
case 'S': gpsOn(); gps_limit = getTime() + 60*30; gps_speed_limit = gps_limit; ack("GPS speed"); break; case 'S': gpsOn(); state.gps_limit = getTime() + 60*30; state.gps_speed_limit = state.gps_limit; ack("GPS speed"); break;
case 'G': { case 'G': {
s = ' T'; s = ' T';
let d = new Date(); let d = new Date();
@ -458,7 +461,7 @@ function every(now) {
} }
mode = 0; mode = 0;
} }
if (gps_on && getTime() > gps_limit && getTime() > gps_speed_limit) { if (gps_on && getTime() > state.gps_limit && getTime() > state.gps_speed_limit) {
Bangle.setGPSPower(0, "sixths"); Bangle.setGPSPower(0, "sixths");
gps_on = 0; gps_on = 0;
} }
@ -529,9 +532,9 @@ function drawBackground() {
drawDot(h, 0.7, 10); drawDot(h, 0.7, 10);
} }
} }
if (prev_fix && prev_fix.fix) { if (state.prev_fix && state.prev_fix.fix) {
g.setColor(0.5, 1, 0.5); g.setColor(0.5, 1, 0.5);
drawDot(prev_fix.course, 0.5, 6); drawDot(state.prev_fix.course, 0.5, 6);
} }
if (mark_heading != -1) { if (mark_heading != -1) {
g.setColor(1, 0.5, 0.5); g.setColor(1, 0.5, 0.5);
@ -584,7 +587,7 @@ function draw() {
msg += gpsHandle() + "\n"; msg += gpsHandle() + "\n";
} }
if (cur_mark) { if (state.cur_mark) {
msg += markHandle() + "\n"; msg += markHandle() + "\n";
} }
@ -761,7 +764,7 @@ function lockHandler(locked) {
function queueDraw() { function queueDraw() {
let next; let next;
if ((getTime() - last_unlocked > 3*60) && if ((getTime() - last_unlocked > 3*60) &&
(getTime() > gps_limit)) (getTime() > state.gps_limit))
next = 60000; next = 60000;
else else
next = 1000; next = 1000;
@ -789,6 +792,7 @@ function start() {
draw(); draw();
location = require("Storage").readJSON("mylocation.json",1)||{"lat":50,"lon":14.45,"alt":354,"location":"Woods"}; location = require("Storage").readJSON("mylocation.json",1)||{"lat":50,"lon":14.45,"alt":354,"location":"Woods"};
state = require("Storage").readJSON("sixths.json",1)||state;
loadWPs(); loadWPs();
buzzTask(); buzzTask();
if (0) if (0)