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