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
65 void HandleError(tResult oError) const;
66
67protected:
68 // internal functions to call the registered subitems
69 tResult RunSubs(tTimeStamp tmTimeofActivation,
71 const void* pvUserData,
72 size_t nUserDataSize);
73
74 tResult RunSubs(base::flash::tNanoSeconds tmTimeofActivation,
76 const void* pvUserData,
77 size_t nUserDataSize);
78
79protected:
80 ucom::ant::object_ptr<base::elasto::IErrorHandling::IErrorHandler> m_pErrorHandler;
81
82private:
83 std::unique_ptr<cTriggerItemPrioList> m_pPrioSubItems;
84};
85
86} // namespace detail
87// @endcond
88
102tResult create_trigger_pipe(const char* strNameOfPipe,
105
115
124template<typename... INTERFACES>
126 public adtf::ucom::object<ant::ITriggerPipeSource, INTERFACES...>,
127 protected detail::cTriggerPipeSourceBase
128{
129public:
132
134 virtual ~trigger_pipe_source() = default;
135
136public: // implements ITriggerPipeSource
139 ITriggerPipeItem::tPriority ui32Prio) override
140 {
141 return detail::cTriggerPipeSourceBase::RegisterSubItem(pSubRun, ui32Prio, this);
142 }
143
146 {
147 return detail::cTriggerPipeSourceBase::UnregisterSubItem(pSubRun, this);
148 }
149
151 ITriggerPipeItem::tPriority ui32Prio) override
152 {
153 return detail::cTriggerPipeSourceBase::ChangePriority(pSubRun, ui32Prio);
154 }
155
157 {
158 return detail::cTriggerPipeSourceBase::GetSubItems(lstSubItems);
159 }
160
161public: // implements INamedGraphObject, if derived from it
164 {
165 return detail::cTriggerPipeSourceBase::GetName(std::forward<base::ant::IString>(strName));
166 }
167
168 tResult SetName(const char* strName)
169 {
170 return detail::cTriggerPipeSourceBase::SetName(strName);
171 }
172
174 {
175 return detail::cTriggerPipeSourceBase::SetParent(oParentObject);
176 }
177
178 tResult GetParent(const ucom::ant::IObject*& poParentObject) const
179 {
180 return detail::cTriggerPipeSourceBase::GetParent(poParentObject);
181 }
182};
183
184// @cond NODOC
185namespace detail
186{
187
188class cTriggerPipeItemBase : public cTriggerPipeSourceBase
189{
190public:
191 static constexpr const char* DefaultTriggerPipeTypeName = "trigger_pipe_item";
192
193 cTriggerPipeItemBase();
194 cTriggerPipeItemBase(const char* strName);
195 ~cTriggerPipeItemBase() override;
196
197 // forwarding ITriggerPipeHierachy functions
198 tResult RegisterTriggerParent(const ant::ITriggerPipeSource* pParent);
199 tResult UnregisterTriggerParent(const ant::ITriggerPipeSource* pParent);
200 tResult GetTriggerParents(const ucom::nitro::ifunction<tResult(const ant::ITriggerPipeSource*)>& fnCallback) const;
201
202 // Optionally skip running sub items, typically disabled when sub items are externally handled by a sample stream.
203 tResult SetRunSubs(bool bEnabled);
204
205 // setup the runnable trigger call that will be invoked on Run
206 void SetRunnable(base::flash::IRunnable& pRunnableToCall);
207 void SetRunnable(base::ant::IRunnable& pRunnableToCall);
208
209 // setup any callable object as trigger call that will be invoked on Run.
210 template<typename CALLABLE>
211 void SetCallable(CALLABLE&& callable)
212 {
214 ucom::make_object_ptr(base::runnable(std::forward<CALLABLE>(callable)))));
215 }
216 void SetManagedRunnable(const ucom::object_ptr<ucom::IObject>& pRunnableToCall);
217
218 // internal functions to call the registered subitems (Runnable -> RunSubs)
219 tResult Run(tTimeStamp tmTimeofActivation,
220 base::ant::IRunnable::tActivationType ui32ActivationType,
221 const void* pvUserData,
222 size_t nUserDataSize);
223
224 tResult Run(base::flash::tNanoSeconds tmTimeofActivation,
225 base::ant::IRunnable::tActivationType ui32ActivationType,
226 const void* pvUserData,
227 size_t nUserDataSize);
228
229private:
230 const std::string& ProfilingName();
231 const std::string& ProfilingExecutionName();
232
233protected:
234 base::flash::IRunnable* m_pRunnableToCall = nullptr;
235 ucom::object_ptr<ucom::IObject> m_pManagedRunnable = nullptr;
236
237 std::string m_strProfilingName;
238 std::string m_strProfilingExecutionName;
239 bool m_bRunSubs = true;
240 std::vector<const ant::ITriggerPipeSource*> m_oDirectTriggerParents;
241};
242} // namespace detail
243
244// @endcond
245
256template<typename... INTERFACES>
258 public adtf::ucom::catwo::object<base::ant::IRunnable,
259 base::flash::IRunnable,
260 ant::ITriggerPipeSource,
261 ant::ITriggerPipeItem,
262 quiet::ITriggerPipeHierachy,
263 INTERFACES...>,
264 protected detail::cTriggerPipeItemBase
265{
266public:
268 trigger_pipe_item() = default;
271 trigger_pipe_item(const char* strName): detail::cTriggerPipeItemBase(strName)
272 {
273 }
274
277 trigger_pipe_item(const char* strName, adtf::base::ant::IRunnable& oRunnable): trigger_pipe_item(strName)
278 {
279 SetRunnable(oRunnable);
280 }
281
289 {
290 if (const auto pFlashRunnable = dynamic_cast<adtf::base::flash::IRunnable*>(&oRunnable))
291 {
292 SetRunnable(*pFlashRunnable);
293 }
294 else
295 {
296 detail::cTriggerPipeItemBase::SetRunnable(oRunnable);
297 }
298 }
299
307 {
308 detail::cTriggerPipeItemBase::SetRunnable(oRunnable);
309 }
310
319 template<typename CALLABLE>
320 void SetCallable(CALLABLE&& callable)
321 {
322 detail::cTriggerPipeItemBase::SetCallable(std::forward<CALLABLE>(callable));
323 }
324
325 // implementation of trigger pipe source
328 ITriggerPipeItem::tPriority ui32Prio) override
329 {
330 return detail::cTriggerPipeItemBase::RegisterSubItem(pSubRun, ui32Prio, this);
331 }
332
334 {
335 return detail::cTriggerPipeItemBase::UnregisterSubItem(pSubRun, this);
336 }
337
339 ITriggerPipeItem::tPriority ui32Prio) override
340 {
341 return detail::cTriggerPipeSourceBase::ChangePriority(pSubRun, ui32Prio);
342 }
343
345 {
346 return detail::cTriggerPipeSourceBase::GetSubItems(lstSubItems);
347 }
348
349 // implementation of trigger pipe item and its IRunnable interface
362 tResult Run(tTimeStamp tmTimeofActivation,
364 const void* pvUserData,
365 size_t nUserDataSize) override
366 {
367 return detail::cTriggerPipeItemBase::Run(tmTimeofActivation, ui32ActivationType, pvUserData, nUserDataSize);
368 }
369
370 // implementation of flash::IRunnable interface
385 const void* pvUserData,
386 size_t nUserDataSize) override
387 {
388 return detail::cTriggerPipeItemBase::Run(tmTimeofActivation, ui32ActivationType, pvUserData, nUserDataSize);
389 }
390
391 // implementation of trigger pipe hierachy interface
396 {
397 return detail::cTriggerPipeItemBase::RegisterTriggerParent(pParent);
398 }
399
404 {
405 return detail::cTriggerPipeItemBase::UnregisterTriggerParent(pParent);
406 }
407
412 const ucom::nitro::ifunction<tResult(const ant::ITriggerPipeSource*)>& fnCallback) const override
413 {
414 return detail::cTriggerPipeItemBase::GetTriggerParents(fnCallback);
415 }
416
417 // implement named graph object interface if derived from it
420 {
421 return detail::cTriggerPipeSourceBase::GetName(std::forward<base::ant::IString>(strName));
422 }
423
424 tResult SetName(const char* strName)
425 {
426 return detail::cTriggerPipeSourceBase::SetName(strName);
427 }
428
430 {
431 return detail::cTriggerPipeSourceBase::SetParent(oParentObject);
432 }
433
434 tResult GetParent(const ucom::ant::IObject*& poParentObject) const
435 {
436 return detail::cTriggerPipeSourceBase::GetParent(poParentObject);
437 }
438};
439
440} // namespace streaming
441} // namespace adtf
A_UTILS_NS::cResult tResult
For backwards compatibility and to bring latest version into scope.
Definition result.h:775
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:403
tResult GetTriggerParents(const ucom::nitro::ifunction< tResult(const ant::ITriggerPipeSource *)> &fnCallback) const override
Definition triggerpipe.h:411
trigger_pipe_item(const char *strName, adtf::base::ant::IRunnable &oRunnable)
Definition triggerpipe.h:277
void SetRunnable(adtf::base::flash::IRunnable &oRunnable)
Definition triggerpipe.h:306
tResult SetName(const char *strName)
Definition triggerpipe.h:424
tResult ChangePriority(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:338
tResult UnregisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun) override
Definition triggerpipe.h:333
trigger_pipe_item(const char *strName)
Definition triggerpipe.h:271
tResult Run(tTimeStamp tmTimeofActivation, adtf::base::ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition triggerpipe.h:362
tResult GetName(base::ant::IString &&strName) const
Definition triggerpipe.h:419
tResult RegisterTriggerParent(const ant::ITriggerPipeSource *pParent) override
Definition triggerpipe.h:395
tResult RegisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:327
tResult GetParent(const ucom::ant::IObject *&poParentObject) const
Definition triggerpipe.h:434
tResult SetParent(const ucom::ant::IObject *oParentObject)
Definition triggerpipe.h:429
void SetRunnable(adtf::base::ant::IRunnable &oRunnable)
Definition triggerpipe.h:288
tResult GetSubItems(adtf::ucom::ant::iobject_enum< const ITriggerPipeItem > &lstSubItems) const override
Definition triggerpipe.h:344
void SetCallable(CALLABLE &&callable)
Definition triggerpipe.h:320
tResult Run(adtf::base::flash::tNanoSeconds tmTimeofActivation, adtf::base::ant::IRunnable::tActivationType ui32ActivationType, const void *pvUserData, size_t nUserDataSize) override
Definition triggerpipe.h:383
virtual ~trigger_pipe_source()=default
DTOR.
tResult SetParent(const ucom::ant::IObject *oParentObject)
Definition triggerpipe.h:173
tResult GetParent(const ucom::ant::IObject *&poParentObject) const
Definition triggerpipe.h:178
tResult RegisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:138
tResult UnregisterSubItem(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun) override
Definition triggerpipe.h:145
tResult GetName(base::ant::IString &&strName) const
Definition triggerpipe.h:163
tResult SetName(const char *strName)
Definition triggerpipe.h:168
tResult GetSubItems(adtf::ucom::ant::iobject_enum< const ITriggerPipeItem > &lstSubItems) const override
Definition triggerpipe.h:156
tResult ChangePriority(const adtf::ucom::ant::iobject_ptr< ITriggerPipeItem > &pSubRun, ITriggerPipeItem::tPriority ui32Prio) override
Definition triggerpipe.h:150
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:135
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:160
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