#pragma once #include #include #include #include #include namespace vamp_pico { enum class request_kind { DISPLAY, COMMAND, HEARTBEAT, }; struct remote_request { request_kind kind{request_kind::DISPLAY}; vamp_protocol::page_command command{vamp_protocol::page_command::NEXT}; }; class gesture_state { public: auto update(std::bool_t touching, std::uint64_t now_ms) -> std::optional; private: std::bool_t touching_{}; std::bool_t hold_sent_{}; std::bool_t pending_tap_{}; std::uint64_t down_ms_{}; std::uint64_t last_up_ms_{}; }; 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; 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_{}; }; }