/* * FailureManager.h * * Created on: 8 окт. 2019 г. * Author: titov */ #ifndef SOURCE_APPLICATION_SAFETY_FAILUREMANAGERSETUP_H_ #define SOURCE_APPLICATION_SAFETY_FAILUREMANAGERSETUP_H_ #include "../ISetupStep.hh" #include "../../driver/safety/ITermination.hh" #include namespace application { namespace safety { //!Менеджер отказов. Контролирует процедуру сброса и реакции системы на отказы. struct FailureManager : public ISetupStep { typedef driver::safety::ITermination Terminator; Terminator * terminator = nullptr; std::pmr::memory_resource * memory = nullptr; struct Links { Environment::Id setup_memory; //!<Указатель на память, которая будет использованна для динамических структур данных. Environment::Id terminator; //!<Модуль реализующий реакцию системы на отказ и восстановление работы. Environment::Id failure_manager; //!<Менеджер отказов. Environment::Id failure_registration; //!<Интерфейс регистрации отказов. Environment::Id fault_log; //!<Журнал отказов. Environment::StatusId failure_stored; //!<Признак наличия "сохраненных" отказов. Environment::StatusId failure_actual; //!<Признак наличия "текущих" отказов. Environment::Id ack; //!<Действия сброса отказов. }; bool input( Environment & env ); void build( Environment & env ); const Links & links; const configuration::ProcessConfig & params; FailureManager( const Links & links, const configuration::ProcessConfig & params ) : links(links), params(params) {} }; } } #include "../../processing/failure/FailureManager.hh" #include "../../processing/failure/FailureLogger.hh" #include "../../systemic/StatusLazyFast.hpp" #include "../../systemic/FunctorLazyFast.hpp" inline bool application::safety::FailureManager::input( Environment & env ) { return grab( terminator, env.rholder.getShared( links.terminator ) ) and grab( memory, env.rholder.getShared( links.setup_memory ) ); } inline void application::safety::FailureManager::build( Environment & env ) { Local lmem( memory, *env.rholder.getShared( links.setup_memory ) ); typedef processing::failure::FailureManager FM; FM * fm = memories::instance_object(env.static_object_ma, *terminator, memory ); env.rholder.share( *fm, links.failure_manager ); env.rholder.share( *fm, links.failure_registration ); typedef processing::failure::FailureLogger FL; FL * fl = memories::instance_object(env.static_object_ma, *fm ); systemic::ProcScheduler::ProcessParameter proc = { .priority = params.priority, .period = params.period, .phase = params.phase, .controlled = false }; env.scheduler.registerProcess( params.processor_id, *fl, proc ); env.rholder.share( *fl, links.fault_log ); typedef systemic::detail::StatusLazyFast FailureActual; FailureActual * failure_actual = memories::instance_object( env.static_setup_ma, *fm ); env.statuses.add( links.failure_actual, failure_actual ); typedef systemic::detail::StatusLazyFast FailureStored; FailureStored * failure_stored = memories::instance_object( env.static_setup_ma, *fm ); env.statuses.add( links.failure_stored, failure_stored ); typedef systemic::detail::FunctorLazyFast FailureAck; FailureAck::Function function = &FM::acknowledge; FailureAck * failure_ack = memories::instance_object( env.static_setup_ma, *fm, function ); typedef systemic::IFunctor Action; env.rholder.share< Action >( *failure_ack, links.ack ); } #endif /* SOURCE_APPLICATION_SAFETY_FAILUREMANAGERSETUP_H_ */