## Summary The introduction of `HalGPIO` moved the `BatteryMonitor battery` object into the member function `HalGPIO::getBatteryPercentage()`. Then, with the introduction of `HalPowerManager`, this function was moved to `HalPowerManager::getBatteryPercentage()`. However, the original `BatteryMonitor battery` object is still utilized by themes for displaying the battery percentage. This PR replaces these deprecated uses of `BatteryMonitor battery` with the new `HalPowerManager::getBatteryPercentage()` function. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**NO **_
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include <InputManager.h>
|
|
#include <Logging.h>
|
|
#include <freertos/semphr.h>
|
|
|
|
#include <cassert>
|
|
|
|
#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)
|
|
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;
|
|
};
|
|
};
|