RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
acquisitor.hpp
Go to the documentation of this file.
1
11
12#ifndef RTCTK_METADATACOLLECTOR_ACQUISITOR_HPP
13#define RTCTK_METADATACOLLECTOR_ACQUISITOR_HPP
14
15#include <Metadaqif.hpp>
16#include <Rtctkif.hpp>
17#include <rtctk/componentFramework/events.rad.hpp>
21#include <rtctk/metadataCollector/acquisitor.rad.hpp>
22
24
25using namespace rtctk::componentFramework;
26
27template <typename Super>
28struct Runnable;
29
30template <typename Super>
31struct Loopaware;
32
37class DaqRequestRejected : public metadaqif::DaqException {
38public:
39 DaqRequestRejected(const std::string& request_id,
40 const std::string& session_id,
41 const std::string& state_id);
42};
43
47class DaqReply : public metadaqif::DaqReply {
48public:
49 DaqReply() = default;
50
51 DaqReply(const std::string& id);
52
53 std::string getId() const override;
54
55 void setId(const std::string& id) override;
56
57 bool hasKey() const override;
58
59 bool keyEquals(const metadaqif::DaqReply& other) const override;
60
61 std::unique_ptr<metadaqif::DaqReply> clone() const override;
62
63 std::unique_ptr<metadaqif::DaqReply> cloneKey() const override;
64
65private:
66 std::string m_id;
67};
68
72class DaqStopReply : public metadaqif::DaqStopReply {
73public:
74 DaqStopReply() = default;
75
76 DaqStopReply(const std::string& id,
77 const std::vector<std::string>& files,
78 const std::string& kw);
79
80 std::string getId() const override;
81
82 void setId(const std::string& id) override;
83
84 std::string getKeywords() const override;
85
86 void setKeywords(const std::string& kw) override;
87
88 std::vector<std::string> getFiles() const override;
89
90 void setFiles(const std::vector<std::string>& fs) override;
91
92 bool hasKey() const override;
93
94 bool keyEquals(const metadaqif::DaqStopReply& other) const override;
95
96 std::unique_ptr<metadaqif::DaqStopReply> clone() const override;
97
98 std::unique_ptr<metadaqif::DaqStopReply> cloneKey() const override;
99
100private:
101 std::string m_id;
102 std::vector<std::string> m_files;
103 std::string m_kw;
104};
105
109class DaqStatus : public metadaqif::DaqStatus {
110public:
111 DaqStatus() = default;
112
113 std::string getId() const override;
114
115 void setId(const std::string& id) override;
116
117 std::string getKeywords() const override;
118
119 void setKeywords(const std::string& kw) override;
120
121 std::string getMessage() const override;
122
123 void setMessage(const std::string& msg) override;
124
125 double getTimestamp() const override;
126
127 void setTimestamp(double ts) override;
128
129 metadaqif::DaqState getState() const override;
130
131 void setState(metadaqif::DaqState st) override;
132
133 std::vector<std::string> getFiles() const override;
134
135 void setFiles(const std::vector<std::string>& fs) override;
136
137 bool hasKey() const override;
138
139 bool keyEquals(const metadaqif::DaqStatus& other) const override;
140
141 std::unique_ptr<metadaqif::DaqStatus> clone() const override;
142
143 std::unique_ptr<metadaqif::DaqStatus> cloneKey() const override;
144
145private:
146 std::string m_id;
147 std::string m_msg;
148 double m_ts;
149 metadaqif::DaqState m_st;
150 std::vector<std::string> m_files;
151 std::string m_kw;
152};
153
159class AcquisitorCmdsImpl : public metadaqif::AsyncMetaDaq {
160public:
161 static void Register(CommandReplier& replier, StateMachineEngine& engine);
162
164
165 ::elt::mal::future<std::shared_ptr<metadaqif::DaqReply>>
166 StartDaq(const std::string& id) override;
167
168 ::elt::mal::future<std::shared_ptr<metadaqif::DaqStopReply>>
169 StopDaq(const std::string& id) override;
170
171 ::elt::mal::future<std::shared_ptr<metadaqif::DaqReply>>
172 AbortDaq(const std::string& id) override;
173
174 ::elt::mal::future<std::shared_ptr<metadaqif::DaqStatus>>
175 GetDaqStatus(const std::string& id) override;
176
177private:
178 log4cplus::Logger& m_logger;
179 StateMachineEngine& m_engine;
180};
181
188template <typename Super>
189struct Acquisitor : Super {
190 static_assert(std::is_base_of_v<RtcComponent, Super>, "'Acquisitor' requires 'RtcComponent'");
191 static_assert(not is_base_of_template_v<Runnable, Super>, "'Acquisitor' excludes 'Runnable'");
192 static_assert(not is_base_of_template_v<Loopaware, Super>, "'Acquisitor' excludes 'Loopaware'");
193
194 class BizLogicIf : public Super::BizLogicIf {
195 public:
196 virtual void ActivityPreparing(StopToken st, const std::string& id) {};
197 virtual void ActivityAcquiring(StopToken st) {};
199 return {};
200 };
201 virtual void ActivityAborting(StopToken st) {};
202 virtual void ActivityRecovering(StopToken st) {};
203 };
204
205 class InputStage : public Super::InputStage {
206 public:
207 using Super::InputStage::InputStage;
208
209 void Start() override {
210 Super::InputStage::Start();
211
212 AcquisitorCmdsImpl::Register(this->m_replier, this->m_engine);
213 }
214 };
215
216 class OutputStage : public Super::OutputStage {
217 public:
218 OutputStage(StateMachineEngine& engine, BizLogicIf& bl) : Super::OutputStage(engine, bl) {
219 // Handlers ###################################################################
220
222 events::StartDaq::ID, [](const rad::AnyEvent& event, const std::string& state) {
223 if (auto req = rad::GetPayloadNothrow<events::StartDaq>(event); req) {
224 const auto& id = req->GetRequestPayload();
225 req->SetException(DaqRequestRejected{events::StartDaq::ID, id, state});
226 }
227 });
228
230 events::StopDaq::ID, [](const rad::AnyEvent& event, const std::string& state) {
231 if (auto req = rad::GetPayloadNothrow<events::StopDaq>(event); req) {
232 const auto& id = req->GetRequestPayload();
233 req->SetException(DaqRequestRejected{events::StopDaq::ID, id, state});
234 }
235 });
236
238 events::AbortDaq::ID, [](const rad::AnyEvent& event, const std::string& state) {
239 if (auto req = rad::GetPayloadNothrow<events::AbortDaq>(event); req) {
240 const auto& id = req->GetRequestPayload();
241 req->SetException(DaqRequestRejected{events::AbortDaq::ID, id, state});
242 }
243 });
244
246 events::GetDaqStatus::ID, [](const rad::AnyEvent& event, const std::string& state) {
247 if (auto req = rad::GetPayloadNothrow<events::GetDaqStatus>(event); req) {
248 const auto& id = req->GetRequestPayload();
249 req->SetException(DaqRequestRejected{events::GetDaqStatus::ID, id, state});
250 }
251 });
252
253 // No Disable in states ###############################################################
254
255 this->m_no_disable_in_states.push_back("On::Operational::Preparing");
256 this->m_no_disable_in_states.push_back("On::Operational::Acquiring");
257 this->m_no_disable_in_states.push_back("On::Operational::Finalising");
258 this->m_no_disable_in_states.push_back("On::Operational::Aborting");
259 this->m_no_disable_in_states.push_back("On::Operational::Recovering");
260 this->m_no_disable_in_states.push_back("On::Operational::Error");
261
262 // No Update in states ################################################################
263
264 this->m_no_update_in_states.push_back("On::Operational::Preparing");
265 this->m_no_update_in_states.push_back("On::Operational::Acquiring");
266 this->m_no_update_in_states.push_back("On::Operational::Finalising");
267 this->m_no_update_in_states.push_back("On::Operational::Aborting");
268 this->m_no_update_in_states.push_back("On::Operational::Recovering");
269 this->m_no_update_in_states.push_back("On::Operational::Error");
270
271 // ClearHistory #####################################################################
272
273 engine.RegisterAction("ActionClearHistory",
274 [this](auto c) { m_acquisition_history.clear(); });
275
276 // StartDaq #####################################################################
277
278 engine.RegisterGuard("GuardPreparingAllowed", [this](auto c) {
280 auto id = req->GetRequestPayload();
281// #define FEATURE_REQUIRE_UNIQUE_ID_FOR_NEW_SESSION
282#ifdef FEATURE_REQUIRE_UNIQUE_ID_FOR_NEW_SESSION
283 return m_acquisition_history.count(id) == 0;
284#else
285 return true;
286#endif
287 });
288
289 engine.RegisterAction("ActionPreparingEntry", [this](auto c) {
290 m_tmp_start_request = GetPayloadNothrow<events::StartDaq>(c);
291 m_active_id = m_tmp_start_request->GetRequestPayload();
292 std::string id = m_active_id.value();
293
294 DaqStatus status;
295 status.setId(id);
296 status.setState(metadaqif::Acquiring);
297 status.setTimestamp(GetCurrentTime());
298 m_acquisition_history[id] = status;
299 });
300
301 engine.RegisterAction("ActionPreparingDone", [this](auto c) {
302 if (m_tmp_start_request) {
303 std::string id = m_active_id.value();
304 m_tmp_start_request->SetReplyValue(std::make_shared<DaqReply>(id));
305 m_tmp_start_request = nullptr;
306 }
307 });
308
309 engine.RegisterAction("ActionPreparingFailed", [this](auto c) {
310 if (m_tmp_start_request) {
311 std::string id = m_active_id.value();
313 std::string msg = NestedExceptionPrinter(std::move(*eptr)).Str();
314 m_acquisition_history.at(id).setState(metadaqif::Failed);
315 m_acquisition_history.at(id).setTimestamp(GetCurrentTime());
316 m_acquisition_history.at(id).setMessage(msg);
317 m_tmp_start_request->SetException(metadaqif::DaqException(id, msg));
318 m_tmp_start_request = nullptr;
319 }
320 });
321
322 // StopDaq #####################################################################
323
324 engine.RegisterGuard("GuardFinalisingAllowed", [this](auto c) {
326 auto id = req->GetRequestPayload();
327 return m_active_id.value() == id;
328 });
329
330 engine.RegisterAction("ActionFinalisingEntry", [this](auto c) {
331 m_tmp_stop_request = GetPayloadNothrow<events::StopDaq>(c);
332 });
333
334 engine.RegisterAction("ActionFinalisingDone", [this](auto c) {
335 if (m_tmp_stop_request) {
336 std::string id = m_active_id.value();
337 m_acquisition_history.at(id).setState(metadaqif::Succeeded);
338 m_acquisition_history.at(id).setTimestamp(GetCurrentTime());
339
340 m_tmp_stop_request->SetReplyValue(
341 std::make_shared<DaqStopReply>(m_acquisition_history.at(id).getId(),
342 m_acquisition_history.at(id).getFiles(),
343 m_acquisition_history.at(id).getKeywords()));
344 m_tmp_stop_request = nullptr;
345 }
346 });
347
348 engine.RegisterAction("ActionFinalisingFailed", [this](auto c) {
349 if (m_tmp_stop_request) {
350 std::string id = m_active_id.value();
352 std::string msg = NestedExceptionPrinter(std::move(*eptr)).Str();
353 m_acquisition_history.at(id).setState(metadaqif::Failed);
354 m_acquisition_history.at(id).setTimestamp(GetCurrentTime());
355 m_acquisition_history.at(id).setMessage(msg);
356 m_tmp_stop_request->SetException(metadaqif::DaqException(id, msg));
357 m_tmp_stop_request = nullptr;
358 }
359 });
360
361 // AbortDaq #####################################################################
362
363 engine.RegisterGuard("GuardAbortingAllowed", [this](auto c) {
365 auto id = req->GetRequestPayload();
366 return m_active_id.value() == id;
367 });
368
369 engine.RegisterAction("ActionAbortingEntry", [this](auto c) {
370 m_tmp_abort_request = GetPayloadNothrow<events::AbortDaq>(c);
371 });
372
373 engine.RegisterAction("ActionAbortingDone", [this](auto c) {
374 if (m_tmp_abort_request) {
375 std::string id = this->m_active_id.value();
376 m_acquisition_history.at(id).setState(metadaqif::Aborted);
377 m_acquisition_history.at(id).setTimestamp(GetCurrentTime());
378 m_tmp_abort_request->SetReplyValue(std::make_shared<DaqReply>(id));
379 m_tmp_abort_request = nullptr;
380 }
381 });
382
383 // GetDaqStatus #####################################################################
384
385 engine.RegisterAction("ActionGetDaqStatus", [this](auto c) {
387 auto id = request->GetRequestPayload();
388
389 if (m_acquisition_history.count(id)) {
390 request->SetReplyValue(std::move(m_acquisition_history.at(id).clone()));
391 } else {
392 auto status = std::make_shared<DaqStatus>();
393 status->setId(id);
394 status->setState(metadaqif::NotStarted);
395 status->setTimestamp(0);
396 request->SetReplyValue(status);
397 }
398 });
399
400 // Recover #####################################################################
401
402 engine.RegisterAction("ActionRecoveringEntry", [this](auto c) {
403 std::string id = m_active_id.value();
405 std::string msg = NestedExceptionPrinter(std::move(*eptr)).Str();
406 m_acquisition_history.at(id).setState(metadaqif::Failed);
407 m_acquisition_history.at(id).setTimestamp(GetCurrentTime());
408 m_acquisition_history.at(id).setMessage(msg);
409 });
410
411 // Activities #####################################################################
412
413 engine.RegisterActivity(
414 "ActivityPreparing",
415 [this](StopToken stop_token) {
416 std::string id = m_active_id.value();
417 static_cast<BizLogicIf&>(this->m_logic).ActivityPreparing(stop_token, id);
418 },
419 this->m_success_handler,
420 this->m_error_handler);
421
422 engine.RegisterActivity(
423 "ActivityFinalising",
424 [this](StopToken stop_token) {
425 std::string id = m_active_id.value();
426 auto result =
427 static_cast<BizLogicIf&>(this->m_logic).ActivityFinalising(stop_token);
428 m_acquisition_history.at(id).setId(result.getId());
429 m_acquisition_history.at(id).setFiles(result.getFiles());
430 m_acquisition_history.at(id).setKeywords(result.getKeywords());
431 },
432 this->m_success_handler,
433 this->m_error_handler);
434
435 engine.RegisterActivity(
436 "ActivityAcquiring",
437 [this](StopToken stop_token) {
438 static_cast<BizLogicIf&>(this->m_logic).ActivityAcquiring(stop_token);
439 },
440 nullptr,
441 this->m_error_handler);
442
443 engine.RegisterActivity(
444 "ActivityAborting",
445 [this](StopToken stop_token) {
446 static_cast<BizLogicIf&>(this->m_logic).ActivityAborting(stop_token);
447 },
448 this->m_success_handler,
449 this->m_error_handler);
450
451 engine.RegisterActivity(
452 "ActivityRecovering",
453 [this](StopToken stop_token) {
454 static_cast<BizLogicIf&>(this->m_logic).ActivityRecovering(stop_token);
455 },
456 this->m_success_handler,
457 this->m_error_handler);
458 }
459
460 private:
461 double GetCurrentTime() {
462 using namespace std::chrono;
463 auto t = high_resolution_clock::now();
464 return duration_cast<nanoseconds>(t.time_since_epoch()).count();
465 }
466
467 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqReply>, std::string>>
468 m_tmp_start_request;
469 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqStopReply>, std::string>>
470 m_tmp_stop_request;
471 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqReply>, std::string>>
472 m_tmp_abort_request;
473 std::map<std::string, DaqStatus> m_acquisition_history;
474
475 std::optional<std::string> m_active_id;
476 };
477
478 struct ModelBuilder : public Super::ModelBuilder {
479 public:
480 ModelBuilder(StateMachineEngine& engine) : Super::ModelBuilder(engine) {
481 // clang-format off
482 this->mm.ModStateType("On::Operational", Parallel);
483
484 const std::string parent_region = "On::Operational:";
485
486 this->mm.AddState(Composite, parent_region, "On::Operational");
487 this->mm.AddState(Initial, "On::Operational::Initial", parent_region);
488 this->mm.AddState(Simple, "On::Operational::Idle", parent_region);
489 this->mm.AddState(Simple, "On::Operational::Acquiring", parent_region, "ActivityAcquiring");
490 this->mm.AddState(Simple, "On::Operational::Recovering", parent_region, "ActivityRecovering", "ActionRecoveringEntry");
491 this->mm.AddState(Simple, "On::Operational::Preparing", parent_region, "ActivityPreparing", "ActionPreparingEntry");
492 this->mm.AddState(Simple, "On::Operational::Finalising", parent_region, "ActivityFinalising", "ActionFinalisingEntry");
493 this->mm.AddState(Simple, "On::Operational::Aborting", parent_region, "ActivityAborting", "ActionAbortingEntry");
494
495 this->mm.AddTrans("On::Operational::Initial", "On::Operational::Idle", "", "", "ActionClearHistory");
496 this->mm.AddTrans(parent_region, "", "events.GetDaqStatus", "", "ActionGetDaqStatus");
497 this->mm.AddTrans("On::Operational::Idle", "On::Operational::Preparing", "events.StartDaq", "GuardPreparingAllowed");
498 this->mm.AddTrans("On::Operational::Preparing", "On::Operational::Acquiring", "events.Done", "", "ActionPreparingDone");
499 this->mm.AddTrans("On::Operational::Preparing", "On::Operational::Idle", "events.Error", "", "ActionPreparingFailed");
500 this->mm.AddTrans("On::Operational::Acquiring", "On::Operational::Finalising", "events.StopDaq", "GuardFinalisingAllowed");
501 this->mm.AddTrans("On::Operational::Finalising", "On::Operational::Idle", "events.Done", "", "ActionFinalisingDone");
502 this->mm.AddTrans("On::Operational::Finalising", "On::Operational::Idle", "events.Error", "", "ActionFinalisingFailed");
503 this->mm.AddTrans("On::Operational::Acquiring", "On::Operational::Aborting", "events.AbortDaq", "GuardAbortingAllowed");
504 this->mm.AddTrans("On::Operational::Aborting", "On::Operational::Idle", "events.Done", "", "ActionAbortingDone");
505 this->mm.AddTrans("On::Operational::Acquiring", "On::Operational::Recovering", "events.Error");
506 this->mm.AddTrans("On::Operational::Recovering", "On::Operational::Idle", "events.Done");
507 // clang-format on
508 }
509 };
510};
511
512} // namespace rtctk::metadataCollector
513
514#endif // RTCTK_COMPONENTFRAMEWORK_ACQUISITOR_HPP
Class that handles reception of commands using MAL.
Definition commandReplier.hpp:29
Adapter object intended to be used in contexts without direct access to the output-stream object.
Definition exceptions.hpp:168
std::string Str() const
Convenience function for constructing a std::string from the exception.
Definition exceptions.hpp:186
Definition stateMachineEngine.hpp:34
void RegisterAction(const std::string &id, ActionMethod action)
Register action.
Definition stateMachineEngine.cpp:85
void RegisterGuard(const std::string &id, GuardMethod guard)
Register guard.
Definition stateMachineEngine.cpp:107
void RegisterRejectHandler(const std::string &id, RejectMethod reject)
Register reject handler.
Definition stateMachineEngine.cpp:128
void RegisterActivity(const std::string &id, ActivityMethod activity, SuccessMethod on_success, FailureMethod on_failure)
Register activity.
Definition stateMachineEngine.cpp:120
::elt::mal::future< std::shared_ptr< metadaqif::DaqStopReply > > StopDaq(const std::string &id) override
Definition acquisitor.cpp:197
::elt::mal::future< std::shared_ptr< metadaqif::DaqReply > > StartDaq(const std::string &id) override
Definition acquisitor.cpp:188
::elt::mal::future< std::shared_ptr< metadaqif::DaqStatus > > GetDaqStatus(const std::string &id) override
Definition acquisitor.cpp:215
::elt::mal::future< std::shared_ptr< metadaqif::DaqReply > > AbortDaq(const std::string &id) override
Definition acquisitor.cpp:206
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition acquisitor.cpp:177
AcquisitorCmdsImpl(StateMachineEngine &engine)
Definition acquisitor.cpp:183
virtual void ActivityAborting(StopToken st)
Definition acquisitor.hpp:201
virtual void ActivityRecovering(StopToken st)
Definition acquisitor.hpp:202
virtual DaqStopReply ActivityFinalising(StopToken st)
Definition acquisitor.hpp:198
virtual void ActivityPreparing(StopToken st, const std::string &id)
Definition acquisitor.hpp:196
virtual void ActivityAcquiring(StopToken st)
Definition acquisitor.hpp:197
void Start() override
Definition acquisitor.hpp:209
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition acquisitor.hpp:218
std::unique_ptr< metadaqif::DaqReply > clone() const override
Definition acquisitor.cpp:46
bool hasKey() const override
Definition acquisitor.cpp:38
bool keyEquals(const metadaqif::DaqReply &other) const override
Definition acquisitor.cpp:42
void setId(const std::string &id) override
Definition acquisitor.cpp:34
std::string getId() const override
Definition acquisitor.cpp:30
std::unique_ptr< metadaqif::DaqReply > cloneKey() const override
Definition acquisitor.cpp:50
Thrown if command is not allowed in current state or guard.
Definition acquisitor.hpp:37
DaqRequestRejected(const std::string &request_id, const std::string &session_id, const std::string &state_id)
Definition acquisitor.cpp:18
Definition acquisitor.hpp:109
bool hasKey() const override
Definition acquisitor.cpp:152
std::unique_ptr< metadaqif::DaqStatus > cloneKey() const override
Definition acquisitor.cpp:171
void setState(metadaqif::DaqState st) override
Definition acquisitor.cpp:140
void setMessage(const std::string &msg) override
Definition acquisitor.cpp:124
void setTimestamp(double ts) override
Definition acquisitor.cpp:132
std::string getMessage() const override
Definition acquisitor.cpp:120
std::unique_ptr< metadaqif::DaqStatus > clone() const override
Definition acquisitor.cpp:160
void setId(const std::string &id) override
Definition acquisitor.cpp:108
bool keyEquals(const metadaqif::DaqStatus &other) const override
Definition acquisitor.cpp:156
void setFiles(const std::vector< std::string > &fs) override
Definition acquisitor.cpp:148
std::vector< std::string > getFiles() const override
Definition acquisitor.cpp:144
std::string getKeywords() const override
Definition acquisitor.cpp:112
void setKeywords(const std::string &kw) override
Definition acquisitor.cpp:116
metadaqif::DaqState getState() const override
Definition acquisitor.cpp:136
double getTimestamp() const override
Definition acquisitor.cpp:128
std::string getId() const override
Definition acquisitor.cpp:104
Definition acquisitor.hpp:72
void setFiles(const std::vector< std::string > &fs) override
Definition acquisitor.cpp:82
bool keyEquals(const metadaqif::DaqStopReply &other) const override
Definition acquisitor.cpp:90
std::string getKeywords() const override
Definition acquisitor.cpp:70
std::string getId() const override
Definition acquisitor.cpp:62
void setId(const std::string &id) override
Definition acquisitor.cpp:66
std::unique_ptr< metadaqif::DaqStopReply > clone() const override
Definition acquisitor.cpp:94
std::unique_ptr< metadaqif::DaqStopReply > cloneKey() const override
Definition acquisitor.cpp:98
bool hasKey() const override
Definition acquisitor.cpp:86
std::vector< std::string > getFiles() const override
Definition acquisitor.cpp:78
void setKeywords(const std::string &kw) override
Definition acquisitor.cpp:74
Provides macros and utilities for exception handling.
@ Simple
Definition model.hpp:22
@ Composite
Definition model.hpp:22
@ Parallel
Definition model.hpp:22
@ Initial
Definition model.hpp:22
rad::StopToken StopToken
Definition stopToken.hpp:19
std::shared_ptr< typename EVENT::payload_t > GetPayloadNothrow(scxml4cpp::Context *c)
Definition stateMachineEngine.hpp:255
constexpr bool is_base_of_template_v
Definition utils.hpp:36
Definition acquisitor.cpp:14
Lifecycle of a basic 'RtcComponent'.
A simple Stop Token.
Life cycle extension to make RtcComponent Loopaware.
Definition loopaware.hpp:31
Life cycle extension to make RtcComponent Runnable.
Definition runnable.hpp:30
ModelBuilder(StateMachineEngine &engine)
Definition acquisitor.hpp:480
Life cycle extension for Acquisitor RtcComponent.
Definition acquisitor.hpp:189