Shared Catalog
This commit is contained in:
@@ -23,11 +23,12 @@ public:
|
||||
auto fill_rect(std::int32_t x, std::int32_t y, std::int32_t width, std::int32_t height, std::uint16_t color) -> void;
|
||||
auto draw_text(std::int32_t x, std::int32_t y, std::char_t const *text, std::uint16_t color, std::int32_t scale = 2) -> void;
|
||||
auto show_boot(std::char_t const *line1, std::char_t const *line2, std::uint16_t accent) -> void;
|
||||
auto show_remote(vamp_style::color status, std::char_t const *title, std::char_t const *part, std::uint32_t page, std::uint32_t pages, std::bool_t active) -> void;
|
||||
auto show_remote(vamp_style::color status, std::char_t const *title, std::char_t const *part, std::uint32_t page, std::uint32_t pages, std::bool_t active, std::bool_t busy = false) -> void;
|
||||
private:
|
||||
std::bool_t remote_valid_{};
|
||||
vamp_style::color last_status_{};
|
||||
std::bool_t last_active_{};
|
||||
std::bool_t last_busy_{};
|
||||
std::array<std::char_t, 96> last_title_{};
|
||||
std::array<std::char_t, 48> last_part_{};
|
||||
std::uint32_t last_page_{};
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
#include <string_view>
|
||||
|
||||
#include <vamp_protocol/page_control.hpp>
|
||||
#include <vamp_pico/input.hpp>
|
||||
#include <modulus/types.hpp>
|
||||
|
||||
|
||||
struct tcp_pcb;
|
||||
|
||||
namespace vamp_pico {
|
||||
|
||||
struct remote_display_state {
|
||||
@@ -19,8 +24,50 @@ struct remote_display_state {
|
||||
};
|
||||
|
||||
auto parse_remote_display_body(std::string_view body, vamp_pico::remote_display_state &state) -> std::bool_t;
|
||||
auto post_remote_command(vamp_protocol::page_command command, vamp_pico::remote_display_state &state) -> std::bool_t;
|
||||
auto heartbeat() -> std::bool_t;
|
||||
auto fetch_remote_display(vamp_pico::remote_display_state &state) -> std::bool_t;
|
||||
|
||||
enum class http_status {
|
||||
IDLE,
|
||||
IN_FLIGHT,
|
||||
READY,
|
||||
};
|
||||
|
||||
enum class http_start_result {
|
||||
STARTED,
|
||||
BUSY,
|
||||
};
|
||||
|
||||
struct http_result {
|
||||
remote_request request{};
|
||||
std::bool_t success{};
|
||||
remote_display_state display{};
|
||||
};
|
||||
|
||||
class http_client {
|
||||
public:
|
||||
http_client() = default;
|
||||
~http_client();
|
||||
http_client(http_client const &) = delete;
|
||||
auto operator=(http_client const &) -> http_client & = delete;
|
||||
http_client(http_client &&) = delete;
|
||||
auto operator=(http_client &&) -> http_client & = delete;
|
||||
// Accepted requests, including immediate failures, produce exactly one result.
|
||||
auto start(remote_request request, std::uint64_t now_ms) -> http_start_result;
|
||||
auto poll(std::uint64_t now_ms) -> http_status;
|
||||
auto take_result() -> std::optional<http_result>;
|
||||
// Discards the request/result and returns to IDLE. Call before Wi-Fi deinit.
|
||||
auto cancel() -> void;
|
||||
private:
|
||||
friend struct http_client_callbacks;
|
||||
tcp_pcb *pcb_{};
|
||||
http_status status_{http_status::IDLE};
|
||||
remote_request request_{};
|
||||
std::bool_t success_{};
|
||||
std::uint64_t started_ms_{};
|
||||
std::uint64_t timeout_ms_{};
|
||||
std::array<std::char_t, 384> request_buffer_{};
|
||||
std::size_t request_size_{};
|
||||
std::array<std::char_t, 1024> response_buffer_{};
|
||||
std::size_t response_size_{};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
|
||||
#include <vamp_protocol/page_control.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};
|
||||
};
|
||||
|
||||
class gesture_state {
|
||||
public:
|
||||
auto update(std::bool_t touching, std::uint64_t now_ms) -> std::optional<vamp_protocol::page_command>;
|
||||
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<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_{};
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user