13#ifndef RTCTK_COMPONENTFRAMEWORK_MEASURABLE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_MEASURABLE_HPP
46 explicit MeasureContext(rad::cii::Request<std::string, std::string>
const& request)
47 : m_logger(
GetLogger(
"rtctk")), m_request(request), m_arg() {
48 m_arg = JsonPayload::parse(m_request.GetRequestPayload());
63 m_result = result.dump();
73 m_request.SetReplyValue(m_result);
74 }
catch (std::exception
const& exception) {
76 m_logger,
"MeasureContext::SendReply: Failed to send reply: " << exception.what());
80 "MeasureContext::SendReply: Failed to send reply with unknown exception.");
93 "MeasureContext::SendErrorReply: Failed to send reply: " << exception.what());
97 "MeasureContext::SendErrorReply: Failed to send reply with unknown exception.");
102 log4cplus::Logger& m_logger;
103 rad::cii::Request<std::string, std::string> m_request;
111 std::string m_result;
150template <
typename Super>
152 static_assert(std::is_base_of_v<RtcComponent, Super>,
"'Measurable' requires 'RtcComponent'");
196 using Super::InputStage::InputStage;
199 Super::InputStage::Start();
216 this->m_engine.PostEvent(std::make_unique<events::MeasureDone>());
220 this->m_engine.PostEvent(std::make_unique<events::MeasureError>(std::move(eptr)));
225 this->m_no_disable_in_states.push_back(
"On::Operational:Measure:Busy");
229 this->m_no_update_in_states.push_back(
"On::Operational:Measure:Busy");
238 "GuardMeasuringAllowed", [
this](events::Measure
const& ev) {
247 auto act_state = this->m_engine.GetState();
249 if (act_state.find(s) != std::string::npos) {
255 .GuardMeasuringAllowed(ctx.
GetArg())) {
271 .ActivityMeasuring(std::move(stop_token),
m_measure_ctx->GetArg());
286 "ActionMeasuringFailed", [
this](events::MeasureError
const& ev) {
308 this->mm.ModStateType(
"On::Operational",
Parallel);
310 this->mm.AddState(
Composite,
"On::Operational:Measure:",
"On::Operational");
311 this->mm.AddState(
Initial,
"On::Operational:Measure:Initial",
"On::Operational:Measure:");
312 this->mm.AddState(
Simple,
"On::Operational:Measure:Idle",
"On::Operational:Measure:");
313 this->mm.AddState(
Simple,
"On::Operational:Measure:Busy",
"On::Operational:Measure:",
"ActivityMeasuring");
315 this->mm.AddTrans(
"On::Operational:Measure:Initial" ,
"On::Operational:Measure:Idle" );
316 this->mm.AddTrans(
"On::Operational:Measure:Idle" ,
"On::Operational:Measure:Busy", events::Measure::ID,
"GuardMeasuringAllowed");
317 this->mm.AddTrans(
"On::Operational:Measure:Busy" ,
"On::Operational:Measure:Idle", events::MeasureDone::ID,
"",
"ActionMeasuringDone");
318 this->mm.AddTrans(
"On::Operational:Measure:Busy" ,
"On::Operational:Measure:Idle", events::MeasureError::ID,
"",
"ActionMeasuringFailed");
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: measCmdsImpl.hpp:37
Business logic interface for Measurable mixin.
Definition: measurable.hpp:158
virtual bool GuardMeasuringAllowed(JsonPayload const &arg)
Determines if measurement is possible at this time with the provided argument.
Definition: measurable.hpp:186
virtual JsonPayload ActivityMeasuring(StopToken stop_token, JsonPayload const &arg)
Activity executed in its own thread that peforms the requested measurement specified by JSON argument...
Definition: measurable.hpp:172
Definition: measurable.hpp:304
ModelBuilder(StateMachineEngine &engine)
Definition: measurable.hpp:306
Definition: measurable.hpp:208
std::function< void()> m_measure_success_handler
Definition: measurable.hpp:296
std::function< void(std::exception_ptr)> m_measure_error_handler
Definition: measurable.hpp:297
std::optional< detail::MeasureContext > m_measure_ctx
Context storage used for each accepted Measure request.
Definition: measurable.hpp:295
std::list< std::string > m_no_measure_in_states
Definition: measurable.hpp:298
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition: measurable.hpp:210
Adapter object intended to be used in contexts without direct access to the output-stream object.
Definition: exceptions.hpp:185
Thrown if the command was accepted but the task to run failed.
Definition: rtcComponent.hpp:53
Thrown if a command is not allowed in current state or guard.
Definition: rtcComponent.hpp:40
The RtctkException class is the base class for all Rtctk exceptions.
Definition: exceptions.hpp:237
Definition: stateMachineEngine.hpp:35
void RegisterRejectHandler(std::string const &id, RejectMethod reject)
Register reject handler.
Definition: stateMachineEngine.cpp:131
void RegisterActivity(std::string const &id, ActivityMethod activity, SuccessMethod on_success, FailureMethod on_failure)
Register activity.
Definition: stateMachineEngine.cpp:123
void RegisterGuardStatic(std::string const &id, std::function< bool(Event const &)> guard)
Register guard for statically known event type.
Definition: stateMachineEngine.hpp:126
void RegisterAction(std::string const &id, ActionMethod action)
Register action.
Definition: stateMachineEngine.cpp:86
void RegisterActionStatic(std::string const &id, std::function< void(Event const &)> action)
Register action for statically known event type.
Definition: stateMachineEngine.hpp:93
Holds context necessary for processing a measure request to completion.
Definition: measurable.hpp:38
void SendErrorReply(std::exception_ptr eptr) noexcept
If reply is pending, set exception to the provided value.
Definition: measurable.hpp:87
void SetResult(JsonPayload const &result)
Sets serialized reply from JSON payload, but does not send it.
Definition: measurable.hpp:62
MeasureContext(rad::cii::Request< std::string, std::string > const &request)
Construct context with provided request.
Definition: measurable.hpp:46
MeasureContext(MeasureContext &&) noexcept=default
JsonPayload const & GetArg() const noexcept
Definition: measurable.hpp:52
void SendReply() noexcept
Send reply using result set with SetResult().
Definition: measurable.hpp:71
Provides macros and utilities for exception handling.
log4cplus::Logger & GetLogger(const std::string &name="app")
Get handle to a specific logger.
Definition: logger.cpp:180
Defines the JSON payload type JsonPayload.
Logging Support Library based on log4cplus.
Implementation of MAL commands for layer 'Measurable'.
Definition: commandReplier.cpp:22
nlohmann::json JsonPayload
Type requirements:
Definition: jsonPayload.hpp:25
rad::StopToken StopToken
Definition: stopToken.hpp:20
@ Simple
Definition: model.hpp:22
@ Composite
Definition: model.hpp:22
@ Parallel
Definition: model.hpp:22
@ Initial
Definition: model.hpp:22
Lifecycle of a basic 'RtcComponent'.
Life cycle extension to make RtcComponent Measurable.
Definition: measurable.hpp:151