#pragma once #include #include #include #include #include namespace libcamera { class Camera; class CameraConfiguration; class CameraManager; class FrameBufferAllocator; class Request; } // namespace libcamera class Image; class Pixels; class OV9281 { public: ~OV9281(); public: static std::vector> search( std::unique_ptr &manager); // public functions public: bool startStream(); void printControls(); // 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}; };