45inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
51 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
53 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
55 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
57 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
59 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
61 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
67class GenericAutoBrightness :
public IController
69 using ProcessingCallback = std::function<void()>;
72 friend BrightnessComponent;
74 explicit GenericAutoBrightness(
75 peak::afl::Manager& manager, ProcessingCallback callback,
const std::vector<BrightnessComponentType>& componentTypes)
76 : IController(manager)
78 , m_processingCallback{ std::move(callback) }
79 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
80 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
81 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
82 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
83 , m_roi{ std::make_unique<features::Roi>(m_controller) }
84 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
88 m_brightnessComponents.reserve(componentTypes.size());
89 for (
const auto& componentType : componentTypes)
96 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
97 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
109 if (m_processingCallback)
111 m_processingCallback();
118 return "GenericAutoBrightness";
123 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
124 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
126 feature->Serialize(archive);
129 for (
const auto& component : m_brightnessComponents)
132 component->Serialize(*componentArchive);
140 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
141 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
143 feature->Deserialize(archive);
146 for (
const auto& component : m_brightnessComponents)
149 component->Deserialize(*componentArchive);
160 for (
const auto& component : m_brightnessComponents)
162 component->SetMode(mode);
169 for (
const auto& component : m_brightnessComponents)
173 return controllerMode;
176 controllerMode = (std::max)(controllerMode, component->GetMode());
179 return controllerMode;
189 return *m_skipFrames;
194 return *m_autoTarget;
199 return *m_autoTolerance;
204 return *m_autoPercentile;
214 return *m_brightnessAlgorithm;
220 if (
nullptr == component)
236 if (
nullptr == component)
252 if (
nullptr == component)
268 if (
nullptr == component)
284 if (
nullptr == component)
287 "Host gain component is not available! Call IAutofeature::SetGainModule to set gain module!");
300 std::vector<BrightnessComponent*> components;
301 std::transform(m_brightnessComponents.begin(), m_brightnessComponents.end(), std::back_inserter(components),
302 [](
const auto& elem) { return elem.get(); });
308 auto entry = std::find_if(m_brightnessComponents.begin(), m_brightnessComponents.end(),
309 [componentType](
const std::unique_ptr<BrightnessComponent>& component) { return component->GetType() == componentType; });
310 if (entry != m_brightnessComponents.end())
317 void ResetToDefault()
override
321 AutoPercentile().
Set(13);
322 AutoTarget().
Set(150);
323 AutoTolerance().
Set(3);
327 for (
auto* component : GetComponents())
329 component->SetLimit({ 0, (std::numeric_limits<double>::max)() });
335 return m_FinishedCallbackManager.RegisterCallback(callback);
340 m_FinishedCallbackManager.UnregisterCallback(callbackHandle);
344 peak::core::TTriggerCallbackManager<IController::FinishedCallbackHandle, IController::FinishedCallback>
345 m_FinishedCallbackManager;
347 std::shared_ptr<peak::afl::Controller> m_controller{};
348 std::vector<std::unique_ptr<BrightnessComponent>> m_brightnessComponents{};
349 ProcessingCallback m_processingCallback{};
351 std::unique_ptr<features::SkipFrames> m_skipFrames{};
352 std::unique_ptr<features::AutoTarget> m_autoTarget{};
353 std::unique_ptr<features::AutoTolerance> m_autoTolerance{};
354 std::unique_ptr<features::AutoPercentile> m_autoPercentile{};
355 std::unique_ptr<features::Roi> m_roi{};
356 std::unique_ptr<features::BrightnessAlgorithm> m_brightnessAlgorithm{};