#ifndef _LIVOX_GEN1_PCLOUD_AMBIENCE_STIMULUS_BUFFER_H #define _LIVOX_GEN1_PCLOUD_AMBIENCE_STIMULUS_BUFFER_H #include #include #include #include #include #include #include #include #include #include "lg1PcloudAmbienceStencil.h" namespace smo { namespace stim_buff { // Forward declaration class StimulusProducer; /** * PcloudAmbienceStimulusBuffer is a specialized StimulusBuffer for ambience point cloud data. */ class PcloudAmbienceStimulusBuffer : public StimulusBuffer { public: explicit PcloudAmbienceStimulusBuffer( StimulusProducer& parent, const std::shared_ptr& deviceAttachmentSpec, int histbuffMs, const StagingBuffer::IOEngineConstraints& inputEngineConstraints, const StagingBuffer::IOEngineConstraints& outputEngineConstraints, const SmoCallbacks& callbacks, cl_mem_flags flags, size_t nStencils_, size_t nDgramsPerFrame_) : StimulusBuffer( parent, deviceAttachmentSpec, histbuffMs, inputEngineConstraints, outputEngineConstraints, callbacks, flags), nStencils(nStencils_) { // Parse postrinInterestThreshold from qualeIfaceApiParams const std::vector postrinInterestThresholdParamNames = { "postrin-interest-threshold", "postrin-interest" }; /** EXPLANATION: * The default postrin threshold is determined as follows: * We want 90% of the scanned points to have intensity under the * lowVal to consider the ambience criterion met. * * If nDgramsPerFrame_ (the number of datagrams per frame) is less * than 10, we require that all frames (100%) be under the lowVal. * This is because, for such small sample sizes, calculating 90% * does not yield a meaningful integer; for example, 90% of 7 is * 6.3, but we must count whole frames that meet the threshold. By * using nDgramsPerFrame_ as the threshold in this case, we ensure * logical, all-or-nothing evaluation at low sample counts while * maintaining an approximate 90% requirement for larger frame * sizes. */ uint32_t defaultPostrinThreshold = (nDgramsPerFrame_ < 10) ? static_cast(nDgramsPerFrame_) : static_cast(nDgramsPerFrame_ * 9 / 10); postrinInterestThreshold = static_cast( device::DeviceAttachmentSpec::parseOptionalParamAsIntWithSynonyms( deviceAttachmentSpec->qualeIfaceApiParams, postrinInterestThresholdParamNames, defaultPostrinThreshold)); // Parse ambienceIntensityLowVal from qualeIfaceApiParams const std::vector ambienceIntensityLowValParamNames = { "ambience-intensity-low-val" }; ambienceIntensityLowVal = static_cast( device::DeviceAttachmentSpec::parseOptionalParamAsIntWithSynonyms( deviceAttachmentSpec->qualeIfaceApiParams, ambienceIntensityLowValParamNames, 8)); // Construct stencils and add to list (FIFO behavior) for (size_t i = 0; i < nStencils; ++i) { stencils.emplace_back(); } } ~PcloudAmbienceStimulusBuffer() = default; // Non-copyable, movable PcloudAmbienceStimulusBuffer(const PcloudAmbienceStimulusBuffer&) = delete; PcloudAmbienceStimulusBuffer& operator=(const PcloudAmbienceStimulusBuffer&) = delete; PcloudAmbienceStimulusBuffer(PcloudAmbienceStimulusBuffer&&) = default; PcloudAmbienceStimulusBuffer& operator=(PcloudAmbienceStimulusBuffer&&) = default; public: uint32_t postrinInterestThreshold; uint32_t ambienceIntensityLowVal; size_t nStencils; std::list stencils; }; } // namespace stim_buff } // namespace smo #endif // _LIVOX_GEN1_PCLOUD_AMBIENCE_STIMULUS_BUFFER_H