1 #include "pel.hpp" 2 3 #include "bcd_time.hpp" 4 #include "log_id.hpp" 5 #include "stream.hpp" 6 7 namespace openpower 8 { 9 namespace pels 10 { 11 12 PEL::PEL(const std::vector<uint8_t>& data) : PEL(data, 0) 13 { 14 } 15 16 PEL::PEL(const std::vector<uint8_t>& data, uint32_t obmcLogID) : _rawPEL(data) 17 { 18 populateFromRawData(obmcLogID); 19 } 20 21 void PEL::populateFromRawData(uint32_t obmcLogID) 22 { 23 Stream pelData{_rawPEL}; 24 _ph = std::make_unique<PrivateHeader>(pelData); 25 if (obmcLogID != 0) 26 { 27 _ph->obmcLogID() = obmcLogID; 28 } 29 30 _uh = std::make_unique<UserHeader>(pelData); 31 } 32 33 bool PEL::valid() const 34 { 35 bool valid = _ph->valid(); 36 37 if (valid) 38 { 39 valid = _uh->valid(); 40 } 41 42 return valid; 43 } 44 45 void PEL::setCommitTime() 46 { 47 auto now = std::chrono::system_clock::now(); 48 _ph->commitTimestamp() = getBCDTime(now); 49 } 50 51 void PEL::assignID() 52 { 53 _ph->id() = generatePELID(); 54 } 55 56 void PEL::flatten(std::vector<uint8_t>& pelBuffer) 57 { 58 Stream pelData{pelBuffer}; 59 if (_ph->valid()) 60 { 61 pelData << *_ph; 62 } 63 else 64 { 65 return; 66 } 67 68 if (_uh->valid()) 69 { 70 pelData << *_uh; 71 } 72 } 73 74 std::vector<uint8_t> PEL::data() 75 { 76 // Until we can recreate a complete PEL from objects, need to just flatten 77 // on top of the original PEL data which we need to keep around for this 78 // reason. 79 80 flatten(_rawPEL); 81 return _rawPEL; 82 } 83 84 } // namespace pels 85 } // namespace openpower 86