#pragma once #include "stream.hpp" #include 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& 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 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