44inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
50 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
52 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
54 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
56 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
58 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
60 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
66class GenericAutoBrightness :
public IController
68 using ProcessingCallback = std::function<void()>;
71 friend BrightnessComponent;
73 explicit GenericAutoBrightness(
74 peak::afl::Manager& manager, ProcessingCallback callback,
const std::vector<BrightnessComponentType>& componentTypes)
75 : IController(manager)
77 , m_processingCallback{ std::move(callback) }
78 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
79 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
80 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
81 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
82 , m_roi{ std::make_unique<features::Roi>(m_controller) }
83 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
87 m_brightnessComponents.reserve(componentTypes.size());
88 for (
const auto& componentType : componentTypes)
95 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
96 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
108 if (m_processingCallback)
110 m_processingCallback();
115 PEAK_COMMON_NO_DISCARD std::string
GetName()
const override
117 return "GenericAutoBrightness";
122 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
123 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
125 feature->Serialize(archive);
128 for (
const auto& component : m_brightnessComponents)
131 component->Serialize(*componentArchive);
139 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
140 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
142 feature->Deserialize(archive);
145 for (
const auto& component : m_brightnessComponents)
148 component->Deserialize(*componentArchive);
159 for (
const auto& component : m_brightnessComponents)
161 component->SetMode(mode);
168 for (
const auto& component : m_brightnessComponents)
172 return controllerMode;
175 controllerMode = (std::max)(controllerMode, component->GetMode());
178 return controllerMode;
181 PEAK_COMMON_NO_DISCARD
bool IsRunning()
const override
186 PEAK_COMMON_NO_DISCARD features::SkipFrames& SkipFrames()
const
188 return *m_skipFrames;
191 PEAK_COMMON_NO_DISCARD features::AutoTarget& AutoTarget()
const
193 return *m_autoTarget;
196 PEAK_COMMON_NO_DISCARD features::AutoTolerance& AutoTolerance()
const
198 return *m_autoTolerance;
201 PEAK_COMMON_NO_DISCARD features::AutoPercentile& AutoPercentile()
const
203 return *m_autoPercentile;
206 PEAK_COMMON_NO_DISCARD features::Roi& Roi()
211 PEAK_COMMON_NO_DISCARD features::BrightnessAlgorithm& AnalysisAlgorithm()
const
213 return *m_brightnessAlgorithm;
216 PEAK_COMMON_NO_DISCARD BrightnessComponent& ExposureComponent()
const
219 if (
nullptr == component)
228 PEAK_COMMON_NO_DISCARD
bool HasExposureComponent()
const
233 PEAK_COMMON_NO_DISCARD BrightnessComponent& AnalogGainComponent()
const
236 if (
nullptr == component)
245 PEAK_COMMON_NO_DISCARD
bool HasAnalogGainComponent()
const
250 PEAK_COMMON_NO_DISCARD BrightnessComponent& DigitalGainComponent()
const
253 if (
nullptr == component)
262 PEAK_COMMON_NO_DISCARD
bool HasDigitalGainComponent()
const
267 PEAK_COMMON_NO_DISCARD BrightnessComponent& CombinedGainComponent()
const
270 if (
nullptr == component)
279 PEAK_COMMON_NO_DISCARD
bool HasCombinedGainComponent()
const
284 PEAK_COMMON_NO_DISCARD BrightnessComponent& HostGainComponent()
const
287 if (
nullptr == component)
290 "Host gain component is not available! Call IAutofeature::SetGainModule to set gain module!",
297 PEAK_COMMON_NO_DISCARD
bool HasHostGainComponent()
const
302 PEAK_COMMON_NO_DISCARD std::vector<BrightnessComponent*> GetComponents()
const
304 std::vector<BrightnessComponent*> components;
305 std::transform(m_brightnessComponents.begin(), m_brightnessComponents.end(), std::back_inserter(components),
306 [](
const auto& elem) { return elem.get(); });
312 auto entry = std::find_if(m_brightnessComponents.begin(), m_brightnessComponents.end(),
313 [componentType](
const std::unique_ptr<BrightnessComponent>& component) { return component->GetType() == componentType; });
314 if (entry != m_brightnessComponents.end())
325 AutoPercentile().
Set(13);
326 AutoTarget().
Set(150);
327 AutoTolerance().
Set(3);
331 for (
auto* component : GetComponents())
333 component->SetLimit({ 0, (std::numeric_limits<double>::max)() });
339 return m_FinishedCallbackManager.RegisterCallback(callback);
344 m_FinishedCallbackManager.UnregisterCallback(callbackHandle);
348 peak::core::TTriggerCallbackManager<IController::FinishedCallbackHandle, IController::FinishedCallback>
349 m_FinishedCallbackManager;
351 std::shared_ptr<peak::afl::Controller> m_controller{};
352 std::vector<std::unique_ptr<BrightnessComponent>> m_brightnessComponents{};
353 ProcessingCallback m_processingCallback{};
355 std::unique_ptr<features::SkipFrames> m_skipFrames{};
356 std::unique_ptr<features::AutoTarget> m_autoTarget{};
357 std::unique_ptr<features::AutoTolerance> m_autoTolerance{};
358 std::unique_ptr<features::AutoPercentile> m_autoPercentile{};
359 std::unique_ptr<features::Roi> m_roi{};
360 std::unique_ptr<features::BrightnessAlgorithm> m_brightnessAlgorithm{};