#pragma once #include #include #include #include #include #include #include #include #include namespace vamp_zero { class control_state { public: control_state(vamp_zero::config config, vamp_zero::app_state state); auto config() const -> vamp_zero::config; auto snapshot() const -> vamp_zero::app_state; auto apply(vamp_protocol::page_command command) -> vamp_zero::app_state; auto heartbeat() -> vamp_zero::app_state; auto refresh_connection() -> std::optional; auto set_observer(std::function observer) -> void; auto finish_playback(std::uint64_t session, std::string error = {}, std::shared_ptr catalog = {}) -> void; private: auto pico_connected_locked() const -> std::bool_t; auto snapshot_locked() const -> vamp_zero::app_state; mutable std::mutex mutex_{}; vamp_zero::config config_{}; vamp_zero::app_state state_{}; std::chrono::steady_clock::time_point last_heartbeat_{}; std::function observer_{}; }; auto make_router(vamp_zero::control_state &state) -> ligo::service_router; auto portal_status_json(vamp_zero::config const &config, vamp_zero::app_state const &state) -> boost::json::value; auto validated_title_path(std::string const &assets_path, std::string const &identifier) -> std::expected; }