#ifndef _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H #define _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H #include #include #include #include #include #include #include #include #include "ioUringAssemblyEngine.h" #include "openClCollatingAndMeshingEngine.h" #include "meshStimulusBuffer.h" #include "pcloudIntensityStimulusBuffer.h" #include "pcloudAmbienceStimulusBuffer.h" namespace smo { namespace stim_buff { /** * PcloudStimulusProducer is a specialized StimulusProducer for point cloud data. * * This class extends StimulusProducer to handle point cloud-specific stimulus * frames, particularly those generated from LiDAR point cloud data. It * provides additional functionality for managing point cloud frame metadata * and processing. */ class PcloudStimulusProducer : public StimulusProducer { public: class PcloudFormatDesc { public: enum class Format { XYZ, XYZI, }; public: Format format; }; public: explicit PcloudStimulusProducer( const std::shared_ptr &deviceAttachmentSpec, std::shared_ptr &device, const PcloudFormatDesc& formatDesc, size_t nDgramsPerStagingBufferFrame); ~PcloudStimulusProducer() = default; // Non-copyable, non-movable: pinners hold buffer instance references PcloudStimulusProducer(const PcloudStimulusProducer&) = delete; PcloudStimulusProducer& operator=(const PcloudStimulusProducer&) = delete; PcloudStimulusProducer(PcloudStimulusProducer&&) = delete; PcloudStimulusProducer& operator=(PcloudStimulusProducer&&) = delete; // Control methods void start() override; void stop() override; static bool supportsQualeIfaceApi(const std::string& qualeIfaceApi); bool exportsQualeIfaceApi( const std::string& qualeIfaceApi) const override; std::shared_ptr getOrCreateAttachedStimulusBuffer( const std::shared_ptr &deviceAttachmentSpec) override; std::shared_ptr getAttachedStimulusBuffer( const std::shared_ptr& spec) const override; void destroyAttachedStimulusBuffer( const std::shared_ptr& buffer) override; protected: void stimFrameProductionTimesliceInd() override; // Callback function type for produceFrameReq typedef std::function produceFrameReqCbFn; public: void produceFrameReq(sscl::Callback callback); size_t nDgramsPerStagingBufferFrame; std::shared_ptr device; PcloudFormatDesc formatDesc; OpenClCollatingAndMeshingEngine openClCollatingAndMeshingEngine; StagingBuffer assemblyBuffer; IoUringAssemblyEngine ioUringAssemblyEngine; StagingBuffer collationBuffer; std::unique_ptr collationBufferMlockPinner; StagingBuffer averageIntensityBuffer; std::unique_ptr averageIntensityBufferMlockPinner; size_t tempStimulusFrameMem; StimulusFrame tempStimulusFrame; std::atomic> meshStimulusBuffer; std::atomic> intensityStimulusBuffer; std::atomic> ambienceStimulusBuffer; private: class ProduceFrameReq; }; } // namespace stim_buff } // namespace smo #endif // _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H