blob: 55cb16774af73a3f6afd3041c16ac7551137492d [file] [log] [blame]
Matthew Barthfcfa0522020-08-24 16:40:24 -05001/**
2 * Copyright © 2020 IBM Corporation
3 *
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:
112 /* The sdbusplus bus object */
113 sdbusplus::bus::bus& _bus;
Matthew Barthfcfa0522020-08-24 16:40:24 -0500114
115 /**
116 * Interface containing the `Target` property
Matthew Barthe47c9582021-03-09 14:24:02 -0600117 * to use in controlling the fan's target
Matthew Barthfcfa0522020-08-24 16:40:24 -0500118 */
119 std::string _interface;
Matthew Barthbff10802020-08-25 10:07:57 -0500120
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600121 /* Target for this fan */
122 uint64_t _target;
123
Matthew Barthbff10802020-08-25 10:07:57 -0500124 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600125 * Map of sensors containing the `Target` property on
126 * dbus to the service providing them that make up the fan
127 */
128 std::map<std::string, std::string> _sensors;
129
130 /* The zone this fan belongs to */
131 std::string _zone;
132
133 /**
134 * @brief Parse and set the fan's sensor interface
Matthew Barthbff10802020-08-25 10:07:57 -0500135 *
136 * @param[in] jsonObj - JSON object for the fan
137 *
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600138 * Sets the sensor interface to use when setting the `Target` property
Matthew Barthbff10802020-08-25 10:07:57 -0500139 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600140 void setInterface(const json& jsonObj);
Matthew Barthbff10802020-08-25 10:07:57 -0500141
142 /**
143 * @brief Parse and set the fan's sensor list
144 *
145 * @param[in] jsonObj - JSON object for the fan
146 *
147 * Sets the list of sensors that contain a `Target` property on dbus
148 * that make up this fan.
149 */
150 void setSensors(const json& jsonObj);
151
152 /**
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600153 * @brief Parse and set the fan's zone
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 zone this fan is included in.
Matthew Barthbff10802020-08-25 10:07:57 -0500158 */
Matthew Bartha3a8cc52021-01-15 12:40:25 -0600159 void setZone(const json& jsonObj);
Matthew Barthfcfa0522020-08-24 16:40:24 -0500160};
161
162} // namespace phosphor::fan::control::json