73 lines
2.3 KiB
C++
73 lines
2.3 KiB
C++
/*
|
||
* 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<FT>(links.failure_term_id) )
|
||
and grab( gpio_override, env.rholder.getShared<peripheral::IGpioOverride>(links.gpio_override_id) );
|
||
|
||
}
|
||
|
||
inline void application::safety::AddGpioOverrideTermination::build(
|
||
Environment & env ) {
|
||
|
||
Local<FT> term( terminator, *env.rholder.getShared<FT>(links.failure_term_id) );
|
||
Local<peripheral::IGpioOverride> gpio( gpio_override, *env.rholder.getShared<peripheral::IGpioOverride>(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_ */
|