mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
This fixes two small bugs: We previously populated LensPosition's ControlInfo with hard-coded values, ignoring the tuning file. Now we query the AfAlgorithm to get limits (over all AF ranges) and default (for AfRangeNormal). We previously sent a default position to the lens driver, even when a user-specified starting position would follow. Defer doing this, to reduce unnecessary lens movement at startup (for some drivers). Bug: https://bugs.libcamera.org/show_bug.cgi?id=258 Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
82 lines
2.3 KiB
C++
82 lines
2.3 KiB
C++
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
/*
|
|
* Copyright (C) 2022, Raspberry Pi Ltd
|
|
*
|
|
* af_algorithm.hpp - auto focus algorithm interface
|
|
*/
|
|
#pragma once
|
|
|
|
#include <optional>
|
|
|
|
#include <libcamera/base/span.h>
|
|
|
|
#include "algorithm.h"
|
|
|
|
namespace RPiController {
|
|
|
|
class AfAlgorithm : public Algorithm
|
|
{
|
|
public:
|
|
AfAlgorithm(Controller *controller)
|
|
: Algorithm(controller) {}
|
|
|
|
/*
|
|
* An autofocus algorithm should provide the following calls.
|
|
*
|
|
* Where a ControlList combines a change of AfMode with other AF
|
|
* controls, setMode() should be called first, to ensure the
|
|
* algorithm will be in the correct state to handle controls.
|
|
*
|
|
* setLensPosition() returns true if the mode was AfModeManual and
|
|
* the lens position has changed, otherwise returns false. When it
|
|
* returns true, hwpos should be sent immediately to the lens driver.
|
|
*
|
|
* getMode() is provided mainly for validating controls.
|
|
* getLensPosition() is provided for populating DeviceStatus.
|
|
*
|
|
* getDefaultlensPosition() and getLensLimits() were added for
|
|
* populating ControlInfoMap. They return the static API limits
|
|
* which should be independent of the current range or mode.
|
|
*/
|
|
|
|
enum AfRange { AfRangeNormal = 0,
|
|
AfRangeMacro,
|
|
AfRangeFull,
|
|
AfRangeMax };
|
|
|
|
enum AfSpeed { AfSpeedNormal = 0,
|
|
AfSpeedFast,
|
|
AfSpeedMax };
|
|
|
|
enum AfMode { AfModeManual = 0,
|
|
AfModeAuto,
|
|
AfModeContinuous };
|
|
|
|
enum AfPause { AfPauseImmediate = 0,
|
|
AfPauseDeferred,
|
|
AfPauseResume };
|
|
|
|
virtual void setRange([[maybe_unused]] AfRange range)
|
|
{
|
|
}
|
|
virtual void setSpeed([[maybe_unused]] AfSpeed speed)
|
|
{
|
|
}
|
|
virtual void setMetering([[maybe_unused]] bool use_windows)
|
|
{
|
|
}
|
|
virtual void setWindows([[maybe_unused]] libcamera::Span<libcamera::Rectangle const> const &wins)
|
|
{
|
|
}
|
|
virtual void setMode(AfMode mode) = 0;
|
|
virtual AfMode getMode() const = 0;
|
|
virtual double getDefaultLensPosition() const = 0;
|
|
virtual void getLensLimits(double &min, double &max) const = 0;
|
|
virtual bool setLensPosition(double dioptres, int32_t *hwpos, bool force = false) = 0;
|
|
virtual std::optional<double> getLensPosition() const = 0;
|
|
virtual void triggerScan() = 0;
|
|
virtual void cancelScan() = 0;
|
|
virtual void pause(AfPause pause) = 0;
|
|
};
|
|
|
|
} // namespace RPiController
|