1 #pragma once 2 3 #include <analyzer/callout.hpp> 4 #include <analyzer/guard.hpp> 5 #include <hei_main.hpp> 6 #include <nlohmann/json.hpp> 7 8 namespace analyzer 9 { 10 11 /** 12 * @brief Data regarding required service actions based on the hardware error 13 * analysis. 14 */ 15 class ServiceData 16 { 17 public: 18 /** 19 * @brief Constructor from components. 20 * @param The signature of the root cause attention. 21 * @param True if the signature list contained a system checkstop attention. 22 * False, otherwise. 23 */ 24 ServiceData(const libhei::Signature& i_rootCause, bool i_isCheckstop) : 25 iv_rootCause(i_rootCause), iv_isCheckstop(i_isCheckstop) 26 {} 27 28 /** @brief Destructor. */ 29 ~ServiceData() = default; 30 31 /** @brief Copy constructor. */ 32 ServiceData(const ServiceData&) = default; 33 34 /** @brief Assignment operator. */ 35 ServiceData& operator=(const ServiceData&) = default; 36 37 private: 38 /** The signature of the root cause attention. */ 39 const libhei::Signature iv_rootCause; 40 41 /** True if the signature list contained a system checkstop attention. 42 * False, otherwise. */ 43 const bool iv_isCheckstop; 44 45 /** The list of callouts that will be added to a PEL. */ 46 nlohmann::json iv_calloutList = nlohmann::json::array(); 47 48 /** FFDC for callouts that would otherwise not be available in the 49 * callout list (unit paths, bus types, etc.). */ 50 nlohmann::json iv_calloutFFDC = nlohmann::json::array(); 51 52 /** The list of hardware guard requests. Some information will be added to 53 * the PEL, but the actual guard record will be created after submitting 54 * the PEL. */ 55 std::vector<Guard> iv_guardList; 56 57 public: 58 /** @return The signature of the root cause attention. */ 59 const libhei::Signature& getRootCause() const 60 { 61 return iv_rootCause; 62 } 63 64 /** @return True if the signature list contained a system checkstop 65 * attention. False, otherwise. */ 66 bool queryCheckstop() const 67 { 68 return iv_isCheckstop; 69 } 70 71 /** 72 * @brief Add callout information to the callout list. 73 * @param The JSON object for this callout. 74 */ 75 void addCallout(const nlohmann::json& i_callout) 76 { 77 iv_calloutList.push_back(i_callout); 78 } 79 80 /** 81 * @brief Add FFDC for a callout that would otherwise not be available in 82 * the callout list (unit paths, bus types, etc.). 83 * @param The JSON object for this callout. 84 */ 85 void addCalloutFFDC(const nlohmann::json& i_ffdc) 86 { 87 iv_calloutFFDC.push_back(i_ffdc); 88 } 89 90 /** 91 * @brief Add a guard request to the guard list. 92 * @param i_path Entity path for the target part. 93 * @param i_guard True, if the part should be guarded. False, otherwise. 94 * @return A reference to the object just added to the guard list. 95 */ 96 const Guard& addGuard(const std::string& i_path, bool i_guard) 97 { 98 Guard::Type guardType = Guard::Type::NONE; 99 if (i_guard) 100 { 101 // The guard type is dependent on the presence of a system checkstop 102 // attention. 103 guardType = 104 queryCheckstop() ? Guard::Type::FATAL : Guard::Type::NON_FATAL; 105 } 106 107 return iv_guardList.emplace_back(i_path, guardType); 108 } 109 110 /** @brief Accessor to iv_calloutList. */ 111 const nlohmann::json& getCalloutList() const 112 { 113 return iv_calloutList; 114 } 115 116 /** @brief Accessor to iv_calloutFFDC. */ 117 const nlohmann::json& getCalloutFFDC() const 118 { 119 return iv_calloutFFDC; 120 } 121 122 /** @brief Accessor to iv_guardList. */ 123 const std::vector<Guard>& getGuardList() const 124 { 125 return iv_guardList; 126 } 127 }; 128 129 } // namespace analyzer 130