Files
product-vamp/include/vamp_pico/http_client.hpp
T
2026-09-17 00:44:19 -05:00

74 lines
1.7 KiB
C++

#pragma once
#include <array>
#include <cstddef>
#include <cstdint>
#include <optional>
#include <string_view>
#include <vamp_pico/input.hpp>
#include <modulus/types.hpp>
struct tcp_pcb;
namespace vamp_pico {
struct remote_display_state {
std::bool_t active{};
std::char_t title[96]{};
std::char_t part[48]{};
std::char_t mode[24]{};
std::uint32_t page{};
std::uint32_t pages{};
};
auto parse_remote_display_body(std::string_view body, 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_{};
};
}