blob: 2e7d6ecf2ee89255a868cf71df5613660ccc8bd4 [file] [log] [blame]
Matthew Barth89c2fa12021-02-04 14:50:40 -06001/**
2 * Copyright © 2021 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 "../zone.hpp"
19#include "action.hpp"
20#include "group.hpp"
21
22#include <nlohmann/json.hpp>
23
24namespace phosphor::fan::control::json
25{
26
27using json = nlohmann::json;
28
29/**
30 * @class CountStateTarget - Action to set a target when members are at a state
31 *
32 * Sets the fans to a configured target when a number of members within the
33 * group are at a configured state. Once the number of members at the given
34 * state falls below the configured count, active fan target changes are
35 * allowed.
36 */
37class CountStateTarget :
38 public ActionBase,
39 public ActionRegister<CountStateTarget>
40{
41 public:
42 /* Name of this action */
Matthew Barthbab94f22021-08-24 11:21:42 -050043 static constexpr auto name = "count_state_before_target";
Matthew Barth89c2fa12021-02-04 14:50:40 -060044
45 CountStateTarget() = delete;
46 CountStateTarget(const CountStateTarget&) = delete;
47 CountStateTarget(CountStateTarget&&) = delete;
48 CountStateTarget& operator=(const CountStateTarget&) = delete;
49 CountStateTarget& operator=(CountStateTarget&&) = delete;
50 ~CountStateTarget() = default;
51
52 /**
53 * @brief Set target when a number of members are at a given state
54 *
55 * @param[in] jsonObj - JSON configuration of this action
Matthew Barth19c77492021-04-08 10:06:06 -050056 * @param[in] groups - Groups of dbus objects the action uses
Matthew Barth89c2fa12021-02-04 14:50:40 -060057 */
Matthew Barth19c77492021-04-08 10:06:06 -050058 CountStateTarget(const json& jsonObj, const std::vector<Group>& groups);
Matthew Barth89c2fa12021-02-04 14:50:40 -060059
60 /**
61 * @brief Run the action
62 *
63 * Counts the number of members within a group are equal to a given state
64 * and when the number of members are at or above the given state, the fans
65 * within the zone are set to the configured target. The fans are held at
66 * the configured target until the number of members equal to the given
67 * state fall below the provided count.
68 *
69 * @param[in] zone - Zone to run the action on
Matthew Barth89c2fa12021-02-04 14:50:40 -060070 */
Matthew Barth6d2476c2021-04-08 10:48:57 -050071 void run(Zone& zone) override;
Matthew Barth89c2fa12021-02-04 14:50:40 -060072
73 private:
74 /* Number of group members */
75 size_t _count;
76
77 /* State the members must be at to set the target */
78 PropertyVariantType _state;
79
80 /* Target for this action */
81 uint64_t _target;
82
Matthew Barth89c2fa12021-02-04 14:50:40 -060083 /**
84 * @brief Parse and set the count
85 *
86 * @param[in] jsonObj - JSON object for the action
87 *
88 * Sets the number of members that must equal the state
89 */
90 void setCount(const json& jsonObj);
91
92 /**
93 * @brief Parse and set the state
94 *
95 * @param[in] jsonObj - JSON object for the action
96 *
97 * Sets the state for each member to equal to set the target
98 */
99 void setState(const json& jsonObj);
100
101 /**
102 * @brief Parse and set the target
103 *
104 * @param[in] jsonObj - JSON object for the action
105 *
106 * Sets the target to use when running the action
107 */
108 void setTarget(const json& jsonObj);
109};
110
111} // namespace phosphor::fan::control::json