1 #pragma once 2 3 #include "controller.hpp" 4 #include "ec/pid.hpp" 5 #include "fan.hpp" 6 7 #include <limits> 8 #include <memory> 9 #include <vector> 10 11 namespace pid_control 12 { 13 14 class ZoneInterface; 15 16 /* 17 * Base class for PID controllers. Each PID that implements this needs to 18 * provide an inputProc, setptProc, and outputProc. 19 */ 20 class PIDController : public Controller 21 { 22 public: 23 PIDController(const std::string& id, ZoneInterface* owner) : 24 Controller(), _owner(owner), _id(id) 25 { 26 _pid_info.initialized = false; 27 _pid_info.checkHysterWithSetpt = false; 28 _pid_info.ts = static_cast<double>(0.0); 29 _pid_info.integral = static_cast<double>(0.0); 30 _pid_info.lastOutput = static_cast<double>(0.0); 31 _pid_info.proportionalCoeff = static_cast<double>(0.0); 32 _pid_info.integralCoeff = static_cast<double>(0.0); 33 _pid_info.derivativeCoeff = static_cast<double>(0.0); 34 _pid_info.feedFwdOffset = static_cast<double>(0.0); 35 _pid_info.feedFwdGain = static_cast<double>(0.0); 36 _pid_info.integralLimit.min = static_cast<double>(0.0); 37 _pid_info.integralLimit.max = static_cast<double>(0.0); 38 _pid_info.outLim.min = static_cast<double>(0.0); 39 _pid_info.outLim.max = static_cast<double>(0.0); 40 _pid_info.slewNeg = static_cast<double>(0.0); 41 _pid_info.slewPos = static_cast<double>(0.0); 42 _pid_info.negativeHysteresis = static_cast<double>(0.0); 43 _pid_info.positiveHysteresis = static_cast<double>(0.0); 44 } 45 46 virtual ~PIDController() {} 47 48 virtual double inputProc(void) override = 0; 49 virtual double setptProc(void) = 0; 50 virtual void outputProc(double value) override = 0; 51 52 void process(void) override; 53 54 std::string getID(void) override 55 { 56 return _id; 57 } 58 double getSetpoint(void) 59 { 60 return _setpoint; 61 } 62 void setSetpoint(double setpoint) 63 { 64 _setpoint = setpoint; 65 } 66 67 ec::pid_info_t* getPIDInfo(void) 68 { 69 return &_pid_info; 70 } 71 72 double getLastInput(void) 73 { 74 return lastInput; 75 } 76 77 double calPIDOutput(double setpt, double input, ec::pid_info_t* info); 78 79 protected: 80 ZoneInterface* _owner; 81 std::string _id; 82 83 private: 84 // parameters 85 ec::pid_info_t _pid_info; 86 double _setpoint = 0; 87 double lastInput = std::numeric_limits<double>::quiet_NaN(); 88 }; 89 90 } // namespace pid_control 91