| #pragma once |
| |
| #include "controller.hpp" |
| #include "ec/pid.hpp" |
| #include "fan.hpp" |
| |
| #include <limits> |
| #include <memory> |
| #include <vector> |
| |
| namespace pid_control |
| { |
| |
| class ZoneInterface; |
| |
| /* |
| * Base class for PID controllers. Each PID that implements this needs to |
| * provide an inputProc, setptProc, and outputProc. |
| */ |
| class PIDController : public Controller |
| { |
| public: |
| PIDController(const std::string& id, ZoneInterface* owner) : |
| Controller(), _owner(owner), _id(id) |
| { |
| _pid_info.initialized = false; |
| _pid_info.ts = static_cast<double>(0.0); |
| _pid_info.integral = static_cast<double>(0.0); |
| _pid_info.lastOutput = static_cast<double>(0.0); |
| _pid_info.proportionalCoeff = static_cast<double>(0.0); |
| _pid_info.integralCoeff = static_cast<double>(0.0); |
| _pid_info.feedFwdOffset = static_cast<double>(0.0); |
| _pid_info.feedFwdGain = static_cast<double>(0.0); |
| _pid_info.integralLimit.min = static_cast<double>(0.0); |
| _pid_info.integralLimit.max = static_cast<double>(0.0); |
| _pid_info.outLim.min = static_cast<double>(0.0); |
| _pid_info.outLim.max = static_cast<double>(0.0); |
| _pid_info.slewNeg = static_cast<double>(0.0); |
| _pid_info.slewPos = static_cast<double>(0.0); |
| _pid_info.negativeHysteresis = static_cast<double>(0.0); |
| _pid_info.positiveHysteresis = static_cast<double>(0.0); |
| } |
| |
| virtual ~PIDController() |
| {} |
| |
| virtual double inputProc(void) override = 0; |
| virtual double setptProc(void) = 0; |
| virtual void outputProc(double value) override = 0; |
| |
| void process(void) override; |
| |
| std::string getID(void) override |
| { |
| return _id; |
| } |
| double getSetpoint(void) |
| { |
| return _setpoint; |
| } |
| void setSetpoint(double setpoint) |
| { |
| _setpoint = setpoint; |
| } |
| |
| ec::pid_info_t* getPIDInfo(void) |
| { |
| return &_pid_info; |
| } |
| |
| double getLastInput(void) |
| { |
| return lastInput; |
| } |
| |
| protected: |
| ZoneInterface* _owner; |
| std::string _id; |
| |
| private: |
| // parameters |
| ec::pid_info_t _pid_info; |
| double _setpoint = 0; |
| double lastInput = std::numeric_limits<double>::quiet_NaN(); |
| }; |
| |
| } // namespace pid_control |