/* * AddGpioOverrideTermination.h * * Created on: 8 окт. 2019 г. * Author: titov */ #ifndef SOURCE_APPLICATION_SAFETY_ADDGPIOOVERRIDETERMINATION_H_ #define SOURCE_APPLICATION_SAFETY_ADDGPIOOVERRIDETERMINATION_H_ #include "../ISetupStep.hh" #include "../../driver/safety/FailureTermination.hh" #include "../../peripheral/IGpioOverride.hh" namespace application { namespace safety { //!Добавить вывод для перезаписи. struct AddGpioOverrideTermination : public ISetupStep { typedef driver::safety::FailureTermination FT; FT * terminator = nullptr; peripheral::IGpioOverride * gpio_override = nullptr; struct Links { Environment::Id failure_term_id; //!<Идентификатор прерывателя работы по отказу. Environment::GpioId gpio_override_id; //!<Вывод, который необходимо перезаписать при отказе. }; struct Setting { uint16_t gpio_state; //!<Состояние gpio для перезаписи. }; bool input( Environment & env ); void build( Environment & env ); const Links & links; const Setting & setting; AddGpioOverrideTermination( const Links & links, const Setting & setting ) : links(links), setting(setting) {} }; } } inline bool application::safety::AddGpioOverrideTermination::input( Environment & env ) { return grab( terminator, env.rholder.getShared(links.failure_term_id) ) and grab( gpio_override, env.rholder.getShared(links.gpio_override_id) ); } inline void application::safety::AddGpioOverrideTermination::build( Environment & env ) { Local term( terminator, *env.rholder.getShared(links.failure_term_id) ); Local gpio( gpio_override, *env.rholder.getShared(links.gpio_override_id) ); peripheral::IGpioOverride::TOutValue value = setting.gpio_state == 0 ? peripheral::IGpioOverride::hi_z : setting.gpio_state == 1 ? peripheral::IGpioOverride::high : peripheral::IGpioOverride::low; term->addTerminate( gpio_override, value ); } #endif /* SOURCE_APPLICATION_SAFETY_ADDGPIOOVERRIDETERMINATION_H_ */