1 #pragma once
2 
3 #include "epoch_base.hpp"
4 
5 #include <chrono>
6 
7 namespace phosphor
8 {
9 namespace time
10 {
11 
12 using namespace std::chrono;
13 
14 /** @class BmcEpoch
15  *  @brief OpenBMC BMC EpochTime implementation.
16  *  @details A concrete implementation for xyz.openbmc_project.Time.EpochTime
17  *  DBus API for BMC's epoch time.
18  */
19 class BmcEpoch : public EpochBase
20 {
21   public:
22     friend class TestBmcEpoch;
23     BmcEpoch(sdbusplus::bus::bus& bus, const char* objPath);
24     ~BmcEpoch();
25 
26     /**
27      * @brief Get value of Elapsed property
28      *
29      * @return The elapsed microseconds since UTC
30      **/
31     uint64_t elapsed() const override;
32 
33     /**
34      * @brief Set value of Elapsed property
35      *
36      * @param[in] value - The microseconds since UTC to set
37      * @return The updated elapsed microseconds since UTC
38      **/
39     uint64_t elapsed(uint64_t value) override;
40 
41   private:
42     /** @brief The fd for time change event */
43     int timeFd = -1;
44 
45     /** @brief Initialize timerFd related resource */
46     void initialize();
47 
48     /** @brief The callback function on system time change
49      *
50      * @param[in] es - Source of the event
51      * @param[in] fd - File descriptor of the timer
52      * @param[in] revents - Not used
53      * @param[in] userdata - User data pointer
54      */
55     static int onTimeChange(sd_event_source* es, int fd, uint32_t revents,
56                             void* userdata);
57 
58     /** @brief The reference of sdbusplus bus */
59     sdbusplus::bus::bus& bus;
60 
61     /** @brief The deleter of sd_event_source */
62     std::function<void(sd_event_source*)> sdEventSourceDeleter =
63         [](sd_event_source* p) {
64             if (p)
65             {
66                 sd_event_source_unref(p);
67             }
68         };
69     using SdEventSource =
70         std::unique_ptr<sd_event_source, decltype(sdEventSourceDeleter)>;
71 
72     /** @brief The event source on system time change */
73     SdEventSource timeChangeEventSource{nullptr, sdEventSourceDeleter};
74 };
75 
76 } // namespace time
77 } // namespace phosphor
78