#pragma once #include #include #include #include #include #include "HalGPIO.h" class HalPowerManager; extern HalPowerManager powerManager; // Singleton class HalPowerManager { int normalFreq = 0; // MHz bool isLowPower = false; enum LockMode { None, NormalSpeed }; LockMode currentLockMode = None; SemaphoreHandle_t modeMutex = nullptr; // Protect access to currentLockMode public: static constexpr int LOW_POWER_FREQ = 10; // MHz static constexpr unsigned long IDLE_POWER_SAVING_MS = 3000; // ms void begin(); // Control CPU frequency for power saving void setPowerSaving(bool enabled); // Setup wake up GPIO and enter deep sleep. // When keepClockAlive is true, GPIO13 stays HIGH so the LP timer keeps // running during sleep (~3-4 mA extra). This allows HalClock to compute // elapsed sleep time and restore the wall clock accurately on wake. void startDeepSleep(HalGPIO& gpio, bool keepClockAlive = false) const; // Get battery percentage (range 0-100) uint16_t getBatteryPercentage() const; // RAII helper class to manage power saving locks // Usage: create an instance of Lock in a scope to disable power saving, for example when running a task that needs // full performance. When the Lock instance is destroyed (goes out of scope), power saving will be re-enabled. class Lock { friend class HalPowerManager; bool valid = false; public: explicit Lock(); ~Lock(); // Non-copyable and non-movable Lock(const Lock&) = delete; Lock& operator=(const Lock&) = delete; Lock(Lock&&) = delete; Lock& operator=(Lock&&) = delete; }; };