#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 // Should be called inside main loop() to handle the currentLockMode void startDeepSleep(HalGPIO& gpio) const; // Get battery percentage (range 0-100) int 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; }; };