blob: b9e2cbd06c24acbf37f97fabe68a0ec303af0815 [file] [log] [blame]
#pragma once
#include "fan.hpp"
#include "rpolicy.hpp"
#include <functional>
#include <vector>
namespace phosphor
{
namespace fan
{
namespace presence
{
class PresenceSensor;
/**
* @class Fallback
* @brief Fallback redundancy policy.
*
* The fallback redundancy policy falls back to
* subsequent presence sensors when the active
* sensor indicates not present and a fallback
* sensor indicates the fan is present.
*/
class Fallback : public RedundancyPolicy
{
public:
Fallback() = delete;
Fallback(const Fallback&) = default;
Fallback& operator=(const Fallback&) = default;
Fallback(Fallback&&) = default;
Fallback& operator=(Fallback&&) = default;
~Fallback() = default;
/**
* @brief Construct a fallback policy.
*
* @param[in] fan - The fan associated with the policy.
* @param[in] s - The set of sensors associated with the policy.
* @param[in] e - EEPROM device instance
*/
Fallback(const Fan& fan,
const std::vector<std::reference_wrapper<PresenceSensor>>& s,
std::unique_ptr<EEPROMDevice> e) :
RedundancyPolicy(fan, std::move(e)), sensors(s)
{
activeSensor = sensors.begin();
}
/**
* @brief Construct a fallback policy.
*
* @param[in] fan - The fan associated with the policy.
* @param[in] s - The set of sensors associated with the policy.
*/
Fallback(const Fan& fan,
const std::vector<std::reference_wrapper<PresenceSensor>>& s) :
Fallback(fan, s, nullptr)
{}
/**
* @brief stateChanged
*
* Update the inventory and execute the fallback
* policy.
*
* @param[in] present - The new presence state according
* to the active sensor.
* @param[in] sensor - The sensor that changed state.
*/
void stateChanged(bool present, PresenceSensor& /*sensor*/) override;
/**
* @brief monitor
*
* Start monitoring the fan.
*/
void monitor() override;
private:
/** @brief All presence sensors in the redundancy set. */
std::vector<std::reference_wrapper<PresenceSensor>> sensors;
/** @brief The active presence sensor. */
decltype(sensors)::iterator activeSensor;
};
} // namespace presence
} // namespace fan
} // namespace phosphor