diff options
Diffstat (limited to 'src/camera/veyeimx287m.h')
| -rw-r--r-- | src/camera/veyeimx287m.h | 73 |
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]; +}; |
