MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/technological/function/InverterDebug.cpp

128 lines
2.8 KiB
C++

/*
* InverterDebug.cpp
*
* Created on: 4 àïð. 2017 ã.
* Author: titov
*/
#include "InverterDebug.hh"
#include <cmath>
#include <cstring>
technological::function::InverterDebug::InverterDebug( peripheral::IPwmOverride & u, peripheral::IPwmOverride & v, peripheral::IPwmOverride & w,
ResourceKeeper<driver::IInverter> & 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<driver::IInverter> 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 );
}