2025-11-14 23:50:31 -04:00
|
|
|
#ifndef _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H
|
|
|
|
|
#define _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H
|
2025-10-25 19:28:18 -04:00
|
|
|
|
2025-11-01 04:14:07 -04:00
|
|
|
#include <functional>
|
2025-11-14 19:24:31 -04:00
|
|
|
#include <atomic>
|
2025-11-14 19:50:51 -04:00
|
|
|
#include <user/stimulusProducer.h>
|
2025-11-14 20:44:37 -04:00
|
|
|
#include <user/stimulusFrame.h>
|
2025-10-25 23:04:59 -04:00
|
|
|
#include <livoxProto1/device.h>
|
2025-11-01 04:14:07 -04:00
|
|
|
#include <asynchronousContinuation.h>
|
|
|
|
|
#include <callback.h>
|
2025-11-15 20:47:40 -04:00
|
|
|
#include <user/stagingBuffer.h>
|
2025-10-30 19:07:19 -04:00
|
|
|
#include "ioUringAssemblyEngine.h"
|
2025-11-08 12:20:21 -04:00
|
|
|
#include "openClCollatingAndMeshingEngine.h"
|
2025-11-16 00:10:33 -04:00
|
|
|
#include "meshStimulusBuffer.h"
|
2025-11-16 00:31:47 -04:00
|
|
|
#include "pcloudIntensityStimulusBuffer.h"
|
2025-11-14 23:19:32 -04:00
|
|
|
#include "pcloudAmbienceStimulusBuffer.h"
|
2025-10-25 19:28:18 -04:00
|
|
|
|
|
|
|
|
namespace smo {
|
|
|
|
|
namespace stim_buff {
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-14 23:50:31 -04:00
|
|
|
* PcloudStimulusProducer is a specialized StimulusProducer for point cloud data.
|
2025-10-25 19:28:18 -04:00
|
|
|
*
|
2025-11-14 19:50:51 -04:00
|
|
|
* This class extends StimulusProducer to handle point cloud-specific stimulus
|
2025-10-25 19:28:18 -04:00
|
|
|
* frames, particularly those generated from LiDAR point cloud data. It
|
|
|
|
|
* provides additional functionality for managing point cloud frame metadata
|
|
|
|
|
* and processing.
|
|
|
|
|
*/
|
2025-11-14 23:50:31 -04:00
|
|
|
class PcloudStimulusProducer
|
2025-11-14 19:50:51 -04:00
|
|
|
: public StimulusProducer
|
2025-10-25 19:28:18 -04:00
|
|
|
{
|
2025-11-14 20:44:37 -04:00
|
|
|
public:
|
|
|
|
|
class PcloudFormatDesc
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
enum class Format
|
|
|
|
|
{
|
|
|
|
|
XYZ,
|
|
|
|
|
XYZI,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
Format format;
|
|
|
|
|
};
|
|
|
|
|
|
2025-10-25 19:28:18 -04:00
|
|
|
public:
|
2025-11-14 23:50:31 -04:00
|
|
|
explicit PcloudStimulusProducer(
|
2025-11-04 00:46:07 -04:00
|
|
|
const std::shared_ptr<device::DeviceAttachmentSpec> &deviceAttachmentSpec,
|
2025-10-25 23:04:59 -04:00
|
|
|
std::shared_ptr<livoxProto1::Device> &device,
|
2025-10-30 00:39:34 -04:00
|
|
|
const PcloudFormatDesc& formatDesc,
|
2025-10-31 12:22:07 -04:00
|
|
|
size_t nDgramsPerStagingBufferFrame);
|
2025-10-25 19:42:48 -04:00
|
|
|
|
2025-11-14 23:50:31 -04:00
|
|
|
~PcloudStimulusProducer() = default;
|
2025-10-25 19:28:18 -04:00
|
|
|
|
|
|
|
|
// Non-copyable, movable
|
2025-11-14 23:50:31 -04:00
|
|
|
PcloudStimulusProducer(const PcloudStimulusProducer&) = delete;
|
|
|
|
|
PcloudStimulusProducer& operator=(const PcloudStimulusProducer&) = delete;
|
|
|
|
|
PcloudStimulusProducer(PcloudStimulusProducer&&) = default;
|
|
|
|
|
PcloudStimulusProducer& operator=(PcloudStimulusProducer&&) = default;
|
2025-10-25 19:32:10 -04:00
|
|
|
|
2025-11-01 22:03:28 -04:00
|
|
|
// Control methods
|
|
|
|
|
void start() override;
|
|
|
|
|
void stop() override;
|
|
|
|
|
|
2025-11-15 04:02:25 -04:00
|
|
|
std::shared_ptr<StimulusBuffer> getOrCreateAttachedStimulusBuffer(
|
|
|
|
|
const std::shared_ptr<device::DeviceAttachmentSpec>
|
2025-11-16 04:38:25 -04:00
|
|
|
&deviceAttachmentSpec) override;
|
2025-11-15 04:02:25 -04:00
|
|
|
|
2025-11-16 02:23:53 -04:00
|
|
|
std::shared_ptr<StimulusBuffer> getAttachedStimulusBuffer(
|
|
|
|
|
const std::shared_ptr<device::DeviceAttachmentSpec>& spec)
|
|
|
|
|
const override;
|
|
|
|
|
|
2025-11-20 01:25:46 -04:00
|
|
|
void destroyAttachedStimulusBuffer(
|
|
|
|
|
const std::shared_ptr<StimulusBuffer>& buffer) override;
|
|
|
|
|
|
2025-10-31 13:54:50 -04:00
|
|
|
protected:
|
|
|
|
|
void stimFrameProductionTimesliceInd() override;
|
|
|
|
|
|
2025-11-10 01:02:06 -04:00
|
|
|
// Callback function type for produceFrameReq
|
|
|
|
|
typedef std::function<void()> produceFrameReqCbFn;
|
2025-11-01 04:14:07 -04:00
|
|
|
|
2025-10-25 23:04:59 -04:00
|
|
|
public:
|
2025-11-10 01:02:06 -04:00
|
|
|
void produceFrameReq(smo::Callback<produceFrameReqCbFn> callback);
|
2025-11-01 04:14:07 -04:00
|
|
|
|
2025-11-16 16:09:35 -04:00
|
|
|
size_t nDgramsPerStagingBufferFrame;
|
2025-10-25 23:04:59 -04:00
|
|
|
std::shared_ptr<livoxProto1::Device> device;
|
2025-10-25 19:32:10 -04:00
|
|
|
PcloudFormatDesc formatDesc;
|
2025-11-08 12:20:21 -04:00
|
|
|
OpenClCollatingAndMeshingEngine openClCollatingAndMeshingEngine;
|
2025-11-06 14:09:10 -04:00
|
|
|
StagingBuffer assemblyBuffer;
|
2025-10-30 19:07:19 -04:00
|
|
|
IoUringAssemblyEngine ioUringAssemblyEngine;
|
2025-11-07 22:07:27 -04:00
|
|
|
StagingBuffer collationBuffer;
|
2025-11-19 03:08:16 -04:00
|
|
|
size_t tempStimulusFrameMem;
|
2025-11-14 20:44:37 -04:00
|
|
|
StimulusFrame tempStimulusFrame;
|
2025-11-16 00:10:33 -04:00
|
|
|
std::shared_ptr<MeshStimulusBuffer> meshStimulusBuffer;
|
2025-11-16 00:31:47 -04:00
|
|
|
std::shared_ptr<PcloudIntensityStimulusBuffer> intensityStimulusBuffer;
|
2025-11-14 23:19:32 -04:00
|
|
|
std::shared_ptr<PcloudAmbienceStimulusBuffer> ambienceStimulusBuffer;
|
|
|
|
|
|
2025-11-01 04:14:07 -04:00
|
|
|
private:
|
2025-11-10 01:02:06 -04:00
|
|
|
class ProduceFrameReq;
|
2025-10-25 19:28:18 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace stim_buff
|
|
|
|
|
} // namespace smo
|
|
|
|
|
|
2025-11-14 23:50:31 -04:00
|
|
|
#endif // _LIVOX_GEN1_PCLOUD_STIMULUS_PRODUCER_H
|