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