blob: 5825b52eccc5c1b14c729c138ae8c0b12afcc174 [file] [log] [blame]
Matt Spinler7f88fe62017-04-10 14:39:02 -05001#pragma once
2#include <vector>
3#include <sdbusplus/bus.hpp>
Matthew Barth38a93a82017-05-11 14:12:27 -05004#include <sdbusplus/server.hpp>
Matt Spinler7f88fe62017-04-10 14:39:02 -05005#include "fan.hpp"
6#include "types.hpp"
7
8namespace phosphor
9{
10namespace fan
11{
12namespace control
13{
14
15/**
Matthew Barth14184132017-05-19 14:37:30 -050016 * The mode fan control will run in:
17 * - init - only do the initialization steps
18 * - control - run normal control algorithms
19 */
20enum class Mode
21{
22 init,
23 control
24};
25
26/**
Matt Spinler7f88fe62017-04-10 14:39:02 -050027 * @class Represents a fan control zone, which is a group of fans
28 * that behave the same.
29 */
30class Zone
31{
32 public:
33
34 Zone() = delete;
35 Zone(const Zone&) = delete;
36 Zone(Zone&&) = default;
37 Zone& operator=(const Zone&) = delete;
38 Zone& operator=(Zone&&) = delete;
39 ~Zone() = default;
40
41 /**
42 * Constructor
43 * Creates the appropriate fan objects based on
44 * the zone definition data passed in.
45 *
Matthew Barth14184132017-05-19 14:37:30 -050046 * @param[in] mode - mode of fan control
Matt Spinler7f88fe62017-04-10 14:39:02 -050047 * @param[in] bus - the dbus object
48 * @param[in] def - the fan zone definition data
49 */
Matthew Barth14184132017-05-19 14:37:30 -050050 Zone(Mode mode,
51 sdbusplus::bus::bus& bus,
Matt Spinler7f88fe62017-04-10 14:39:02 -050052 const ZoneDefinition& def);
53
54 /**
55 * Sets all fans in the zone to the speed
56 * passed in
57 *
58 * @param[in] speed - the fan speed
59 */
60 void setSpeed(uint64_t speed);
61
62 /**
63 * Sets the zone to full speed
64 */
65 inline void setFullSpeed()
66 {
67 if (_fullSpeed != 0)
68 {
69 setSpeed(_fullSpeed);
70 }
71 }
72
Matthew Barth38a93a82017-05-11 14:12:27 -050073 /**
Matthew Barth861d77c2017-05-22 14:18:25 -050074 * @brief Sets the automatic fan control allowed active state
75 *
76 * @param[in] group - A group that affects the active state
77 * @param[in] isActiveAllow - Active state according to group
78 */
79 void setActiveAllow(const Group* group, bool isActiveAllow);
80
81 /**
Matthew Barth38a93a82017-05-11 14:12:27 -050082 * @brief Sets a given object's property value
83 *
84 * @param[in] object - Name of the object containing the property
85 * @param[in] property - Property name
86 * @param[in] value - Property value
87 */
88 void setPropertyValue(const char* object,
89 const char* property,
90 bool value)
91 {
92 _properties[object][property] = value;
93 };
94
Matthew Barth17d1fe22017-05-11 15:00:36 -050095 /**
96 * @brief Get the value of an object's property
97 *
98 * @param[in] object - Name of the object containing the property
99 * @param[in] property - Property name
100 *
101 * @return - The property value
102 */
103 inline auto getPropertyValue(const std::string& object,
104 const std::string& property)
105 {
106 return _properties[object][property];
107 };
108
Matt Spinler7f88fe62017-04-10 14:39:02 -0500109 private:
110
111 /**
112 * The dbus object
113 */
114 sdbusplus::bus::bus& _bus;
115
116 /**
117 * Full speed for the zone
118 */
119 const uint64_t _fullSpeed;
120
121 /**
122 * The zone number
123 */
124 const size_t _zoneNum;
125
126 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500127 * Automatic fan control active state
128 */
129 bool _isActive = true;
130
131 /**
Matt Spinler7f88fe62017-04-10 14:39:02 -0500132 * The vector of fans in this zone
133 */
134 std::vector<std::unique_ptr<Fan>> _fans;
Matthew Barth38a93a82017-05-11 14:12:27 -0500135
136 /**
137 * @brief Map of object property values
138 */
139 std::map<std::string, std::map<std::string, bool>> _properties;
140
141 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500142 * @brief Map of active fan control allowed by groups
143 */
144 std::map<const Group*, bool> _active;
145
146 /**
Matthew Barth38a93a82017-05-11 14:12:27 -0500147 * @brief List of signal event arguments
148 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500149 std::vector<std::unique_ptr<EventData>> _signalEvents;
Matthew Barth38a93a82017-05-11 14:12:27 -0500150
151 /**
152 * @brief list of Dbus matches for callbacks
153 */
154 std::vector<sdbusplus::server::match::match> _matches;
155
156 /**
Matthew Barthdf3e8d62017-05-31 11:07:24 -0500157 * @brief Get a property value from the path/interface given
158 *
159 * @param[in] bus - the bus to use
160 * @param[in] path - the dbus path name
161 * @param[in] iface - the dbus interface name
162 * @param[in] prop - the property name
163 * @param[out] value - the value of the property
164 */
165 template <typename T>
166 static void getProperty(sdbusplus::bus::bus& bus,
167 const std::string& path,
168 const std::string& iface,
169 const std::string& prop,
170 T& value);
171
172 /**
Matthew Barth34f1bda2017-05-31 13:45:36 -0500173 * @brief Dbus signal change callback handler
Matthew Barth38a93a82017-05-11 14:12:27 -0500174 *
Matthew Barth34f1bda2017-05-31 13:45:36 -0500175 * @param[in] msg - Expanded sdbusplus message data
176 * @param[in] eventData - The single event's data
Matthew Barth38a93a82017-05-11 14:12:27 -0500177 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500178 void handleEvent(sdbusplus::message::message& msg,
179 const EventData* eventData);
Matt Spinler7f88fe62017-04-10 14:39:02 -0500180};
181
182}
183}
184}