xref: /openbmc/phosphor-pid-control/pid/pidcontroller.hpp (revision 572c43dab62f9e207781b96e7e48b7b38ca024e5)
1  #pragma once
2  
3  #include "controller.hpp"
4  #include "ec/pid.hpp"
5  #include "fan.hpp"
6  
7  #include <memory>
8  #include <vector>
9  
10  class ZoneInterface;
11  
12  /*
13   * Base class for PID controllers.  Each PID that implements this needs to
14   * provide an inputProc, setptProc, and outputProc.
15   */
16  class PIDController : public Controller
17  {
18    public:
19      PIDController(const std::string& id, ZoneInterface* owner) :
20          Controller(), _owner(owner), _setpoint(0), _id(id)
21      {
22      }
23  
24      virtual ~PIDController()
25      {
26      }
27  
28      virtual double inputProc(void) override = 0;
29      virtual double setptProc(void) = 0;
30      virtual void outputProc(double value) override = 0;
31  
32      void process(void) override;
33  
34      std::string getID(void) override
35      {
36          return _id;
37      }
38      double getSetpoint(void)
39      {
40          return _setpoint;
41      }
42      void setSetpoint(double setpoint)
43      {
44          _setpoint = setpoint;
45      }
46  
47      ec::pid_info_t* getPIDInfo(void)
48      {
49          return &_pid_info;
50      }
51  
52      double getLastInput(void)
53      {
54          return lastInput;
55      }
56  
57    protected:
58      ZoneInterface* _owner;
59  
60    private:
61      // parameters
62      ec::pid_info_t _pid_info;
63      double _setpoint;
64      std::string _id;
65      double lastInput = std::numeric_limits<double>::quiet_NaN();
66  };
67