40inline std::unique_ptr<features::BrightnessLimit> CreateBrightnessLimit(
46 return std::make_unique<features::BrightnessExposureLimit>(std::move(controller));
48 return std::make_unique<features::BrightnessGainLimit>(std::move(controller));
50 return std::make_unique<features::BrightnessGainAnalogLimit>(std::move(controller));
52 return std::make_unique<features::BrightnessGainDigitalLimit>(std::move(controller));
54 return std::make_unique<features::BrightnessGainCombinedLimit>(std::move(controller));
56 return std::make_unique<features::BrightnessGainHostLimit>(std::move(controller));
62class GenericAutoBrightness :
public IController
64 using ProcessingCallback = std::function<void()>;
67 friend BrightnessComponent;
69 explicit GenericAutoBrightness(
70 peak::afl::Manager& manager, ProcessingCallback callback,
const std::vector<BrightnessComponentType>& componentTypes)
71 : IController(manager)
73 , m_processingCallback{ std::move(callback) }
74 , m_skipFrames{ std::make_unique<features::SkipFrames>(m_controller) }
75 , m_autoTarget{ std::make_unique<features::AutoTarget>(m_controller) }
76 , m_autoTolerance{ std::make_unique<features::AutoTolerance>(m_controller) }
77 , m_autoPercentile{ std::make_unique<features::AutoPercentile>(m_controller) }
78 , m_roi{ std::make_unique<features::Roi>(m_controller) }
79 , m_brightnessAlgorithm{ std::make_unique<features::BrightnessAlgorithm>(m_controller) }
83 m_brightnessComponents.reserve(componentTypes.size());
84 for (
const auto& componentType : componentTypes)
91 m_brightnessComponents.emplace_back(std::unique_ptr<BrightnessComponent>(
92 new BrightnessComponent(m_controller, componentType, detail::CreateBrightnessLimit(m_controller, componentType))));
104 if (m_processingCallback)
106 m_processingCallback();
111 PEAK_COMMON_NO_DISCARD std::string
GetName()
const override
113 return "GenericAutoBrightness";
118 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
119 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
121 feature->Serialize(archive);
124 for (
const auto& component : m_brightnessComponents)
127 component->Serialize(*componentArchive);
135 for (
const auto& feature : std::initializer_list<ISerializable*>{ m_skipFrames.get(), m_autoTarget.get(), m_autoTolerance.get(),
136 m_autoPercentile.get(), m_roi.get(), m_brightnessAlgorithm.get() })
138 feature->Deserialize(archive);
141 for (
const auto& component : m_brightnessComponents)
144 component->Deserialize(*componentArchive);
155 for (
const auto& component : m_brightnessComponents)
157 component->SetMode(mode);
164 for (
const auto& component : m_brightnessComponents)
168 return controllerMode;
171 controllerMode = (std::max)(controllerMode, component->GetMode());
174 return controllerMode;
177 PEAK_COMMON_NO_DISCARD
bool IsRunning()
const override
182 PEAK_COMMON_NO_DISCARD features::SkipFrames& SkipFrames()
const
184 return *m_skipFrames;
187 PEAK_COMMON_NO_DISCARD features::AutoTarget& AutoTarget()
const
189 return *m_autoTarget;
192 PEAK_COMMON_NO_DISCARD features::AutoTolerance& AutoTolerance()
const
194 return *m_autoTolerance;
197 PEAK_COMMON_NO_DISCARD features::AutoPercentile& AutoPercentile()
const
199 return *m_autoPercentile;
202 PEAK_COMMON_NO_DISCARD features::Roi& Roi()
207 PEAK_COMMON_NO_DISCARD features::BrightnessAlgorithm& AnalysisAlgorithm()
const
209 return *m_brightnessAlgorithm;
212 PEAK_COMMON_NO_DISCARD BrightnessComponent& ExposureComponent()
const
215 if (
nullptr == component)
224 PEAK_COMMON_NO_DISCARD
bool HasExposureComponent()
const
229 PEAK_COMMON_NO_DISCARD BrightnessComponent& AnalogGainComponent()
const
232 if (
nullptr == component)
241 PEAK_COMMON_NO_DISCARD
bool HasAnalogGainComponent()
const
246 PEAK_COMMON_NO_DISCARD BrightnessComponent& DigitalGainComponent()
const
249 if (
nullptr == component)
258 PEAK_COMMON_NO_DISCARD
bool HasDigitalGainComponent()
const
263 PEAK_COMMON_NO_DISCARD BrightnessComponent& CombinedGainComponent()
const
266 if (
nullptr == component)
275 PEAK_COMMON_NO_DISCARD
bool HasCombinedGainComponent()
const
280 PEAK_COMMON_NO_DISCARD BrightnessComponent& HostGainComponent()
const
283 if (
nullptr == component)
286 "Host gain component is not available! Call IAutofeature::SetGainModule to set gain module!",
293 PEAK_COMMON_NO_DISCARD
bool HasHostGainComponent()
const
298 PEAK_COMMON_NO_DISCARD std::vector<BrightnessComponent*> GetComponents()
const
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())
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{};