| #pragma once | 
 |  | 
 | #include <cstdint> | 
 | #include <string> | 
 |  | 
 | namespace pid_control | 
 | { | 
 | namespace ec | 
 | { | 
 |  | 
 | typedef struct limits_t | 
 | { | 
 |     double min = 0.0; | 
 |     double max = 0.0; | 
 | } limits_t; | 
 |  | 
 | /* Note: If you update these structs you need to update the copy code in | 
 |  * pid/util.cpp and the initialization code in pid/buildjson.hpp files. | 
 |  */ | 
 | typedef struct pid_info_t | 
 | { | 
 |     bool initialized = false;          // has pid been initialized | 
 |     bool checkHysterWithSetpt = false; // compare current input and setpoint to | 
 |                                        // check hysteresis | 
 |  | 
 |     double ts = 0.0;                   // sample time in seconds | 
 |     double integral = 0.0;             // integral of error | 
 |     double lastOutput = 0.0;           // value of last output | 
 |     double lastError = 0.0;            // value of last error | 
 |  | 
 |     double proportionalCoeff = 0.0;    // coeff for P | 
 |     double integralCoeff = 0.0;        // coeff for I | 
 |     double derivativeCoeff = 0.0;      // coeff for D | 
 |     double feedFwdOffset = 0.0;        // offset coeff for feed-forward term | 
 |     double feedFwdGain = 0.0;          // gain for feed-forward term | 
 |  | 
 |     limits_t integralLimit;            // clamp of integral | 
 |     limits_t outLim;                   // clamp of output | 
 |     double slewNeg = 0.0; | 
 |     double slewPos = 0.0; | 
 |     double positiveHysteresis = 0.0; | 
 |     double negativeHysteresis = 0.0; | 
 | } pid_info_t; | 
 |  | 
 | double pid(pid_info_t* pidinfoptr, double input, double setpoint, | 
 |            const std::string* nameptr = nullptr); | 
 |  | 
 | /* Condensed version for use by the configuration. */ | 
 | struct pidinfo | 
 | { | 
 |     bool checkHysterWithSetpt = 0.0; // compare current input and setpoint to | 
 |                                      // check hysteresis | 
 |  | 
 |     double ts = 0.0;                 // sample time in seconds | 
 |     double proportionalCoeff = 0.0;  // coeff for P | 
 |     double integralCoeff = 0.0;      // coeff for I | 
 |     double derivativeCoeff = 0.0;    // coeff for D | 
 |     double feedFwdOffset = 0.0;      // offset coeff for feed-forward term | 
 |     double feedFwdGain = 0.0;        // gain for feed-forward term | 
 |     ec::limits_t integralLimit;      // clamp of integral | 
 |     ec::limits_t outLim;             // clamp of output | 
 |     double slewNeg = 0.0; | 
 |     double slewPos = 0.0; | 
 |     double positiveHysteresis = 0.0; | 
 |     double negativeHysteresis = 0.0; | 
 | }; | 
 |  | 
 | } // namespace ec | 
 | } // namespace pid_control |