46 lines
954 B
C++
46 lines
954 B
C++
#pragma once
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <optional>
|
|
|
|
#include <vamp_protocol/gesture.hpp>
|
|
|
|
|
|
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};
|
|
};
|
|
|
|
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<remote_request>;
|
|
auto complete(std::uint64_t now_ms) -> void;
|
|
auto queued() const -> std::size_t;
|
|
private:
|
|
std::array<vamp_protocol::page_command, command_capacity> commands_{};
|
|
std::size_t head_{};
|
|
std::size_t size_{};
|
|
std::bool_t in_flight_{};
|
|
std::bool_t completed_{};
|
|
std::uint64_t completed_ms_{};
|
|
};
|
|
|
|
}
|