#pragma once #include namespace roro { enum class ScreenState : uint8_t { On, Dimmed, Off }; // Screen power from user activity. Services keep running whatever the screen does. class PowerPolicy { public: PowerPolicy(uint32_t dimAfterMs, uint32_t offAfterMs) : dimMs_(dimAfterMs), offMs_(offAfterMs) {} void setTimeouts(uint32_t dimAfterMs, uint32_t offAfterMs) { dimMs_ = dimAfterMs; offMs_ = offAfterMs; } // Records a key press. Returns true if the key only woke an Off screen and must not reach the App. bool activity(uint32_t nowMs); ScreenState update(uint32_t nowMs); ScreenState state() const { return state_; } private: uint32_t dimMs_; uint32_t offMs_; uint32_t lastActivityMs_ = 0; ScreenState state_ = ScreenState::On; }; enum class ButtonAction : uint8_t { None, ShortPress, LongPress }; // G0 button: a long press fires as soon as the hold time is reached (power off); a short press on release. class PowerButton { public: explicit PowerButton(uint32_t longPressMs) : longMs_(longPressMs) {} ButtonAction update(bool pressed, uint32_t nowMs); private: uint32_t longMs_; bool pressed_ = false; bool longFired_ = false; uint32_t pressedAtMs_ = 0; }; } // namespace roro