blob: fc1a8bb02c19c3c58f6bc9ae72d8c06ee4bf0cde [file] [log] [blame]
#pragma once
#include "stream.hpp"
#include <chrono>
namespace openpower
{
namespace pels
{
/**
* @brief A structure that contains a PEL timestamp in BCD.
*/
struct BCDTime
{
uint8_t yearMSB;
uint8_t yearLSB;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minutes;
uint8_t seconds;
uint8_t hundredths;
BCDTime() :
yearMSB(0), yearLSB(0), month(0), day(0), hour(0), minutes(0),
seconds(0), hundredths(0)
{}
BCDTime(uint8_t yearMSB, uint8_t yearLSB, uint8_t month, uint8_t day,
uint8_t hour, uint8_t minutes, uint8_t seconds,
uint8_t hundredths) :
yearMSB(yearMSB), yearLSB(yearLSB), month(month), day(day), hour(hour),
minutes(minutes), seconds(seconds), hundredths(hundredths)
{}
bool operator==(const BCDTime& right) const;
bool operator!=(const BCDTime& right) const;
} __attribute__((packed));
/**
* @brief Converts a time_point into a BCD time
*
* @param[in] time - the time_point to convert
* @return BCDTime - the BCD time
*/
BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time);
/**
* @brief Converts the number of milliseconds since the epoch into BCD time
*
* @param[in] milliseconds - Number of milliseconds since the epoch
* @return BCDTime - the BCD time
*/
BCDTime getBCDTime(uint64_t milliseconds);
/**
* @brief Convert a BCDTime value into the number of
* milliseconds since the epoch (1/1/1970).
*
* @param[in] bcdTime - The BCD time value
* @return uint64_t - The milliseconds value
*/
uint64_t getMillisecondsSinceEpoch(const BCDTime& bcdTime);
/**
* @brief Converts a number to a BCD.
*
* For example 32 -> 0x32.
*
* Source: PLDM repository
*
* @param[in] value - the value to convert.
*
* @return T - the BCD value
*/
template <typename T>
T toBCD(T decimal)
{
T bcd = 0;
T remainder = 0;
auto count = 0;
while (decimal)
{
remainder = decimal % 10;
bcd = bcd + (remainder << count);
decimal = decimal / 10;
count += 4;
}
return bcd;
}
/**
* @brief Converts a BCD byte to a decimal number.
*
* For example 0x22 -> 22.
*
* @param[in] bcd - The value in BCD
* @return int - The number in decimal
*/
inline int fromBCD(uint8_t bcd)
{
return (((bcd & 0xF0) >> 4) * 10) + (bcd & 0xF);
}
/**
* @brief Stream extraction operator for BCDTime
*
* @param[in] s - the Stream
* @param[out] time - the BCD time
*
* @return Stream&
*/
Stream& operator>>(Stream& s, BCDTime& time);
/**
* @brief Stream insertion operator for BCDTime
*
* @param[in/out] s - the Stream
* @param[in] time - the BCD time
*
* @return Stream&
*/
Stream& operator<<(Stream& s, const BCDTime& time);
} // namespace pels
} // namespace openpower