merge upstream PR #852: feat: lower CPU freq on idle, add HalPowerManager
This commit is contained in:
16
src/main.cpp
16
src/main.cpp
@@ -3,6 +3,7 @@
|
||||
#include <GfxRenderer.h>
|
||||
#include <HalDisplay.h>
|
||||
#include <HalGPIO.h>
|
||||
#include <HalPowerManager.h>
|
||||
#include <HalStorage.h>
|
||||
#include <SPI.h>
|
||||
#include <builtinFonts/all.h>
|
||||
@@ -31,6 +32,7 @@
|
||||
|
||||
HalDisplay display;
|
||||
HalGPIO gpio;
|
||||
HalPowerManager powerManager;
|
||||
MappedInputManager mappedInputManager(gpio);
|
||||
GfxRenderer renderer(display);
|
||||
Activity* currentActivity;
|
||||
@@ -181,7 +183,7 @@ void verifyPowerButtonDuration() {
|
||||
if (abort) {
|
||||
// Button released too early. Returning to sleep.
|
||||
// IMPORTANT: Re-arm the wakeup trigger before sleeping again
|
||||
gpio.startDeepSleep();
|
||||
powerManager.startDeepSleep(gpio);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,7 +206,7 @@ void enterDeepSleep() {
|
||||
Serial.printf("[%lu] [ ] Power button press calibration value: %lu ms\n", millis(), t2 - t1);
|
||||
Serial.printf("[%lu] [ ] Entering deep sleep.\n", millis());
|
||||
|
||||
gpio.startDeepSleep();
|
||||
powerManager.startDeepSleep(gpio);
|
||||
}
|
||||
|
||||
void onGoHome();
|
||||
@@ -281,6 +283,7 @@ void setup() {
|
||||
t1 = millis();
|
||||
|
||||
gpio.begin();
|
||||
powerManager.begin();
|
||||
|
||||
// Only start serial if USB connected
|
||||
if (gpio.isUsbConnected()) {
|
||||
@@ -316,7 +319,7 @@ void setup() {
|
||||
case HalGPIO::WakeupReason::AfterUSBPower:
|
||||
// If USB power caused a cold boot, go back to sleep
|
||||
Serial.printf("[%lu] [ ] Wakeup reason: After USB Power\n", millis());
|
||||
gpio.startDeepSleep();
|
||||
powerManager.startDeepSleep(gpio);
|
||||
break;
|
||||
case HalGPIO::WakeupReason::AfterFlash:
|
||||
// After flashing, just proceed to boot
|
||||
@@ -372,7 +375,8 @@ void loop() {
|
||||
// Check for any user activity (button press or release) or active background work
|
||||
static unsigned long lastActivityTime = millis();
|
||||
if (gpio.wasAnyPressed() || gpio.wasAnyReleased() || (currentActivity && currentActivity->preventAutoSleep())) {
|
||||
lastActivityTime = millis(); // Reset inactivity timer
|
||||
lastActivityTime = millis(); // Reset inactivity timer
|
||||
powerManager.setPowerSaving(false); // Restore normal CPU frequency on user activity
|
||||
}
|
||||
|
||||
const unsigned long sleepTimeoutMs = SETTINGS.getSleepTimeoutMs();
|
||||
@@ -410,9 +414,9 @@ void loop() {
|
||||
if (currentActivity && currentActivity->skipLoopDelay()) {
|
||||
yield(); // Give FreeRTOS a chance to run tasks, but return immediately
|
||||
} else {
|
||||
static constexpr unsigned long IDLE_POWER_SAVING_MS = 3000; // 3 seconds
|
||||
if (millis() - lastActivityTime >= IDLE_POWER_SAVING_MS) {
|
||||
if (millis() - lastActivityTime >= HalPowerManager::IDLE_POWER_SAVING_MS) {
|
||||
// If we've been inactive for a while, increase the delay to save power
|
||||
powerManager.setPowerSaving(true); // Lower CPU frequency after extended inactivity
|
||||
delay(50);
|
||||
} else {
|
||||
// Short delay to prevent tight loop while still being responsive
|
||||
|
||||
Reference in New Issue
Block a user