#ifndef UDP_COMMAND_DEMUXER_H #define UDP_COMMAND_DEMUXER_H #include #include #include #include #include namespace livoxProto1 { // Forward declarations class DeviceManager; namespace comms { /** * UdpCommandDemuxer - Routes UDP command datagrams to appropriate devices * * This class listens on the command port (65000) for incoming UDP datagrams * from Livox devices and routes them to the appropriate Device based on * the source IP address. */ class UdpCommandDemuxer { public: UdpCommandDemuxer( const std::shared_ptr& componentThread, DeviceManager& deviceManager, uint16_t commandPort = 56001); ~UdpCommandDemuxer(); void start(); void stop(); bool isRunning() const { return isActive.load(); } // Get shared pointer to command endpoint for handshake use std::shared_ptr getCmdEndpointFdDesc() const { return cmdEndpointFdDesc; } private: void setupSocket(); void startAsyncReceive(); void onDataReady(const boost::system::error_code& error); void onTimerTick(const boost::system::error_code& error); void processIncomingData(); std::shared_ptr componentThread; DeviceManager& deviceManager; uint16_t commandPort; // Socket and async objects std::shared_ptr cmdEndpointFdDesc; boost::asio::deadline_timer timer; // State management std::atomic isActive{false}; std::atomic shouldStop{false}; // Receive buffer uint8_t receiveBuffer[1024]; struct sockaddr_in senderAddr; socklen_t senderAddrLen; ssize_t bytesReceived; }; } // namespace comms } // namespace livoxProto1 #endif // UDP_COMMAND_DEMUXER_H