Merge pull request #1266 from IoTThinks/MCdev-Powersaving-for-esp32-202512

Added powersaving to all ESP32 boards with RTC-supported DIO1
This commit is contained in:
ripplebiz 2025-12-31 11:35:46 +11:00 committed by GitHub
commit f9720f0b0c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 84 additions and 12 deletions

View file

@ -1116,3 +1116,8 @@ void MyMesh::loop() {
uptime_millis += now - last_millis;
last_millis = now;
}
// To check if there is pending work
bool MyMesh::hasPendingWork() const {
return _mgr->getOutboundCount(0xFFFFFFFF) > 0;
}

View file

@ -225,4 +225,7 @@ public:
bridge.begin();
}
#endif
// To check if there is pending work
bool hasPendingWork() const;
};

View file

@ -19,12 +19,19 @@ void halt() {
static char command[160];
// For power saving
unsigned long lastActive = 0; // mark last active time
unsigned long nextSleepinSecs = 120; // next sleep in seconds. The first sleep (if enabled) is after 2 minutes from boot
void setup() {
Serial.begin(115200);
delay(1000);
board.begin();
// For power saving
lastActive = millis(); // mark last active time since boot
#ifdef DISPLAY_CLASS
if (display.begin()) {
display.startFrame();
@ -117,4 +124,15 @@ void loop() {
ui_task.loop();
#endif
rtc_clock.tick();
if (the_mesh.getNodePrefs()->powersaving_enabled && // To check if power saving is enabled
the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep
if (!the_mesh.hasPendingWork()) { // No pending work. Safe to sleep
board.sleep(1800); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
lastActive = millis();
nextSleepinSecs = 5; // Default: To work for 5s and sleep again
} else {
nextSleepinSecs += 5; // When there is pending work, to work another 5s
}
}
}