1 /* 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 <app.hpp> 23 #include <sdbusplus/asio/property.hpp> 24 25 namespace 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 */ 34 // TODO (Gunnar): Remove IndicatorLED after enough time has passed 35 inline void 36 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 37 { 38 BMCWEB_LOG_DEBUG << "Get led groups"; 39 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) { 44 // 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", 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 }); 90 } 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 */ 100 // TODO (Gunnar): Remove IndicatorLED after enough time has passed 101 inline void 102 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 103 const std::string& ledState) 104 { 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( 124 [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable { 125 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( 136 [aResp](const boost::system::error_code ec2) { 137 if (ec2) 138 { 139 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 140 messages::internalError(aResp->res); 141 return; 142 } 143 messages::success(aResp->res); 144 }, 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", 149 dbus::utility::DbusVariantType(ledOn)); 150 }, 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", 155 dbus::utility::DbusVariantType(ledBlinkng)); 156 } 157 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 */ 165 inline void 166 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 167 { 168 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive"; 169 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) { 174 // Some systems may not have enclosure_identify_blink object so 175 // proceed to get enclosure_identify state. 176 if (ec == boost::system::errc::invalid_argument) 177 { 178 BMCWEB_LOG_DEBUG 179 << "Get identity blinking LED failed, missmatch in property type"; 180 messages::internalError(aResp->res); 181 return; 182 } 183 184 // 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, 193 "xyz.openbmc_project.LED.GroupManager", 194 "/xyz/openbmc_project/led/groups/enclosure_identify", 195 "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 }); 213 } 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 */ 223 inline void 224 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 225 const bool ledState) 226 { 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", 249 dbus::utility::DbusVariantType(ledState)); 250 } 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", 256 dbus::utility::DbusVariantType(ledState)); 257 } 258 } // namespace redfish 259