#pragma once #include "device.hpp" #include <phosphor-logging/log.hpp> #include <sdbusplus/bus.hpp> #include <sdbusplus/server.hpp> #include <sdeventplus/clock.hpp> #include <sdeventplus/event.hpp> #include <sdeventplus/utility/timer.hpp> namespace phosphor { namespace power { using namespace phosphor::logging; /** * @class DeviceMonitor * * Monitors a power device for faults by calling Device::analyze() * on an interval. Do the monitoring by calling run(). * May be overridden to provide more functionality. */ class DeviceMonitor { public: DeviceMonitor() = delete; virtual ~DeviceMonitor() = default; DeviceMonitor(const DeviceMonitor&) = delete; DeviceMonitor& operator=(const DeviceMonitor&) = delete; DeviceMonitor(DeviceMonitor&&) = delete; DeviceMonitor& operator=(DeviceMonitor&&) = delete; /** * Constructor * * @param[in] d - device to monitor * @param[in] e - event object * @param[in] i - polling interval in ms */ DeviceMonitor(std::unique_ptr<Device>&& d, const sdeventplus::Event& e, std::chrono::milliseconds i) : device(std::move(d)), timer(e, std::bind(&DeviceMonitor::analyze, this), i) {} /** * Starts the timer to monitor the device on an interval. */ virtual int run() { return timer.get_event().loop(); } protected: /** * Analyzes the device for faults * * Runs in the timer callback * * Override if desired */ virtual void analyze() { device->analyze(); } /** * The device to run the analysis on */ std::unique_ptr<Device> device; /** * The timer that runs fault check polls. */ sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer; }; } // namespace power } // namespace phosphor