#pragma once #include #include namespace Basalt::Presenter { // Protocol codes enum class ProtocolCode : std::uint8_t { HANDSHAKE_REQUEST = 0x61, //< Trainer -> Presenter HANDSHAKE_RESPONSE = 0x62, //< Presenter -> Trainer DATA_READY = 0x01, //< Presenter -> Trainer DATA_RECEIVED = 0x02, //< Trainer -> Presenter STOP_REQUEST = 0x71, //< Both directions STOP = 0x71 //< Both directions (same code) }; // Pixel kind values enum class PixelKind : std::uint8_t { GRAY_FLOAT32 = 0x01, ///< Grayscale represented by one float32 GRAY_U8 = 0x02, ///< Grayscale represented by one u8 RGB_FLOAT32 = 0x03, ///< RGB represented by three float32 RGB_U8 = 0x04 ///< RGB represented by three u8 }; #pragma pack(push, 1) struct HandshakePayload { PixelKind pixel_kind; std::uint32_t width; std::uint32_t height; }; #pragma pack(pop) // Status enum class ClientStatus { Ready, Running, Stop, }; class CommandClient { public: CommandClient(); ~CommandClient(); public: // Wait for handshake from Trainer, send response with data properties HandshakePayload WaitHandshake(); // Tick function called every frame to send data ready and wait for response bool Tick(bool actively_stop = false); private: Shared::PipeOperator m_PipeOperator; ClientStatus m_Status; }; } // namespace Basalt::Presenter