@@ -28,6 +28,8 @@ public:
virtual void SetWindows(const libcamera::Rectangle &afWindows) = 0;
// set AF range
virtual void SetRange(const uint32_t &range) = 0;
+ // set Lens Range
+ virtual void SetLensRange(const uint32_t &low, const uint32_t &high) = 0;
// set AF speed
virtual void setSpeed(const uint32_t &speed) = 0;
};
@@ -40,7 +40,7 @@ Af::Af(Controller *controller)
: AfAlgorithm(controller), focus_(0), bestFocus_(0),
currentContrast_(0.0), previousContrast_(0.0), maxContrast_(0.0),
maxStep_(0), coarseCompleted_(false), fineCompleted_(false),
- mode_(libcamera::controls::AfModeManual)
+ mode_(libcamera::controls::AfModeManual), lowStep_(0), highStep_(kMaxFocusSteps)
{
}
@@ -90,6 +90,18 @@ void Af::SetRange([[maybe_unused]] const uint32_t &range)
{
}
+void Af::SetLensRange(const uint32_t &low, const uint32_t &high)
+{
+ lowStep_ = low;
+ highStep_ = high;
+
+ LOG(IoBAf, Debug) << "Lens range set between " << lowStep_
+ << " and " << highStep_;
+
+ focus_ = lowStep_;
+ maxStep_ = highStep_;
+}
+
void Af::setSpeed([[maybe_unused]] const uint32_t &speed)
{
}
@@ -118,7 +130,7 @@ void Af::afCoarseScan()
status_.lensPosition = focus_;
previousContrast_ = 0;
maxStep_ = std::clamp(focus_ + static_cast<uint32_t>((focus_ * kFineRange)),
- 0U, kMaxFocusSteps);
+ 0U, highStep_);
}
}
@@ -136,7 +148,7 @@ void Af::afFineScan()
bool Af::afScan(uint32_t minSteps)
{
- if (focus_ > maxStep_) {
+ if (focus_ + minSteps > maxStep_) {
/* If the max step is reached, move lens to the position. */
status_.lensPosition = bestFocus_;
return true;
@@ -180,13 +192,13 @@ bool Af::afScan(uint32_t minSteps)
void Af::afReset()
{
LOG(IoBAf, Debug) << "Reset AF parameters";
- status_.lensPosition = 0;
- focus_ = 0;
+ status_.lensPosition = lowStep_;
+ focus_ = lowStep_;
+ maxStep_ = highStep_;
status_.state = libcamera::controls::AfStateScanning;
previousContrast_ = 0.0;
coarseCompleted_ = false;
fineCompleted_ = false;
- maxStep_ = kMaxFocusSteps;
maxContrast_ = 0.0;
}
@@ -29,6 +29,7 @@ public:
void Pause(const uint32_t &pause) override;
void SetWindows(const libcamera::Rectangle &afWindows) override;
void SetRange(const uint32_t &range) override;
+ void SetLensRange(const uint32_t &low, const uint32_t &high) override;
void setSpeed(const uint32_t &speed) override;
private:
bool afNeedIgnoreFrame();
@@ -58,6 +59,9 @@ private:
bool fineCompleted_;
uint32_t mode_;
+
+ uint32_t lowStep_;
+ uint32_t highStep_;
};
} /* namespace RPiController */
Give the algorithm a way to have a constrained range for the lens. Add a default SetRange() call and implement it to set the low bound and high bound for the search. There is no functionnal change expected but gives the ability for the pipeline handler to set the range at runtime. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> --- .../raspberrypi/controller/af_algorithm.hpp | 2 ++ src/ipa/raspberrypi/controller/iob/af.cpp | 24 ++++++++++++++----- src/ipa/raspberrypi/controller/iob/af.h | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-)