blob: 6f5f5f121b792bbecea38af729c2b61a5e365f0a [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>
Jonathan Doman1e1e5982021-06-11 09:36:17 -070023#include <sdbusplus/asio/property.hpp>
John Edward Broadbent7e860f12021-04-08 15:57:16 -070024
James Feist1c8fba92019-12-20 15:12:07 -080025namespace redfish
26{
27/**
28 * @brief Retrieves identify led group properties over dbus
29 *
30 * @param[in] aResp Shared pointer for generating response message.
31 *
32 * @return None.
33 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -050034// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +080035inline void
36 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
James Feist1c8fba92019-12-20 15:12:07 -080037{
38 BMCWEB_LOG_DEBUG << "Get led groups";
Jonathan Doman1e1e5982021-06-11 09:36:17 -070039 sdbusplus::asio::getProperty<bool>(
40 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
41 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
42 "xyz.openbmc_project.Led.Group", "Asserted",
43 [aResp](const boost::system::error_code ec, const bool blinking) {
James Feist1c8fba92019-12-20 15:12:07 -080044 // Some systems may not have enclosure_identify_blink object so
45 // proceed to get enclosure_identify state.
Jonathan Doman1e1e5982021-06-11 09:36:17 -070046 if (ec == boost::system::errc::invalid_argument)
James Feist1c8fba92019-12-20 15:12:07 -080047 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -070048 BMCWEB_LOG_DEBUG
49 << "Get identity blinking LED failed, missmatch in property type";
50 messages::internalError(aResp->res);
51 return;
James Feist1c8fba92019-12-20 15:12:07 -080052 }
James Feist1c8fba92019-12-20 15:12:07 -080053
Jonathan Doman1e1e5982021-06-11 09:36:17 -070054 // Blinking ON, no need to check enclosure_identify assert.
55 if (!ec && blinking)
56 {
57 aResp->res.jsonValue["IndicatorLED"] = "Blinking";
58 return;
59 }
60
61 sdbusplus::asio::getProperty<bool>(
62 *crow::connections::systemBus,
James Feist1c8fba92019-12-20 15:12:07 -080063 "xyz.openbmc_project.LED.GroupManager",
64 "/xyz/openbmc_project/led/groups/enclosure_identify",
Jonathan Doman1e1e5982021-06-11 09:36:17 -070065 "xyz.openbmc_project.Led.Group", "Asserted",
66 [aResp](const boost::system::error_code ec2, const bool ledOn) {
67 if (ec2 == boost::system::errc::invalid_argument)
68 {
69 BMCWEB_LOG_DEBUG
70 << "Get enclosure identity led failed, missmatch in property type";
71 messages::internalError(aResp->res);
72 return;
73 }
74
75 if (ec2)
76 {
77 return;
78 }
79
80 if (ledOn)
81 {
82 aResp->res.jsonValue["IndicatorLED"] = "Lit";
83 }
84 else
85 {
86 aResp->res.jsonValue["IndicatorLED"] = "Off";
87 }
88 });
89 });
James Feist1c8fba92019-12-20 15:12:07 -080090}
91
92/**
93 * @brief Sets identify led group properties
94 *
95 * @param[in] aResp Shared pointer for generating response message.
96 * @param[in] ledState LED state passed from request
97 *
98 * @return None.
99 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500100// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +0800101inline void
102 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
103 const std::string& ledState)
James Feist1c8fba92019-12-20 15:12:07 -0800104{
105 BMCWEB_LOG_DEBUG << "Set led groups";
106 bool ledOn = false;
107 bool ledBlinkng = false;
108
109 if (ledState == "Lit")
110 {
111 ledOn = true;
112 }
113 else if (ledState == "Blinking")
114 {
115 ledBlinkng = true;
116 }
117 else if (ledState != "Off")
118 {
119 messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED");
120 return;
121 }
122
123 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000124 [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable {
James Feist1c8fba92019-12-20 15:12:07 -0800125 if (ec)
126 {
127 // Some systems may not have enclosure_identify_blink object so
128 // Lets set enclosure_identify state to true if Blinking is
129 // true.
130 if (ledBlinkng)
131 {
132 ledOn = true;
133 }
134 }
135 crow::connections::systemBus->async_method_call(
Ed Tanouscb13a392020-07-25 19:02:03 +0000136 [aResp](const boost::system::error_code ec2) {
Ed Tanous23a21a12020-07-25 04:45:05 +0000137 if (ec2)
James Feist1c8fba92019-12-20 15:12:07 -0800138 {
Ed Tanous23a21a12020-07-25 04:45:05 +0000139 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
James Feist1c8fba92019-12-20 15:12:07 -0800140 messages::internalError(aResp->res);
141 return;
142 }
Jayaprakash Mutyala1d40ef62021-02-26 13:06:03 +0000143 messages::success(aResp->res);
James Feist1c8fba92019-12-20 15:12:07 -0800144 },
145 "xyz.openbmc_project.LED.GroupManager",
146 "/xyz/openbmc_project/led/groups/enclosure_identify",
147 "org.freedesktop.DBus.Properties", "Set",
148 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800149 dbus::utility::DbusVariantType(ledOn));
James Feist1c8fba92019-12-20 15:12:07 -0800150 },
151 "xyz.openbmc_project.LED.GroupManager",
152 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
153 "org.freedesktop.DBus.Properties", "Set",
154 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800155 dbus::utility::DbusVariantType(ledBlinkng));
James Feist1c8fba92019-12-20 15:12:07 -0800156}
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500157
158/**
159 * @brief Retrieves identify led group properties over dbus
160 *
161 * @param[in] aResp Shared pointer for generating response message.
162 *
163 * @return None.
164 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800165inline void
166 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500167{
168 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700169 sdbusplus::asio::getProperty<bool>(
170 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
171 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
172 "xyz.openbmc_project.Led.Group", "Asserted",
173 [aResp](const boost::system::error_code ec, const bool blinking) {
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500174 // Some systems may not have enclosure_identify_blink object so
175 // proceed to get enclosure_identify state.
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700176 if (ec == boost::system::errc::invalid_argument)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500177 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700178 BMCWEB_LOG_DEBUG
179 << "Get identity blinking LED failed, missmatch in property type";
180 messages::internalError(aResp->res);
181 return;
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500182 }
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500183
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700184 // Blinking ON, no need to check enclosure_identify assert.
185 if (!ec && blinking)
186 {
187 aResp->res.jsonValue["LocationIndicatorActive"] = true;
188 return;
189 }
190
191 sdbusplus::asio::getProperty<bool>(
192 *crow::connections::systemBus,
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500193 "xyz.openbmc_project.LED.GroupManager",
194 "/xyz/openbmc_project/led/groups/enclosure_identify",
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700195 "xyz.openbmc_project.Led.Group", "Asserted",
196 [aResp](const boost::system::error_code ec2, const bool ledOn) {
197 if (ec2 == boost::system::errc::invalid_argument)
198 {
199 BMCWEB_LOG_DEBUG
200 << "Get enclosure identity led failed, missmatch in property type";
201 messages::internalError(aResp->res);
202 return;
203 }
204
205 if (ec2)
206 {
207 return;
208 }
209
210 aResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
211 });
212 });
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500213}
214
215/**
216 * @brief Sets identify led group properties
217 *
218 * @param[in] aResp Shared pointer for generating response message.
219 * @param[in] ledState LED state passed from request
220 *
221 * @return None.
222 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800223inline void
224 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
225 const bool ledState)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500226{
227 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
228
229 crow::connections::systemBus->async_method_call(
230 [aResp, ledState](const boost::system::error_code ec) mutable {
231 if (ec)
232 {
233 // Some systems may not have enclosure_identify_blink object so
234 // lets set enclosure_identify state also if
235 // enclosure_identify_blink failed
236 crow::connections::systemBus->async_method_call(
237 [aResp](const boost::system::error_code ec2) {
238 if (ec2)
239 {
240 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
241 messages::internalError(aResp->res);
242 return;
243 }
244 },
245 "xyz.openbmc_project.LED.GroupManager",
246 "/xyz/openbmc_project/led/groups/enclosure_identify",
247 "org.freedesktop.DBus.Properties", "Set",
248 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800249 dbus::utility::DbusVariantType(ledState));
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500250 }
251 },
252 "xyz.openbmc_project.LED.GroupManager",
253 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
254 "org.freedesktop.DBus.Properties", "Set",
255 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800256 dbus::utility::DbusVariantType(ledState));
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500257}
Ed Tanous23a21a12020-07-25 04:45:05 +0000258} // namespace redfish