blob: 24739f8e153fef67371833aba1ab3e99fe671682 [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
Matthew Barthcec5ab72017-06-02 15:20:56 -050085 * @param[in] interface - Interface name containing the property
Matthew Barth38a93a82017-05-11 14:12:27 -050086 * @param[in] property - Property name
87 * @param[in] value - Property value
88 */
Matthew Barth9e741ed2017-06-02 16:29:09 -050089 template <typename T>
Matthew Barth38a93a82017-05-11 14:12:27 -050090 void setPropertyValue(const char* object,
Matthew Barthcec5ab72017-06-02 15:20:56 -050091 const char* interface,
Matthew Barth38a93a82017-05-11 14:12:27 -050092 const char* property,
Matthew Barth9e741ed2017-06-02 16:29:09 -050093 T value)
Matthew Barth38a93a82017-05-11 14:12:27 -050094 {
Matthew Barthcec5ab72017-06-02 15:20:56 -050095 _properties[object][interface][property] = value;
Matthew Barth38a93a82017-05-11 14:12:27 -050096 };
97
Matthew Barth17d1fe22017-05-11 15:00:36 -050098 /**
99 * @brief Get the value of an object's property
100 *
101 * @param[in] object - Name of the object containing the property
Matthew Barthcec5ab72017-06-02 15:20:56 -0500102 * @param[in] interface - Interface name containing the property
Matthew Barth17d1fe22017-05-11 15:00:36 -0500103 * @param[in] property - Property name
104 *
105 * @return - The property value
106 */
Matthew Barth9e741ed2017-06-02 16:29:09 -0500107 template <typename T>
Matthew Barth17d1fe22017-05-11 15:00:36 -0500108 inline auto getPropertyValue(const std::string& object,
Matthew Barthcec5ab72017-06-02 15:20:56 -0500109 const std::string& interface,
Matthew Barth17d1fe22017-05-11 15:00:36 -0500110 const std::string& property)
111 {
Matthew Barth9e741ed2017-06-02 16:29:09 -0500112 return sdbusplus::message::variant_ns::get<T>(
113 _properties[object][interface][property]);
Matthew Barth17d1fe22017-05-11 15:00:36 -0500114 };
115
Matthew Barth1de66622017-06-12 13:13:02 -0500116 /**
117 * @brief Get the default floor speed
118 *
119 * @return - The defined default floor speed
120 */
121 inline auto getDefFloor()
122 {
123 return _defFloorSpeed;
124 };
125
Matthew Barth4af419c2017-06-12 13:39:31 -0500126 /**
127 * @brief Set the floor speed to the given speed
128 *
129 * @param[in] speed - Speed to set the floor to
130 */
131 inline void setFloor(uint64_t speed)
132 {
133 _floorSpeed = speed;
134 };
135
Matt Spinler7f88fe62017-04-10 14:39:02 -0500136 private:
137
138 /**
139 * The dbus object
140 */
141 sdbusplus::bus::bus& _bus;
142
143 /**
144 * Full speed for the zone
145 */
146 const uint64_t _fullSpeed;
147
148 /**
149 * The zone number
150 */
151 const size_t _zoneNum;
152
153 /**
Matthew Barth1de66622017-06-12 13:13:02 -0500154 * The default floor speed for the zone
155 */
156 const uint64_t _defFloorSpeed;
157
158 /**
Matthew Barth4af419c2017-06-12 13:39:31 -0500159 * The floor speed to not go below
160 */
161 uint64_t _floorSpeed = _defFloorSpeed;
162
163 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500164 * Automatic fan control active state
165 */
166 bool _isActive = true;
167
168 /**
Matt Spinler7f88fe62017-04-10 14:39:02 -0500169 * The vector of fans in this zone
170 */
171 std::vector<std::unique_ptr<Fan>> _fans;
Matthew Barth38a93a82017-05-11 14:12:27 -0500172
173 /**
174 * @brief Map of object property values
175 */
Matthew Barthcec5ab72017-06-02 15:20:56 -0500176 std::map<std::string,
177 std::map<std::string,
178 std::map<std::string,
Matthew Barth9e741ed2017-06-02 16:29:09 -0500179 PropertyVariantType>>> _properties;
Matthew Barth38a93a82017-05-11 14:12:27 -0500180
181 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500182 * @brief Map of active fan control allowed by groups
183 */
184 std::map<const Group*, bool> _active;
185
186 /**
Matthew Barth38a93a82017-05-11 14:12:27 -0500187 * @brief List of signal event arguments
188 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500189 std::vector<std::unique_ptr<EventData>> _signalEvents;
Matthew Barth38a93a82017-05-11 14:12:27 -0500190
191 /**
192 * @brief list of Dbus matches for callbacks
193 */
194 std::vector<sdbusplus::server::match::match> _matches;
195
196 /**
Matthew Barthdf3e8d62017-05-31 11:07:24 -0500197 * @brief Get a property value from the path/interface given
198 *
199 * @param[in] bus - the bus to use
200 * @param[in] path - the dbus path name
201 * @param[in] iface - the dbus interface name
202 * @param[in] prop - the property name
203 * @param[out] value - the value of the property
204 */
Matthew Barthdf3e8d62017-05-31 11:07:24 -0500205 static void getProperty(sdbusplus::bus::bus& bus,
206 const std::string& path,
207 const std::string& iface,
208 const std::string& prop,
Matthew Barth9e741ed2017-06-02 16:29:09 -0500209 PropertyVariantType& value);
Matthew Barthdf3e8d62017-05-31 11:07:24 -0500210
211 /**
Matthew Barth34f1bda2017-05-31 13:45:36 -0500212 * @brief Dbus signal change callback handler
Matthew Barth38a93a82017-05-11 14:12:27 -0500213 *
Matthew Barth34f1bda2017-05-31 13:45:36 -0500214 * @param[in] msg - Expanded sdbusplus message data
215 * @param[in] eventData - The single event's data
Matthew Barth38a93a82017-05-11 14:12:27 -0500216 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500217 void handleEvent(sdbusplus::message::message& msg,
218 const EventData* eventData);
Matt Spinler7f88fe62017-04-10 14:39:02 -0500219};
220
221}
222}
223}