1 #pragma once
2 #include <string>
3 #include <tuple>
4 #include <vector>
5 #include <sdbusplus/server.hpp>
6 #include <sdeventplus/clock.hpp>
7 #include <sdeventplus/utility/timer.hpp>
8 
9 namespace phosphor
10 {
11 namespace fan
12 {
13 namespace control
14 {
15 
16 class Zone;
17 
18 constexpr auto propertyNamePos = 0;
19 constexpr auto propertyInterfacePos = 1;
20 constexpr auto propertyPathPos = 2;
21 constexpr auto propertyValuePos = 3;
22 
23 // TODO openbmc/openbmc#1769: Support more property types.
24 using ConditionProperty = std::tuple<std::string,
25                           std::string,
26                           std::string,
27                           bool>;
28 
29 constexpr auto conditionTypePos = 0;
30 constexpr auto conditionPropertyListPos = 1;
31 using Condition = std::tuple<std::string,
32                              std::vector<ConditionProperty>>;
33 
34 using PropertyVariantType = sdbusplus::message::variant<bool,
35                                                         int32_t,
36                                                         int64_t,
37                                                         double,
38                                                         std::string>;
39 
40 constexpr auto fanNamePos = 0;
41 constexpr auto sensorListPos = 1;
42 constexpr auto targetInterfacePos = 2;
43 using FanDefinition = std::tuple<std::string,
44                                  std::vector<std::string>,
45                                  std::string>;
46 
47 constexpr auto pathPos = 0;
48 constexpr auto intfPos = 1;
49 constexpr auto propPos = 2;
50 using Group = std::vector<std::tuple<std::string,
51                                      std::string,
52                                      std::string>>;
53 using ZoneHandler = std::function<void(Zone&)>;
54 using SignalHandler = std::function<void(sdbusplus::bus::bus&,
55                                          sdbusplus::message::message&,
56                                          Zone&)>;
57 using MethodHandler = std::function<void(Zone&, const Group&)>;
58 using Action = std::function<void(Zone&, const Group&)>;
59 using Trigger = std::function<void(Zone&,
60                                    const std::string&,
61                                    const Group&,
62                                    const std::vector<Action>&)>;
63 
64 constexpr auto adGroupPos = 0;
65 constexpr auto adActionsPos = 1;
66 using ActionData = std::vector<std::tuple<Group, std::vector<Action>>>;
67 
68 constexpr auto pcPathPos = 0;
69 constexpr auto pcIntfPos = 1;
70 constexpr auto pcPropPos = 2;
71 constexpr auto pcValuePos = 3;
72 using PrecondGroup = std::tuple<std::string,
73                                 std::string,
74                                 std::string,
75                                 PropertyVariantType>;
76 
77 constexpr auto namePos = 0;
78 constexpr auto hasOwnerPos = 1;
79 using Service = std::tuple<std::string, bool>;
80 
81 constexpr auto intervalPos = 0;
82 constexpr auto typePos = 1;
83 enum class TimerType
84 {
85     oneshot,
86     repeating,
87 };
88 using TimerConf = std::tuple<std::chrono::microseconds,
89                              TimerType>;
90 
91 // TODO Remove event group (groupPos)
92 // Bind groups directly to list of actions after optimized code generated
93 constexpr auto sseNamePos = 0;
94 constexpr auto groupPos = 1;
95 constexpr auto actionsPos = 2;
96 constexpr auto triggerPos = 3;
97 using SetSpeedEvent = std::tuple<std::string,
98                                  Group,
99                                  ActionData,
100                                  std::vector<Trigger>>;
101 
102 constexpr auto eventGroupPos = 0;
103 constexpr auto eventMatchPos = 1;
104 constexpr auto eventHandlerPos = 2;
105 constexpr auto eventActionsPos = 3;
106 using EventData = std::tuple<Group,
107                              std::string,
108                              SignalHandler,
109                              std::vector<Action>>;
110 
111 constexpr auto timerEventDataPos = 0;
112 constexpr auto timerTimerPos = 1;
113 using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
114 using TimerEvent = std::tuple<std::unique_ptr<EventData>, Timer>;
115 
116 constexpr auto signalEventDataPos = 0;
117 constexpr auto signalMatchPos = 1;
118 using SignalEvent =
119     std::tuple<std::unique_ptr<EventData>,
120                std::unique_ptr<sdbusplus::server::match::match>>;
121 
122 constexpr auto zoneNumPos = 0;
123 constexpr auto fullSpeedPos = 1;
124 constexpr auto floorSpeedPos = 2;
125 constexpr auto incDelayPos = 3;
126 constexpr auto decIntervalPos = 4;
127 constexpr auto handlerPos = 5;
128 constexpr auto fanListPos = 6;
129 constexpr auto setSpeedEventsPos = 7;
130 using ZoneDefinition = std::tuple<size_t,
131                                   uint64_t,
132                                   uint64_t,
133                                   size_t,
134                                   size_t,
135                                   std::vector<ZoneHandler>,
136                                   std::vector<FanDefinition>,
137                                   std::vector<SetSpeedEvent>>;
138 
139 constexpr auto conditionListPos = 0;
140 constexpr auto zoneListPos = 1;
141 using ZoneGroup = std::tuple<std::vector<Condition>,
142                              std::vector<ZoneDefinition>>;
143 
144 }
145 }
146 }
147