12#ifndef RTCTK_METADATACOLLECTOR_ACQUISITOR_HPP
13#define RTCTK_METADATACOLLECTOR_ACQUISITOR_HPP
15#include <Metadaqif.hpp>
17#include <rtctk/componentFramework/events.rad.hpp>
21#include <rtctk/metadataCollector/acquisitor.rad.hpp>
25using namespace rtctk::componentFramework;
27template <
typename Super>
30template <
typename Super>
40 const std::string& session_id,
41 const std::string& state_id);
53 std::string
getId()
const override;
55 void setId(
const std::string&
id)
override;
57 bool hasKey()
const override;
59 bool keyEquals(
const metadaqif::DaqReply& other)
const override;
61 std::unique_ptr<metadaqif::DaqReply>
clone()
const override;
63 std::unique_ptr<metadaqif::DaqReply>
cloneKey()
const override;
77 const std::vector<std::string>& files,
78 const std::string& kw);
80 std::string
getId()
const override;
82 void setId(
const std::string&
id)
override;
88 std::vector<std::string>
getFiles()
const override;
90 void setFiles(
const std::vector<std::string>& fs)
override;
92 bool hasKey()
const override;
94 bool keyEquals(
const metadaqif::DaqStopReply& other)
const override;
96 std::unique_ptr<metadaqif::DaqStopReply>
clone()
const override;
98 std::unique_ptr<metadaqif::DaqStopReply>
cloneKey()
const override;
102 std::vector<std::string> m_files;
113 std::string
getId()
const override;
115 void setId(
const std::string&
id)
override;
123 void setMessage(
const std::string& msg)
override;
129 metadaqif::DaqState
getState()
const override;
131 void setState(metadaqif::DaqState st)
override;
133 std::vector<std::string>
getFiles()
const override;
135 void setFiles(
const std::vector<std::string>& fs)
override;
137 bool hasKey()
const override;
139 bool keyEquals(
const metadaqif::DaqStatus& other)
const override;
141 std::unique_ptr<metadaqif::DaqStatus>
clone()
const override;
143 std::unique_ptr<metadaqif::DaqStatus>
cloneKey()
const override;
149 metadaqif::DaqState m_st;
150 std::vector<std::string> m_files;
165 ::elt::mal::future<std::shared_ptr<metadaqif::DaqReply>>
166 StartDaq(
const std::string&
id)
override;
168 ::elt::mal::future<std::shared_ptr<metadaqif::DaqStopReply>>
169 StopDaq(
const std::string&
id)
override;
171 ::elt::mal::future<std::shared_ptr<metadaqif::DaqReply>>
172 AbortDaq(
const std::string&
id)
override;
174 ::elt::mal::future<std::shared_ptr<metadaqif::DaqStatus>>
178 log4cplus::Logger& m_logger;
188template <
typename Super>
190 static_assert(std::is_base_of_v<RtcComponent, Super>,
"'Acquisitor' requires 'RtcComponent'");
207 using Super::InputStage::InputStage;
210 Super::InputStage::Start();
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();
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();
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();
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();
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");
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");
274 [
this](
auto c) { m_acquisition_history.clear(); });
278 engine.
RegisterGuard(
"GuardPreparingAllowed", [
this](
auto c) {
280 auto id = req->GetRequestPayload();
282#ifdef FEATURE_REQUIRE_UNIQUE_ID_FOR_NEW_SESSION
283 return m_acquisition_history.count(
id) == 0;
291 m_active_id = m_tmp_start_request->GetRequestPayload();
292 std::string
id = m_active_id.value();
296 status.
setState(metadaqif::Acquiring);
298 m_acquisition_history[id] = status;
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;
310 if (m_tmp_start_request) {
311 std::string
id = m_active_id.value();
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;
324 engine.
RegisterGuard(
"GuardFinalisingAllowed", [
this](
auto c) {
326 auto id = req->GetRequestPayload();
327 return m_active_id.value() == id;
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());
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;
349 if (m_tmp_stop_request) {
350 std::string
id = m_active_id.value();
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;
363 engine.
RegisterGuard(
"GuardAbortingAllowed", [
this](
auto c) {
365 auto id = req->GetRequestPayload();
366 return m_active_id.value() == id;
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;
387 auto id = request->GetRequestPayload();
389 if (m_acquisition_history.count(
id)) {
390 request->SetReplyValue(std::move(m_acquisition_history.at(
id).clone()));
392 auto status = std::make_shared<DaqStatus>();
394 status->setState(metadaqif::NotStarted);
395 status->setTimestamp(0);
396 request->SetReplyValue(status);
403 std::string
id = m_active_id.value();
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);
416 std::string
id = m_active_id.value();
417 static_cast<BizLogicIf&
>(this->m_logic).ActivityPreparing(stop_token,
id);
419 this->m_success_handler,
420 this->m_error_handler);
423 "ActivityFinalising",
425 std::string
id = m_active_id.value();
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());
432 this->m_success_handler,
433 this->m_error_handler);
438 static_cast<BizLogicIf&
>(this->m_logic).ActivityAcquiring(stop_token);
441 this->m_error_handler);
446 static_cast<BizLogicIf&
>(this->m_logic).ActivityAborting(stop_token);
448 this->m_success_handler,
449 this->m_error_handler);
452 "ActivityRecovering",
454 static_cast<BizLogicIf&
>(this->m_logic).ActivityRecovering(stop_token);
456 this->m_success_handler,
457 this->m_error_handler);
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();
467 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqReply>, std::string>>
469 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqStopReply>, std::string>>
471 std::shared_ptr<rad::cii::Request<std::shared_ptr<metadaqif::DaqReply>, std::string>>
473 std::map<std::string, DaqStatus> m_acquisition_history;
475 std::optional<std::string> m_active_id;
482 this->mm.ModStateType(
"On::Operational",
Parallel);
484 const std::string parent_region =
"On::Operational:";
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");
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");
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
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
Lifecycle of a basic 'RtcComponent'.
Life cycle extension to make RtcComponent Loopaware.
Definition loopaware.hpp:31
Life cycle extension to make RtcComponent Runnable.
Definition runnable.hpp:30