// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #include #include #include #include #include #include #include #include #include namespace wpi { class json; } // namespace wpi namespace wpilibws { class HALSimWSClientConnection; class HALSimWS : public std::enable_shared_from_this { public: using LoopFunc = std::function; using UvExecFunc = wpi::uv::Async; HALSimWS(wpi::uv::Loop& loop, ProviderContainer& providers, HALSimWSProviderSimDevices& simDevicesProvider); HALSimWS(const HALSimWS&) = delete; HALSimWS& operator=(const HALSimWS&) = delete; bool Initialize(); void Start(); bool RegisterWebsocket(std::shared_ptr hws); void CloseWebsocket(std::shared_ptr hws); void OnNetValueChanged(const wpi::json& msg); const std::string& GetTargetHost() const { return m_host; } const std::string& GetTargetUri() const { return m_uri; } int GetTargetPort() const { return m_port; } wpi::uv::Loop& GetLoop() { return m_loop; } UvExecFunc& GetExec() { return *m_exec; } private: void AttemptConnect(); bool m_tcp_connected = false; std::shared_ptr m_connect_timer; int m_connect_attempts = 0; std::weak_ptr m_hws; wpi::uv::Loop& m_loop; std::shared_ptr m_tcp_client; std::shared_ptr m_exec; ProviderContainer& m_providers; HALSimWSProviderSimDevices& m_simDevicesProvider; std::string m_host; std::string m_uri; int m_port; }; } // namespace wpilibws