1 #pragma once
2 
3 #include "sensors/sensor.hpp"
4 
5 #include <string>
6 
7 namespace pid_control
8 {
9 
10 /**
11  * In a Zone you have a set of PIDs which feed each other.  Fan PIDs are fed set
12  * points from Thermal PIDs.
13  */
14 class ZoneInterface
15 {
16   public:
17     virtual ~ZoneInterface() = default;
18 
19     /** If the zone implementation supports logging, initialize the log. */
20     virtual void initializeLog(void) = 0;
21     /** If the zone implementation supports logging, write string to log. */
22     virtual void writeLog(const std::string& value) = 0;
23 
24     /** Return a pointer to the sensor specified by name. */
25     virtual Sensor* getSensor(const std::string& name) = 0;
26 
27     /* updateFanTelemetry() and updateSensors() both clear the failsafe state
28      * for a sensor if it's no longer in that state.
29      */
30     /** For each fan input in the zone, read each to update the cachedValue and
31      * check if the fan is beyond its timeout to trigger a failsafe condition.
32      */
33     virtual void updateFanTelemetry(void) = 0;
34     /** For each thermal input in the zone, read each to update the cachedValue
35      * and check if the sensor is beyond its timeout to trigger a failsafe
36      * condition.
37      */
38     virtual void updateSensors(void) = 0;
39     /** For each fan and thermal input in the zone, set the cachedValue to 0 and
40      * set the input as failsafe - to default the zone to failsafe before it
41      * starts processing values to control fans.
42      */
43     virtual void initializeCache(void) = 0;
44 
45     /** Return cached value for sensor by name. */
46     virtual double getCachedValue(const std::string& name) = 0;
47 
48     /** Add a set point value for the Max Set Point computation. */
49     virtual void addSetPoint(double setpoint, const std::string& name) = 0;
50     /** Clear all set points specified via addSetPoint */
51     virtual void clearSetPoints(void) = 0;
52 
53     /** Add maximum RPM value to drive fan pids. */
54     virtual void addRPMCeiling(double ceiling) = 0;
55     /** Clear any RPM value set with addRPMCeiling. */
56     virtual void clearRPMCeilings(void) = 0;
57 
58     /** Compute the value returned by getMaxSetPointRequest - called from the
59      * looping mechanism before triggering any Fan PIDs. The value computed is
60      * used by each fan PID.
61      */
62     virtual void determineMaxSetPointRequest(void) = 0;
63     /** Given the set points added via addSetPoint, return the maximum value -
64      * called from the PID loop that uses that value to drive the fans.
65      */
66     virtual double getMaxSetPointRequest() const = 0;
67 
68     /** Return if the zone has any sensors in fail safe mode. */
69     virtual bool getFailSafeMode() const = 0;
70     /** Return the rpm or pwm percent value to drive fan pids when zone is in
71      * fail safe.
72      */
73     virtual double getFailSafePercent() const = 0;
74 
75     /** Return if the zone is set to manual mode.  false equates to automatic
76      * mode (the default).
77      */
78     virtual bool getManualMode(void) const = 0;
79 
80     /** Returns true if a redundant fan PWM write is needed. Redundant write
81      * is used when returning the fan to automatic mode from manual mode.
82      */
83     virtual bool getRedundantWrite(void) const = 0;
84 
85     /** For each fan pid, do processing. */
86     virtual void processFans(void) = 0;
87     /** For each thermal pid, do processing. */
88     virtual void processThermals(void) = 0;
89 };
90 
91 } // namespace pid_control
92