diff options
author | Matthew Barth <msbarth@us.ibm.com> | 2017-09-27 09:33:42 -0500 |
---|---|---|
committer | Matthew Barth <msbarth@us.ibm.com> | 2017-11-17 13:14:10 -0600 |
commit | e59fdf707514ed00fa1ab432a052de1fac07b56c (patch) | |
tree | 38ca2bc1a3e4bee8d5b1a0fbc8d2dba55024000c | |
parent | 8fa02dabe17db9761086d77c390ceb281e2936c9 (diff) | |
download | phosphor-fan-presence-e59fdf707514ed00fa1ab432a052de1fac07b56c.tar.gz phosphor-fan-presence-e59fdf707514ed00fa1ab432a052de1fac07b56c.zip |
Set/update a service name owner for a group
Adds a service name associated with a group when the group or given
service name is not found within the map of services otherwise updates
the service name owner associated with the group.
Change-Id: I602ddaa7e06e354e01ea70d6c5c0a45e74a14e99
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
-rw-r--r-- | control/types.hpp | 4 | ||||
-rw-r--r-- | control/zone.cpp | 30 | ||||
-rw-r--r-- | control/zone.hpp | 16 |
3 files changed, 50 insertions, 0 deletions
diff --git a/control/types.hpp b/control/types.hpp index d3ddb16..915b8b4 100644 --- a/control/types.hpp +++ b/control/types.hpp @@ -53,6 +53,10 @@ using PrecondGroup = std::tuple<std::string, std::string, PropertyVariantType>; +constexpr auto namePos = 0; +constexpr auto hasOwnerPos = 1; +using Service = std::tuple<std::string, bool>; + constexpr auto intervalPos = 0; using Timer = std::tuple<std::chrono::seconds>; diff --git a/control/zone.cpp b/control/zone.cpp index 3d7852e..b9a7583 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -115,6 +115,36 @@ void Zone::setActiveAllow(const Group* group, bool isActiveAllow) } } +void Zone::setServiceOwner(const Group* group, + const std::string& name, + const bool hasOwner) +{ + try + { + auto& sNames = _services.at(*group); + auto it = std::find_if( + sNames.begin(), + sNames.end(), + [&name](auto const& entry) + { + return name == std::get<namePos>(entry); + } + ); + if (it != std::end(sNames)) + { + std::get<hasOwnerPos>(*it) = hasOwner; + } + else + { + _services[*group].emplace_back(name, hasOwner); + } + } + catch (const std::out_of_range& oore) + { + _services[*group].emplace_back(name, hasOwner); + } +} + void Zone::setFloor(uint64_t speed) { _floorSpeed = speed; diff --git a/control/zone.hpp b/control/zone.hpp index 8869f91..9c08032 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -128,6 +128,17 @@ class Zone }; /** + * @brief Set or update a service name owner in use + * + * @param[in] group - Group associated with service + * @param[in] name - Service name + * @param[in] hasOwner - Whether the service is owned or not + */ + void setServiceOwner(const Group* group, + const std::string& name, + const bool hasOwner); + + /** * @brief Initialize a set speed event properties and actions * * @param[in] event - Set speed event @@ -372,6 +383,11 @@ class Zone std::map<const Group, bool> _active; /** + * @brief Map of group service names + */ + std::map<const Group, std::vector<Service>> _services; + + /** * @brief List of signal event arguments and Dbus matches for callbacks */ std::vector<SignalEvent> _signalEvents; |