| #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 |