ADTF
Loading...
Searching...
No Matches
triggerpipe.h
Go to the documentation of this file.
1
7#pragma once
8#include "triggerpipe_intf.h"
10#include "named_graph_object.h"
11#include "graph.h"
12
15
16namespace adtf
17{
18namespace streaming
19{
20// @cond NODOC
21namespace detail
22{
23
24class cTriggerItemPrioList;
25
26class cTriggerPipeSourceBase : protected flash::cNamedGraphObject
27{
28public:
29 static constexpr const char* DefaultTriggerPipeTypeName = "trigger_pipe_source";
30
31public:
33 cTriggerPipeSourceBase();
34 cTriggerPipeSourceBase(bool bDefault, const char* strName);
36 virtual ~cTriggerPipeSourceBase();
37
39 cTriggerPipeSourceBase(const cTriggerPipeSourceBase&) = delete;
41 cTriggerPipeSourceBase& operator=(const cTriggerPipeSourceBase&) = delete;
43 cTriggerPipeSourceBase(cTriggerPipeSourceBase&&) = delete;
45 cTriggerPipeSourceBase& operator=(cTriggerPipeSourceBase&&) = delete;
46
47 // forwarding of INamedGraphObject functions
48 tResult SetName(const char* strName);
49 tResult SetParent(const ucom::ant::IObject* pParentObject);
50 tResult GetName(base::ant::IString&& strName) const;
51 tResult GetParent(const ucom::ant::IObject*& poParentObject) const;
52
53 // forwarding of ITriggerPipeSource functions
54 tResult RegisterSubItem(const adtf::ucom::ant::iobject_ptr<ITriggerPipeItem>& pSubRun,
55 ITriggerPipeItem::tPriority ui32Prio,
56 ITriggerPipeSource* pParent);
57 tResult UnregisterSubItem(const adtf::ucom::ant::iobject_ptr<ITriggerPipeItem>& pSubRun,
58 ant::ITriggerPipeSource* pParent);
59 tResult ChangePriority(const adtf::ucom::ant::iobject_ptr<ITriggerPipeItem>& pSubRun,
60 ITriggerPipeItem::tPriority ui32Prio);
61 tResult GetSubItems(adtf::ucom::ant::iobject_enum<const ITriggerPipeItem>& lstSubItems) const;
62
63protected:
64 // internal functions to call the registered subitems
65 tResult RunSubs(tTimeStamp tmTimeofActivation,
67 const void* pvUserData,
68 size_t nUserDataSize);
69
70 tResult RunSubs(base::flash::tNanoSeconds tmTimeofActivation,
72 const void* pvUserData,
73 size_t nUserDataSize);
74
75protected:
76 ucom::ant::object_ptr<base::elasto::IErrorHandling::IErrorHandler> m_pErrorHandler;
77
78private:
79 std::unique_ptr<cTriggerItemPrioList> m_pPrioSubItems;
80};
81
82} // namespace detail
83// @endcond
84
98tResult create_trigger_pipe(const char* strNameOfPipe,
101
111
120template<typename... INTERFACES>
122 public adtf::ucom::object<ant::ITriggerPipeSource, INTERFACES...>,
123 protected detail::cTriggerPipeSourceBase
124{
125public:
128
130 virtual ~trigger_pipe_source() = default;
131
132public: // implements ITriggerPipeSource
135 ITriggerPipeItem::tPriority ui32Prio) override
136 {
137 return detail::cTriggerPipeSourceBase::RegisterSubItem(pSubRun, ui32Prio, this);
138 }
139
142 {
143 return detail::cTriggerPipeSourceBase::UnregisterSubItem(pSubRun, this);
144 }
145
147 ITriggerPipeItem::tPriority ui32Prio) override
148 {
149 return detail::cTriggerPipeSourceBase::ChangePriority(pSubRun, ui32Prio);
150 }
151
153 {
154 return detail::cTriggerPipeSourceBase::GetSubItems(lstSubItems);
155 }
156
157public: // implements INamedGraphObject, if derived from it
160 {
161 return detail::cTriggerPipeSourceBase::GetName(std::forward<base::ant::IString>(strName));
162 }
163
164 tResult SetName(const char* strName)
165 {
166 return detail::cTriggerPipeSourceBase::SetName(strName);
167 }
168
170 {
171 return detail::cTriggerPipeSourceBase::SetParent(oParentObject);
172 }
173
174 tResult GetParent(const ucom::ant::IObject*& poParentObject) const
175 {
176 return detail::cTriggerPipeSourceBase::GetParent(poParentObject);
177 }
178};
179
180// @cond NODOC
181namespace detail
182{
183
184class cTriggerPipeItemBase : public cTriggerPipeSourceBase
185{
186public:
187 static constexpr const char* DefaultTriggerPipeTypeName = "trigger_pipe_item";
188
189 cTriggerPipeItemBase();
190 cTriggerPipeItemBase(const char* strName);
191 ~cTriggerPipeItemBase() override;
192
193 // forwarding ITriggerPipeHierachy functions
194 tResult RegisterTriggerParent(const ant::ITriggerPipeSource* pParent);
195 tResult UnregisterTriggerParent(const ant::ITriggerPipeSource* pParent);
196 tResult GetTriggerParents(const ucom::nitro::ifunction<tResult(const ant::ITriggerPipeSource*)>& fnCallback) const;
197
198 // conditionally run subs, if this item is used within a sample stream
199 tResult SetRunSubsConditionally(bool bConditionally);
200 bool IsRunSubsConditionally() const;
201 void EnableSubRunnables();
202
203 // setup the runnable trigger call that will be invoked on Run
204 void SetRunnable(base::flash::IRunnable& pRunnableToCall);
205 void SetRunnable(base::ant::IRunnable& pRunnableToCall);
206
207 // setup any callable object as trigger call that will be invoked on Run.
208 template<typename CALLABLE>
209 void SetCallable(CALLABLE&& callable)
210 {
212 ucom::make_object_ptr(base::runnable(std::forward<CALLABLE>(callable)))));
213 }
214 void SetManagedRunnable(const ucom::object_ptr<ucom::IObject>& pRunnableToCall);
215
216 // internal functions to call the registered subitems (Runnable -> RunSubs)
217 tResult Run(tTimeStamp tmTimeofActivation,
218 base::ant::IRunnable::tActivationType ui32ActivationType,
219 const void* pvUserData,
220 size_t nUserDataSize);
221
222 tResult Run(base::flash::tNanoSeconds tmTimeofActivation,
223 base::ant::IRunnable::tActivationType ui32ActivationType,
224 const void* pvUserData,
225 size_t nUserDataSize);
226
227private:
228 tResult UpdateProfilingName();
229
230protected:
231 base::flash::IRunnable* m_pRunnableToCall = nullptr;
232 ucom::object_ptr<ucom::IObject> m_pManagedRunnable = nullptr;
233
234 std::string m_strProfilingName;
235 std::string m_strProfilingExecutionName;
236 bool m_bRunSubsConditionally = false;
237 std::atomic_bool m_bRunSubs = {true};
238 std::vector<const ant::ITriggerPipeSource*> m_oDirectTriggerParents;
239};
240} // namespace detail
241
242// @endcond
243
254template<typename... INTERFACES>
256 public adtf::ucom::catwo::object<base::ant::IRunnable,
257 base::flash::IRunnable,
258 ant::ITriggerPipeSource,
259 ant::ITriggerPipeItem,
260 quiet::ITriggerPipeHierachy,
261 INTERFACES...>,
262 protected detail::cTriggerPipeItemBase
263{
264public:
266 trigger_pipe_item() = default;
269 trigger_pipe_item(const char* strName): detail::cTriggerPipeItemBase(strName)
270 {
271 }
272
275 trigger_pipe_item(const char* strName, adtf::base::ant::IRunnable& oRunnable): trigger_pipe_item(strName)
276 {
277 SetRunnable(oRunnable);
278 }
279
287 {
288 if (const auto pFlashRunnable = dynamic_cast<adtf::base::flash::IRunnable*>(&oRunnable))
289 {
290 SetRunnable(*pFlashRunnable);
291 }
292 else
293 {
294 detail::cTriggerPipeItemBase::SetRunnable(oRunnable);
295 }
296 }
297
305 {
306 detail::cTriggerPipeItemBase::SetRunnable(oRunnable);
307 }
308
317 template<typename CALLABLE>
318 void SetCallable(CALLABLE&& callable)
319 {
320 detail::cTriggerPipeItemBase::SetCallable(std::forward<CALLABLE>(callable));
321 }
322
323 // implementation of trigger pipe source
326 ITriggerPipeItem::tPriority ui32Prio) override
327 {
328 return detail::cTriggerPipeItemBase::RegisterSubItem(pSubRun, ui32Prio, this);
329 }
330
332 {
333 return detail::cTriggerPipeItemBase::UnregisterSubItem(pSubRun, this);
334 }
335
337 ITriggerPipeItem::tPriority ui32Prio) override
338 {
339 return detail::cTriggerPipeSourceBase::ChangePriority(pSubRun, ui32Prio);
340 }
341
343 {
344 return detail::cTriggerPipeSourceBase::GetSubItems(lstSubItems);
345 }
346
347 // implementation of trigger pipe item and its IRunnable interface
360 tResult Run(tTimeStamp tmTimeofActivation,
362 const void* pvUserData,
363 size_t nUserDataSize) override
364 {
365 return detail::cTriggerPipeItemBase::Run(tmTimeofActivation, ui32ActivationType, pvUserData, nUserDataSize);
366 }
367
368 // implementation of flash::IRunnable interface
383 const void* pvUserData,
384 size_t nUserDataSize) override
385 {
386 return detail::cTriggerPipeItemBase::Run(tmTimeofActivation, ui32ActivationType, pvUserData, nUserDataSize);
387 }
388
389 // implementation of trigger pipe hierachy interface
394 {
395 return detail::cTriggerPipeItemBase::RegisterTriggerParent(pParent);
396 }
397
402 {
403 return detail::cTriggerPipeItemBase::UnregisterTriggerParent(pParent);
404 }
405
410 const ucom::nitro::ifunction<tResult(const ant::ITriggerPipeSource*)>& fnCallback) const override
411 {
412 return detail::cTriggerPipeItemBase::GetTriggerParents(fnCallback);
413 }
414
415 // implement named graph object interface if derived from it
418 {
419 return detail::cTriggerPipeSourceBase::GetName(std::forward<base::ant::IString>(strName));
420 }
421
422 tResult SetName(const char* strName)
423 {
424 return detail::cTriggerPipeSourceBase::SetName(strName);
425 }
426
428 {
429 return detail::cTriggerPipeSourceBase::SetParent(oParentObject);
430 }
431
432 tResult GetParent(const ucom::ant::IObject*& poParentObject) const
433 {
434 return detail::cTriggerPipeSourceBase::GetParent(poParentObject);
435 }
436};
437
438} // namespace streaming
439} // namespace adtf
A_UTILS_NS::cResult tResult
For backwards compatibility and to bring latest version into scope.
Definition result.h:736
Definition runnable_intf.h:27
tActivationType
Definition runnable_intf.h:45
Definition string_intf.h:29
Definition runnable_intf.h:112
Definition runnable.h:38
Definition triggerpipe_intf.h:26
tPriority
Definition triggerpipe_intf.h:39
tResult UnregisterTriggerParent(const ant::ITriggerPipeSource *pParent) override
Definition triggerpipe.h:401
tResult GetTriggerParents(const ucom::nitro::ifunction< tResult(const ant::ITriggerPipeSource *)> &fnCallback) const override
Definition triggerpipe.h:409
trigger_pipe_item(const char *strName, adtf::base::ant::IRunnable &oRunnable)
Definition triggerpipe.h:275
void SetRunnable(adtf::base::flash::IRunnable &oRunnable)
Definition triggerpipe.h:304
tResult SetName(const char *strName)
Definition triggerpipe.h:422
tResult ChangePriority(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:336
tResult UnregisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun) override
Definition triggerpipe.h:331
trigger_pipe_item(const char *strName)
Definition triggerpipe.h:269
tResult Run(tTimeStamp tmTimeofActivation, adtf::base::ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition triggerpipe.h:360
tResult GetName(base::ant::IString &&strName) const
Definition triggerpipe.h:417
tResult RegisterTriggerParent(const ant::ITriggerPipeSource *pParent) override
Definition triggerpipe.h:393
tResult RegisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:325
tResult GetParent(const ucom::ant::IObject *&poParentObject) const
Definition triggerpipe.h:432
tResult SetParent(const ucom::ant::IObject *oParentObject)
Definition triggerpipe.h:427
void SetRunnable(adtf::base::ant::IRunnable &oRunnable)
Definition triggerpipe.h:286
tResult GetSubItems(adtf::ucom::ant::iobject_enum< const ITriggerPipeItem > &lstSubItems) const override
Definition triggerpipe.h:342
void SetCallable(CALLABLE &&callable)
Definition triggerpipe.h:318
tResult Run(adtf::base::flash::tNanoSeconds tmTimeofActivation, adtf::base::ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition triggerpipe.h:381
virtual ~trigger_pipe_source()=default
DTOR.
tResult SetParent(const ucom::ant::IObject *oParentObject)
Definition triggerpipe.h:169
tResult GetParent(const ucom::ant::IObject *&poParentObject) const
Definition triggerpipe.h:174
tResult RegisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:134
tResult UnregisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun) override
Definition triggerpipe.h:141
tResult GetName(base::ant::IString &&strName) const
Definition triggerpipe.h:159
tResult SetName(const char *strName)
Definition triggerpipe.h:164
tResult GetSubItems(adtf::ucom::ant::iobject_enum< const ITriggerPipeItem > &lstSubItems) const override
Definition triggerpipe.h:152
tResult ChangePriority(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:146
Definition object_intf.h:33
Definition object_list.h:22
Base object pointer to realize binary compatible reference counting in interface methods.
Definition object_ptr_intf.h:112
Definition object.h:397
Definition function_ptr.h:28
Namespace for the ADTF Streaming SDK.
Definition bindingproxyinport.h:14
tResult check_loop_call_in_trigger_pipe(const adtf::streaming::ant::ITriggerPipeSource &pItem)
tResult create_trigger_pipe(const char *strNameOfPipe, adtf::ucom::ant::iobject_ptr< ITriggerPipe > &pTriggerPipe, adtf::ucom::ant::object_list< ITriggerPipeItem > lstNextItems)
object_enum< T, INTERFACE_TYPE, std::list > object_list
Definition object_list.h:402
object_ptr< T > ucom_object_ptr_cast(object_ptr< T > oCasted)
Alias always bringing the latest version of ant::ucom_object_ptr_cast() into scope.
Definition object_ptr_utilities.h:104
object_ptr< Implementation > make_object_ptr(Args &&... args)
Alias always bringing the latest version of ant::make_object_ptr() into scope.
Definition object_ptr_utilities.h:129
Namespace for all functionality provided by ADTF and its SDKs.
Definition adtf_client_connector.h:14
A timestamp with nanosecond precision.
Definition chrono.h:23