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

142 lines
2.5 KiB
C++
Raw Permalink Normal View History

/*
* PhaseSpaceLimit.cpp
*
* Created on: 10 <EFBFBD><EFBFBD><EFBFBD>. 2020 <EFBFBD>.
* Author: LeonidTitov
*/
#include "PhaseSpaceLimit.hh"
#include <cmath>
void processing::acs::PhaseSpaceLimit::set( TypeInput phaseSpacePoint ) {
if( isConnected() ) {
bool limited = false;
if( phaseSpacePoint.value > h_t ) {
phaseSpacePoint.value = h_t;
if( phaseSpacePoint.d_value > 0 )
phaseSpacePoint.d_value = 0;
limited = true;
}
if( phaseSpacePoint.value < l_t ) {
phaseSpacePoint.value = l_t;
if( phaseSpacePoint.d_value < 0 )
phaseSpacePoint.d_value = 0;
limited = true;
}
limited_flag = limited;
limited_value = phaseSpacePoint;
output->set( phaseSpacePoint );
}
}
processing::acs::PhaseSpaceLimit::TypeOutput processing::acs::PhaseSpaceLimit::get() const {
return limited_value;
}
void processing::acs::PhaseSpaceLimit::set_output( SetInterface * new_output ) {
output = new_output;
}
void processing::acs::PhaseSpaceLimit::reset() {
limited_value = TypeOutput( NAN, NAN );
limited_flag = false;
}
vector::ITechValue & processing::acs::PhaseSpaceLimit::getUpperLimit() {
return upper;
}
vector::ITechValue & processing::acs::PhaseSpaceLimit::getLowerLimit() {
return lower;
}
void processing::acs::PhaseSpaceLimit::apply() {
if( upper.value > lower.value ) {
h_t = upper.value;
l_t = lower.value;
range_valid = true;
} else {
if( upper.value == lower.value) {
h_t = l_t = upper.value;
} else {
h_t = 0.0f;
l_t = 0.0f;
}
range_valid = false;
}
}
const bool & processing::acs::PhaseSpaceLimit::valid_range() const {
return range_valid;
}
const bool& processing::acs::PhaseSpaceLimit::is_limited() const {
return limited_flag;
}
void processing::acs::PhaseSpaceLimit::configure( Setting & config ) {
upper.value = config.upper_limit;
lower.value = config.lower_limit;
apply();
}
bool processing::acs::PhaseSpaceLimit::Setting::isValid() {
using namespace std;
return upper_limit >= lower_limit;
}
processing::acs::PhaseSpaceLimit::PhaseSpaceLimit() :
range_valid(false), limited_flag(false), lower(), upper(),
h_t(NAN), l_t(NAN), limited_value(NAN, NAN), output(nullptr) {}
bool processing::acs::PhaseSpaceLimit::isConnected() const {
return output;
}