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 the number of milliseconds since the epoch into BCD time 40 * 41 * @param[in] milliseconds - Number of milliseconds since the epoch 42 * @return BCDTime - the BCD time 43 */ 44 BCDTime getBCDTime(uint64_t milliseconds); 45 46 /** 47 * @brief Converts a number to a BCD. 48 * 49 * For example 32 -> 0x32. 50 * 51 * Source: PLDM repository 52 * 53 * @param[in] value - the value to convert. 54 * 55 * @return T - the BCD value 56 */ 57 template <typename T> 58 T toBCD(T decimal) 59 { 60 T bcd = 0; 61 T remainder = 0; 62 auto count = 0; 63 64 while (decimal) 65 { 66 remainder = decimal % 10; 67 bcd = bcd + (remainder << count); 68 decimal = decimal / 10; 69 count += 4; 70 } 71 72 return bcd; 73 } 74 75 /** 76 * @brief Stream extraction operator for BCDTime 77 * 78 * @param[in] s - the Stream 79 * @param[out] time - the BCD time 80 * 81 * @return Stream& 82 */ 83 Stream& operator>>(Stream& s, BCDTime& time); 84 85 /** 86 * @brief Stream insertion operator for BCDTime 87 * 88 * @param[in/out] s - the Stream 89 * @param[in] time - the BCD time 90 * 91 * @return Stream& 92 */ 93 Stream& operator<<(Stream& s, BCDTime& time); 94 95 } // namespace pels 96 } // namespace openpower 97