13#ifndef RTCTK_COMPONENTFRAMEWORK_OPTIMISABLE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_OPTIMISABLE_HPP
43 explicit OptimiseContext(rad::cii::Request<std::string, std::string>
const& request)
44 : m_logger(
GetLogger(
"rtctk")), m_request(request), m_arg() {
45 m_arg = JsonPayload::parse(m_request.GetRequestPayload());
64 }
catch (std::exception
const& exception) {
66 m_logger,
"OptimiseContext::SendReply: Failed to send reply: " << exception.what());
70 "OptimiseContext::SendReply: Failed to send reply with unknown exception.");
87 log4cplus::Logger& m_logger;
90 rad::cii::Request<std::string, std::string> m_request;
127template <
typename Super>
129 static_assert(std::is_base_of_v<RtcComponent, Super>,
"'Optimisable' requires 'RtcComponent'");
168 using Super::InputStage::InputStage;
171 Super::InputStage::Start();
188 this->m_engine.PostEvent(std::make_unique<events::OptimiseDone>());
192 this->m_engine.PostEvent(std::make_unique<events::OptimiseError>(std::move(eptr)));
197 this->m_no_disable_in_states.push_back(
"On::Operational:Optimise:Busy");
201 this->m_no_update_in_states.push_back(
"On::Operational:Optimise:Busy");
210 "GuardOptimisingAllowed", [
this](events::Optimise
const& ev) ->
bool {
219 auto act_state = this->m_engine.GetState();
221 if (act_state.find(s) != std::string::npos) {
227 .GuardOptimisingAllowed(ctx.
GetArg())) {
241 "ActivityOptimising",
252 [
this](events::OptimiseDone
const&) {
259 "ActionOptimisingFailed", [
this](events::OptimiseError
const& ev) {
279 this->mm.ModStateType(
"On::Operational",
Parallel);
281 this->mm.AddState(
Composite,
"On::Operational:Optimise:",
"On::Operational");
282 this->mm.AddState(
Initial,
"On::Operational:Optimise:Initial",
"On::Operational:Optimise:");
283 this->mm.AddState(
Simple,
"On::Operational:Optimise:Idle",
"On::Operational:Optimise:");
284 this->mm.AddState(
Simple,
"On::Operational:Optimise:Busy",
"On::Operational:Optimise:",
"ActivityOptimising");
286 this->mm.AddTrans(
"On::Operational:Optimise:Initial" ,
"On::Operational:Optimise:Idle" );
287 this->mm.AddTrans(
"On::Operational:Optimise:Idle" ,
"On::Operational:Optimise:Busy", events::Optimise::ID,
"GuardOptimisingAllowed");
288 this->mm.AddTrans(
"On::Operational:Optimise:Busy" ,
"On::Operational:Optimise:Idle", events::OptimiseDone::ID,
"",
"ActionOptimisingDone");
289 this->mm.AddTrans(
"On::Operational:Optimise:Busy" ,
"On::Operational:Optimise:Idle", events::OptimiseError::ID,
"",
"ActionOptimisingFailed");
Adapter object intended to be used in contexts without direct access to the output-stream object.
Definition: exceptions.hpp:185
static void Register(CommandReplier &replier, StateMachineEngine &engine)
Definition: optCmdsImpl.hpp:37
Business logic interface for Optimisable mixin.
Definition: optimisable.hpp:135
virtual bool GuardOptimisingAllowed(JsonPayload const &arg)
Determines if optimising is possible at this time with the provided argument.
Definition: optimisable.hpp:158
virtual void ActivityOptimising(StopToken st, JsonPayload const &arg)
Activity executed in its own thread that performs the requested optimization.
Definition: optimisable.hpp:147
Definition: optimisable.hpp:275
ModelBuilder(StateMachineEngine &engine)
Definition: optimisable.hpp:277
Definition: optimisable.hpp:180
std::optional< detail::OptimiseContext > m_optimise_ctx
Definition: optimisable.hpp:266
OutputStage(StateMachineEngine &engine, BizLogicIf &bl)
Definition: optimisable.hpp:182
std::function< void()> m_optimise_success_handler
Definition: optimisable.hpp:267
std::function< void(std::exception_ptr)> m_optimise_error_handler
Definition: optimisable.hpp:268
std::list< std::string > m_no_optimise_in_states
Definition: optimisable.hpp:269
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
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 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 optimise request to completion.
Definition: optimisable.hpp:35
OptimiseContext(rad::cii::Request< std::string, std::string > const &request)
Construct context with provided request.
Definition: optimisable.hpp:43
void SendErrorReply(std::exception_ptr eptr) noexcept
Send exceptional reply.
Definition: optimisable.hpp:79
OptimiseContext(OptimiseContext &&) noexcept=default
void SendReply() noexcept
Sends hardcoded string reply.
Definition: optimisable.hpp:61
JsonPayload const & GetArg() const noexcept
Definition: optimisable.hpp:52
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.
Definition: commandReplier.cpp:22
const std::string STD_OK_REPLY
Definition: stdComponent.hpp:86
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
Implementation of MAL commands for layer 'Optimisable'.
Lifecycle of a basic 'RtcComponent'.
Life cycle extension to make RtcComponent Optimisable.
Definition: optimisable.hpp:128