#pragma once #include #include #include #include #include #include "icamera.h" namespace libcamera { class Camera; class CameraConfiguration; class CameraManager; class FrameBufferAllocator; class Request; } // namespace libcamera class Image; class Pixels; class OV9281 : public QObject, public ICamera { // Q_OBJECT public: ~OV9281(); public: static std::vector> search( std::unique_ptr &manager); // public functions public: bool startStream() override; void printControls(); bool setExposureTimeUs(int value) override { assert(false); return false; }; bool setGain(int value) override { assert(false); return false; }; // signals public: // TODO: image->pixels in separate thread // TODO: respect sender/receiver threads // libcamera::Signal> newPixels; // libcamera::Signal> newImage; private: explicit OV9281(const std::shared_ptr &camera); // private functions private: bool init(); bool validateConfig(); bool applyConfig(); void onRequestCompleted(libcamera::Request *completed_request); // constants private: static inline constexpr auto pixelFormat{libcamera::formats::R8}; static inline constexpr unsigned int bufferCount{2}; static inline constexpr size_t desiredFPS{144}; // member variables private: std::shared_ptr m_camera{nullptr}; std::unique_ptr m_config{nullptr}; std::map> m_mappedBuffers; std::vector> m_requests; std::unique_ptr m_allocator{nullptr}; // TODO: set exposureTime from outside int32_t m_exposureTime{3000}; };