summaryrefslogtreecommitdiffstats
path: root/pid/pidcontroller.hpp
blob: 3d38c2a8f6fab348fb34efe26a646cd16cd7d420 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once

#include "controller.hpp"
#include "ec/pid.hpp"
#include "fan.hpp"

#include <memory>
#include <vector>

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), _setpoint(0), _id(id)
    {
    }

    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;

  private:
    // parameters
    ec::pid_info_t _pid_info;
    double _setpoint;
    std::string _id;
    double lastInput = std::numeric_limits<double>::quiet_NaN();
};
OpenPOWER on IntegriCloud