1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 // SPDX-FileCopyrightText: Copyright 2019 Intel Corporation 4 #pragma once 5 6 #include "async_resp.hpp" 7 #include "dbus_singleton.hpp" 8 #include "dbus_utility.hpp" 9 #include "error_messages.hpp" 10 #include "generated/enums/chassis.hpp" 11 #include "logging.hpp" 12 #include "utils/dbus_utils.hpp" 13 14 #include <sdbusplus/asio/property.hpp> 15 #include <sdbusplus/message/native_types.hpp> 16 17 #include <memory> 18 19 namespace redfish 20 { 21 /** 22 * @brief Retrieves identify led group properties over dbus 23 * 24 * @param[in] asyncResp Shared pointer for generating response message. 25 * 26 * @return None. 27 */ 28 // TODO (Gunnar): Remove IndicatorLED after enough time has passed 29 inline void 30 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 31 { 32 BMCWEB_LOG_DEBUG("Get led groups"); 33 dbus::utility::getProperty<bool>( 34 "xyz.openbmc_project.LED.GroupManager", 35 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 36 "xyz.openbmc_project.Led.Group", "Asserted", 37 [asyncResp](const boost::system::error_code& ec, const bool blinking) { 38 // Some systems may not have enclosure_identify_blink object so 39 // proceed to get enclosure_identify state. 40 if (ec == boost::system::errc::invalid_argument) 41 { 42 BMCWEB_LOG_DEBUG( 43 "Get identity blinking LED failed, mismatch in property type"); 44 messages::internalError(asyncResp->res); 45 return; 46 } 47 48 // Blinking ON, no need to check enclosure_identify assert. 49 if (!ec && blinking) 50 { 51 asyncResp->res.jsonValue["IndicatorLED"] = 52 chassis::IndicatorLED::Blinking; 53 return; 54 } 55 56 dbus::utility::getProperty<bool>( 57 "xyz.openbmc_project.LED.GroupManager", 58 "/xyz/openbmc_project/led/groups/enclosure_identify", 59 "xyz.openbmc_project.Led.Group", "Asserted", 60 [asyncResp](const boost::system::error_code& ec2, 61 const bool ledOn) { 62 if (ec2 == boost::system::errc::invalid_argument) 63 { 64 BMCWEB_LOG_DEBUG( 65 "Get enclosure identity led failed, mismatch in property type"); 66 messages::internalError(asyncResp->res); 67 return; 68 } 69 70 if (ec2) 71 { 72 return; 73 } 74 75 if (ledOn) 76 { 77 asyncResp->res.jsonValue["IndicatorLED"] = 78 chassis::IndicatorLED::Lit; 79 } 80 else 81 { 82 asyncResp->res.jsonValue["IndicatorLED"] = 83 chassis::IndicatorLED::Off; 84 } 85 }); 86 }); 87 } 88 89 /** 90 * @brief Sets identify led group properties 91 * 92 * @param[in] asyncResp Shared pointer for generating response message. 93 * @param[in] ledState LED state passed from request 94 * 95 * @return None. 96 */ 97 // TODO (Gunnar): Remove IndicatorLED after enough time has passed 98 inline void 99 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 100 const std::string& ledState) 101 { 102 BMCWEB_LOG_DEBUG("Set led groups"); 103 bool ledOn = false; 104 bool ledBlinkng = false; 105 106 if (ledState == "Lit") 107 { 108 ledOn = true; 109 } 110 else if (ledState == "Blinking") 111 { 112 ledBlinkng = true; 113 } 114 else if (ledState != "Off") 115 { 116 messages::propertyValueNotInList(asyncResp->res, ledState, 117 "IndicatorLED"); 118 return; 119 } 120 121 sdbusplus::asio::setProperty( 122 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 123 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 124 "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng, 125 [asyncResp, ledOn, 126 ledBlinkng](const boost::system::error_code& ec) mutable { 127 if (ec) 128 { 129 // Some systems may not have enclosure_identify_blink object so 130 // Lets set enclosure_identify state to true if Blinking is 131 // true. 132 if (ledBlinkng) 133 { 134 ledOn = true; 135 } 136 } 137 setDbusProperty( 138 asyncResp, "IndicatorLED", 139 "xyz.openbmc_project.LED.GroupManager", 140 sdbusplus::message::object_path( 141 "/xyz/openbmc_project/led/groups/enclosure_identify"), 142 "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng); 143 }); 144 } 145 146 /** 147 * @brief Retrieves identify system led group properties over dbus 148 * 149 * @param[in] asyncResp Shared pointer for generating response message. 150 * 151 * @return None. 152 */ 153 inline void getSystemLocationIndicatorActive( 154 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 155 { 156 BMCWEB_LOG_DEBUG("Get LocationIndicatorActive"); 157 dbus::utility::getProperty<bool>( 158 "xyz.openbmc_project.LED.GroupManager", 159 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 160 "xyz.openbmc_project.Led.Group", "Asserted", 161 [asyncResp](const boost::system::error_code& ec, const bool blinking) { 162 // Some systems may not have enclosure_identify_blink object so 163 // proceed to get enclosure_identify state. 164 if (ec == boost::system::errc::invalid_argument) 165 { 166 BMCWEB_LOG_DEBUG( 167 "Get identity blinking LED failed, mismatch in property type"); 168 messages::internalError(asyncResp->res); 169 return; 170 } 171 172 // Blinking ON, no need to check enclosure_identify assert. 173 if (!ec && blinking) 174 { 175 asyncResp->res.jsonValue["LocationIndicatorActive"] = true; 176 return; 177 } 178 179 dbus::utility::getProperty<bool>( 180 "xyz.openbmc_project.LED.GroupManager", 181 "/xyz/openbmc_project/led/groups/enclosure_identify", 182 "xyz.openbmc_project.Led.Group", "Asserted", 183 [asyncResp](const boost::system::error_code& ec2, 184 const bool ledOn) { 185 if (ec2 == boost::system::errc::invalid_argument) 186 { 187 BMCWEB_LOG_DEBUG( 188 "Get enclosure identity led failed, mismatch in property type"); 189 messages::internalError(asyncResp->res); 190 return; 191 } 192 193 if (ec2) 194 { 195 return; 196 } 197 198 asyncResp->res.jsonValue["LocationIndicatorActive"] = ledOn; 199 }); 200 }); 201 } 202 203 /** 204 * @brief Sets identify system led group properties 205 * 206 * @param[in] asyncResp Shared pointer for generating response message. 207 * @param[in] ledState LED state passed from request 208 * 209 * @return None. 210 */ 211 inline void setSystemLocationIndicatorActive( 212 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const bool ledState) 213 { 214 BMCWEB_LOG_DEBUG("Set LocationIndicatorActive"); 215 216 sdbusplus::asio::setProperty( 217 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 218 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 219 "xyz.openbmc_project.Led.Group", "Asserted", ledState, 220 [asyncResp, ledState](const boost::system::error_code& ec) { 221 if (ec) 222 { 223 // Some systems may not have enclosure_identify_blink object so 224 // lets set enclosure_identify state also if 225 // enclosure_identify_blink failed 226 setDbusProperty( 227 asyncResp, "LocationIndicatorActive", 228 "xyz.openbmc_project.LED.GroupManager", 229 sdbusplus::message::object_path( 230 "/xyz/openbmc_project/led/groups/enclosure_identify"), 231 "xyz.openbmc_project.Led.Group", "Asserted", ledState); 232 } 233 }); 234 } 235 } // namespace redfish 236