From 861d77c39a3b69d5be43aceca72602beb18165df Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Mon, 22 May 2017 14:18:25 -0500 Subject: Add an active state for automatic fan control Each zone contains an active state that determines whether the automatic fan control algorithm is active and controlling the fan speeds dynamically or not. This will be used to determine if the fan speeds within the zone are set dynamically or rather held at another speed for a determined reason. Change-Id: I2f81de168c5f7d859b3ec917022c4749e1a28d4e Signed-off-by: Matthew Barth --- control/actions.hpp | 4 +++- control/zone.cpp | 17 +++++++++++++++++ control/zone.hpp | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/control/actions.hpp b/control/actions.hpp index eb857b6..96da323 100644 --- a/control/actions.hpp +++ b/control/actions.hpp @@ -13,7 +13,7 @@ namespace action /** * @brief An action to set the speed on a zone - * @details The zone is set to the given speed when a defined number of + * @details The zone is held at the given speed when a defined number of * properties in the group are set to the given state * * @param[in] count - Number of properties @@ -37,6 +37,8 @@ auto count_state_before_speed(size_t count, bool state, uint64_t speed) entry.first, std::get(entry.second)) == state; }); + // Update group's fan control active allowed based on action results + zone.setActiveAllow(&group, !(numAtState >= count)); if (numAtState >= count) { zone.setSpeed(speed); diff --git a/control/zone.cpp b/control/zone.cpp index 18fd627..35c7d2b 100644 --- a/control/zone.cpp +++ b/control/zone.cpp @@ -73,6 +73,23 @@ void Zone::setSpeed(uint64_t speed) } } +void Zone::setActiveAllow(const Group* group, bool isActiveAllow) +{ + _active[group] = isActiveAllow; + if (!isActiveAllow) + { + _isActive = false; + } + else + { + // Check all entries are set to allow control active + auto actPred = [](auto const& entry) {return entry.second;}; + _isActive = std::all_of(_active.begin(), + _active.end(), + actPred); + } +} + int Zone::signalHandler(sd_bus_message* msg, void* data, sd_bus_error* err) diff --git a/control/zone.hpp b/control/zone.hpp index 1a4e173..b727567 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -70,6 +70,14 @@ class Zone } } + /** + * @brief Sets the automatic fan control allowed active state + * + * @param[in] group - A group that affects the active state + * @param[in] isActiveAllow - Active state according to group + */ + void setActiveAllow(const Group* group, bool isActiveAllow); + /** * @brief Sets a given object's property value * @@ -115,6 +123,11 @@ class Zone */ const size_t _zoneNum; + /** + * Automatic fan control active state + */ + bool _isActive = true; + /** * The vector of fans in this zone */ @@ -125,6 +138,11 @@ class Zone */ std::map> _properties; + /** + * @brief Map of active fan control allowed by groups + */ + std::map _active; + /** * @brief List of signal event arguments */ -- cgit v1.2.1