#pragma once #include #include #include #include #include namespace vamp_pico { enum class request_kind { DISPLAY, COMMAND, HEARTBEAT, TITLE, }; struct remote_request { request_kind kind{request_kind::DISPLAY}; vamp_protocol::page_command command{vamp_protocol::page_command::NEXT}; std::array title_id{}; }; enum class enqueue_result { QUEUED, BUSY, }; class request_scheduler { public: static constexpr auto command_capacity = std::size_t{16}; auto enqueue(vamp_protocol::page_command command) -> enqueue_result; auto next(std::uint64_t now_ms) -> std::optional; auto complete(std::uint64_t now_ms) -> void; auto queued() const -> std::size_t; auto want_title(std::string_view identifier) -> void; auto cancel_title() -> void; private: std::array commands_{}; std::size_t head_{}; std::size_t size_{}; std::bool_t in_flight_{}; std::bool_t completed_{}; std::uint64_t completed_ms_{}; std::array title_id_{}; std::bool_t title_pending_{}; request_kind active_kind_{request_kind::DISPLAY}; }; }