#ifndef STAGINGBUFFER_H #define STAGINGBUFFER_H #include #include #include #include namespace smo { namespace stim_buff { /** * StagingBuffer manages a large buffer to guide io_uring in assembling some * number of Livox Avia pcloud UDP dgrams into a single stim frame. * * The buffer operates in a cycle: * 1. io_uring assembles UDP dgrams into the buffer until it's full * 2. Buffer is handed off to the stimbuff layer to be appended to the stimbuff. * 3. When the stimbuff layer has appended the current assembled frame, the * assembly buffer is reset and cycle repeats. */ class StagingBuffer { public: explicit StagingBuffer(); ~StagingBuffer(); // Non-copyable, movable StagingBuffer(const StagingBuffer&) = delete; StagingBuffer& operator=(const StagingBuffer&) = delete; StagingBuffer(StagingBuffer&&) = default; StagingBuffer& operator=(StagingBuffer&&) = default; bool isAssembling() const { return isAssembling_; } void startAssembly(); void stopAssembly(); private: // Buffer data std::unique_ptr buffer_; size_t bufferSize_; // Current state std::atomic currentSize_; std::atomic isAssembling_; }; } // namespace stim_buff } // namespace smo #endif // STAGINGBUFFER_H