blob: bd6e080819f124abc1176d1fb2b0f445f1f92d15 [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 */
89 void setPropertyValue(const char* object,
Matthew Barthcec5ab72017-06-02 15:20:56 -050090 const char* interface,
Matthew Barth38a93a82017-05-11 14:12:27 -050091 const char* property,
92 bool value)
93 {
Matthew Barthcec5ab72017-06-02 15:20:56 -050094 _properties[object][interface][property] = value;
Matthew Barth38a93a82017-05-11 14:12:27 -050095 };
96
Matthew Barth17d1fe22017-05-11 15:00:36 -050097 /**
98 * @brief Get the value of an object's property
99 *
100 * @param[in] object - Name of the object containing the property
Matthew Barthcec5ab72017-06-02 15:20:56 -0500101 * @param[in] interface - Interface name containing the property
Matthew Barth17d1fe22017-05-11 15:00:36 -0500102 * @param[in] property - Property name
103 *
104 * @return - The property value
105 */
106 inline auto getPropertyValue(const std::string& object,
Matthew Barthcec5ab72017-06-02 15:20:56 -0500107 const std::string& interface,
Matthew Barth17d1fe22017-05-11 15:00:36 -0500108 const std::string& property)
109 {
Matthew Barthcec5ab72017-06-02 15:20:56 -0500110 return _properties[object][interface][property];
Matthew Barth17d1fe22017-05-11 15:00:36 -0500111 };
112
Matt Spinler7f88fe62017-04-10 14:39:02 -0500113 private:
114
115 /**
116 * The dbus object
117 */
118 sdbusplus::bus::bus& _bus;
119
120 /**
121 * Full speed for the zone
122 */
123 const uint64_t _fullSpeed;
124
125 /**
126 * The zone number
127 */
128 const size_t _zoneNum;
129
130 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500131 * Automatic fan control active state
132 */
133 bool _isActive = true;
134
135 /**
Matt Spinler7f88fe62017-04-10 14:39:02 -0500136 * The vector of fans in this zone
137 */
138 std::vector<std::unique_ptr<Fan>> _fans;
Matthew Barth38a93a82017-05-11 14:12:27 -0500139
140 /**
141 * @brief Map of object property values
142 */
Matthew Barthcec5ab72017-06-02 15:20:56 -0500143 std::map<std::string,
144 std::map<std::string,
145 std::map<std::string,
146 bool>>> _properties;
Matthew Barth38a93a82017-05-11 14:12:27 -0500147
148 /**
Matthew Barth861d77c2017-05-22 14:18:25 -0500149 * @brief Map of active fan control allowed by groups
150 */
151 std::map<const Group*, bool> _active;
152
153 /**
Matthew Barth38a93a82017-05-11 14:12:27 -0500154 * @brief List of signal event arguments
155 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500156 std::vector<std::unique_ptr<EventData>> _signalEvents;
Matthew Barth38a93a82017-05-11 14:12:27 -0500157
158 /**
159 * @brief list of Dbus matches for callbacks
160 */
161 std::vector<sdbusplus::server::match::match> _matches;
162
163 /**
Matthew Barthdf3e8d62017-05-31 11:07:24 -0500164 * @brief Get a property value from the path/interface given
165 *
166 * @param[in] bus - the bus to use
167 * @param[in] path - the dbus path name
168 * @param[in] iface - the dbus interface name
169 * @param[in] prop - the property name
170 * @param[out] value - the value of the property
171 */
172 template <typename T>
173 static void getProperty(sdbusplus::bus::bus& bus,
174 const std::string& path,
175 const std::string& iface,
176 const std::string& prop,
177 T& value);
178
179 /**
Matthew Barth34f1bda2017-05-31 13:45:36 -0500180 * @brief Dbus signal change callback handler
Matthew Barth38a93a82017-05-11 14:12:27 -0500181 *
Matthew Barth34f1bda2017-05-31 13:45:36 -0500182 * @param[in] msg - Expanded sdbusplus message data
183 * @param[in] eventData - The single event's data
Matthew Barth38a93a82017-05-11 14:12:27 -0500184 */
Matthew Barth34f1bda2017-05-31 13:45:36 -0500185 void handleEvent(sdbusplus::message::message& msg,
186 const EventData* eventData);
Matt Spinler7f88fe62017-04-10 14:39:02 -0500187};
188
189}
190}
191}