diff options
author | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2017-07-25 19:52:22 -0400 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-08-02 20:18:19 +0000 |
commit | 00b520827e5d16fc8262783e1ccf8de89a213006 (patch) | |
tree | 940e1830b9ad83ccdf90e41ae3eb6560d645852d /presence/anyof.cpp | |
parent | 11083eca847cf8efa0983deb698a48ee0246e1d3 (diff) | |
download | phosphor-fan-presence-00b520827e5d16fc8262783e1ccf8de89a213006.tar.gz phosphor-fan-presence-00b520827e5d16fc8262783e1ccf8de89a213006.zip |
presence: Add any of redundancy policy
Add a bitwise logical or redundancy policy implementation
(fan is present if any sensor indicates as such).
Change-Id: I1d161478a4a6fe9d5690a385703e41c6fff9c81c
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'presence/anyof.cpp')
-rw-r--r-- | presence/anyof.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/presence/anyof.cpp b/presence/anyof.cpp new file mode 100644 index 0000000..4dbf356 --- /dev/null +++ b/presence/anyof.cpp @@ -0,0 +1,78 @@ +/** + * Copyright © 2017 IBM Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <algorithm> +#include <phosphor-logging/log.hpp> +#include "anyof.hpp" +#include "fan.hpp" +#include "psensor.hpp" + +namespace phosphor +{ +namespace fan +{ +namespace presence +{ +AnyOf::AnyOf( + const Fan& fan, + const std::vector<std::reference_wrapper<PresenceSensor>>& s) + : RedundancyPolicy(fan), + state() +{ + for (auto& sensor: s) + { + state.emplace_back(sensor, false); + } +} + +void AnyOf::stateChanged(bool present, PresenceSensor& sensor) +{ + // Find the sensor that changed state. + auto sit = std::find_if( + state.begin(), + state.end(), + [&sensor](const auto& s){ return std::get<0>(s).get() == sensor; }); + if (sit != state.end()) + { + // Update our cache of the sensors state and re-evaluate. + std::get<bool>(*sit) = present; + auto newState = std::any_of( + state.begin(), + state.end(), + [](const auto& s){ return std::get<bool>(s); }); + setPresence(fan, newState); + } +} + +void AnyOf::monitor() +{ + // Start all sensors in the anyof redundancy set. + + for (auto& s: state) + { + auto &sensor = std::get<0>(s); + std::get<bool>(s) = sensor.get().start(); + } + + auto present = std::any_of( + state.begin(), + state.end(), + [](const auto& s){ return std::get<bool>(s); }); + setPresence(fan, present); +} + +} // namespace presence +} // namespace fan +} // namespace phosphor |