1
0
Fork 0

gipy: fiddling with powersaving

master
frederic wagner 2023-07-11 11:18:30 +02:00
parent ed543b8716
commit 9d54ac09ec
4 changed files with 116 additions and 32 deletions

View File

@ -93,7 +93,7 @@ The distance to next point displayed corresponds to the length of the black segm
### Menu
If you click the button you'll reach a menu where you can currently zoom out to see more of the map
(with a slower refresh rate) and reverse the path direction.
(with a slower refresh rate), reverse the path direction and disable power saving (keeping backlight on).
### Settings
@ -102,7 +102,8 @@ Few settings for now (feel free to suggest me more) :
- lost distance : at which distance from path are you considered to be lost ?
- buzz on turns : should the watch buzz when reaching a waypoint ?
- disable bluetooth : turn bluetooth off completely to try to save some power.
- power lcd off : turn lcd off after 30 seconds to save power. the watch will wake up when reaching waypoints
- 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
and when you touch the screen.
### Caveats
@ -111,6 +112,7 @@ It is good to use but you should know :
- the gps might take a long time to start initially (see the assisted gps update app).
- gps signal is noisy : there is therefore a small delay for instant speed. sometimes you may jump somewhere else.
- if you adventure in gorges the gps signal will become garbage.
- your gpx trace has been decimated and approximated : the **REAL PATH** might be **A FEW METERS AWAY**
- sometimes the watch will tell you that you are lost but you are in fact on the path. It usually figures again
the real gps position after a few minutes. It usually happens when the signal is acquired very fast.

View File

@ -1,3 +1,41 @@
*** thoughts on lcd power ***
so, i tried experimenting with turning the lcd off in order to save power.
the good news: this saves a lot. i did a 3h ride which usually depletes the battery and I still had
around two more hours to go.
now the bad news:
- i had to de-activate the twist detection : you cannot raise your watch to the eyes to turn it on.
that's because with twist detection on all road bumps turn the watch on constantly.
- i tried manual detection like :
Bangle.on('accel', function(xyz) {
if (xyz.diff > 0.4 && xyz.mag > 1 && xyz.z < -1.4) {
Bangle.setLCDPower(true);
Bangle.setLocked(false);
}
});
this works nicely when you sit on a chair with a simulated gps signal but does not work so nicely when on the bike.
sometimes it is ok, sometimes you can try 10 times with no success.
- instead i use screen touch to turn it on. that's a bother since you need two hands but well it could be worth it.
the problem is in the delay: between 1 and 5 seconds before the screen comes back on.
my conclusion is that:
* we should not turn screen off unless we agree to have an unresponsive ui
* we should maybe autowake near segments ends and when lost
* we should play with backlight instead
**************************
+ put back foot only ways
+ try fiddling with jit

View File

@ -3,6 +3,7 @@ let displaying = false;
let in_menu = false;
let go_backwards = false;
let zoomed = true;
let powersaving = true;
let status;
let interests_colors = [
@ -18,9 +19,10 @@ let s = require("Storage");
var settings = Object.assign({
lost_distance: 50,
brightness: 0.5,
buzz_on_turns: false,
disable_bluetooth: true,
power_lcd_off: true,
power_lcd_off: false,
},
s.readJSON("gipy.json", true) || {}
);
@ -606,6 +608,8 @@ class Interests {
class Status {
constructor(path, maps, interests) {
this.path = path;
this.active = false; // should we have screen on
this.last_activity = getTime();
this.maps = maps;
this.interests = interests;
let half_screen_width = g.getWidth() / 2;
@ -644,6 +648,32 @@ class Status {
this.old_points = []; // record previous points but only when enough distance between them
this.old_times = []; // the corresponding times
}
activate() {
this.last_activity = getTime();
if (this.active) {
return;
} else {
this.active = true;
Bangle.setLCDBrightness(settings.brightness);
Bangle.setLocked(false);
if (settings.power_lcd_off) {
Bangle.setLCDPower(true);
}
}
}
check_activity() {
if (!this.active || !powersaving) {
return;
}
if (getTime() - this.last_activity > 30) {
this.active = false;
Bangle.setLCDBrightness(0);
Bangle.setLocked(true);
if (settings.power_lcd_off) {
Bangle.setLCDPower(false);
}
}
}
invalidate_caches() {
for (let i = 0; i < this.maps.length; i++) {
this.maps[i].invalidate_caches();
@ -713,6 +743,7 @@ class Status {
if (in_menu) {
return;
}
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_sin_direction = Math.sin(-direction - Math.PI / 2.0);
@ -768,6 +799,7 @@ class Status {
// now check if we strayed away from path or back to it
let lost = this.is_lost(next_segment);
if (this.on_path == lost) {
this.activate();
// if status changes
if (lost) {
Bangle.buzz(); // we lost path
@ -798,6 +830,7 @@ class Status {
// }
// }
if (this.reaching != next_point && this.distance_to_next_point <= 100) {
this.activate();
this.reaching = next_point;
let reaching_waypoint = this.path.is_waypoint(next_point);
if (reaching_waypoint) {
@ -807,16 +840,12 @@ class Status {
setTimeout(() => Bangle.buzz(), 1000);
setTimeout(() => Bangle.buzz(), 1500);
}
if (!Bangle.isLCDOn()) {
Bangle.setLCDPower(true);
Bangle.setLocked(false);
}
}
}
}
// abort most frames if locked
if (!Bangle.isLocked() && this.gps_coordinates_counter % 5 != 0) {
// abort most frames if inactive
if (!this.active && this.gps_coordinates_counter % 5 != 0) {
return;
}
@ -1353,9 +1382,9 @@ function simulate_gps(status) {
let pos = p1.times(1 - alpha).plus(p2.times(alpha));
if (go_backwards) {
fake_gps_point -= 0.05; // advance simulation
fake_gps_point -= 0.01; // advance simulation
} else {
fake_gps_point += 0.05; // advance simulation
fake_gps_point += 0.01; // advance simulation
}
status.update_position(pos, null, null);
}
@ -1387,17 +1416,18 @@ function start(fn) {
function start_gipy(path, maps, interests) {
console.log("starting");
if (settings.power_lcd_off) {
// we handle manually the backlight
Bangle.setOptions({
lockTimeout: 10000,
backlightTimeout: 20000,
lcdPowerTimeout: 30000,
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,
wakeOnTouch: false,
powerSave: false,
});
}
Bangle.setPollInterval(4000); // disable accelerometer as much as we can
if (!simulated && settings.disable_bluetooth) {
NRF.sleep(); // disable bluetooth completely
}
@ -1406,6 +1436,7 @@ function start_gipy(path, maps, interests) {
setWatch(
function() {
status.activate();
if (in_menu) {
return;
}
@ -1429,6 +1460,12 @@ function start_gipy(path, maps, interests) {
zoomed = v;
},
},
/*LANG*/"powersaving": {
value: powersaving,
onchange: (v) => {
powersaving = v;
}
},
"back to map": function() {
in_menu = false;
E.showMenu();
@ -1461,6 +1498,7 @@ function start_gipy(path, maps, interests) {
status.display();
Bangle.on("stroke", (o) => {
status.activate();
if (in_menu) {
return;
}
@ -1488,7 +1526,7 @@ function start_gipy(path, maps, interests) {
Bangle.setLCDPower(1);
setInterval(simulate_gps, 500, status);
} else {
Bangle.setLocked(false);
status.activate();
let frame = 0;
let set_coordinates = function(data) {
@ -1519,15 +1557,9 @@ function start_gipy(path, maps, interests) {
Bangle.setGPSPower(true, "gipy");
Bangle.on("GPS", set_coordinates);
Bangle.on("lock", function(on) {
if (!on) {
Bangle.setGPSPower(true, "gipy"); // activate gps when unlocking
}
});
}
}
let files = s.list(".gps");
if (files.length <= 1) {
if (files.length == 0) {

View File

@ -5,7 +5,8 @@
lost_distance: 50,
buzz_on_turns: false,
disable_bluetooth: true,
power_lcd_off: true,
brightness: 0.5,
power_lcd_off: false,
},
require("Storage").readJSON(FILE, true) || {}
);
@ -35,14 +36,25 @@
}
},
"lost distance": {
value: 50 | settings.lost_distance, // 0| converts undefined to 0
value: settings.lost_distance,
min: 10,
max: 500,
onchange: (v) => {
settings.max_speed = v;
settings.lost_distance = v;
writeSettings();
},
},
"brightness": {
value: settings.brightness,
min: 0,
max: 1,
step: 0.1,
onchange: (v) => {
settings.brightness = v;
writeSettings();
},
},
/*LANG*/"power lcd off": {
value: settings.power_lcd_off == true,
onchange: (v) => {