blob: 1fdf5e7e13c7955ef263885e2c139f655578299c [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
John Edward Broadbent7e860f12021-04-08 15:57:16 -070022#include <app.hpp>
23
James Feist1c8fba92019-12-20 15:12:07 -080024#include <variant>
25
26namespace redfish
27{
28/**
29 * @brief Retrieves identify led group properties over dbus
30 *
31 * @param[in] aResp Shared pointer for generating response message.
32 *
33 * @return None.
34 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -050035// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +080036inline void
37 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
James Feist1c8fba92019-12-20 15:12:07 -080038{
39 BMCWEB_LOG_DEBUG << "Get led groups";
40 crow::connections::systemBus->async_method_call(
41 [aResp](const boost::system::error_code ec,
42 const std::variant<bool> asserted) {
43 // Some systems may not have enclosure_identify_blink object so
44 // proceed to get enclosure_identify state.
45 if (!ec)
46 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -050047 const bool* blinking = std::get_if<bool>(&asserted);
James Feist1c8fba92019-12-20 15:12:07 -080048 if (!blinking)
49 {
50 BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
51 messages::internalError(aResp->res);
52 return;
53 }
54 // Blinking ON, no need to check enclosure_identify assert.
55 if (*blinking)
56 {
57 aResp->res.jsonValue["IndicatorLED"] = "Blinking";
58 return;
59 }
60 }
61 crow::connections::systemBus->async_method_call(
Ed Tanous23a21a12020-07-25 04:45:05 +000062 [aResp](const boost::system::error_code ec2,
63 const std::variant<bool> asserted2) {
64 if (!ec2)
James Feist1c8fba92019-12-20 15:12:07 -080065 {
Ed Tanous23a21a12020-07-25 04:45:05 +000066 const bool* ledOn = std::get_if<bool>(&asserted2);
James Feist1c8fba92019-12-20 15:12:07 -080067 if (!ledOn)
68 {
69 BMCWEB_LOG_DEBUG
70 << "Get enclosure identity led failed";
71 messages::internalError(aResp->res);
72 return;
73 }
74
75 if (*ledOn)
76 {
77 aResp->res.jsonValue["IndicatorLED"] = "Lit";
78 }
79 else
80 {
81 aResp->res.jsonValue["IndicatorLED"] = "Off";
82 }
83 }
84 return;
85 },
86 "xyz.openbmc_project.LED.GroupManager",
87 "/xyz/openbmc_project/led/groups/enclosure_identify",
88 "org.freedesktop.DBus.Properties", "Get",
89 "xyz.openbmc_project.Led.Group", "Asserted");
90 },
91 "xyz.openbmc_project.LED.GroupManager",
92 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
93 "org.freedesktop.DBus.Properties", "Get",
94 "xyz.openbmc_project.Led.Group", "Asserted");
95}
96
97/**
98 * @brief Sets identify led group properties
99 *
100 * @param[in] aResp Shared pointer for generating response message.
101 * @param[in] ledState LED state passed from request
102 *
103 * @return None.
104 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500105// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +0800106inline void
107 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
108 const std::string& ledState)
James Feist1c8fba92019-12-20 15:12:07 -0800109{
110 BMCWEB_LOG_DEBUG << "Set led groups";
111 bool ledOn = false;
112 bool ledBlinkng = false;
113
114 if (ledState == "Lit")
115 {
116 ledOn = true;
117 }
118 else if (ledState == "Blinking")
119 {
120 ledBlinkng = true;
121 }
122 else if (ledState != "Off")
123 {
124 messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED");
125 return;
126 }
127
128 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000129 [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable {
James Feist1c8fba92019-12-20 15:12:07 -0800130 if (ec)
131 {
132 // Some systems may not have enclosure_identify_blink object so
133 // Lets set enclosure_identify state to true if Blinking is
134 // true.
135 if (ledBlinkng)
136 {
137 ledOn = true;
138 }
139 }
140 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000141 [aResp](const boost::system::error_code ec2) {
Ed Tanous23a21a12020-07-25 04:45:05 +0000142 if (ec2)
James Feist1c8fba92019-12-20 15:12:07 -0800143 {
Ed Tanous23a21a12020-07-25 04:45:05 +0000144 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
James Feist1c8fba92019-12-20 15:12:07 -0800145 messages::internalError(aResp->res);
146 return;
147 }
Jayaprakash Mutyala1d40ef62021-02-26 13:06:03 +0000148 messages::success(aResp->res);
James Feist1c8fba92019-12-20 15:12:07 -0800149 },
150 "xyz.openbmc_project.LED.GroupManager",
151 "/xyz/openbmc_project/led/groups/enclosure_identify",
152 "org.freedesktop.DBus.Properties", "Set",
153 "xyz.openbmc_project.Led.Group", "Asserted",
154 std::variant<bool>(ledOn));
155 },
156 "xyz.openbmc_project.LED.GroupManager",
157 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
158 "org.freedesktop.DBus.Properties", "Set",
159 "xyz.openbmc_project.Led.Group", "Asserted",
160 std::variant<bool>(ledBlinkng));
161}
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500162
163/**
164 * @brief Retrieves identify led group properties over dbus
165 *
166 * @param[in] aResp Shared pointer for generating response message.
167 *
168 * @return None.
169 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800170inline void
171 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500172{
173 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
174 crow::connections::systemBus->async_method_call(
175 [aResp](const boost::system::error_code ec,
176 const std::variant<bool> asserted) {
177 // Some systems may not have enclosure_identify_blink object so
178 // proceed to get enclosure_identify state.
179 if (!ec)
180 {
181 const bool* blinking = std::get_if<bool>(&asserted);
182 if (!blinking)
183 {
184 BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
185 messages::internalError(aResp->res);
186 return;
187 }
188 // Blinking ON, no need to check enclosure_identify assert.
189 if (*blinking)
190 {
191 aResp->res.jsonValue["LocationIndicatorActive"] = true;
192 return;
193 }
194 }
195 crow::connections::systemBus->async_method_call(
196 [aResp](const boost::system::error_code ec2,
197 const std::variant<bool> asserted2) {
198 if (!ec2)
199 {
200 const bool* ledOn = std::get_if<bool>(&asserted2);
201 if (!ledOn)
202 {
203 BMCWEB_LOG_DEBUG
204 << "Get enclosure identity led failed";
205 messages::internalError(aResp->res);
206 return;
207 }
208
209 if (*ledOn)
210 {
211 aResp->res.jsonValue["LocationIndicatorActive"] =
212 true;
213 }
214 else
215 {
216 aResp->res.jsonValue["LocationIndicatorActive"] =
217 false;
218 }
219 }
220 return;
221 },
222 "xyz.openbmc_project.LED.GroupManager",
223 "/xyz/openbmc_project/led/groups/enclosure_identify",
224 "org.freedesktop.DBus.Properties", "Get",
225 "xyz.openbmc_project.Led.Group", "Asserted");
226 },
227 "xyz.openbmc_project.LED.GroupManager",
228 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
229 "org.freedesktop.DBus.Properties", "Get",
230 "xyz.openbmc_project.Led.Group", "Asserted");
231}
232
233/**
234 * @brief Sets identify led group properties
235 *
236 * @param[in] aResp Shared pointer for generating response message.
237 * @param[in] ledState LED state passed from request
238 *
239 * @return None.
240 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800241inline void
242 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
243 const bool ledState)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500244{
245 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
246
247 crow::connections::systemBus->async_method_call(
248 [aResp, ledState](const boost::system::error_code ec) mutable {
249 if (ec)
250 {
251 // Some systems may not have enclosure_identify_blink object so
252 // lets set enclosure_identify state also if
253 // enclosure_identify_blink failed
254 crow::connections::systemBus->async_method_call(
255 [aResp](const boost::system::error_code ec2) {
256 if (ec2)
257 {
258 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
259 messages::internalError(aResp->res);
260 return;
261 }
262 },
263 "xyz.openbmc_project.LED.GroupManager",
264 "/xyz/openbmc_project/led/groups/enclosure_identify",
265 "org.freedesktop.DBus.Properties", "Set",
266 "xyz.openbmc_project.Led.Group", "Asserted",
267 std::variant<bool>(ledState));
268 }
269 },
270 "xyz.openbmc_project.LED.GroupManager",
271 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
272 "org.freedesktop.DBus.Properties", "Set",
273 "xyz.openbmc_project.Led.Group", "Asserted",
274 std::variant<bool>(ledState));
275}
Ed Tanous23a21a12020-07-25 04:45:05 +0000276} // namespace redfish