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)
|
||
|
|
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;
|
||
|
|
};
|
||
|
|
};
|