/* * InverterDebug.cpp * * Created on: 4 апр. 2017 г. * Author: titov */ #include "InverterDebug.hh" #include #include technological::function::InverterDebug::InverterDebug( peripheral::IPwmOverride & u, peripheral::IPwmOverride & v, peripheral::IPwmOverride & w, ResourceKeeper & inv ) : pwm_u(u), pwm_v(v), pwm_w(w), inverter_resource(inv), inverter(nullptr) {} bool technological::function::InverterDebug::validate( Input & input ) { using namespace std; return ( ( input.time_a >= -1.0f && input.time_a <= 1.0f ) || isnan(input.time_a) ) && ( ( input.time_b >= -1.0f && input.time_b <= 1.0f ) || isnan(input.time_b) ) && ( ( input.time_c >= -1.0f && input.time_c <= 1.0f ) || isnan(input.time_c) ); } void technological::function::InverterDebug::prepare_time( const Input & input, float (& time)[3] ) { using namespace std; if( isnan(input.time_a) ) { pwm_u.overrideDisableOutput(); time[0] = 0.0f; } else { pwm_u.resetOverride(); time[0] = input.time_a; } if( isnan(input.time_b) ) { pwm_v.overrideDisableOutput(); time[1] = 0.0f; } else { pwm_v.resetOverride(); time[1] = input.time_b; } if( isnan(input.time_c) ) { pwm_w.overrideDisableOutput(); time[2] = 0.0f; } else { pwm_w.resetOverride(); time[2] = input.time_c; } } bool technological::function::InverterDebug::run( const char * value, std::size_t size ) { using namespace std; if( size != sizeof(Input) ) return false; Input input; std::memcpy( &input, value, size ); if( not validate(input) ) return false; if( not inverter ) { Local local_inverter( &inverter_resource ); if( local_inverter ) { float time[3]; prepare_time( input, time ); local_inverter->enPulse(); local_inverter->pwm( time[0], time[1], time[2] ); local_inverter.release( inverter ); } } else { float time[3]; prepare_time( input, time ); inverter->enPulse(); inverter->pwm( time[0], time[1], time[2] ); } return inverter; } void technological::function::InverterDebug::stop() { if( inverter ) { pwm_u.resetOverride(); pwm_v.resetOverride(); pwm_w.resetOverride(); inverter->disPulse(); inverter_resource.release( inverter ); } } short technological::function::InverterDebug::getState() const { return inverter ? ITechFunction::EXECUTE : ITechFunction::DISABLE; } technological::function::InverterDebug::~InverterDebug() noexcept { inverter_resource.release( inverter ); }