summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/bcd_time.hpp
blob: 3a805a50e2ed4b17c1e60679449a08442fa37e92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#pragma once
#include "stream.hpp"

#include <chrono>

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<std::chrono::system_clock>& 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 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 <typename T>
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 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
OpenPOWER on IntegriCloud