| #pragma once | 
 |  | 
 | #include "mtms.hpp" | 
 | #include "stream.hpp" | 
 |  | 
 | namespace openpower | 
 | { | 
 | namespace pels | 
 | { | 
 | namespace src | 
 | { | 
 |  | 
 | /** | 
 |  * @class PCEIdentity | 
 |  * | 
 |  * This represents the PCE (Power Controlling Enclosure) Identity | 
 |  * substructure in the callout subsection of the SRC PEL section. | 
 |  * | 
 |  * It contains the name and machine type/model/SN of that enclosure. | 
 |  * | 
 |  * It is only used for errors in an I/O drawer where another enclosure | 
 |  * may control its power.  It is not used in BMC errors and so will | 
 |  * never be created by the BMC, but only unflattened in errors it | 
 |  * receives from the host. | 
 |  */ | 
 | class PCEIdentity | 
 | { | 
 |   public: | 
 |     PCEIdentity() = delete; | 
 |     ~PCEIdentity() = default; | 
 |     PCEIdentity(const PCEIdentity&) = default; | 
 |     PCEIdentity& operator=(const PCEIdentity&) = default; | 
 |     PCEIdentity(PCEIdentity&&) = default; | 
 |     PCEIdentity& operator=(PCEIdentity&&) = default; | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Fills in this class's data fields from the stream. | 
 |      * | 
 |      * @param[in] pel - the PEL data stream | 
 |      */ | 
 |     explicit PCEIdentity(Stream& pel); | 
 |  | 
 |     /** | 
 |      * @brief Flatten the object into the stream | 
 |      * | 
 |      * @param[in] stream - The stream to write to | 
 |      */ | 
 |     void flatten(Stream& pel) const; | 
 |  | 
 |     /** | 
 |      * @brief Returns the size of this structure when flattened into a PEL | 
 |      * | 
 |      * @return size_t - The size of the structure | 
 |      */ | 
 |     size_t flattenedSize() | 
 |     { | 
 |         return _size; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief The type identifier value of this structure. | 
 |      */ | 
 |     static const uint16_t substructureType = 0x5045; // "PE" | 
 |  | 
 |     /** | 
 |      * @brief Returns the enclosure name | 
 |      * | 
 |      * @return std::string - The enclosure name | 
 |      */ | 
 |     std::string enclosureName() const | 
 |     { | 
 |         // _pceName is NULL terminated | 
 |         std::string name{static_cast<const char*>(_pceName.data())}; | 
 |         return name; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the MTMS sub structure | 
 |      * | 
 |      * @return const MTMS& - The machine type/model/SN structure. | 
 |      */ | 
 |     const MTMS& mtms() const | 
 |     { | 
 |         return _mtms; | 
 |     } | 
 |  | 
 |   private: | 
 |     /** | 
 |      * @brief The callout substructure type field. Will be 'PE'. | 
 |      */ | 
 |     uint16_t _type; | 
 |  | 
 |     /** | 
 |      * @brief The size of this callout structure. | 
 |      * | 
 |      * Always a multiple of 4. | 
 |      */ | 
 |     uint8_t _size; | 
 |  | 
 |     /** | 
 |      * @brief The flags byte of this substructure. | 
 |      * | 
 |      * Always 0 for this structure. | 
 |      */ | 
 |     uint8_t _flags; | 
 |  | 
 |     /** | 
 |      * @brief The structure that holds the power controlling enclosure's | 
 |      *        machine type, model, and serial number. | 
 |      */ | 
 |     MTMS _mtms; | 
 |  | 
 |     /** | 
 |      * @brief The name of the power controlling enclosure. | 
 |      * | 
 |      * Null terminated and padded with NULLs to a 4 byte boundary. | 
 |      */ | 
 |     std::vector<char> _pceName; | 
 | }; | 
 |  | 
 | } // namespace src | 
 | } // namespace pels | 
 | } // namespace openpower |