1
0
Fork 0

gipy: improvements to sleep algorithm

master
frederic wagner 2023-07-18 08:59:37 +02:00
parent 549cd0aadd
commit 465539561f
2 changed files with 47 additions and 35 deletions

View File

@ -103,8 +103,8 @@ Few settings for now (feel free to suggest me more) :
- buzz on turns : should the watch buzz when reaching a waypoint ? - buzz on turns : should the watch buzz when reaching a waypoint ?
- disable bluetooth : turn bluetooth off completely to try to save some power. - disable bluetooth : turn bluetooth off completely to try to save some power.
- brightness : how bright should screen be ? (by default 0.5, again saving power) - brightness : how bright should screen be ? (by default 0.5, again saving power)
- power lcd off (disabled by default): turn lcd off when inactive to save power. the watch will wake up when reaching points - power lcd off (disabled by default): turn lcd off when inactive to save power. the watch will wake up when reaching points,
and when you touch the screen. when you touch the screen and when speed is below 13km/h.
### Caveats ### Caveats

View File

@ -608,6 +608,7 @@ class Interests {
class Status { class Status {
constructor(path, maps, interests) { constructor(path, maps, interests) {
this.path = path; this.path = path;
this.default_options = true; // do we still have default options ?
this.active = false; // should we have screen on this.active = false; // should we have screen on
this.last_activity = getTime(); this.last_activity = getTime();
this.maps = maps; this.maps = maps;
@ -668,7 +669,6 @@ class Status {
if (getTime() - this.last_activity > 30) { if (getTime() - this.last_activity > 30) {
this.active = false; this.active = false;
Bangle.setLCDBrightness(0); Bangle.setLCDBrightness(0);
Bangle.setLocked(true);
if (settings.power_lcd_off) { if (settings.power_lcd_off) {
Bangle.setLCDPower(false); Bangle.setLCDPower(false);
} }
@ -698,6 +698,10 @@ class Status {
let distance_to_previous = previous_point.distance(position); let distance_to_previous = previous_point.distance(position);
// gps signal is noisy but rarely above 5 meters // gps signal is noisy but rarely above 5 meters
if (distance_to_previous < 5) { if (distance_to_previous < 5) {
// update instant speed and return
let oldest_point = this.old_points[0];
let distance_to_oldest = oldest_point.distance(position);
this.instant_speed = distance_to_oldest / (now - this.old_times[0]);
return null; return null;
} }
} }
@ -731,18 +735,47 @@ class Status {
let angle = Math.atan2(diff.lat, diff.lon); let angle = Math.atan2(diff.lat, diff.lon);
return angle; return angle;
} }
update_position(new_position, maybe_direction, timestamp) { update_position(new_position) {
let direction = this.new_position_reached(new_position); let direction = this.new_position_reached(new_position);
if (direction === null) { if (direction === null) {
if (maybe_direction === null) { if (this.old_points.length > 1) {
return; this.display(); // re-display because speed has changed
} else {
direction = maybe_direction;
} }
return;
} }
if (in_menu) { if (in_menu) {
return; return;
} }
if (this.instant_speed * 3.6 < 13) {
this.activate(); // if we go too slow turn on, we might be looking for the direction to follow
if (!this.default_options) {
this.default_options = true;
Bangle.setOptions({
lockTimeout: 10000,
backlightTimeout: 10000,
wakeOnTwist: true,
powerSave: true,
});
}
} else {
if (this.default_options) {
this.default_options = false;
Bangle.setOptions({
lockTimeout: 0,
backlightTimeout: 0,
lcdPowerTimeout: 0,
hrmSportMode: 2,
wakeOnTwist: false, // if true watch will never sleep due to speed and road bumps. tried several tresholds.
wakeOnFaceUp: false,
wakeOnTouch: true,
powerSave: false,
});
Bangle.setPollInterval(4000); // disable accelerometer as much as we can
}
}
this.check_activity(); // if we don't move or are in menu we should stay on this.check_activity(); // if we don't move or are in menu we should stay on
this.adjusted_cos_direction = Math.cos(-direction - Math.PI / 2.0); this.adjusted_cos_direction = Math.cos(-direction - Math.PI / 2.0);
@ -760,16 +793,6 @@ class Status {
new_position.lat + sin_direction * this.instant_speed * 0.00001 new_position.lat + sin_direction * this.instant_speed * 0.00001
); );
// abort if we are late
// if (timestamp !== null) {
// let elapsed = Date.now() - timestamp;
// if (elapsed > 1000) {
// console.log("we are late");
// return;
// }
// console.log("we are not late");
// }
if (this.path !== null) { if (this.path !== null) {
// detect segment we are on now // detect segment we are on now
let res = this.path.nearest_segment( let res = this.path.nearest_segment(
@ -1364,7 +1387,7 @@ function simulate_gps(status) {
if (fake_gps_point < 1) { if (fake_gps_point < 1) {
fake_gps_point += 0.01; fake_gps_point += 0.01;
} }
status.update_position(pos, null, null); status.update_position(pos);
} else { } else {
if (fake_gps_point > status.path.len - 1 || fake_gps_point < 0) { if (fake_gps_point > status.path.len - 1 || fake_gps_point < 0) {
return; return;
@ -1386,7 +1409,7 @@ function simulate_gps(status) {
} else { } else {
fake_gps_point += 0.01; // advance simulation fake_gps_point += 0.01; // advance simulation
} }
status.update_position(pos, null, null); status.update_position(pos);
} }
} }
@ -1416,18 +1439,6 @@ function start(fn) {
function start_gipy(path, maps, interests) { function start_gipy(path, maps, interests) {
console.log("starting"); console.log("starting");
// we handle manually the backlight
Bangle.setOptions({
lockTimeout: 0,
backlightTimeout: 0,
lcdPowerTimeout: 0,
hrmSportMode: 2,
wakeOnTwist: false, // if true watch will never sleep due to speed and road bumps. tried several tresholds.
wakeOnFaceUp: false,
wakeOnTouch: false,
powerSave: false,
});
Bangle.setPollInterval(4000); // disable accelerometer as much as we can
if (!simulated && settings.disable_bluetooth) { if (!simulated && settings.disable_bluetooth) {
NRF.sleep(); // disable bluetooth completely NRF.sleep(); // disable bluetooth completely
} }
@ -1460,7 +1471,8 @@ function start_gipy(path, maps, interests) {
zoomed = v; zoomed = v;
}, },
}, },
/*LANG*/"powersaving": { /*LANG*/
"powersaving": {
value: powersaving, value: powersaving,
onchange: (v) => { onchange: (v) => {
powersaving = v; powersaving = v;
@ -1540,7 +1552,7 @@ function start_gipy(path, maps, interests) {
status.starting_time = getTime(); status.starting_time = getTime();
Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen
} }
status.update_position(new Point(data.lon, data.lat), null, data.time); status.update_position(new Point(data.lon, data.lat));
} }
let gps_status_color; let gps_status_color;
if (frame % 2 == 0 || valid_coordinates) { if (frame % 2 == 0 || valid_coordinates) {
@ -1569,4 +1581,4 @@ if (files.length <= 1) {
} }
} else { } else {
drawMenu(); drawMenu();
} }