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 "app.hpp" 19 #include "async_resp.hpp" 20 #include "dbus_utility.hpp" 21 #include "redfish_util.hpp" 22 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] asyncResp 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>& asyncResp) 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 [asyncResp](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, mismatch in property type"); 50 messages::internalError(asyncResp->res); 51 return; 52 } 53 54 // Blinking ON, no need to check enclosure_identify assert. 55 if (!ec && blinking) 56 { 57 asyncResp->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 [asyncResp](const boost::system::error_code& ec2, 67 const bool ledOn) { 68 if (ec2 == boost::system::errc::invalid_argument) 69 { 70 BMCWEB_LOG_DEBUG( 71 "Get enclosure identity led failed, mismatch in property type"); 72 messages::internalError(asyncResp->res); 73 return; 74 } 75 76 if (ec2) 77 { 78 return; 79 } 80 81 if (ledOn) 82 { 83 asyncResp->res.jsonValue["IndicatorLED"] = "Lit"; 84 } 85 else 86 { 87 asyncResp->res.jsonValue["IndicatorLED"] = "Off"; 88 } 89 }); 90 }); 91 } 92 93 /** 94 * @brief Sets identify led group properties 95 * 96 * @param[in] asyncResp Shared pointer for generating response message. 97 * @param[in] ledState LED state passed from request 98 * 99 * @return None. 100 */ 101 // TODO (Gunnar): Remove IndicatorLED after enough time has passed 102 inline void 103 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 104 const std::string& ledState) 105 { 106 BMCWEB_LOG_DEBUG("Set led groups"); 107 bool ledOn = false; 108 bool ledBlinkng = false; 109 110 if (ledState == "Lit") 111 { 112 ledOn = true; 113 } 114 else if (ledState == "Blinking") 115 { 116 ledBlinkng = true; 117 } 118 else if (ledState != "Off") 119 { 120 messages::propertyValueNotInList(asyncResp->res, ledState, 121 "IndicatorLED"); 122 return; 123 } 124 125 sdbusplus::asio::setProperty( 126 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 127 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 128 "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng, 129 [asyncResp, ledOn, 130 ledBlinkng](const boost::system::error_code& ec) mutable { 131 if (ec) 132 { 133 // Some systems may not have enclosure_identify_blink object so 134 // Lets set enclosure_identify state to true if Blinking is 135 // true. 136 if (ledBlinkng) 137 { 138 ledOn = true; 139 } 140 } 141 setDbusProperty( 142 asyncResp, "IndicatorLED", "xyz.openbmc_project.LED.GroupManager", 143 sdbusplus::message::object_path( 144 "/xyz/openbmc_project/led/groups/enclosure_identify"), 145 "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng); 146 }); 147 } 148 149 /** 150 * @brief Retrieves identify system led group properties over dbus 151 * 152 * @param[in] asyncResp Shared pointer for generating response message. 153 * 154 * @return None. 155 */ 156 inline void getSystemLocationIndicatorActive( 157 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 158 { 159 BMCWEB_LOG_DEBUG("Get LocationIndicatorActive"); 160 sdbusplus::asio::getProperty<bool>( 161 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 162 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 163 "xyz.openbmc_project.Led.Group", "Asserted", 164 [asyncResp](const boost::system::error_code& ec, const bool blinking) { 165 // Some systems may not have enclosure_identify_blink object so 166 // proceed to get enclosure_identify state. 167 if (ec == boost::system::errc::invalid_argument) 168 { 169 BMCWEB_LOG_DEBUG( 170 "Get identity blinking LED failed, mismatch in property type"); 171 messages::internalError(asyncResp->res); 172 return; 173 } 174 175 // Blinking ON, no need to check enclosure_identify assert. 176 if (!ec && blinking) 177 { 178 asyncResp->res.jsonValue["LocationIndicatorActive"] = true; 179 return; 180 } 181 182 sdbusplus::asio::getProperty<bool>( 183 *crow::connections::systemBus, 184 "xyz.openbmc_project.LED.GroupManager", 185 "/xyz/openbmc_project/led/groups/enclosure_identify", 186 "xyz.openbmc_project.Led.Group", "Asserted", 187 [asyncResp](const boost::system::error_code& ec2, 188 const bool ledOn) { 189 if (ec2 == boost::system::errc::invalid_argument) 190 { 191 BMCWEB_LOG_DEBUG( 192 "Get enclosure identity led failed, mismatch in property type"); 193 messages::internalError(asyncResp->res); 194 return; 195 } 196 197 if (ec2) 198 { 199 return; 200 } 201 202 asyncResp->res.jsonValue["LocationIndicatorActive"] = ledOn; 203 }); 204 }); 205 } 206 207 /** 208 * @brief Sets identify system led group properties 209 * 210 * @param[in] asyncResp Shared pointer for generating response message. 211 * @param[in] ledState LED state passed from request 212 * 213 * @return None. 214 */ 215 inline void setSystemLocationIndicatorActive( 216 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const bool ledState) 217 { 218 BMCWEB_LOG_DEBUG("Set LocationIndicatorActive"); 219 220 sdbusplus::asio::setProperty( 221 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 222 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 223 "xyz.openbmc_project.Led.Group", "Asserted", ledState, 224 [asyncResp, ledState](const boost::system::error_code& ec) { 225 if (ec) 226 { 227 // Some systems may not have enclosure_identify_blink object so 228 // lets set enclosure_identify state also if 229 // enclosure_identify_blink failed 230 setDbusProperty( 231 asyncResp, "LocationIndicatorActive", 232 "xyz.openbmc_project.LED.GroupManager", 233 sdbusplus::message::object_path( 234 "/xyz/openbmc_project/led/groups/enclosure_identify"), 235 "xyz.openbmc_project.Led.Group", "Asserted", ledState); 236 } 237 }); 238 } 239 } // namespace redfish 240