#ifndef _LIVOX_GEN1_IOURING_ASSEMBLY_ENGINE_H #define _LIVOX_GEN1_IOURING_ASSEMBLY_ENGINE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace smo { namespace stim_buff { class PcloudStimulusProducer; class IoUringAssemblyEngine { public: explicit IoUringAssemblyEngine( PcloudStimulusProducer& parent, size_t nDgramsPerStagingBufferFrame); ~IoUringAssemblyEngine() = default; bool setup(); void finalize(); typedef std::function assembleFrameReqCbFn; void assembleFrameReq(Callback cb); // Telemetry helpers static size_t computePointsPerFrame(int returnMode, size_t nDgramsPerFrame) { return livoxProto1::Device::getNPointsPerDgram(returnMode) * nDgramsPerFrame; } static bool compactionIsNeeded(uint32_t nSucceeded, uint32_t nTotal) { return nSucceeded != 0 && nTotal != 0 && nSucceeded != nTotal; } private: typedef std::function resetAndAssembleFrameCbFn; void resetAndAssembleFrame(resetAndAssembleFrameCbFn onCqeReady); void assemblyCycleComplete(); bool stop(); private: PcloudStimulusProducer& parent; // Cached descriptor for reuse across iterations std::shared_ptr frameAssemblyDesc; // io_uring infrastructure struct io_uring ring; // Eventfd for CQE notifications (used with boost's unified loop) int eventfdFd; std::unique_ptr eventfdDesc; uint64_t eventfd_value; // Buffer for async_read_some // Point cloud data socket descriptor std::shared_ptr pcloudDataFdDesc; // Stall detection timer boost::asio::deadline_timer stallTimer; // Callback for CQE ntfns (called with user_data+result from each CQE) resetAndAssembleFrameCbFn onCqeReadyCallback; /** EXPLANATION: * Flag to indicate whether engine should accept new requests. * Set by setup(), cleared by stop(). */ SpinLock shouldAcceptRequestsLock; bool shouldAcceptRequests; size_t nDgramsPerStagingBufferFrame; struct SlotAssemblyDesc { bool assembled; struct msghdr msgHdr; struct iovec ioVec; }; // Track which slots have been successfully assembled and maintain persistent iovecs std::vector assembledSlotsTracker; // Random number generation for dummy slot creation std::random_device randomDevice; std::mt19937 randomGenerator; void fillUnAssembledSlotsWithDummyDgrams(); void randomDummySlotFiller(AsynchronousLoop& loop); void onEventfdRead( const boost::system::error_code& error, std::size_t bytes_transferred); class AssembleFrameReq; friend class AssembleFrameReq; public: void printSlotBytes(size_t slotIndex, size_t nBytes); }; } // namespace stim_buff } // namespace smo #endif // _LIVOX_GEN1_IOURING_ASSEMBLY_ENGINE_H