blob: 1eb3167f962dee6b406d2214c1387dc72c94d78c [file] [log] [blame]
#pragma once
#include "bmc_time_change_listener.hpp"
#include "config.h"
#include "epoch_base.hpp"
#include <chrono>
namespace phosphor
{
namespace time
{
/** @class HostEpoch
* @brief OpenBMC HOST EpochTime implementation.
* @details A concrete implementation for xyz.openbmc_project.Time.EpochTime
* DBus API for HOST's epoch time.
*/
class HostEpoch : public EpochBase, public BmcTimeChangeListener
{
public:
friend class TestHostEpoch;
HostEpoch(sdbusplus::bus::bus& bus,
const char* objPath);
/**
* @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 Notified on time owner changed */
void onOwnerChanged(Owner owner) override;
/** @brief Notified on bmc time is changed
*
* @param[in] bmcTime - The epoch time in microseconds
*/
void onBmcTimeChanged(
const std::chrono::microseconds& bmcTime) override;
private:
/** @brief The diff between BMC and Host time */
std::chrono::microseconds offset;
/**
* @brief The diff between host time and steady clock
* @details This diff is used to calculate the host time if BMC time
* is changed and the owner is SPLIT.
* Without this the host time is lost if BMC time is changed.
*/
std::chrono::microseconds diffToSteadyClock;
/** @brief Save the offset value into offsetFile */
void saveOffset();
/** @brief The file to store the offset in File System.
* Read back when starts
**/
static constexpr auto offsetFile = HOST_OFFSET_FILE;
};
} // namespace time
} // namespace phosphor