| #pragma once |
| |
| #include "bmc_time_change_listener.hpp" |
| #include "epoch_base.hpp" |
| |
| #include <chrono> |
| |
| namespace phosphor |
| { |
| namespace time |
| { |
| |
| using namespace std::chrono; |
| |
| /** @class BmcEpoch |
| * @brief OpenBMC BMC EpochTime implementation. |
| * @details A concrete implementation for xyz.openbmc_project.Time.EpochTime |
| * DBus API for BMC's epoch time. |
| */ |
| class BmcEpoch : public EpochBase |
| { |
| public: |
| friend class TestBmcEpoch; |
| BmcEpoch(sdbusplus::bus::bus& bus, |
| const char* objPath); |
| ~BmcEpoch(); |
| |
| /** |
| * @brief Get value of Elapsed property |
| * |
| * @return The elapsed microseconds since UTC |
| **/ |
| uint64_t elapsed() const override; |
| |
| /** |
| * @brief Set value of Elapsed property |
| * |
| * @param[in] value - The microseconds since UTC to set |
| * @return The updated elapsed microseconds since UTC |
| **/ |
| uint64_t elapsed(uint64_t value) override; |
| |
| /** @brief Set the listner for bmc time change |
| * |
| * @param[in] listener - The pointer to the listener |
| */ |
| void setBmcTimeChangeListener(BmcTimeChangeListener* listener); |
| |
| private: |
| /** @brief The fd for time change event */ |
| int timeFd = -1; |
| |
| /** @brief Initialize timerFd related resource */ |
| void initialize(); |
| |
| /** @brief Notify the listeners that bmc time is changed |
| * |
| * @param[in] time - The epoch time in microseconds to notify |
| */ |
| void notifyBmcTimeChange(const microseconds& time); |
| |
| /** @brief The callback function on system time change |
| * |
| * @param[in] es - Source of the event |
| * @param[in] fd - File descriptor of the timer |
| * @param[in] revents - Not used |
| * @param[in] userdata - User data pointer |
| */ |
| static int onTimeChange(sd_event_source* es, int fd, |
| uint32_t revents, void* userdata); |
| |
| /** @brief The reference of sdbusplus bus */ |
| sdbusplus::bus::bus& bus; |
| |
| /** @brief The deleter of sd_event_source */ |
| std::function<void(sd_event_source*)> sdEventSourceDeleter = |
| [] (sd_event_source* p) { |
| if (p) |
| { |
| sd_event_source_unref(p); |
| } |
| }; |
| using SdEventSource = std::unique_ptr<sd_event_source, |
| decltype(sdEventSourceDeleter)>; |
| |
| /** @brief The event source on system time change */ |
| SdEventSource timeChangeEventSource {nullptr, sdEventSourceDeleter}; |
| |
| /** @brief The listener for bmc time change */ |
| BmcTimeChangeListener* timeChangeListener = nullptr; |
| }; |
| |
| } // namespace time |
| } // namespace phosphor |