//====================================================================================================== // Copyright 2025, Rokoko Glove OptiTrack Integration //====================================================================================================== /** * RokokoUDPReceiver class provides UDP communication functionality for receiving Rokoko glove data. * This receiver handles UDP socket communication and data reception from Rokoko Studio. */ #pragma once #include #include #include #include #include #include #include namespace RokokoIntegration { class RokokoUDPReceiver { public: /** * Constructor */ RokokoUDPReceiver(); /** * Destructor */ ~RokokoUDPReceiver(); /** * Initializes UDP receiver * @param port UDP port to listen on (default: 14043) * @return true if initialization successful */ bool Initialize(int port = 14043); /** * Starts listening for UDP data * @return true if started successfully */ bool StartListening(); /** * Stops listening for UDP data */ void StopListening(); /** * Sets callback function for received data * @param callback Function to call when data is received */ void SetDataCallback(std::function&, const std::string&)> callback); /** * Checks if receiver is currently listening * @return true if listening */ bool IsListening() const; /** * Gets the current connection status * @return true if connected and receiving data */ bool IsConnected() const; /** * Gets the last error message * @return Error message string */ std::string GetLastError() const; /** * Gets connection statistics * @param packetsReceived Number of packets received * @param bytesReceived Total bytes received * @param lastPacketTime Timestamp of last packet */ void GetStatistics(uint64_t& packetsReceived, uint64_t& bytesReceived, double& lastPacketTime) const; private: // UDP socket SOCKET mSocket; // Thread management std::thread mReceiveThread; std::atomic mIsRunning; std::atomic mIsListening; // Data callback std::function&, const std::string&)> mDataCallback; // Statistics mutable std::mutex mStatsMutex; uint64_t mPacketsReceived; uint64_t mBytesReceived; double mLastPacketTime; // Error handling mutable std::mutex mErrorMutex; std::string mLastError; // Configuration int mPort; int mBufferSize; /** * Main receive thread function */ void ReceiveThread(); /** * Processes incoming UDP data * @param data Received data * @param size Size of received data * @param senderIP IP address of sender */ void ProcessIncomingData(const uint8_t* data, int size, const std::string& senderIP); /** * Sets error message * @param error Error message */ void SetError(const std::string& error); /** * Updates statistics * @param packetSize Size of received packet */ void UpdateStatistics(int packetSize); /** * Closes UDP socket */ void CloseSocket(); }; }