blob: fe1842f935e39f917cecfeebd7215f70ce4aef61 [file] [log] [blame]
James Feist1c8fba92019-12-20 15:12:07 -08001/*
2// Copyright (c) 2019 Intel 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 "async_resp.hpp"
19#include "dbus_utility.hpp"
20#include "redfish_util.hpp"
21
22#include <variant>
23
24namespace redfish
25{
26/**
27 * @brief Retrieves identify led group properties over dbus
28 *
29 * @param[in] aResp Shared pointer for generating response message.
30 *
31 * @return None.
32 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -050033// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +080034inline void
35 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
James Feist1c8fba92019-12-20 15:12:07 -080036{
37 BMCWEB_LOG_DEBUG << "Get led groups";
38 crow::connections::systemBus->async_method_call(
39 [aResp](const boost::system::error_code ec,
40 const std::variant<bool> asserted) {
41 // Some systems may not have enclosure_identify_blink object so
42 // proceed to get enclosure_identify state.
43 if (!ec)
44 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -050045 const bool* blinking = std::get_if<bool>(&asserted);
James Feist1c8fba92019-12-20 15:12:07 -080046 if (!blinking)
47 {
48 BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
49 messages::internalError(aResp->res);
50 return;
51 }
52 // Blinking ON, no need to check enclosure_identify assert.
53 if (*blinking)
54 {
55 aResp->res.jsonValue["IndicatorLED"] = "Blinking";
56 return;
57 }
58 }
59 crow::connections::systemBus->async_method_call(
Ed Tanous23a21a12020-07-25 04:45:05 +000060 [aResp](const boost::system::error_code ec2,
61 const std::variant<bool> asserted2) {
62 if (!ec2)
James Feist1c8fba92019-12-20 15:12:07 -080063 {
Ed Tanous23a21a12020-07-25 04:45:05 +000064 const bool* ledOn = std::get_if<bool>(&asserted2);
James Feist1c8fba92019-12-20 15:12:07 -080065 if (!ledOn)
66 {
67 BMCWEB_LOG_DEBUG
68 << "Get enclosure identity led failed";
69 messages::internalError(aResp->res);
70 return;
71 }
72
73 if (*ledOn)
74 {
75 aResp->res.jsonValue["IndicatorLED"] = "Lit";
76 }
77 else
78 {
79 aResp->res.jsonValue["IndicatorLED"] = "Off";
80 }
81 }
82 return;
83 },
84 "xyz.openbmc_project.LED.GroupManager",
85 "/xyz/openbmc_project/led/groups/enclosure_identify",
86 "org.freedesktop.DBus.Properties", "Get",
87 "xyz.openbmc_project.Led.Group", "Asserted");
88 },
89 "xyz.openbmc_project.LED.GroupManager",
90 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
91 "org.freedesktop.DBus.Properties", "Get",
92 "xyz.openbmc_project.Led.Group", "Asserted");
93}
94
95/**
96 * @brief Sets identify led group properties
97 *
98 * @param[in] aResp Shared pointer for generating response message.
99 * @param[in] ledState LED state passed from request
100 *
101 * @return None.
102 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500103// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +0800104inline void
105 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
106 const std::string& ledState)
James Feist1c8fba92019-12-20 15:12:07 -0800107{
108 BMCWEB_LOG_DEBUG << "Set led groups";
109 bool ledOn = false;
110 bool ledBlinkng = false;
111
112 if (ledState == "Lit")
113 {
114 ledOn = true;
115 }
116 else if (ledState == "Blinking")
117 {
118 ledBlinkng = true;
119 }
120 else if (ledState != "Off")
121 {
122 messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED");
123 return;
124 }
125
126 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000127 [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable {
James Feist1c8fba92019-12-20 15:12:07 -0800128 if (ec)
129 {
130 // Some systems may not have enclosure_identify_blink object so
131 // Lets set enclosure_identify state to true if Blinking is
132 // true.
133 if (ledBlinkng)
134 {
135 ledOn = true;
136 }
137 }
138 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000139 [aResp](const boost::system::error_code ec2) {
Ed Tanous23a21a12020-07-25 04:45:05 +0000140 if (ec2)
James Feist1c8fba92019-12-20 15:12:07 -0800141 {
Ed Tanous23a21a12020-07-25 04:45:05 +0000142 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
James Feist1c8fba92019-12-20 15:12:07 -0800143 messages::internalError(aResp->res);
144 return;
145 }
Jayaprakash Mutyala1d40ef62021-02-26 13:06:03 +0000146 messages::success(aResp->res);
James Feist1c8fba92019-12-20 15:12:07 -0800147 },
148 "xyz.openbmc_project.LED.GroupManager",
149 "/xyz/openbmc_project/led/groups/enclosure_identify",
150 "org.freedesktop.DBus.Properties", "Set",
151 "xyz.openbmc_project.Led.Group", "Asserted",
152 std::variant<bool>(ledOn));
153 },
154 "xyz.openbmc_project.LED.GroupManager",
155 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
156 "org.freedesktop.DBus.Properties", "Set",
157 "xyz.openbmc_project.Led.Group", "Asserted",
158 std::variant<bool>(ledBlinkng));
159}
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500160
161/**
162 * @brief Retrieves identify led group properties over dbus
163 *
164 * @param[in] aResp Shared pointer for generating response message.
165 *
166 * @return None.
167 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800168inline void
169 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500170{
171 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
172 crow::connections::systemBus->async_method_call(
173 [aResp](const boost::system::error_code ec,
174 const std::variant<bool> asserted) {
175 // Some systems may not have enclosure_identify_blink object so
176 // proceed to get enclosure_identify state.
177 if (!ec)
178 {
179 const bool* blinking = std::get_if<bool>(&asserted);
180 if (!blinking)
181 {
182 BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
183 messages::internalError(aResp->res);
184 return;
185 }
186 // Blinking ON, no need to check enclosure_identify assert.
187 if (*blinking)
188 {
189 aResp->res.jsonValue["LocationIndicatorActive"] = true;
190 return;
191 }
192 }
193 crow::connections::systemBus->async_method_call(
194 [aResp](const boost::system::error_code ec2,
195 const std::variant<bool> asserted2) {
196 if (!ec2)
197 {
198 const bool* ledOn = std::get_if<bool>(&asserted2);
199 if (!ledOn)
200 {
201 BMCWEB_LOG_DEBUG
202 << "Get enclosure identity led failed";
203 messages::internalError(aResp->res);
204 return;
205 }
206
207 if (*ledOn)
208 {
209 aResp->res.jsonValue["LocationIndicatorActive"] =
210 true;
211 }
212 else
213 {
214 aResp->res.jsonValue["LocationIndicatorActive"] =
215 false;
216 }
217 }
218 return;
219 },
220 "xyz.openbmc_project.LED.GroupManager",
221 "/xyz/openbmc_project/led/groups/enclosure_identify",
222 "org.freedesktop.DBus.Properties", "Get",
223 "xyz.openbmc_project.Led.Group", "Asserted");
224 },
225 "xyz.openbmc_project.LED.GroupManager",
226 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
227 "org.freedesktop.DBus.Properties", "Get",
228 "xyz.openbmc_project.Led.Group", "Asserted");
229}
230
231/**
232 * @brief Sets identify led group properties
233 *
234 * @param[in] aResp Shared pointer for generating response message.
235 * @param[in] ledState LED state passed from request
236 *
237 * @return None.
238 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800239inline void
240 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
241 const bool ledState)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500242{
243 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
244
245 crow::connections::systemBus->async_method_call(
246 [aResp, ledState](const boost::system::error_code ec) mutable {
247 if (ec)
248 {
249 // Some systems may not have enclosure_identify_blink object so
250 // lets set enclosure_identify state also if
251 // enclosure_identify_blink failed
252 crow::connections::systemBus->async_method_call(
253 [aResp](const boost::system::error_code ec2) {
254 if (ec2)
255 {
256 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
257 messages::internalError(aResp->res);
258 return;
259 }
260 },
261 "xyz.openbmc_project.LED.GroupManager",
262 "/xyz/openbmc_project/led/groups/enclosure_identify",
263 "org.freedesktop.DBus.Properties", "Set",
264 "xyz.openbmc_project.Led.Group", "Asserted",
265 std::variant<bool>(ledState));
266 }
267 },
268 "xyz.openbmc_project.LED.GroupManager",
269 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
270 "org.freedesktop.DBus.Properties", "Set",
271 "xyz.openbmc_project.Led.Group", "Asserted",
272 std::variant<bool>(ledState));
273}
Ed Tanous23a21a12020-07-25 04:45:05 +0000274} // namespace redfish