blob: 116e50f8a9d817b79a676c955a1faee008969618 [file] [log] [blame]
Matthew Barthfcfa0522020-08-24 16:40:24 -05001/**
Mike Capps70c26b22021-10-07 15:24:29 -04002 * Copyright © 2022 IBM Corporation
Matthew Barthfcfa0522020-08-24 16:40:24 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include "config_base.hpp"
19
20#include <nlohmann/json.hpp>
21#include <sdbusplus/bus.hpp>
22
Matthew Bartha3a8cc52021-01-15 12:40:25 -060023#include <map>
24
Matthew Barthfcfa0522020-08-24 16:40:24 -050025namespace phosphor::fan::control::json
26{
27
28using json = nlohmann::json;
29
30/**
31 * @class Fan - Represents a configured fan control fan object
32 *
33 * A fan object contains the configured attributes for a fan within the system
34 * that will be controlled by the fan control application. These configuration
35 * attributes include, but are not limited to, the cooling zone in which the
36 * fan is included, what sensors make up the fan, the target interface to be
Matthew Barthe47c9582021-03-09 14:24:02 -060037 * used in setting a target, and any profiles(OPTIONAL) the fan should be
Matthew Barthfcfa0522020-08-24 16:40:24 -050038 * included in.
39 *
40 * (When no profile for a fan is given, the fan defaults to always be included)
41 *
42 */
43class Fan : public ConfigBase
44{
Mike Capps762e8582021-10-07 15:33:23 -040045 friend class Zone;
46
Matthew Barthfcfa0522020-08-24 16:40:24 -050047 public:
48 /* JSON file name for fans */
49 static constexpr auto confFileName = "fans.json";
50
51 Fan() = delete;
52 Fan(const Fan&) = delete;
53 Fan(Fan&&) = delete;
54 Fan& operator=(const Fan&) = delete;
55 Fan& operator=(Fan&&) = delete;
56 ~Fan() = default;
57
58 /**
59 * Constructor
60 * Parses and populates a zone fan from JSON object data
61 *
Matthew Barthfcfa0522020-08-24 16:40:24 -050062 * @param[in] jsonObj - JSON object
63 */
Matthew Barth9403a212021-05-17 09:31:50 -050064 Fan(const json& jsonObj);
Matthew Barthfcfa0522020-08-24 16:40:24 -050065
66 /**
Matthew Barthfcfa0522020-08-24 16:40:24 -050067 * @brief Get the zone
68 *
69 * @return Zone this fan belongs in
70 */
71 inline const auto& getZone() const
72 {
73 return _zone;
74 }
75
76 /**
77 * @brief Get the list of sensors
78 *
79 * @return List of sensors with `Target` property
80 */
81 inline const auto& getSensors() const
82 {
83 return _sensors;
84 }
85
86 /**
87 * @brief Get the sensors' interface
88 *
89 * @return Interface containing `Target` to use on sensors
90 */
91 inline const auto& getInterface() const
92 {
93 return _interface;
94 }
95
Matthew Bartha3a8cc52021-01-15 12:40:25 -060096 /**
97 * @brief Get the current fan target
98 *
99 * @return - The current target of the fan
100 */
101 inline auto getTarget() const
102 {
103 return _target;
104 }
Matthew Barthfcfa0522020-08-24 16:40:24 -0500105
106 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600107 * Sets the target value on all contained sensors
108 *
109 * @param[in] target - The value to set
Matthew Barthfcfa0522020-08-24 16:40:24 -0500110 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600111 void setTarget(uint64_t target);
112
113 private:
Mike Capps70c26b22021-10-07 15:24:29 -0400114 /**
115 * Forces all contained sensors to the target (if this target is the
116 * highest. May be overridden by existing or subsequent higher values),
117 * ignoring subsequent setTarget() commands
118 *
119 * @param[in] target - The target lock to set/add
120 */
121 void lockTarget(uint64_t target);
122
123 /**
124 * Removes the provided target lock from the list of locks. Fan will unlock
125 * (become eligible for setTarget()) when all locks are removed from the
126 * list.
127 */
128 void unlockTarget(uint64_t target);
129
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600130 /* The sdbusplus bus object */
131 sdbusplus::bus::bus& _bus;
Matthew Barthfcfa0522020-08-24 16:40:24 -0500132
133 /**
134 * Interface containing the `Target` property
Matthew Barthe47c9582021-03-09 14:24:02 -0600135 * to use in controlling the fan's target
Matthew Barthfcfa0522020-08-24 16:40:24 -0500136 */
137 std::string _interface;
Matthew Barthbff10802020-08-25 10:07:57 -0500138
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600139 /* Target for this fan */
140 uint64_t _target;
141
Mike Capps70c26b22021-10-07 15:24:29 -0400142 /* list of locked targets active on this fan */
143 std::vector<uint64_t> _lockedTargets;
144
Matthew Barthbff10802020-08-25 10:07:57 -0500145 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600146 * Map of sensors containing the `Target` property on
147 * dbus to the service providing them that make up the fan
148 */
149 std::map<std::string, std::string> _sensors;
150
151 /* The zone this fan belongs to */
152 std::string _zone;
153
154 /**
155 * @brief Parse and set the fan's sensor interface
Matthew Barthbff10802020-08-25 10:07:57 -0500156 *
157 * @param[in] jsonObj - JSON object for the fan
158 *
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600159 * Sets the sensor interface to use when setting the `Target` property
Matthew Barthbff10802020-08-25 10:07:57 -0500160 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600161 void setInterface(const json& jsonObj);
Matthew Barthbff10802020-08-25 10:07:57 -0500162
163 /**
164 * @brief Parse and set the fan's sensor list
165 *
166 * @param[in] jsonObj - JSON object for the fan
167 *
168 * Sets the list of sensors that contain a `Target` property on dbus
169 * that make up this fan.
170 */
171 void setSensors(const json& jsonObj);
172
173 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600174 * @brief Parse and set the fan's zone
Matthew Barthbff10802020-08-25 10:07:57 -0500175 *
176 * @param[in] jsonObj - JSON object for the fan
177 *
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600178 * Sets the zone this fan is included in.
Matthew Barthbff10802020-08-25 10:07:57 -0500179 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600180 void setZone(const json& jsonObj);
Matthew Barthfcfa0522020-08-24 16:40:24 -0500181};
182
183} // namespace phosphor::fan::control::json