1 #pragma once 2 #include "stream.hpp" 3 4 #include <chrono> 5 6 namespace openpower 7 { 8 namespace pels 9 { 10 11 /** 12 * @brief A structure that contains a PEL timestamp in BCD. 13 */ 14 struct BCDTime 15 { 16 uint8_t yearMSB; 17 uint8_t yearLSB; 18 uint8_t month; 19 uint8_t day; 20 uint8_t hour; 21 uint8_t minutes; 22 uint8_t seconds; 23 uint8_t hundredths; 24 25 BCDTime() : 26 yearMSB(0), yearLSB(0), month(0), day(0), hour(0), minutes(0), 27 seconds(0), hundredths(0) 28 { 29 } 30 31 BCDTime(uint8_t yearMSB, uint8_t yearLSB, uint8_t month, uint8_t day, 32 uint8_t hour, uint8_t minutes, uint8_t seconds, 33 uint8_t hundredths) : 34 yearMSB(yearMSB), 35 yearLSB(yearLSB), month(month), day(day), hour(hour), minutes(minutes), 36 seconds(seconds), hundredths(hundredths) 37 { 38 } 39 40 bool operator==(const BCDTime& right) const; 41 bool operator!=(const BCDTime& right) const; 42 43 } __attribute__((packed)); 44 45 /** 46 * @brief Converts a time_point into a BCD time 47 * 48 * @param[in] time - the time_point to convert 49 * @return BCDTime - the BCD time 50 */ 51 BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time); 52 53 /** 54 * @brief Converts the number of milliseconds since the epoch into BCD time 55 * 56 * @param[in] milliseconds - Number of milliseconds since the epoch 57 * @return BCDTime - the BCD time 58 */ 59 BCDTime getBCDTime(uint64_t milliseconds); 60 61 /** 62 * @brief Converts a number to a BCD. 63 * 64 * For example 32 -> 0x32. 65 * 66 * Source: PLDM repository 67 * 68 * @param[in] value - the value to convert. 69 * 70 * @return T - the BCD value 71 */ 72 template <typename T> 73 T toBCD(T decimal) 74 { 75 T bcd = 0; 76 T remainder = 0; 77 auto count = 0; 78 79 while (decimal) 80 { 81 remainder = decimal % 10; 82 bcd = bcd + (remainder << count); 83 decimal = decimal / 10; 84 count += 4; 85 } 86 87 return bcd; 88 } 89 90 /** 91 * @brief Stream extraction operator for BCDTime 92 * 93 * @param[in] s - the Stream 94 * @param[out] time - the BCD time 95 * 96 * @return Stream& 97 */ 98 Stream& operator>>(Stream& s, BCDTime& time); 99 100 /** 101 * @brief Stream insertion operator for BCDTime 102 * 103 * @param[in/out] s - the Stream 104 * @param[in] time - the BCD time 105 * 106 * @return Stream& 107 */ 108 Stream& operator<<(Stream& s, const BCDTime& time); 109 110 } // namespace pels 111 } // namespace openpower 112