blob: 85319fe535a96fb96cfad43f2d04d00925706aaa [file] [log] [blame]
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +05301#pragma once
2
Vishwanatha Subbannaed490732016-12-20 15:59:29 +05303#include "ledlayout.hpp"
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +05304
Patrick Venture91ac8d32018-11-01 17:03:22 -07005#include <map>
6#include <sdbusplus/bus.hpp>
7#include <set>
8
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +05309namespace phosphor
10{
11namespace led
12{
13
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +053014/** @brief Physical LED dbus constructs */
15constexpr auto PHY_LED_PATH = "/xyz/openbmc_project/led/physical/";
16constexpr auto PHY_LED_IFACE = "xyz.openbmc_project.Led.Physical";
17constexpr auto DBUS_PROPERTY_IFACE = "org.freedesktop.DBus.Properties";
18
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053019/** @class Manager
20 * @brief Manages group of LEDs and applies action on the elements of group
21 */
22class Manager
23{
Patrick Venture91ac8d32018-11-01 17:03:22 -070024 public:
25 /** @brief Only need the default Manager */
26 Manager() = delete;
27 ~Manager() = default;
28 Manager(const Manager&) = delete;
29 Manager& operator=(const Manager&) = delete;
30 Manager(Manager&&) = delete;
31 Manager& operator=(Manager&&) = delete;
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053032
Patrick Venture91ac8d32018-11-01 17:03:22 -070033 /** @brief Special comparator for finding set difference */
34 static bool ledComp(const phosphor::led::Layout::LedAction& left,
35 const phosphor::led::Layout::LedAction& right)
36 {
37 // Example :
38 // If FIRST_1 is {fan0, 1, 1} and FIRST_2 is {fan0, 2, 2},
39 // with default priority of Blink, this comparator would return
40 // false. But considering the priority, this comparator would need
41 // to return true so that we consider appropriate set and in
42 // this case its {fan0, 1, 1}
43 if (left.name == right.name)
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053044 {
Patrick Venture91ac8d32018-11-01 17:03:22 -070045 if (left.action == right.action)
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +053046 {
Patrick Venture91ac8d32018-11-01 17:03:22 -070047 return false;
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +053048 }
Patrick Venture91ac8d32018-11-01 17:03:22 -070049 else
50 {
51 return true;
52 }
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053053 }
Patrick Venture91ac8d32018-11-01 17:03:22 -070054 return left.name < right.name;
55 }
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053056
Patrick Venture91ac8d32018-11-01 17:03:22 -070057 /** @brief Comparator for finding LEDs to be DeAsserted */
58 static bool ledLess(const phosphor::led::Layout::LedAction& left,
59 const phosphor::led::Layout::LedAction& right)
60 {
61 return left.name < right.name;
62 }
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +053063
Patrick Venture91ac8d32018-11-01 17:03:22 -070064 /** @brief Comparator for helping unique_copy */
65 static bool ledEqual(const phosphor::led::Layout::LedAction& left,
66 const phosphor::led::Layout::LedAction& right)
67 {
68 return left.name == right.name;
69 }
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +053070
Patrick Venture91ac8d32018-11-01 17:03:22 -070071 using group = std::set<phosphor::led::Layout::LedAction>;
72 using LedLayout = std::map<std::string, group>;
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053073
Patrick Venture91ac8d32018-11-01 17:03:22 -070074 /** @brief static global map constructed at compile time */
75 const LedLayout& ledMap;
Vishwanatha Subbannaed490732016-12-20 15:59:29 +053076
Patrick Venture91ac8d32018-11-01 17:03:22 -070077 /** @brief Refer the user supplied LED layout and sdbusplus handler
78 *
79 * @param [in] bus - sdbusplus handler
80 * @param [in] LedLayout - LEDs group layout
81 */
82 Manager(sdbusplus::bus::bus& bus, const LedLayout& ledLayout) :
83 ledMap(ledLayout), bus(bus)
84 {
85 // Nothing here
86 }
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +053087
Patrick Venture91ac8d32018-11-01 17:03:22 -070088 /** @brief Given a group name, applies the action on the group
89 *
90 * @param[in] path - dbus path of group
91 * @param[in] assert - Could be true or false
92 * @param[in] ledsAssert - LEDs that are to be asserted new
93 * or to a different state
94 * @param[in] ledsDeAssert - LEDs that are to be Deasserted
95 *
96 * @return - Success or exception thrown
97 */
98 bool setGroupState(const std::string& path, bool assert, group& ledsAssert,
99 group& ledsDeAssert);
Vishwanatha Subbannaed490732016-12-20 15:59:29 +0530100
Patrick Venture91ac8d32018-11-01 17:03:22 -0700101 /** @brief Finds the set of LEDs to operate on and executes action
102 *
103 * @param[in] ledsAssert - LEDs that are to be asserted newly
104 * or to a different state
105 * @param[in] ledsDeAssert - LEDs that are to be Deasserted
106 *
107 * @return: None
108 */
109 void driveLEDs(group& ledsAssert, group& ledsDeAssert);
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +0530110
Patrick Venture91ac8d32018-11-01 17:03:22 -0700111 private:
112 /** @brief sdbusplus handler */
113 sdbusplus::bus::bus& bus;
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530114
Patrick Venture91ac8d32018-11-01 17:03:22 -0700115 /** Map of physical LED path to service name */
116 std::map<std::string, std::string> phyLeds{};
Vishwanatha Subbannadcc3f382017-03-24 20:15:02 +0530117
Patrick Venture91ac8d32018-11-01 17:03:22 -0700118 /** @brief Pointers to groups that are in asserted state */
119 std::set<const group*> assertedGroups;
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +0530120
Patrick Venture91ac8d32018-11-01 17:03:22 -0700121 /** @brief Contains the highest priority actions for all
122 * asserted LEDs.
123 */
124 group currentState;
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +0530125
Patrick Venture91ac8d32018-11-01 17:03:22 -0700126 /** @brief Contains the set of all actions for asserted LEDs */
127 group combinedState;
Vishwanatha Subbanna4b000d82017-05-03 18:44:16 +0530128
Patrick Venture91ac8d32018-11-01 17:03:22 -0700129 /** @brief Returns action string based on enum
130 *
131 * @param[in] action - Action enum
132 *
133 * @return string equivalent of the passed in enumeration
134 */
135 static std::string getPhysicalAction(Layout::Action action);
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530136
Patrick Venture91ac8d32018-11-01 17:03:22 -0700137 /** @brief Chooses appropriate action to be triggered on physical LED
138 * and calls into function that applies the actual action.
139 *
140 * @param[in] objPath - dbus object path
141 * @param[in] action - Intended action to be triggered
142 * @param[in] dutyOn - Duty Cycle ON percentage
tony lee6fd9e442019-04-23 09:09:15 +0800143 * @param[in] period - Time taken for one blink cycle
Patrick Venture91ac8d32018-11-01 17:03:22 -0700144 */
145 void drivePhysicalLED(const std::string& objPath, Layout::Action action,
tony lee6fd9e442019-04-23 09:09:15 +0800146 uint8_t dutyOn, const uint16_t period);
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530147
Patrick Venture91ac8d32018-11-01 17:03:22 -0700148 /** @brief Makes a dbus call to a passed in service name.
149 * This is now the physical LED controller
150 *
151 * @param[in] service - dbus service name
152 * @param[in] objPath - dbus object path
153 * @param[in] property - property to be written to
154 * @param[in] value - Value to write
155 */
156 template <typename T>
157 void drivePhysicalLED(const std::string& service,
158 const std::string& objPath,
159 const std::string& property, const T& value)
160 {
Patrick Williamsa41d2822020-05-13 17:57:23 -0500161 std::variant<T> data = value;
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530162
Patrick Venture91ac8d32018-11-01 17:03:22 -0700163 auto method = bus.new_method_call(service.c_str(), objPath.c_str(),
164 DBUS_PROPERTY_IFACE, "Set");
165 method.append(PHY_LED_IFACE);
166 method.append(property);
167 method.append(data);
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530168
Patrick Venture91ac8d32018-11-01 17:03:22 -0700169 // There will be exceptions going forward and hence don't need a
170 // response
171 bus.call_noreply(method);
172 return;
173 }
Vishwanatha Subbanna11ca8f92017-02-27 19:33:45 +0530174
Patrick Venture91ac8d32018-11-01 17:03:22 -0700175 /** @brief Populates map of Physical LED paths to service name */
176 void populateObjectMap();
Vishwanatha Subbanna4c8c72b2016-11-29 23:02:06 +0530177};
178
179} // namespace led
180} // namespace phosphor