blob: 2a108467fe515d9ef45d1818fd330cc367f0fcee [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{
45 public:
46 /* JSON file name for fans */
47 static constexpr auto confFileName = "fans.json";
48
49 Fan() = delete;
50 Fan(const Fan&) = delete;
51 Fan(Fan&&) = delete;
52 Fan& operator=(const Fan&) = delete;
53 Fan& operator=(Fan&&) = delete;
54 ~Fan() = default;
55
56 /**
57 * Constructor
58 * Parses and populates a zone fan from JSON object data
59 *
Matthew Barthfcfa0522020-08-24 16:40:24 -050060 * @param[in] jsonObj - JSON object
61 */
Matthew Barth9403a212021-05-17 09:31:50 -050062 Fan(const json& jsonObj);
Matthew Barthfcfa0522020-08-24 16:40:24 -050063
64 /**
Matthew Barthfcfa0522020-08-24 16:40:24 -050065 * @brief Get the zone
66 *
67 * @return Zone this fan belongs in
68 */
69 inline const auto& getZone() const
70 {
71 return _zone;
72 }
73
74 /**
75 * @brief Get the list of sensors
76 *
77 * @return List of sensors with `Target` property
78 */
79 inline const auto& getSensors() const
80 {
81 return _sensors;
82 }
83
84 /**
85 * @brief Get the sensors' interface
86 *
87 * @return Interface containing `Target` to use on sensors
88 */
89 inline const auto& getInterface() const
90 {
91 return _interface;
92 }
93
Matthew Bartha3a8cc52021-01-15 12:40:25 -060094 /**
95 * @brief Get the current fan target
96 *
97 * @return - The current target of the fan
98 */
99 inline auto getTarget() const
100 {
101 return _target;
102 }
Matthew Barthfcfa0522020-08-24 16:40:24 -0500103
104 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600105 * Sets the target value on all contained sensors
106 *
107 * @param[in] target - The value to set
Matthew Barthfcfa0522020-08-24 16:40:24 -0500108 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600109 void setTarget(uint64_t target);
110
111 private:
Mike Capps70c26b22021-10-07 15:24:29 -0400112 /**
113 * Forces all contained sensors to the target (if this target is the
114 * highest. May be overridden by existing or subsequent higher values),
115 * ignoring subsequent setTarget() commands
116 *
117 * @param[in] target - The target lock to set/add
118 */
119 void lockTarget(uint64_t target);
120
121 /**
122 * Removes the provided target lock from the list of locks. Fan will unlock
123 * (become eligible for setTarget()) when all locks are removed from the
124 * list.
125 */
126 void unlockTarget(uint64_t target);
127
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600128 /* The sdbusplus bus object */
129 sdbusplus::bus::bus& _bus;
Matthew Barthfcfa0522020-08-24 16:40:24 -0500130
131 /**
132 * Interface containing the `Target` property
Matthew Barthe47c9582021-03-09 14:24:02 -0600133 * to use in controlling the fan's target
Matthew Barthfcfa0522020-08-24 16:40:24 -0500134 */
135 std::string _interface;
Matthew Barthbff10802020-08-25 10:07:57 -0500136
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600137 /* Target for this fan */
138 uint64_t _target;
139
Mike Capps70c26b22021-10-07 15:24:29 -0400140 /* list of locked targets active on this fan */
141 std::vector<uint64_t> _lockedTargets;
142
Matthew Barthbff10802020-08-25 10:07:57 -0500143 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600144 * Map of sensors containing the `Target` property on
145 * dbus to the service providing them that make up the fan
146 */
147 std::map<std::string, std::string> _sensors;
148
149 /* The zone this fan belongs to */
150 std::string _zone;
151
152 /**
153 * @brief Parse and set the fan's sensor interface
Matthew Barthbff10802020-08-25 10:07:57 -0500154 *
155 * @param[in] jsonObj - JSON object for the fan
156 *
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600157 * Sets the sensor interface to use when setting the `Target` property
Matthew Barthbff10802020-08-25 10:07:57 -0500158 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600159 void setInterface(const json& jsonObj);
Matthew Barthbff10802020-08-25 10:07:57 -0500160
161 /**
162 * @brief Parse and set the fan's sensor list
163 *
164 * @param[in] jsonObj - JSON object for the fan
165 *
166 * Sets the list of sensors that contain a `Target` property on dbus
167 * that make up this fan.
168 */
169 void setSensors(const json& jsonObj);
170
171 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600172 * @brief Parse and set the fan's zone
Matthew Barthbff10802020-08-25 10:07:57 -0500173 *
174 * @param[in] jsonObj - JSON object for the fan
175 *
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600176 * Sets the zone this fan is included in.
Matthew Barthbff10802020-08-25 10:07:57 -0500177 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600178 void setZone(const json& jsonObj);
Matthew Barthfcfa0522020-08-24 16:40:24 -0500179};
180
181} // namespace phosphor::fan::control::json