MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/safety/FailureTermination.cpp

76 lines
1.8 KiB
C++

/*
* FailureTermination.cpp
*
* Created on: 4 îêò. 2019 ã.
* Author: titov
*/
#include "FailureTermination.hh"
driver::safety::FailureTermination::FailureTermination(
std::pmr::memory_resource * memory ) : gpios( Gpios::allocator_type(memory) ),
pwms( Pwms::allocator_type(memory) ), terminated(false) {}
void driver::safety::FailureTermination::addTerminate( peripheral::IPwmOverride * pwm ) {
pwms.push_back(pwm);
if( terminated ) {
pwm->setupOverride();
pwm->overrideDisableOutput();
}
}
void driver::safety::FailureTermination::addTerminate(
peripheral::IGpioOverride * gpio, peripheral::IGpioOverride::TOutValue value ) {
gpios.push_back( std::make_pair(gpio, value) );
if( terminated ) {
gpio->setupOverride();
gpio->setOverrideValue( value );
}
}
void driver::safety::FailureTermination::terminate() {
for( Pwms::iterator iter = pwms.begin(); iter != pwms.end(); ++iter ) {
peripheral::IPwmOverride & pwm = **iter;
pwm.setupOverride();
pwm.overrideDisableOutput();
}
for( Gpios::iterator iter = gpios.begin(); iter != gpios.end(); ++iter ) {
peripheral::IGpioOverride & gpio = *iter->first;
gpio.setupOverride();
gpio.setOverrideValue( iter->second );
}
terminated = true;
}
void driver::safety::FailureTermination::recovery() {
terminated = false;
for( Pwms::iterator iter = pwms.begin(); iter != pwms.end(); ++iter ) {
peripheral::IPwmOverride & pwm = **iter;
pwm.resetOverride();
}
for( Gpios::iterator iter = gpios.begin(); iter != gpios.end(); ++iter ) {
peripheral::IGpioOverride & gpio = *iter->first;
gpio.resetOverride();
}
}
bool driver::safety::FailureTermination::isTerminated() const {
return terminated;
}