#pragma once #include #include #include #include #include #include #include "conf.hpp" #include "controller.hpp" #include "sensors/sensor.hpp" #include "sensors/manager.hpp" #include "xyz/openbmc_project/Control/FanCtrl/Mode/server.hpp" #include #include template using ServerObject = typename sdbusplus::server::object::object; using ModeInterface = sdbusplus::xyz::openbmc_project::Control::FanCtrl::server::Mode; using ModeObject = ServerObject; /* * The PIDZone inherits from the Mode object so that it can listen for control * mode changes. It primarily holds all PID loops and holds the sensor value * cache that's used per iteration of the PID loops. */ class PIDZone : public ModeObject { public: PIDZone(int64_t zone, float minThermalRpm, float failSafePercent, std::shared_ptr mgr, sdbusplus::bus::bus& bus, const char* objPath, bool defer) : ModeObject(bus, objPath, defer), _zoneId(zone), _maximumRPMSetPt(), _minThermalRpmSetPt(minThermalRpm), _failSafePercent(failSafePercent), _mgr(mgr) { #ifdef __TUNING_LOGGING__ _log.open("/tmp/swampd.log"); #endif } float getMaxRPMRequest(void) const; bool getManualMode(void) const; /* Could put lock around this since it's accessed from two threads, but * only one reader/one writer. */ void setManualMode(bool mode); bool getFailSafeMode(void) const; int64_t getZoneId(void) const; void addRPMSetPoint(float setpoint); void clearRPMSetPoints(void); float getFailSafePercent(void) const; float getMinThermalRpmSetPt(void) const; std::unique_ptr& getSensor(std::string name); void determineMaxRPMRequest(void); void updateFanTelemetry(void); void updateSensors(void); void initializeCache(void); void dumpCache(void); void process_fans(void); void process_thermals(void); void addFanPID(std::unique_ptr pid); void addThermalPID(std::unique_ptr pid); double getCachedValue(const std::string& name); void addFanInput(std::string fan); void addThermalInput(std::string therm); #ifdef __TUNING_LOGGING__ void initializeLog(void); std::ofstream& getLogHandle(void); #endif /* Method for setting the manual mode over dbus */ bool manual(bool value) override; /* Method for reading whether in fail-safe mode over dbus */ bool failSafe() const override; private: #ifdef __TUNING_LOGGING__ std::ofstream _log; #endif const int64_t _zoneId; float _maximumRPMSetPt = 0; bool _manualMode = false; const float _minThermalRpmSetPt; const float _failSafePercent; std::set _failSafeSensors; std::vector _RPMSetPoints; std::vector _fanInputs; std::vector _thermalInputs; std::map _cachedValuesByName; std::shared_ptr _mgr; std::vector> _fans; std::vector> _thermals; }; std::map> BuildZones( std::map& ZonePids, std::map& ZoneConfigs, std::shared_ptr mgmr, sdbusplus::bus::bus& ModeControlBus); std::map> BuildZonesFromConfig( std::string& path, std::shared_ptr mgmr, sdbusplus::bus::bus& ModeControlBus);