blob: a5725f1e9e2fa6a73ac8db13e0377702797bf465 [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
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080018#include "app.hpp"
James Feist1c8fba92019-12-20 15:12:07 -080019#include "async_resp.hpp"
20#include "dbus_utility.hpp"
21#include "redfish_util.hpp"
22
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",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -080043 [aResp](const boost::system::error_code& ec, const bool blinking) {
Ed Tanous002d39b2022-05-31 08:59:27 -070044 // Some systems may not have enclosure_identify_blink object so
45 // proceed to get enclosure_identify state.
46 if (ec == boost::system::errc::invalid_argument)
47 {
48 BMCWEB_LOG_DEBUG
49 << "Get identity blinking LED failed, missmatch in property type";
50 messages::internalError(aResp->res);
51 return;
52 }
53
54 // 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,
63 "xyz.openbmc_project.LED.GroupManager",
64 "/xyz/openbmc_project/led/groups/enclosure_identify",
65 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -080066 [aResp](const boost::system::error_code& ec2, const bool ledOn) {
Ed Tanous002d39b2022-05-31 08:59:27 -070067 if (ec2 == boost::system::errc::invalid_argument)
James Feist1c8fba92019-12-20 15:12:07 -080068 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -070069 BMCWEB_LOG_DEBUG
Ed Tanous002d39b2022-05-31 08:59:27 -070070 << "Get enclosure identity led failed, missmatch in property type";
Jonathan Doman1e1e5982021-06-11 09:36:17 -070071 messages::internalError(aResp->res);
72 return;
James Feist1c8fba92019-12-20 15:12:07 -080073 }
James Feist1c8fba92019-12-20 15:12:07 -080074
Ed Tanous002d39b2022-05-31 08:59:27 -070075 if (ec2)
Jonathan Doman1e1e5982021-06-11 09:36:17 -070076 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -070077 return;
78 }
79
Ed Tanous002d39b2022-05-31 08:59:27 -070080 if (ledOn)
81 {
82 aResp->res.jsonValue["IndicatorLED"] = "Lit";
83 }
84 else
85 {
86 aResp->res.jsonValue["IndicatorLED"] = "Off";
87 }
88 });
Jonathan Doman1e1e5982021-06-11 09:36:17 -070089 });
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 Tanous5e7e2dc2023-02-16 10:37:01 -0800124 [aResp, ledOn,
125 ledBlinkng](const boost::system::error_code& ec) mutable {
Ed Tanous002d39b2022-05-31 08:59:27 -0700126 if (ec)
127 {
128 // Some systems may not have enclosure_identify_blink object so
129 // Lets set enclosure_identify state to true if Blinking is
130 // true.
131 if (ledBlinkng)
James Feist1c8fba92019-12-20 15:12:07 -0800132 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700133 ledOn = true;
James Feist1c8fba92019-12-20 15:12:07 -0800134 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700135 }
136 crow::connections::systemBus->async_method_call(
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800137 [aResp](const boost::system::error_code& ec2) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700138 if (ec2)
139 {
140 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
141 messages::internalError(aResp->res);
142 return;
143 }
144 messages::success(aResp->res);
145 },
146 "xyz.openbmc_project.LED.GroupManager",
147 "/xyz/openbmc_project/led/groups/enclosure_identify",
148 "org.freedesktop.DBus.Properties", "Set",
149 "xyz.openbmc_project.Led.Group", "Asserted",
150 dbus::utility::DbusVariantType(ledOn));
James Feist1c8fba92019-12-20 15:12:07 -0800151 },
152 "xyz.openbmc_project.LED.GroupManager",
153 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
154 "org.freedesktop.DBus.Properties", "Set",
155 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800156 dbus::utility::DbusVariantType(ledBlinkng));
James Feist1c8fba92019-12-20 15:12:07 -0800157}
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500158
159/**
160 * @brief Retrieves identify led group properties over dbus
161 *
162 * @param[in] aResp Shared pointer for generating response message.
163 *
164 * @return None.
165 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800166inline void
167 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500168{
169 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700170 sdbusplus::asio::getProperty<bool>(
171 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
172 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
173 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800174 [aResp](const boost::system::error_code& ec, const bool blinking) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700175 // Some systems may not have enclosure_identify_blink object so
176 // proceed to get enclosure_identify state.
177 if (ec == boost::system::errc::invalid_argument)
178 {
179 BMCWEB_LOG_DEBUG
180 << "Get identity blinking LED failed, missmatch in property type";
181 messages::internalError(aResp->res);
182 return;
183 }
184
185 // Blinking ON, no need to check enclosure_identify assert.
186 if (!ec && blinking)
187 {
188 aResp->res.jsonValue["LocationIndicatorActive"] = true;
189 return;
190 }
191
192 sdbusplus::asio::getProperty<bool>(
193 *crow::connections::systemBus,
194 "xyz.openbmc_project.LED.GroupManager",
195 "/xyz/openbmc_project/led/groups/enclosure_identify",
196 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800197 [aResp](const boost::system::error_code& ec2, const bool ledOn) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700198 if (ec2 == boost::system::errc::invalid_argument)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500199 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700200 BMCWEB_LOG_DEBUG
Ed Tanous002d39b2022-05-31 08:59:27 -0700201 << "Get enclosure identity led failed, missmatch in property type";
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700202 messages::internalError(aResp->res);
203 return;
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500204 }
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500205
Ed Tanous002d39b2022-05-31 08:59:27 -0700206 if (ec2)
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700207 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700208 return;
209 }
210
Ed Tanous002d39b2022-05-31 08:59:27 -0700211 aResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
212 });
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700213 });
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500214}
215
216/**
217 * @brief Sets identify led group properties
218 *
219 * @param[in] aResp Shared pointer for generating response message.
220 * @param[in] ledState LED state passed from request
221 *
222 * @return None.
223 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800224inline void
225 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
226 const bool ledState)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500227{
228 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
229
230 crow::connections::systemBus->async_method_call(
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800231 [aResp, ledState](const boost::system::error_code& ec) mutable {
Ed Tanous002d39b2022-05-31 08:59:27 -0700232 if (ec)
233 {
234 // Some systems may not have enclosure_identify_blink object so
235 // lets set enclosure_identify state also if
236 // enclosure_identify_blink failed
237 crow::connections::systemBus->async_method_call(
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800238 [aResp](const boost::system::error_code& ec2) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700239 if (ec2)
240 {
241 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
242 messages::internalError(aResp->res);
243 return;
244 }
245 },
246 "xyz.openbmc_project.LED.GroupManager",
247 "/xyz/openbmc_project/led/groups/enclosure_identify",
248 "org.freedesktop.DBus.Properties", "Set",
249 "xyz.openbmc_project.Led.Group", "Asserted",
250 dbus::utility::DbusVariantType(ledState));
251 }
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500252 },
253 "xyz.openbmc_project.LED.GroupManager",
254 "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
255 "org.freedesktop.DBus.Properties", "Set",
256 "xyz.openbmc_project.Led.Group", "Asserted",
Ed Tanous168e20c2021-12-13 14:39:53 -0800257 dbus::utility::DbusVariantType(ledState));
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500258}
Ed Tanous23a21a12020-07-25 04:45:05 +0000259} // namespace redfish