blob: fc1a8bb02c19c3c58f6bc9ae72d8c06ee4bf0cde [file] [log] [blame]
Matt Spinlerdf797f22019-07-09 15:39:51 -05001#pragma once
2#include "stream.hpp"
3
4#include <chrono>
5
6namespace openpower
7{
8namespace pels
9{
10
11/**
12 * @brief A structure that contains a PEL timestamp in BCD.
13 */
14struct 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
Matt Spinler86c70362019-12-02 15:37:21 -060025 BCDTime() :
26 yearMSB(0), yearLSB(0), month(0), day(0), hour(0), minutes(0),
27 seconds(0), hundredths(0)
Patrick Williams2544b412022-10-04 08:41:06 -050028 {}
Matt Spinler86c70362019-12-02 15:37:21 -060029
30 BCDTime(uint8_t yearMSB, uint8_t yearLSB, uint8_t month, uint8_t day,
31 uint8_t hour, uint8_t minutes, uint8_t seconds,
32 uint8_t hundredths) :
Patrick Williams075c7922024-08-16 15:19:49 -040033 yearMSB(yearMSB), yearLSB(yearLSB), month(month), day(day), hour(hour),
34 minutes(minutes), seconds(seconds), hundredths(hundredths)
Patrick Williams2544b412022-10-04 08:41:06 -050035 {}
Matt Spinler86c70362019-12-02 15:37:21 -060036
Matt Spinlerdf797f22019-07-09 15:39:51 -050037 bool operator==(const BCDTime& right) const;
38 bool operator!=(const BCDTime& right) const;
39
40} __attribute__((packed));
41
42/**
43 * @brief Converts a time_point into a BCD time
44 *
45 * @param[in] time - the time_point to convert
46 * @return BCDTime - the BCD time
47 */
48BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time);
49
50/**
Matt Spinler5fa87f02019-08-27 16:31:57 -050051 * @brief Converts the number of milliseconds since the epoch into BCD time
52 *
53 * @param[in] milliseconds - Number of milliseconds since the epoch
54 * @return BCDTime - the BCD time
55 */
56BCDTime getBCDTime(uint64_t milliseconds);
57
58/**
Matt Spinler0bf04b52023-04-28 10:30:26 -050059 * @brief Convert a BCDTime value into the number of
60 * milliseconds since the epoch (1/1/1970).
61 *
62 * @param[in] bcdTime - The BCD time value
63 * @return uint64_t - The milliseconds value
64 */
65uint64_t getMillisecondsSinceEpoch(const BCDTime& bcdTime);
66
67/**
Matt Spinlerdf797f22019-07-09 15:39:51 -050068 * @brief Converts a number to a BCD.
69 *
70 * For example 32 -> 0x32.
71 *
72 * Source: PLDM repository
73 *
74 * @param[in] value - the value to convert.
75 *
76 * @return T - the BCD value
77 */
78template <typename T>
79T toBCD(T decimal)
80{
81 T bcd = 0;
82 T remainder = 0;
83 auto count = 0;
84
85 while (decimal)
86 {
87 remainder = decimal % 10;
88 bcd = bcd + (remainder << count);
89 decimal = decimal / 10;
90 count += 4;
91 }
92
93 return bcd;
94}
95
96/**
Matt Spinler0bf04b52023-04-28 10:30:26 -050097 * @brief Converts a BCD byte to a decimal number.
98 *
99 * For example 0x22 -> 22.
100 *
101 * @param[in] bcd - The value in BCD
102 * @return int - The number in decimal
103 */
104inline int fromBCD(uint8_t bcd)
105{
106 return (((bcd & 0xF0) >> 4) * 10) + (bcd & 0xF);
107}
108
109/**
Matt Spinlerdf797f22019-07-09 15:39:51 -0500110 * @brief Stream extraction operator for BCDTime
111 *
112 * @param[in] s - the Stream
113 * @param[out] time - the BCD time
114 *
115 * @return Stream&
116 */
117Stream& operator>>(Stream& s, BCDTime& time);
118
119/**
120 * @brief Stream insertion operator for BCDTime
121 *
122 * @param[in/out] s - the Stream
123 * @param[in] time - the BCD time
124 *
125 * @return Stream&
126 */
Matt Spinlerd7b004b2019-11-06 10:23:34 -0600127Stream& operator<<(Stream& s, const BCDTime& time);
Matt Spinlerdf797f22019-07-09 15:39:51 -0500128
129} // namespace pels
130} // namespace openpower