diff options
Diffstat (limited to 'extensions/openpower-pels/bcd_time.cpp')
| -rw-r--r-- | extensions/openpower-pels/bcd_time.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/extensions/openpower-pels/bcd_time.cpp b/extensions/openpower-pels/bcd_time.cpp new file mode 100644 index 0000000..bb80f1a --- /dev/null +++ b/extensions/openpower-pels/bcd_time.cpp @@ -0,0 +1,61 @@ +#include "bcd_time.hpp" + +namespace openpower +{ +namespace pels +{ + +bool BCDTime::operator==(const BCDTime& right) const +{ + return (yearMSB == right.yearMSB) && (yearLSB == right.yearLSB) && + (month == right.month) && (day == right.day) && + (hour == right.hour) && (minutes == right.minutes) && + (seconds == right.seconds) && (hundredths == right.hundredths); +} + +bool BCDTime::operator!=(const BCDTime& right) const +{ + return !(*this == right); +} + +BCDTime getBCDTime(std::chrono::time_point<std::chrono::system_clock>& time) +{ + BCDTime bcd; + + using namespace std::chrono; + time_t t = system_clock::to_time_t(time); + tm* localTime = localtime(&t); + assert(localTime != nullptr); + + int year = 1900 + localTime->tm_year; + bcd.yearMSB = toBCD(year / 100); + bcd.yearLSB = toBCD(year % 100); + bcd.month = toBCD(localTime->tm_mon + 1); + bcd.day = toBCD(localTime->tm_mday); + bcd.hour = toBCD(localTime->tm_hour); + bcd.minutes = toBCD(localTime->tm_min); + bcd.seconds = toBCD(localTime->tm_sec); + + auto ms = duration_cast<milliseconds>(time.time_since_epoch()).count(); + int hundredths = (ms % 1000) / 10; + bcd.hundredths = toBCD(hundredths); + + return bcd; +} + +Stream& operator>>(Stream& s, BCDTime& time) +{ + s >> time.yearMSB >> time.yearLSB >> time.month >> time.day >> time.hour; + s >> time.minutes >> time.seconds >> time.hundredths; + return s; +} + +Stream& operator<<(Stream& s, BCDTime& time) +{ + s << time.yearMSB << time.yearLSB << time.month << time.day << time.hour; + s << time.minutes << time.seconds << time.hundredths; + return s; +} + +} // namespace pels +} // namespace openpower |

