summaryrefslogtreecommitdiff
path: root/src/camera/veyeimx287m.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera/veyeimx287m.h')
-rw-r--r--src/camera/veyeimx287m.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/camera/veyeimx287m.h b/src/camera/veyeimx287m.h
new file mode 100644
index 0000000..9986e59
--- /dev/null
+++ b/src/camera/veyeimx287m.h
@@ -0,0 +1,73 @@
+#pragma once
+
+#include <cstdint>
+
+#include <queue>
+#include <thread>
+
+#include "constants.h"
+#include "image.h"
+
+#include "icamera.h"
+
+class VeyeIMX287m : public ICamera
+{
+ constexpr static char videoDevice[] = "/dev/video0";
+
+public:
+ using buffer_t = std::array<uint8_t, img_size>;
+
+public:
+ VeyeIMX287m();
+ ~VeyeIMX287m() override;
+
+public:
+ static std::vector<std::shared_ptr<ICamera>> search();
+
+public:
+ bool startStream() override;
+
+ bool init();
+
+ bool setExposureTimeUs(int value) override;
+ bool setGain(int value) override;
+
+ bool setLaserLevel(int value) override;
+
+ bool setSomething(int value) override;
+
+ // bool dequeueImageBuffer(Image &image);
+ bool dequeueImageBuffer(size_t &image);
+ bool getImage(Image &image);
+ // Image &getImage();
+
+public:
+ libcamera::Signal<std::shared_ptr<Pixels>> newPixels;
+ libcamera::Signal<std::shared_ptr<Image>> newImage;
+
+private:
+ bool setCamParam(unsigned int v4l2controlId, int value);
+ bool openCam();
+ bool selectCam(int camIdx = 0);
+ bool initCam();
+
+ void dequeueFrameLoop(std::stop_token stopToken);
+ void calcFrameLoop(std::stop_token stopToken);
+
+private:
+ int m_cam_fd{-1};
+
+ static constexpr uint8_t BUFFER_COUNT{8};
+
+ std::array<std::mutex, BUFFER_COUNT> m_imageMutexes;
+ std::array<Image, BUFFER_COUNT> m_images;
+ std::array<std::mutex, BUFFER_COUNT> m_bufferMutexes;
+ std::array<uint8_t *, BUFFER_COUNT> m_videoBuffers;
+
+ // std::mutex m_queueMtx;
+ std::mutex m_camMtx;
+ std::queue<size_t> m_buffersQueue;
+
+ std::jthread m_streamThread;
+ std::jthread m_calcThreads[4];
+};