diff options
author | Matthew Barth <msbarth@us.ibm.com> | 2017-08-04 11:18:28 -0500 |
---|---|---|
committer | Matthew Barth <msbarth@us.ibm.com> | 2017-08-07 15:30:10 -0500 |
commit | 604329ef36d8ba2cd324f7132427d7e5724c074e (patch) | |
tree | 20b319dc2ff32e408ef0cb6bad272d2ea749c299 /control/preconditions.hpp | |
parent | eb639c575a7964b849117cc70b6102f17a2dc32a (diff) | |
download | phosphor-fan-presence-604329ef36d8ba2cd324f7132427d7e5724c074e.tar.gz phosphor-fan-presence-604329ef36d8ba2cd324f7132427d7e5724c074e.zip |
Add precondition that checks property states
The property state check precondition validates that each given property
matches the defined value. When all the precondition groups' property
states match, the given set speed event is initialized and activated
allowing the zone speeds to be active controlled.
Change-Id: Ic16a0e1fc584c6fa695e354fa80fb1993002ffc7
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
Diffstat (limited to 'control/preconditions.hpp')
-rw-r--r-- | control/preconditions.hpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/control/preconditions.hpp b/control/preconditions.hpp index 61a2f50..3bceb19 100644 --- a/control/preconditions.hpp +++ b/control/preconditions.hpp @@ -1,5 +1,7 @@ #pragma once +#include <algorithm> + namespace phosphor { namespace fan @@ -31,9 +33,39 @@ auto property_states_match(std::vector<PrecondGroup>&& pg, return [pg = std::move(pg), sse = std::move(sse)](auto& zone, auto& group) { - // TODO Read/Compare given precondition entries - // TODO Only init the event when the precondition(s) are true - // TODO Remove the event properties when the precondition(s) are false + // Compare given precondition entries + size_t precondState = std::count_if( + pg.begin(), + pg.end(), + [&zone](auto const& entry) + { + try + { + return zone.getPropValueVariant( + std::get<pcPathPos>(entry), + std::get<pcIntfPos>(entry), + std::get<pcPropPos>(entry)) == + std::get<pcValuePos>(entry); + } + catch (const std::out_of_range& oore) + { + // Default to property variants not equal when not found + return false; + } + }); + + // Update group's fan control active allowed + zone.setActiveAllow(&group, (precondState == pg.size())); + if (precondState == pg.size()) + { + // Init the event when all the precondition(s) are true + zone.initEvent(sse); + } + else + { + zone.setFullSpeed(); + // TODO Unsubscribe the event signals when any precondition is false + } }; } |