|  | #pragma once | 
|  | #include <vector> | 
|  | #include <sdbusplus/bus.hpp> | 
|  | #include <sdbusplus/server.hpp> | 
|  | #include "fan.hpp" | 
|  | #include "types.hpp" | 
|  |  | 
|  | namespace phosphor | 
|  | { | 
|  | namespace fan | 
|  | { | 
|  | namespace control | 
|  | { | 
|  |  | 
|  | /** | 
|  | * The mode fan control will run in: | 
|  | *   - init - only do the initialization steps | 
|  | *   - control - run normal control algorithms | 
|  | */ | 
|  | enum class Mode | 
|  | { | 
|  | init, | 
|  | control | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @class Represents a fan control zone, which is a group of fans | 
|  | * that behave the same. | 
|  | */ | 
|  | class Zone | 
|  | { | 
|  | public: | 
|  |  | 
|  | Zone() = delete; | 
|  | Zone(const Zone&) = delete; | 
|  | Zone(Zone&&) = default; | 
|  | Zone& operator=(const Zone&) = delete; | 
|  | Zone& operator=(Zone&&) = delete; | 
|  | ~Zone() = default; | 
|  |  | 
|  | /** | 
|  | * Constructor | 
|  | * Creates the appropriate fan objects based on | 
|  | * the zone definition data passed in. | 
|  | * | 
|  | * @param[in] mode - mode of fan control | 
|  | * @param[in] bus - the dbus object | 
|  | * @param[in] def - the fan zone definition data | 
|  | */ | 
|  | Zone(Mode mode, | 
|  | sdbusplus::bus::bus& bus, | 
|  | const ZoneDefinition& def); | 
|  |  | 
|  | /** | 
|  | * Sets all fans in the zone to the speed | 
|  | * passed in | 
|  | * | 
|  | * @param[in] speed - the fan speed | 
|  | */ | 
|  | void setSpeed(uint64_t speed); | 
|  |  | 
|  | /** | 
|  | * Sets the zone to full speed | 
|  | */ | 
|  | inline void setFullSpeed() | 
|  | { | 
|  | if (_fullSpeed != 0) | 
|  | { | 
|  | setSpeed(_fullSpeed); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Sets the automatic fan control allowed active state | 
|  | * | 
|  | * @param[in] group - A group that affects the active state | 
|  | * @param[in] isActiveAllow - Active state according to group | 
|  | */ | 
|  | void setActiveAllow(const Group* group, bool isActiveAllow); | 
|  |  | 
|  | /** | 
|  | * @brief Sets a given object's property value | 
|  | * | 
|  | * @param[in] object - Name of the object containing the property | 
|  | * @param[in] interface - Interface name containing the property | 
|  | * @param[in] property - Property name | 
|  | * @param[in] value - Property value | 
|  | */ | 
|  | void setPropertyValue(const char* object, | 
|  | const char* interface, | 
|  | const char* property, | 
|  | bool value) | 
|  | { | 
|  | _properties[object][interface][property] = value; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @brief Get the value of an object's property | 
|  | * | 
|  | * @param[in] object - Name of the object containing the property | 
|  | * @param[in] interface - Interface name containing the property | 
|  | * @param[in] property - Property name | 
|  | * | 
|  | * @return - The property value | 
|  | */ | 
|  | inline auto getPropertyValue(const std::string& object, | 
|  | const std::string& interface, | 
|  | const std::string& property) | 
|  | { | 
|  | return _properties[object][interface][property]; | 
|  | }; | 
|  |  | 
|  | private: | 
|  |  | 
|  | /** | 
|  | * The dbus object | 
|  | */ | 
|  | sdbusplus::bus::bus& _bus; | 
|  |  | 
|  | /** | 
|  | * Full speed for the zone | 
|  | */ | 
|  | const uint64_t _fullSpeed; | 
|  |  | 
|  | /** | 
|  | * The zone number | 
|  | */ | 
|  | const size_t _zoneNum; | 
|  |  | 
|  | /** | 
|  | * Automatic fan control active state | 
|  | */ | 
|  | bool _isActive = true; | 
|  |  | 
|  | /** | 
|  | * The vector of fans in this zone | 
|  | */ | 
|  | std::vector<std::unique_ptr<Fan>> _fans; | 
|  |  | 
|  | /** | 
|  | * @brief Map of object property values | 
|  | */ | 
|  | std::map<std::string, | 
|  | std::map<std::string, | 
|  | std::map<std::string, | 
|  | bool>>> _properties; | 
|  |  | 
|  | /** | 
|  | * @brief Map of active fan control allowed by groups | 
|  | */ | 
|  | std::map<const Group*, bool> _active; | 
|  |  | 
|  | /** | 
|  | * @brief List of signal event arguments | 
|  | */ | 
|  | std::vector<std::unique_ptr<EventData>> _signalEvents; | 
|  |  | 
|  | /** | 
|  | * @brief list of Dbus matches for callbacks | 
|  | */ | 
|  | std::vector<sdbusplus::server::match::match> _matches; | 
|  |  | 
|  | /** | 
|  | * @brief Get a property value from the path/interface given | 
|  | * | 
|  | * @param[in] bus - the bus to use | 
|  | * @param[in] path - the dbus path name | 
|  | * @param[in] iface - the dbus interface name | 
|  | * @param[in] prop - the property name | 
|  | * @param[out] value - the value of the property | 
|  | */ | 
|  | template <typename T> | 
|  | static void getProperty(sdbusplus::bus::bus& bus, | 
|  | const std::string& path, | 
|  | const std::string& iface, | 
|  | const std::string& prop, | 
|  | T& value); | 
|  |  | 
|  | /** | 
|  | * @brief Dbus signal change callback handler | 
|  | * | 
|  | * @param[in] msg - Expanded sdbusplus message data | 
|  | * @param[in] eventData - The single event's data | 
|  | */ | 
|  | void handleEvent(sdbusplus::message::message& msg, | 
|  | const EventData* eventData); | 
|  | }; | 
|  |  | 
|  | } | 
|  | } | 
|  | } |