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