Files
vision-anti-pinch/include/camera_pipeline.hpp
T

50 lines
1.6 KiB
C++

#pragma once
#include "camera.hpp"
#include "frame_result.hpp"
#include "output_writer.hpp"
#include "lazy_gate.hpp"
#include <filesystem>
#include <memory>
namespace cms {
struct PipelineConfig {
CameraConfig camera;
OutputOptions output;
LazyGateConfig lazy_gate;
std::filesystem::path engines,door_mask;
double detector_confidence{0.30};
int max_people{3};
double warning_relative{0.30},release_relative{0.45};
std::size_t queue_capacity{2};
bool door_mask_calibration_verified{false};
};
struct PipelineStats {
std::uint64_t captured{},published{},driver_sequence_gaps{},discarded_error_frames{};
double mean_capture_to_result_ms{};
std::uint64_t detector_runs{},pose_runs{},skipped_idle{};
};
// One lifecycle per instance. start() warms engines before starting capture.
// Captures and receives CAN continuously. Engines stay warm while inference is idle.
// latest() reads the immutable result variable without removing or acknowledging it.
// No result queue, consumer registration or frame-count termination.
// Stop is safe from any thread;
// destruction closes queues, interrupts capture and joins every worker.
class CameraPipeline {
public:
explicit CameraPipeline(PipelineConfig config);
~CameraPipeline();
CameraPipeline(CameraPipeline const&)=delete;
CameraPipeline& operator=(CameraPipeline const&)=delete;
void start();
FrameResultPtr latest() const;
bool running() const noexcept;
InferenceStatus inferenceStatus() const;
void requestStop() noexcept;
void join();
PipelineStats stats() const;
private:
struct Impl;
std::unique_ptr<Impl> impl_;
};
}