#pragma once #include "fan.hpp" #include "power_state.hpp" #include "rpolicy.hpp" #include #include #include namespace phosphor { namespace fan { namespace presence { class PresenceSensor; /** * @class AnyOf * @brief AnyOf redundancy policy. * * The any of redundancy policy monitors all sensor * states in the redundancy set and reports true when any * sensor in the set reports true. */ class AnyOf : public RedundancyPolicy { public: AnyOf() = delete; AnyOf(const AnyOf&) = default; AnyOf& operator=(const AnyOf&) = default; AnyOf(AnyOf&&) = default; AnyOf& operator=(AnyOf&&) = default; ~AnyOf() = default; /** * @brief Construct an any of bitwise 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 */ AnyOf(const Fan& fan, const std::vector>& s, std::unique_ptr e); /** * @brief Construct an any of bitwise policy. * * @param[in] fan - The fan associated with the policy. * @param[in] s - The set of sensors associated with the policy. */ AnyOf(const Fan& fan, const std::vector>& s) : AnyOf(fan, s, nullptr) {} /** * @brief stateChanged * * Update the inventory and execute the fallback * policy. * * @param[in] present - The new presence state according * to the specified sensor. * @param[in] sensor - The sensor reporting the new state. */ void stateChanged(bool present, PresenceSensor& sensor) override; /** * @brief monitor * * Start monitoring the fan. */ void monitor() override; private: /** * @brief Checks that the sensors contained in this policy all * agree on the presence value. If they don't, then call * logConflict() on the sensors that don't think the fan * is present as they may be broken. * * This check will only happen when power is on. */ void checkSensorConflicts(); /** * @brief Callback function called after a post-poweron delay. * * The _powerOnDelayTimer is started when _powerState says the * power is on to give fans a bit of time to spin up so tachs * wouldn't be zero. This is the callback function for that timer. * * It will call checkSensorConflicts(). */ void delayedAfterPowerOn(); /** * @brief Says if power is on, though not until the post * power on delay is complete. * * @return bool - if power is on. */ inline bool isPowerOn() const { return _powerOn; } /** * @brief Called by the PowerState object when the power * state changes. * * When power changes to on: * - Clears the memory of previous sensor conflicts. * - Starts the post power on delay timer. * * @param[in] powerOn - If power is now on or off. */ void powerStateChanged(bool powerOn); static constexpr size_t sensorPos = 0; static constexpr size_t presentPos = 1; static constexpr size_t conflictPos = 2; /** * @brief All presence sensors in the redundancy set. * * Each entry contains: * - A reference to a PresenceSensor * - The current presence state * - If the sensors have logged conflicts in their answers. */ std::vector, bool, bool>> state; /** * @brief Pointer to the PowerState object used to track power changes. */ std::shared_ptr _powerState; /** * @brief Post power on delay timer, where the conflict checking code * doesn't consider power on until this timer expires. * * This gives fans a chance to start spinning before checking them. */ sdeventplus::utility::Timer _powerOnDelayTimer; /** * @brief Current power state. */ bool _powerOn; }; } // namespace presence } // namespace fan } // namespace phosphor