Files
salmanoff/stimBuffApis/livoxGen1/pcloudStimulusProducer.h
T
hayodea 5cce473e01 PcloudStimProd: make sh_ptrs to Pcloud*StimBuff atomic<>
This change is a bit pedantic, but since these vars aren't accessed
in any hotpath, it's fine to be pedantic. We made these sh_ptrs
atomic so we can use acquire and release side effects when loading
and storing them. This doesn't eliminate the problem of seeing
inconsistent state across microcontrollers, but it helps with simple
accesses like these ones we already do.
2025-11-26 00:14:15 -04:00

108 lines
3.0 KiB
C++

#ifndef _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H
#define _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H
#include <functional>
#include <atomic>
#include <user/stimulusProducer.h>
#include <user/stimulusFrame.h>
#include <livoxProto1/device.h>
#include <asynchronousContinuation.h>
#include <callback.h>
#include <user/stagingBuffer.h>
#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<device::DeviceAttachmentSpec> &deviceAttachmentSpec,
std::shared_ptr<livoxProto1::Device> &device,
const PcloudFormatDesc& formatDesc,
size_t nDgramsPerStagingBufferFrame);
~PcloudStimulusProducer() = default;
// Non-copyable, movable
PcloudStimulusProducer(const PcloudStimulusProducer&) = delete;
PcloudStimulusProducer& operator=(const PcloudStimulusProducer&) = delete;
PcloudStimulusProducer(PcloudStimulusProducer&&) = default;
PcloudStimulusProducer& operator=(PcloudStimulusProducer&&) = default;
// Control methods
void start() override;
void stop() override;
std::shared_ptr<StimulusBuffer> getOrCreateAttachedStimulusBuffer(
const std::shared_ptr<device::DeviceAttachmentSpec>
&deviceAttachmentSpec) override;
std::shared_ptr<StimulusBuffer> getAttachedStimulusBuffer(
const std::shared_ptr<device::DeviceAttachmentSpec>& spec)
const override;
void destroyAttachedStimulusBuffer(
const std::shared_ptr<StimulusBuffer>& buffer) override;
protected:
void stimFrameProductionTimesliceInd() override;
// Callback function type for produceFrameReq
typedef std::function<void()> produceFrameReqCbFn;
public:
void produceFrameReq(smo::Callback<produceFrameReqCbFn> callback);
size_t nDgramsPerStagingBufferFrame;
std::shared_ptr<livoxProto1::Device> device;
PcloudFormatDesc formatDesc;
OpenClCollatingAndMeshingEngine openClCollatingAndMeshingEngine;
StagingBuffer assemblyBuffer;
IoUringAssemblyEngine ioUringAssemblyEngine;
StagingBuffer collationBuffer;
size_t tempStimulusFrameMem;
StimulusFrame tempStimulusFrame;
std::atomic<std::shared_ptr<MeshStimulusBuffer>> meshStimulusBuffer;
std::atomic<std::shared_ptr<PcloudIntensityStimulusBuffer>>
intensityStimulusBuffer;
std::atomic<std::shared_ptr<PcloudAmbienceStimulusBuffer>>
ambienceStimulusBuffer;
private:
class ProduceFrameReq;
};
} // namespace stim_buff
} // namespace smo
#endif // _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H