xref: /openbmc/bmcweb/features/redfish/lib/led.hpp (revision 1d40ef697d61199197214380ac01970b30d5d575)
11c8fba97SJames Feist /*
21c8fba97SJames Feist // Copyright (c) 2019 Intel Corporation
31c8fba97SJames Feist //
41c8fba97SJames Feist // Licensed under the Apache License, Version 2.0 (the "License");
51c8fba97SJames Feist // you may not use this file except in compliance with the License.
61c8fba97SJames Feist // You may obtain a copy of the License at
71c8fba97SJames Feist //
81c8fba97SJames Feist //      http://www.apache.org/licenses/LICENSE-2.0
91c8fba97SJames Feist //
101c8fba97SJames Feist // Unless required by applicable law or agreed to in writing, software
111c8fba97SJames Feist // distributed under the License is distributed on an "AS IS" BASIS,
121c8fba97SJames Feist // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131c8fba97SJames Feist // See the License for the specific language governing permissions and
141c8fba97SJames Feist // limitations under the License.
151c8fba97SJames Feist */
161c8fba97SJames Feist #pragma once
171c8fba97SJames Feist 
181c8fba97SJames Feist #include "async_resp.hpp"
191c8fba97SJames Feist #include "dbus_utility.hpp"
201c8fba97SJames Feist #include "redfish_util.hpp"
211c8fba97SJames Feist 
221c8fba97SJames Feist #include <variant>
231c8fba97SJames Feist 
241c8fba97SJames Feist namespace redfish
251c8fba97SJames Feist {
261c8fba97SJames Feist /**
271c8fba97SJames Feist  * @brief Retrieves identify led group properties over dbus
281c8fba97SJames Feist  *
291c8fba97SJames Feist  * @param[in] aResp     Shared pointer for generating response message.
301c8fba97SJames Feist  *
311c8fba97SJames Feist  * @return None.
321c8fba97SJames Feist  */
339f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed
34b5a76932SEd Tanous inline void getIndicatorLedState(const std::shared_ptr<AsyncResp>& aResp)
351c8fba97SJames Feist {
361c8fba97SJames Feist     BMCWEB_LOG_DEBUG << "Get led groups";
371c8fba97SJames Feist     crow::connections::systemBus->async_method_call(
381c8fba97SJames Feist         [aResp](const boost::system::error_code ec,
391c8fba97SJames Feist                 const std::variant<bool> asserted) {
401c8fba97SJames Feist             // Some systems may not have enclosure_identify_blink object so
411c8fba97SJames Feist             // proceed to get enclosure_identify state.
421c8fba97SJames Feist             if (!ec)
431c8fba97SJames Feist             {
441c8fba97SJames Feist                 const bool* blinking = std::get_if<bool>(&asserted);
451c8fba97SJames Feist                 if (!blinking)
461c8fba97SJames Feist                 {
471c8fba97SJames Feist                     BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
481c8fba97SJames Feist                     messages::internalError(aResp->res);
491c8fba97SJames Feist                     return;
501c8fba97SJames Feist                 }
511c8fba97SJames Feist                 // Blinking ON, no need to check enclosure_identify assert.
521c8fba97SJames Feist                 if (*blinking)
531c8fba97SJames Feist                 {
541c8fba97SJames Feist                     aResp->res.jsonValue["IndicatorLED"] = "Blinking";
551c8fba97SJames Feist                     return;
561c8fba97SJames Feist                 }
571c8fba97SJames Feist             }
581c8fba97SJames Feist             crow::connections::systemBus->async_method_call(
5923a21a1cSEd Tanous                 [aResp](const boost::system::error_code ec2,
6023a21a1cSEd Tanous                         const std::variant<bool> asserted2) {
6123a21a1cSEd Tanous                     if (!ec2)
621c8fba97SJames Feist                     {
6323a21a1cSEd Tanous                         const bool* ledOn = std::get_if<bool>(&asserted2);
641c8fba97SJames Feist                         if (!ledOn)
651c8fba97SJames Feist                         {
661c8fba97SJames Feist                             BMCWEB_LOG_DEBUG
671c8fba97SJames Feist                                 << "Get enclosure identity led failed";
681c8fba97SJames Feist                             messages::internalError(aResp->res);
691c8fba97SJames Feist                             return;
701c8fba97SJames Feist                         }
711c8fba97SJames Feist 
721c8fba97SJames Feist                         if (*ledOn)
731c8fba97SJames Feist                         {
741c8fba97SJames Feist                             aResp->res.jsonValue["IndicatorLED"] = "Lit";
751c8fba97SJames Feist                         }
761c8fba97SJames Feist                         else
771c8fba97SJames Feist                         {
781c8fba97SJames Feist                             aResp->res.jsonValue["IndicatorLED"] = "Off";
791c8fba97SJames Feist                         }
801c8fba97SJames Feist                     }
811c8fba97SJames Feist                     return;
821c8fba97SJames Feist                 },
831c8fba97SJames Feist                 "xyz.openbmc_project.LED.GroupManager",
841c8fba97SJames Feist                 "/xyz/openbmc_project/led/groups/enclosure_identify",
851c8fba97SJames Feist                 "org.freedesktop.DBus.Properties", "Get",
861c8fba97SJames Feist                 "xyz.openbmc_project.Led.Group", "Asserted");
871c8fba97SJames Feist         },
881c8fba97SJames Feist         "xyz.openbmc_project.LED.GroupManager",
891c8fba97SJames Feist         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
901c8fba97SJames Feist         "org.freedesktop.DBus.Properties", "Get",
911c8fba97SJames Feist         "xyz.openbmc_project.Led.Group", "Asserted");
921c8fba97SJames Feist }
931c8fba97SJames Feist 
941c8fba97SJames Feist /**
951c8fba97SJames Feist  * @brief Sets identify led group properties
961c8fba97SJames Feist  *
971c8fba97SJames Feist  * @param[in] aResp     Shared pointer for generating response message.
981c8fba97SJames Feist  * @param[in] ledState  LED state passed from request
991c8fba97SJames Feist  *
1001c8fba97SJames Feist  * @return None.
1011c8fba97SJames Feist  */
1029f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed
103b5a76932SEd Tanous inline void setIndicatorLedState(const std::shared_ptr<AsyncResp>& aResp,
1041c8fba97SJames Feist                                  const std::string& ledState)
1051c8fba97SJames Feist {
1061c8fba97SJames Feist     BMCWEB_LOG_DEBUG << "Set led groups";
1071c8fba97SJames Feist     bool ledOn = false;
1081c8fba97SJames Feist     bool ledBlinkng = false;
1091c8fba97SJames Feist 
1101c8fba97SJames Feist     if (ledState == "Lit")
1111c8fba97SJames Feist     {
1121c8fba97SJames Feist         ledOn = true;
1131c8fba97SJames Feist     }
1141c8fba97SJames Feist     else if (ledState == "Blinking")
1151c8fba97SJames Feist     {
1161c8fba97SJames Feist         ledBlinkng = true;
1171c8fba97SJames Feist     }
1181c8fba97SJames Feist     else if (ledState != "Off")
1191c8fba97SJames Feist     {
1201c8fba97SJames Feist         messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED");
1211c8fba97SJames Feist         return;
1221c8fba97SJames Feist     }
1231c8fba97SJames Feist 
1241c8fba97SJames Feist     crow::connections::systemBus->async_method_call(
125cb13a392SEd Tanous         [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable {
1261c8fba97SJames Feist             if (ec)
1271c8fba97SJames Feist             {
1281c8fba97SJames Feist                 // Some systems may not have enclosure_identify_blink object so
1291c8fba97SJames Feist                 // Lets set enclosure_identify state to true if Blinking is
1301c8fba97SJames Feist                 // true.
1311c8fba97SJames Feist                 if (ledBlinkng)
1321c8fba97SJames Feist                 {
1331c8fba97SJames Feist                     ledOn = true;
1341c8fba97SJames Feist                 }
1351c8fba97SJames Feist             }
1361c8fba97SJames Feist             crow::connections::systemBus->async_method_call(
137cb13a392SEd Tanous                 [aResp](const boost::system::error_code ec2) {
13823a21a1cSEd Tanous                     if (ec2)
1391c8fba97SJames Feist                     {
14023a21a1cSEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
1411c8fba97SJames Feist                         messages::internalError(aResp->res);
1421c8fba97SJames Feist                         return;
1431c8fba97SJames Feist                     }
144*1d40ef69SJayaprakash Mutyala                     messages::success(aResp->res);
1451c8fba97SJames Feist                 },
1461c8fba97SJames Feist                 "xyz.openbmc_project.LED.GroupManager",
1471c8fba97SJames Feist                 "/xyz/openbmc_project/led/groups/enclosure_identify",
1481c8fba97SJames Feist                 "org.freedesktop.DBus.Properties", "Set",
1491c8fba97SJames Feist                 "xyz.openbmc_project.Led.Group", "Asserted",
1501c8fba97SJames Feist                 std::variant<bool>(ledOn));
1511c8fba97SJames Feist         },
1521c8fba97SJames Feist         "xyz.openbmc_project.LED.GroupManager",
1531c8fba97SJames Feist         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
1541c8fba97SJames Feist         "org.freedesktop.DBus.Properties", "Set",
1551c8fba97SJames Feist         "xyz.openbmc_project.Led.Group", "Asserted",
1561c8fba97SJames Feist         std::variant<bool>(ledBlinkng));
1571c8fba97SJames Feist }
1589f8bfa7cSGunnar Mills 
1599f8bfa7cSGunnar Mills /**
1609f8bfa7cSGunnar Mills  * @brief Retrieves identify led group properties over dbus
1619f8bfa7cSGunnar Mills  *
1629f8bfa7cSGunnar Mills  * @param[in] aResp     Shared pointer for generating response message.
1639f8bfa7cSGunnar Mills  *
1649f8bfa7cSGunnar Mills  * @return None.
1659f8bfa7cSGunnar Mills  */
1669f8bfa7cSGunnar Mills inline void getLocationIndicatorActive(const std::shared_ptr<AsyncResp>& aResp)
1679f8bfa7cSGunnar Mills {
1689f8bfa7cSGunnar Mills     BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
1699f8bfa7cSGunnar Mills     crow::connections::systemBus->async_method_call(
1709f8bfa7cSGunnar Mills         [aResp](const boost::system::error_code ec,
1719f8bfa7cSGunnar Mills                 const std::variant<bool> asserted) {
1729f8bfa7cSGunnar Mills             // Some systems may not have enclosure_identify_blink object so
1739f8bfa7cSGunnar Mills             // proceed to get enclosure_identify state.
1749f8bfa7cSGunnar Mills             if (!ec)
1759f8bfa7cSGunnar Mills             {
1769f8bfa7cSGunnar Mills                 const bool* blinking = std::get_if<bool>(&asserted);
1779f8bfa7cSGunnar Mills                 if (!blinking)
1789f8bfa7cSGunnar Mills                 {
1799f8bfa7cSGunnar Mills                     BMCWEB_LOG_DEBUG << "Get identity blinking LED failed";
1809f8bfa7cSGunnar Mills                     messages::internalError(aResp->res);
1819f8bfa7cSGunnar Mills                     return;
1829f8bfa7cSGunnar Mills                 }
1839f8bfa7cSGunnar Mills                 // Blinking ON, no need to check enclosure_identify assert.
1849f8bfa7cSGunnar Mills                 if (*blinking)
1859f8bfa7cSGunnar Mills                 {
1869f8bfa7cSGunnar Mills                     aResp->res.jsonValue["LocationIndicatorActive"] = true;
1879f8bfa7cSGunnar Mills                     return;
1889f8bfa7cSGunnar Mills                 }
1899f8bfa7cSGunnar Mills             }
1909f8bfa7cSGunnar Mills             crow::connections::systemBus->async_method_call(
1919f8bfa7cSGunnar Mills                 [aResp](const boost::system::error_code ec2,
1929f8bfa7cSGunnar Mills                         const std::variant<bool> asserted2) {
1939f8bfa7cSGunnar Mills                     if (!ec2)
1949f8bfa7cSGunnar Mills                     {
1959f8bfa7cSGunnar Mills                         const bool* ledOn = std::get_if<bool>(&asserted2);
1969f8bfa7cSGunnar Mills                         if (!ledOn)
1979f8bfa7cSGunnar Mills                         {
1989f8bfa7cSGunnar Mills                             BMCWEB_LOG_DEBUG
1999f8bfa7cSGunnar Mills                                 << "Get enclosure identity led failed";
2009f8bfa7cSGunnar Mills                             messages::internalError(aResp->res);
2019f8bfa7cSGunnar Mills                             return;
2029f8bfa7cSGunnar Mills                         }
2039f8bfa7cSGunnar Mills 
2049f8bfa7cSGunnar Mills                         if (*ledOn)
2059f8bfa7cSGunnar Mills                         {
2069f8bfa7cSGunnar Mills                             aResp->res.jsonValue["LocationIndicatorActive"] =
2079f8bfa7cSGunnar Mills                                 true;
2089f8bfa7cSGunnar Mills                         }
2099f8bfa7cSGunnar Mills                         else
2109f8bfa7cSGunnar Mills                         {
2119f8bfa7cSGunnar Mills                             aResp->res.jsonValue["LocationIndicatorActive"] =
2129f8bfa7cSGunnar Mills                                 false;
2139f8bfa7cSGunnar Mills                         }
2149f8bfa7cSGunnar Mills                     }
2159f8bfa7cSGunnar Mills                     return;
2169f8bfa7cSGunnar Mills                 },
2179f8bfa7cSGunnar Mills                 "xyz.openbmc_project.LED.GroupManager",
2189f8bfa7cSGunnar Mills                 "/xyz/openbmc_project/led/groups/enclosure_identify",
2199f8bfa7cSGunnar Mills                 "org.freedesktop.DBus.Properties", "Get",
2209f8bfa7cSGunnar Mills                 "xyz.openbmc_project.Led.Group", "Asserted");
2219f8bfa7cSGunnar Mills         },
2229f8bfa7cSGunnar Mills         "xyz.openbmc_project.LED.GroupManager",
2239f8bfa7cSGunnar Mills         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
2249f8bfa7cSGunnar Mills         "org.freedesktop.DBus.Properties", "Get",
2259f8bfa7cSGunnar Mills         "xyz.openbmc_project.Led.Group", "Asserted");
2269f8bfa7cSGunnar Mills }
2279f8bfa7cSGunnar Mills 
2289f8bfa7cSGunnar Mills /**
2299f8bfa7cSGunnar Mills  * @brief Sets identify led group properties
2309f8bfa7cSGunnar Mills  *
2319f8bfa7cSGunnar Mills  * @param[in] aResp     Shared pointer for generating response message.
2329f8bfa7cSGunnar Mills  * @param[in] ledState  LED state passed from request
2339f8bfa7cSGunnar Mills  *
2349f8bfa7cSGunnar Mills  * @return None.
2359f8bfa7cSGunnar Mills  */
2369f8bfa7cSGunnar Mills inline void setLocationIndicatorActive(const std::shared_ptr<AsyncResp>& aResp,
2379f8bfa7cSGunnar Mills                                        const bool ledState)
2389f8bfa7cSGunnar Mills {
2399f8bfa7cSGunnar Mills     BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
2409f8bfa7cSGunnar Mills 
2419f8bfa7cSGunnar Mills     crow::connections::systemBus->async_method_call(
2429f8bfa7cSGunnar Mills         [aResp, ledState](const boost::system::error_code ec) mutable {
2439f8bfa7cSGunnar Mills             if (ec)
2449f8bfa7cSGunnar Mills             {
2459f8bfa7cSGunnar Mills                 // Some systems may not have enclosure_identify_blink object so
2469f8bfa7cSGunnar Mills                 // lets set enclosure_identify state also if
2479f8bfa7cSGunnar Mills                 // enclosure_identify_blink failed
2489f8bfa7cSGunnar Mills                 crow::connections::systemBus->async_method_call(
2499f8bfa7cSGunnar Mills                     [aResp](const boost::system::error_code ec2) {
2509f8bfa7cSGunnar Mills                         if (ec2)
2519f8bfa7cSGunnar Mills                         {
2529f8bfa7cSGunnar Mills                             BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
2539f8bfa7cSGunnar Mills                             messages::internalError(aResp->res);
2549f8bfa7cSGunnar Mills                             return;
2559f8bfa7cSGunnar Mills                         }
2569f8bfa7cSGunnar Mills                     },
2579f8bfa7cSGunnar Mills                     "xyz.openbmc_project.LED.GroupManager",
2589f8bfa7cSGunnar Mills                     "/xyz/openbmc_project/led/groups/enclosure_identify",
2599f8bfa7cSGunnar Mills                     "org.freedesktop.DBus.Properties", "Set",
2609f8bfa7cSGunnar Mills                     "xyz.openbmc_project.Led.Group", "Asserted",
2619f8bfa7cSGunnar Mills                     std::variant<bool>(ledState));
2629f8bfa7cSGunnar Mills             }
2639f8bfa7cSGunnar Mills         },
2649f8bfa7cSGunnar Mills         "xyz.openbmc_project.LED.GroupManager",
2659f8bfa7cSGunnar Mills         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
2669f8bfa7cSGunnar Mills         "org.freedesktop.DBus.Properties", "Set",
2679f8bfa7cSGunnar Mills         "xyz.openbmc_project.Led.Group", "Asserted",
2689f8bfa7cSGunnar Mills         std::variant<bool>(ledState));
2699f8bfa7cSGunnar Mills }
2701c8fba97SJames Feist } // namespace redfish
271