MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/technological/commissioning/ThetaNullEstimate.hh

130 lines
3.1 KiB
C++
Raw Normal View History

/*
* ThetaNullEstimate.h
*
* Created on: 23 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2016 <EFBFBD>.
* Author: titov
*/
#ifndef SOURCE_COMMISSIONING_THETANULLESTIMATE_H_
#define SOURCE_COMMISSIONING_THETANULLESTIMATE_H_
#include "../../algorithm/LinearRegression.hh"
#include "../../math/math_inc.hh"
#include <algorithm>
#include <memory_resource>
namespace technological { namespace commissioning {
//todo: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
class ThetaNullEstimate {
public:
struct TSetting {
float Ts;
float Np;
float valid_mismatch_theta_1;
float valid_error;
bool isValid() const {
return Ts > 0.0f
&& Np > 0
&& Np < 128
and valid_mismatch_theta_1 > 0
and valid_error > 0;
}
};
private:
enum TDirection {
forward,
backward
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
bool enable;
bool data_collection;
bool data_analysis;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int sector_setpoint; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1/6 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>).
unsigned int Np; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
float speed; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
float Ts; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
TDirection direction;
unsigned long count_rise; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
unsigned long count_next; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int sector; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
unsigned long count; //!<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
algorithm::LinearRegression * null_calculator;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
float errorEstimate;
float totalError; //!<<3C><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
float previous_feedback;
float delta_previous;
std::pmr::monotonic_buffer_resource * buff_resource;
private:
void add_data(float theta_feedback);
float calc_null_result() const {
const unsigned int start_k = 0;
return (null_calculator->getTheta(0)
+ null_calculator->getTheta(1) * start_k);
}
bool check_valid_result() const {
return null_calculator->getTheta(1) < ( math::constants::pi_3 + errorEstimate )
&& null_calculator->getTheta(1) > ( math::constants::pi_3 - errorEstimate )
and std::abs( null_calculator->getError() ) < totalError;
}
public:
ThetaNullEstimate();
bool setBuffer( std::pmr::monotonic_buffer_resource * buffer );
void resetBuffer();
bool configure(const TSetting & setting);
bool start(float average_speed, unsigned int number_sector, float rise_to_hold);
void stop();
void execute(float theta_feedback, float & iota);
void process();
bool isDataCollection() const {return enable && data_collection;}
bool isDataCollected() const {return enable && not data_collection;}
bool isDataAnalysis() const {return enable && data_analysis;}
bool isDataReady() const {return enable && null_calculator && null_calculator->isFull();}
bool isDataFailure() const {return enable && !data_collection && null_calculator && !null_calculator->isFull();}
bool isCalcReady() const {return enable && null_calculator && null_calculator->isFinish();}
float get_result() const {
if(null_calculator && check_valid_result())
return calc_null_result();
else
return NAN;
}
};
}}
#endif /* SOURCE_COMMISSIONING_THETANULLESTIMATE_H_ */