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