1 #include "triggers.hpp"
2 
3 namespace phosphor
4 {
5 namespace fan
6 {
7 namespace control
8 {
9 namespace trigger
10 {
11 
12 using namespace phosphor::fan;
13 
14 Trigger timer(TimerConf&& tConf)
15 {
16     return [tConf = std::move(tConf)](
17                control::Zone& zone, const std::string& name, const Group& group,
18                const std::vector<Action>& actions) {
19         zone.addTimer(name, group, actions, tConf);
20     };
21 }
22 
23 Trigger signal(const std::string& match, SignalHandler&& handler)
24 {
25     return [match = std::move(match), handler = std::move(handler)](
26                control::Zone& zone, const std::string& name, const Group& group,
27                const std::vector<Action>& actions) {
28         // Setup signal matches of the property for event
29         std::unique_ptr<EventData> eventData =
30             std::make_unique<EventData>(group, match, handler, actions);
31         std::unique_ptr<sdbusplus::bus::match_t> mPtr = nullptr;
32         if (!match.empty())
33         {
34             // Subscribe to signal match
35             mPtr = std::make_unique<sdbusplus::bus::match_t>(
36                 zone.getBus(), match.c_str(),
37                 std::bind(std::mem_fn(&Zone::handleEvent), &zone,
38                           std::placeholders::_1, eventData.get()));
39         }
40         else
41         {
42             // When match is empty, handle if zone object member
43             // Set event data for each host group member
44             for (auto& entry : group)
45             {
46                 if (std::get<pathPos>(entry) == zone.getPath())
47                 {
48                     auto ifaces = zone.getIfaces();
49                     // Group member interface in list owned by zone
50                     if (std::find(ifaces.begin(), ifaces.end(),
51                                   std::get<intfPos>(entry)) != ifaces.end())
52                     {
53                         // Store path,interface,property as a managed object
54                         zone.setObjectData(
55                             std::get<pathPos>(entry), std::get<intfPos>(entry),
56                             std::get<propPos>(entry), eventData.get());
57                     }
58                 }
59             }
60         }
61         zone.addSignal(name, std::move(eventData), std::move(mPtr));
62     };
63 }
64 
65 Trigger init(MethodHandler&& handler)
66 {
67     return [handler = std::move(handler)](
68                control::Zone& zone, const std::string& name, const Group& group,
69                const std::vector<Action>& actions) {
70         // A handler function is optional
71         if (handler)
72         {
73             handler(zone, group);
74         }
75 
76         // Run action functions for initial event state
77         std::for_each(
78             actions.begin(), actions.end(),
79             [&zone, &group](auto const& action) { action(zone, group); });
80     };
81 }
82 
83 } // namespace trigger
84 } // namespace control
85 } // namespace fan
86 } // namespace phosphor
87