summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi/lux.hpp
blob: 7b6c7258a3c52e4755afd8393fa1ef4d39957733 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (C) 2019, Raspberry Pi (Trading) Limited
 *
 * lux.hpp - Lux control algorithm
 */
#pragma once

#include <atomic>
#include <mutex>

#include "../lux_status.h"
#include "../algorithm.hpp"

// This is our implementation of the "lux control algorithm".

namespace RPiController {

class Lux : public Algorithm
{
public:
	Lux(Controller *controller);
	char const *Name() const override;
	void Read(boost::property_tree::ptree const &params) override;
	void Prepare(Metadata *image_metadata) override;
	void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
	void SetCurrentAperture(double aperture);

private:
	// These values define the conditions of the reference image, against
	// which we compare the new image.
	double reference_shutter_speed_; // in micro-seconds
	double reference_gain_;
	double reference_aperture_; // units of 1/f
	double reference_Y_; // out of 65536
	double reference_lux_;
	std::atomic<double> current_aperture_;
	LuxStatus status_;
	std::mutex mutex_;
};

} // namespace RPiController
>() const { return model_; } const std::string &id() const { return id_; } const MediaEntity *entity() const { return entity_; } const std::vector<unsigned int> &mbusCodes() const { return mbusCodes_; } const std::vector<Size> sizes(unsigned int mbusCode) const; Size resolution() const; const std::vector<int32_t> &testPatternModes() const { return testPatternModes_; } V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes, const Size &size) const; int setFormat(V4L2SubdeviceFormat *format); const ControlInfoMap &controls() const; ControlList getControls(const std::vector<uint32_t> &ids); int setControls(ControlList *ctrls); V4L2Subdevice *device() { return subdev_.get(); } const ControlList &properties() const { return properties_; } int sensorInfo(IPACameraSensorInfo *info) const; void updateControlInfo(); protected: std::string logPrefix() const override; private: LIBCAMERA_DISABLE_COPY(CameraSensor) int generateId(); int validateSensorDriver(); void initVimcDefaultProperties(); void initStaticProperties(); void initTestPatternModes( const std::map<int32_t, int32_t> &testPatternModeMap); int initProperties(); const MediaEntity *entity_; std::unique_ptr<V4L2Subdevice> subdev_; unsigned int pad_; std::string model_; std::string id_; V4L2Subdevice::Formats formats_; std::vector<unsigned int> mbusCodes_; std::vector<Size> sizes_; std::vector<int32_t> testPatternModes_; Size pixelArraySize_; Rectangle activeArea_; const BayerFormat *bayerFormat_; ControlList properties_; }; } /* namespace libcamera */ #endif /* __LIBCAMERA_INTERNAL_CAMERA_SENSOR_H__ */