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 bool operator==(const BCDTime& right) const; 26 bool operator!=(const BCDTime& right) const; 27 28 } __attribute__((packed)); 29 30 /** 31 * @brief Converts a time_point into a BCD time 32 * 33 * @param[in] time - the time_point to convert 34 * @return BCDTime - the BCD time 35 */ 36 BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time); 37 38 /** 39 * @brief Converts a number to a BCD. 40 * 41 * For example 32 -> 0x32. 42 * 43 * Source: PLDM repository 44 * 45 * @param[in] value - the value to convert. 46 * 47 * @return T - the BCD value 48 */ 49 template <typename T> 50 T toBCD(T decimal) 51 { 52 T bcd = 0; 53 T remainder = 0; 54 auto count = 0; 55 56 while (decimal) 57 { 58 remainder = decimal % 10; 59 bcd = bcd + (remainder << count); 60 decimal = decimal / 10; 61 count += 4; 62 } 63 64 return bcd; 65 } 66 67 /** 68 * @brief Stream extraction operator for BCDTime 69 * 70 * @param[in] s - the Stream 71 * @param[out] time - the BCD time 72 * 73 * @return Stream& 74 */ 75 Stream& operator>>(Stream& s, BCDTime& time); 76 77 /** 78 * @brief Stream insertion operator for BCDTime 79 * 80 * @param[in/out] s - the Stream 81 * @param[in] time - the BCD time 82 * 83 * @return Stream& 84 */ 85 Stream& operator<<(Stream& s, BCDTime& time); 86 87 } // namespace pels 88 } // namespace openpower 89