blob: ef1111b20bfd5396f875fbe19cd2e0418fdf5692 [file] [log] [blame]
#pragma once
#include "fan.hpp"
#include "power_state.hpp"
#include <nlohmann/json.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <sdeventplus/clock.hpp>
#include <sdeventplus/utility/timer.hpp>
namespace phosphor::fan::presence
{
class PresenceSensor;
/**
* @class ErrorReporter
*
* This class will create event logs for missing fans. The logs are
* created after a fan has been missing for an amount of time
* specified in the JSON config file while power is on.
*
* The timers to create event logs are not started when power is off.
* When power is turned on, the timers for any missing fans will be
* be started. If any timers are running when power is turned off,
* they will be stopped.
*/
class ErrorReporter
{
public:
ErrorReporter() = delete;
~ErrorReporter() = default;
ErrorReporter(const ErrorReporter&) = delete;
ErrorReporter& operator=(const ErrorReporter&) = delete;
ErrorReporter(ErrorReporter&&) = delete;
ErrorReporter& operator=(ErrorReporter&&) = delete;
/**
* @brief Constructor
*
* @param[in] bus - The sdbusplus bus object
* @param[in] fans - The fans for this configuration
*/
ErrorReporter(
sdbusplus::bus_t& bus,
const std::vector<std::tuple<
Fan, std::vector<std::unique_ptr<PresenceSensor>>>>& fans);
private:
/**
* @brief The propertiesChanged callback for the interface that
* contains the Present property of a fan.
*
* Will start the timer to create an event log if power is on.
*
* @param[in] msg - The payload of the propertiesChanged signal
*/
void presenceChanged(sdbusplus::message_t& msg);
/**
* @brief The callback function called by the PowerState class
* when the power state changes.
*
* Will start timers for missing fans if power is on, and stop
* them when power changes to off.
*
* @param[in] powerState - The new power state
*/
void powerStateChanged(bool powerState);
/**
* @brief Called when the fan missing timer expires to create
* an event log for a missing fan.
*
* @param[in] fanPath - The D-Bus path of the missing fan.
*/
void fanMissingTimerExpired(const std::string& fanPath);
/**
* @brief Checks if the fan missing timer for a fan needs to
* either be started or stopped based on the power and
* presence states.
*
* @param[in] fanPath - The D-Bus path of the fan
*/
void checkFan(const std::string& fanPath);
/**
* @brief Reference to the D-Bus connection object.
*/
sdbusplus::bus_t& _bus;
/**
* @brief The connection to the event loop for the timer.
*/
sdeventplus::Event _event;
/**
* @brief The propertiesChanged match objects.
*/
std::vector<sdbusplus::bus::match_t> _matches;
/**
* @brief Base class pointer to the power state implementation.
*/
std::shared_ptr<PowerState> _powerState;
/**
* @brief The map of fan paths to their presence states.
*/
std::map<std::string, bool> _fanStates;
/**
* @brief The map of fan paths to their Timer objects with
* the timer expiration time.
*/
std::map<std::string,
std::tuple<std::unique_ptr<sdeventplus::utility::Timer<
sdeventplus::ClockId::Monotonic>>,
std::chrono::seconds>>
_fanMissingTimers;
};
} // namespace phosphor::fan::presence