Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
1.9 kB · 65 lines
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#pragma once
#include <Arduino.h>#include <BatteryMonitor.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;
mutable int _batteryCachedPercent = 0; // Last read battery percentage (0-100) mutable unsigned long _batteryLastPollMs = 0; // Timestamp of last battery read in milliseconds
enum LockMode { None, NormalSpeed }; LockMode currentLockMode = None; SemaphoreHandle_t modeMutex = nullptr; // Protect access to currentLockMode
public:#if BOARD_HAS_PSRAM static constexpr int LOW_POWER_FREQ = 80; // MHz#else static constexpr int LOW_POWER_FREQ = 10; // MHz#endif static constexpr unsigned long IDLE_POWER_SAVING_MS = 3000; // ms static constexpr unsigned long BATTERY_POLL_MS = 1500; // 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; };};