blob: 100514da083db9adcd517a4839d821264d1f97ea [file] [log] [blame]
#pragma once
#include "chassis.hpp"
#include "types.hpp"
#include "utility.hpp"
#include <sdbusplus/bus/match.hpp>
#include <sdbusplus/server/manager.hpp>
#include <sdbusplus/server/object.hpp>
#include <sdeventplus/event.hpp>
#include <sdeventplus/utility/timer.hpp>
#include <xyz/openbmc_project/State/Decorator/PowerSystemInputs/server.hpp>
using namespace phosphor::power::psu;
namespace phosphor::power::chassis_manager
{
// Validation timeout. Allow 30s to detect if new EM interfaces show up in D-Bus
// before performing the validation.
constexpr auto validationTimeout = std::chrono::seconds(30);
/**
* @class ChassisManager
*
* @brief Manages and monitors power supply devices for the chassis.
*
* @detail This class interacts with D-Bus to detect chassis power supply,
* subscribe to Entity Manager interface changes.
*/
class ChassisManager
{
public:
ChassisManager() = delete;
~ChassisManager() = default;
ChassisManager(const ChassisManager&) = delete;
ChassisManager& operator=(const ChassisManager&) = delete;
ChassisManager(ChassisManager&&) = delete;
ChassisManager& operator=(ChassisManager&&) = delete;
/**
* @brief Constructs a ChassisManager instance.
*
* @details Sets up D-Bus interfaces, creates timer for power supply
* validation and monitoring, and subscribes to entity-manager interfaces.
*
* @param[in] bus - Reference to the system D-Bus object.
* @param[in] e - Reference to event loop.
*/
ChassisManager(sdbusplus::bus_t& bus, const sdeventplus::Event& e);
/**
* @brief Starts the main event loop for monitoring.
*
* @return int Returns the result the result of the event loop execution.
*/
int run()
{
return timer->get_event().loop();
}
private:
/**
* @brief The D-Bus object
*/
sdbusplus::bus_t& bus;
/**
* @brief The timer that runs to periodically check the power supplies.
*/
std::unique_ptr<
sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>>
timer;
/**
* @brief Used to subscribe to Entity Manager interfaces added
*/
std::unique_ptr<sdbusplus::bus::match_t> entityManagerIfacesAddedMatch;
/**
* @brief List of chassis objects populated dynamically.
*/
std::vector<std::unique_ptr<phosphor::power::chassis::Chassis>>
listOfChassis;
/**
* @brief Declares a constant reference to an sdeventplus::Envent to manage
* async processing.
*/
const sdeventplus::Event& eventLoop;
/**
* @brief Callback for entity-manager interface added
*
* @details Process the information from the supported configuration and
* or IBM CFFPS Connector interface being added.
*
* @param[in] msg - D-Bus message containing the interface details.
*/
void entityManagerIfaceAdded(sdbusplus::message_t& msg);
/**
* @brief Invoke the PSU analysis method in each chassis on the system.
*
* @details Scan the system for chassis and analyze each chassis power
* supplies and log any detected errors.
*/
void analyze();
/**
* @brief Initialize the list of chassis object from the inventory, scans
* the D-Bus subtree for chassis and creates Chassis instances.
*/
void initializeChassisList();
/**
* @brief Retrieves a pointer to a Chassis object matching the given ID.
*
* @param[in] chassisId - Unique identifier of the chassis to search for.
* @return Raw pointer to the matching Chassis object if found, otherwise a
* nullptr.
*/
phosphor::power::chassis::Chassis* getMatchingChassisPtr(
uint64_t chassisId);
};
} // namespace phosphor::power::chassis_manager