MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/processing/acs/ManagedPiControlProcess.cpp

113 lines
2.3 KiB
C++
Raw Normal View History

/*
* ManagedPiControlProcess.cpp
*
* Created on: 14 <EFBFBD><EFBFBD><EFBFBD>. 2022 <EFBFBD>.
* Author: titov
*/
#include "ManagedPiControlProcess.hh"
void processing::acs::ManagedPiControlProcess::set( TypeInput error ) {
value_error = error;
if( isConnected() and not(proc_enable) ) {
regulator.recalculate( error, reset_value );
proc_enable = true;
}
}
processing::acs::ManagedPiControlProcess::TypeOutput processing::acs::ManagedPiControlProcess::get() const {
return reset_value;
}
void processing::acs::ManagedPiControlProcess::set_output(
SetInterface * output_interface ) {
if( not output_interface ) proc_enable = false;
output = output_interface;
}
vector::ITechValue & processing::acs::ManagedPiControlProcess::getLimit() {
return limit;
}
void processing::acs::ManagedPiControlProcess::setSampleTime( float ts_in_second ) {
regulator.setTime(ts_in_second);
}
void processing::acs::ManagedPiControlProcess::do_reset() {
proc_enable = false;
value_error = 0.0f;
regulator.reset(reset_value);
}
void processing::acs::ManagedPiControlProcess::process() {
if( not proc_enable )
return;
if( not update_lock.test_and_set() ) {
systemic::FlagStiker flag(update_lock);
value_output = regulator( value_error, not( operate ) );
output->set(value_output);
if( need_reset ) {
do_reset();
need_reset = false;
}
}
}
void processing::acs::ManagedPiControlProcess::reset() {
need_reset = true;
}
processing::acs::ManagedPiControlProcess::ManagedPiControlProcess(
Regulator & regulator, systemic::ISignal & current_value, systemic::IStatus & operate,
systemic::Parameter<Regulator> params ) : regulator(regulator),
reset_value(current_value),
value_error(0.0f), limit(regulator), operate(operate),
proc_enable(false), output(nullptr), value_output(0.0f), apply_params(regulator, params),
need_reset(false) { update_lock.clear(); }
bool processing::acs::ManagedPiControlProcess::isConnected() const {
return output;
}
void processing::acs::ManagedPiControlProcess::apply() {
if( not update_lock.test_and_set() ) {
systemic::FlagStiker flag(update_lock);
apply_params();
}
}