xref: /openbmc/bmcweb/features/redfish/lib/led.hpp (revision 5e7e2dc585dc7a7e62d2b648b541e7f50c39ea5d)
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 
183ccb3adbSEd Tanous #include "app.hpp"
191c8fba97SJames Feist #include "async_resp.hpp"
201c8fba97SJames Feist #include "dbus_utility.hpp"
211c8fba97SJames Feist #include "redfish_util.hpp"
221c8fba97SJames Feist 
231e1e598dSJonathan Doman #include <sdbusplus/asio/property.hpp>
247e860f15SJohn Edward Broadbent 
251c8fba97SJames Feist namespace redfish
261c8fba97SJames Feist {
271c8fba97SJames Feist /**
281c8fba97SJames Feist  * @brief Retrieves identify led group properties over dbus
291c8fba97SJames Feist  *
301c8fba97SJames Feist  * @param[in] aResp     Shared pointer for generating response message.
311c8fba97SJames Feist  *
321c8fba97SJames Feist  * @return None.
331c8fba97SJames Feist  */
349f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed
358d1b46d7Szhanghch05 inline void
368d1b46d7Szhanghch05     getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
371c8fba97SJames Feist {
381c8fba97SJames Feist     BMCWEB_LOG_DEBUG << "Get led groups";
391e1e598dSJonathan Doman     sdbusplus::asio::getProperty<bool>(
401e1e598dSJonathan Doman         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
411e1e598dSJonathan Doman         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
421e1e598dSJonathan Doman         "xyz.openbmc_project.Led.Group", "Asserted",
43*5e7e2dc5SEd Tanous         [aResp](const boost::system::error_code& ec, const bool blinking) {
441c8fba97SJames Feist         // Some systems may not have enclosure_identify_blink object so
451c8fba97SJames Feist         // proceed to get enclosure_identify state.
461e1e598dSJonathan Doman         if (ec == boost::system::errc::invalid_argument)
471c8fba97SJames Feist         {
481c8fba97SJames Feist             BMCWEB_LOG_DEBUG
491e1e598dSJonathan Doman                 << "Get identity blinking LED failed, missmatch in property type";
501c8fba97SJames Feist             messages::internalError(aResp->res);
511c8fba97SJames Feist             return;
521c8fba97SJames Feist         }
531c8fba97SJames Feist 
541e1e598dSJonathan Doman         // Blinking ON, no need to check enclosure_identify assert.
551e1e598dSJonathan Doman         if (!ec && blinking)
561e1e598dSJonathan Doman         {
571e1e598dSJonathan Doman             aResp->res.jsonValue["IndicatorLED"] = "Blinking";
581e1e598dSJonathan Doman             return;
591e1e598dSJonathan Doman         }
601e1e598dSJonathan Doman 
611e1e598dSJonathan Doman         sdbusplus::asio::getProperty<bool>(
621e1e598dSJonathan Doman             *crow::connections::systemBus,
631e1e598dSJonathan Doman             "xyz.openbmc_project.LED.GroupManager",
641e1e598dSJonathan Doman             "/xyz/openbmc_project/led/groups/enclosure_identify",
651e1e598dSJonathan Doman             "xyz.openbmc_project.Led.Group", "Asserted",
66*5e7e2dc5SEd Tanous             [aResp](const boost::system::error_code& ec2, const bool ledOn) {
671e1e598dSJonathan Doman             if (ec2 == boost::system::errc::invalid_argument)
681e1e598dSJonathan Doman             {
691e1e598dSJonathan Doman                 BMCWEB_LOG_DEBUG
701e1e598dSJonathan Doman                     << "Get enclosure identity led failed, missmatch in property type";
711e1e598dSJonathan Doman                 messages::internalError(aResp->res);
721e1e598dSJonathan Doman                 return;
731e1e598dSJonathan Doman             }
741e1e598dSJonathan Doman 
751e1e598dSJonathan Doman             if (ec2)
761e1e598dSJonathan Doman             {
771e1e598dSJonathan Doman                 return;
781e1e598dSJonathan Doman             }
791e1e598dSJonathan Doman 
801e1e598dSJonathan Doman             if (ledOn)
811c8fba97SJames Feist             {
821c8fba97SJames Feist                 aResp->res.jsonValue["IndicatorLED"] = "Lit";
831c8fba97SJames Feist             }
841c8fba97SJames Feist             else
851c8fba97SJames Feist             {
861c8fba97SJames Feist                 aResp->res.jsonValue["IndicatorLED"] = "Off";
871c8fba97SJames Feist             }
881e1e598dSJonathan Doman             });
891e1e598dSJonathan Doman         });
901c8fba97SJames Feist }
911c8fba97SJames Feist 
921c8fba97SJames Feist /**
931c8fba97SJames Feist  * @brief Sets identify led group properties
941c8fba97SJames Feist  *
951c8fba97SJames Feist  * @param[in] aResp     Shared pointer for generating response message.
961c8fba97SJames Feist  * @param[in] ledState  LED state passed from request
971c8fba97SJames Feist  *
981c8fba97SJames Feist  * @return None.
991c8fba97SJames Feist  */
1009f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed
1018d1b46d7Szhanghch05 inline void
1028d1b46d7Szhanghch05     setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
1031c8fba97SJames Feist                          const std::string& ledState)
1041c8fba97SJames Feist {
1051c8fba97SJames Feist     BMCWEB_LOG_DEBUG << "Set led groups";
1061c8fba97SJames Feist     bool ledOn = false;
1071c8fba97SJames Feist     bool ledBlinkng = false;
1081c8fba97SJames Feist 
1091c8fba97SJames Feist     if (ledState == "Lit")
1101c8fba97SJames Feist     {
1111c8fba97SJames Feist         ledOn = true;
1121c8fba97SJames Feist     }
1131c8fba97SJames Feist     else if (ledState == "Blinking")
1141c8fba97SJames Feist     {
1151c8fba97SJames Feist         ledBlinkng = true;
1161c8fba97SJames Feist     }
1171c8fba97SJames Feist     else if (ledState != "Off")
1181c8fba97SJames Feist     {
1191c8fba97SJames Feist         messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED");
1201c8fba97SJames Feist         return;
1211c8fba97SJames Feist     }
1221c8fba97SJames Feist 
1231c8fba97SJames Feist     crow::connections::systemBus->async_method_call(
124*5e7e2dc5SEd Tanous         [aResp, ledOn,
125*5e7e2dc5SEd Tanous          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(
137*5e7e2dc5SEd 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             }
1441d40ef69SJayaprakash 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",
150168e20c1SEd Tanous             dbus::utility::DbusVariantType(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",
156168e20c1SEd Tanous         dbus::utility::DbusVariantType(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  */
1668d1b46d7Szhanghch05 inline void
1678d1b46d7Szhanghch05     getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
1689f8bfa7cSGunnar Mills {
1699f8bfa7cSGunnar Mills     BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
1701e1e598dSJonathan Doman     sdbusplus::asio::getProperty<bool>(
1711e1e598dSJonathan Doman         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
1721e1e598dSJonathan Doman         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
1731e1e598dSJonathan Doman         "xyz.openbmc_project.Led.Group", "Asserted",
174*5e7e2dc5SEd Tanous         [aResp](const boost::system::error_code& ec, const bool blinking) {
1759f8bfa7cSGunnar Mills         // Some systems may not have enclosure_identify_blink object so
1769f8bfa7cSGunnar Mills         // proceed to get enclosure_identify state.
1771e1e598dSJonathan Doman         if (ec == boost::system::errc::invalid_argument)
1789f8bfa7cSGunnar Mills         {
1799f8bfa7cSGunnar Mills             BMCWEB_LOG_DEBUG
1801e1e598dSJonathan Doman                 << "Get identity blinking LED failed, missmatch in property type";
1819f8bfa7cSGunnar Mills             messages::internalError(aResp->res);
1829f8bfa7cSGunnar Mills             return;
1839f8bfa7cSGunnar Mills         }
1849f8bfa7cSGunnar Mills 
1851e1e598dSJonathan Doman         // Blinking ON, no need to check enclosure_identify assert.
1861e1e598dSJonathan Doman         if (!ec && blinking)
1879f8bfa7cSGunnar Mills         {
1881e1e598dSJonathan Doman             aResp->res.jsonValue["LocationIndicatorActive"] = true;
1899f8bfa7cSGunnar Mills             return;
1901e1e598dSJonathan Doman         }
1911e1e598dSJonathan Doman 
1921e1e598dSJonathan Doman         sdbusplus::asio::getProperty<bool>(
1931e1e598dSJonathan Doman             *crow::connections::systemBus,
1949f8bfa7cSGunnar Mills             "xyz.openbmc_project.LED.GroupManager",
1959f8bfa7cSGunnar Mills             "/xyz/openbmc_project/led/groups/enclosure_identify",
1961e1e598dSJonathan Doman             "xyz.openbmc_project.Led.Group", "Asserted",
197*5e7e2dc5SEd Tanous             [aResp](const boost::system::error_code& ec2, const bool ledOn) {
1981e1e598dSJonathan Doman             if (ec2 == boost::system::errc::invalid_argument)
1991e1e598dSJonathan Doman             {
2001e1e598dSJonathan Doman                 BMCWEB_LOG_DEBUG
2011e1e598dSJonathan Doman                     << "Get enclosure identity led failed, missmatch in property type";
2021e1e598dSJonathan Doman                 messages::internalError(aResp->res);
2031e1e598dSJonathan Doman                 return;
2041e1e598dSJonathan Doman             }
2051e1e598dSJonathan Doman 
2061e1e598dSJonathan Doman             if (ec2)
2071e1e598dSJonathan Doman             {
2081e1e598dSJonathan Doman                 return;
2091e1e598dSJonathan Doman             }
2101e1e598dSJonathan Doman 
2111e1e598dSJonathan Doman             aResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
2121e1e598dSJonathan Doman             });
2131e1e598dSJonathan Doman         });
2149f8bfa7cSGunnar Mills }
2159f8bfa7cSGunnar Mills 
2169f8bfa7cSGunnar Mills /**
2179f8bfa7cSGunnar Mills  * @brief Sets identify led group properties
2189f8bfa7cSGunnar Mills  *
2199f8bfa7cSGunnar Mills  * @param[in] aResp     Shared pointer for generating response message.
2209f8bfa7cSGunnar Mills  * @param[in] ledState  LED state passed from request
2219f8bfa7cSGunnar Mills  *
2229f8bfa7cSGunnar Mills  * @return None.
2239f8bfa7cSGunnar Mills  */
2248d1b46d7Szhanghch05 inline void
2258d1b46d7Szhanghch05     setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
2269f8bfa7cSGunnar Mills                                const bool ledState)
2279f8bfa7cSGunnar Mills {
2289f8bfa7cSGunnar Mills     BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
2299f8bfa7cSGunnar Mills 
2309f8bfa7cSGunnar Mills     crow::connections::systemBus->async_method_call(
231*5e7e2dc5SEd Tanous         [aResp, ledState](const boost::system::error_code& ec) mutable {
2329f8bfa7cSGunnar Mills         if (ec)
2339f8bfa7cSGunnar Mills         {
2349f8bfa7cSGunnar Mills             // Some systems may not have enclosure_identify_blink object so
2359f8bfa7cSGunnar Mills             // lets set enclosure_identify state also if
2369f8bfa7cSGunnar Mills             // enclosure_identify_blink failed
2379f8bfa7cSGunnar Mills             crow::connections::systemBus->async_method_call(
238*5e7e2dc5SEd Tanous                 [aResp](const boost::system::error_code& ec2) {
2399f8bfa7cSGunnar Mills                 if (ec2)
2409f8bfa7cSGunnar Mills                 {
2419f8bfa7cSGunnar Mills                     BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
2429f8bfa7cSGunnar Mills                     messages::internalError(aResp->res);
2439f8bfa7cSGunnar Mills                     return;
2449f8bfa7cSGunnar Mills                 }
2459f8bfa7cSGunnar Mills                 },
2469f8bfa7cSGunnar Mills                 "xyz.openbmc_project.LED.GroupManager",
2479f8bfa7cSGunnar Mills                 "/xyz/openbmc_project/led/groups/enclosure_identify",
2489f8bfa7cSGunnar Mills                 "org.freedesktop.DBus.Properties", "Set",
2499f8bfa7cSGunnar Mills                 "xyz.openbmc_project.Led.Group", "Asserted",
250168e20c1SEd Tanous                 dbus::utility::DbusVariantType(ledState));
2519f8bfa7cSGunnar Mills         }
2529f8bfa7cSGunnar Mills         },
2539f8bfa7cSGunnar Mills         "xyz.openbmc_project.LED.GroupManager",
2549f8bfa7cSGunnar Mills         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
2559f8bfa7cSGunnar Mills         "org.freedesktop.DBus.Properties", "Set",
2569f8bfa7cSGunnar Mills         "xyz.openbmc_project.Led.Group", "Asserted",
257168e20c1SEd Tanous         dbus::utility::DbusVariantType(ledState));
2589f8bfa7cSGunnar Mills }
2591c8fba97SJames Feist } // namespace redfish
260