| #pragma once | 
 |  | 
 | #include "data_interface.hpp" | 
 | #include "pel.hpp" | 
 |  | 
 | namespace openpower::pels::service_indicators | 
 | { | 
 |  | 
 | /** | 
 |  * @class Policy | 
 |  * | 
 |  * The base class for service indicator policies. | 
 |  */ | 
 | class Policy | 
 | { | 
 |   public: | 
 |     Policy() = delete; | 
 |     virtual ~Policy() = default; | 
 |     Policy(const Policy&) = default; | 
 |     Policy& operator=(const Policy&) = default; | 
 |     Policy(Policy&&) = default; | 
 |     Policy& operator=(Policy&&) = default; | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * @param[in] dataIface - The DataInterface object | 
 |      */ | 
 |     explicit Policy(const DataInterfaceBase& dataIface) : _dataIface(dataIface) | 
 |     {} | 
 |  | 
 |     /** | 
 |      * @brief Pure virtual function for activating service indicators | 
 |      *        based on PEL contents. | 
 |      * | 
 |      * @param[in] pel - The PEL | 
 |      */ | 
 |     virtual void activate(const PEL& pel) = 0; | 
 |  | 
 |   protected: | 
 |     /** | 
 |      * @brief Reference to the DataInterface object | 
 |      */ | 
 |     const DataInterfaceBase& _dataIface; | 
 | }; | 
 |  | 
 | /** | 
 |  * @class LightPath | 
 |  * | 
 |  * This class implements the 'LightPath' IBM policy for | 
 |  * activating LEDs.  It has a set of rules to use to choose | 
 |  * which callouts inside PELs should have their LEDs asserted, | 
 |  * and then activates them by writing the Assert property on | 
 |  * LED group D-Bus objects. | 
 |  */ | 
 | class LightPath : public Policy | 
 | { | 
 |   public: | 
 |     LightPath() = delete; | 
 |     virtual ~LightPath() = default; | 
 |     LightPath(const LightPath&) = default; | 
 |     LightPath& operator=(const LightPath&) = default; | 
 |     LightPath(LightPath&&) = default; | 
 |     LightPath& operator=(LightPath&&) = default; | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * @param[in] dataIface - The DataInterface object | 
 |      */ | 
 |     explicit LightPath(const DataInterfaceBase& dataIface) : Policy(dataIface) | 
 |     {} | 
 |  | 
 |     /** | 
 |      * @brief Turns on LEDs for certain FRUs called out in the PEL. | 
 |      * | 
 |      * First it selectively chooses location codes listed in the FRU | 
 |      * callout section that it wants to turn on LEDs for.  Next it | 
 |      * looks up the inventory D-Bus paths for the FRU represented by | 
 |      * those location codes, and then looks for associations to the | 
 |      * LED group objects for those inventory paths.  After it has | 
 |      * the LED group object, it sets the Asserted property on it. | 
 |      * | 
 |      * It only does the above for PELs that were created by the BMC | 
 |      * or hostboot and have the Serviceable action flag set. | 
 |      * | 
 |      * If there are problems looking up any inventory path or LED | 
 |      * group, then it will stop and not activate any LEDs at all. | 
 |      * | 
 |      * @param[in] pel - The PEL | 
 |      */ | 
 |     void activate(const PEL& pel) override; | 
 |  | 
 |     /** | 
 |      * @brief Returns the location codes for the FRU callouts in the | 
 |      *        callouts list that need their LEDs turned on. | 
 |      * | 
 |      * This is public so it can be tested. | 
 |      * | 
 |      * @param[in] callouts - The Callout list from a PEL | 
 |      * | 
 |      * @return std::vector<std::string> - The location codes | 
 |      */ | 
 |     std::vector<std::string> getLocationCodes( | 
 |         const std::vector<std::unique_ptr<src::Callout>>& callouts) const; | 
 |  | 
 |     /** | 
 |      * @brief Function called to check if the code even needs to | 
 |      *        bother looking in the callouts to find LEDs to turn on. | 
 |      * | 
 |      * It will ignore all PELs except for those created by the BMC or | 
 |      * hostboot that have the Serviceable action flag set. | 
 |      * | 
 |      * This is public so it can be tested. | 
 |      * | 
 |      * @param[in] pel - The PEL | 
 |      * | 
 |      * @return bool - If the PEL should be ignored or not. | 
 |      */ | 
 |     bool ignore(const PEL& pel) const; | 
 |  | 
 |   private: | 
 |     /** | 
 |      * @brief Returns the inventory D-Bus paths for the passed | 
 |      *        in location codes. | 
 |      * | 
 |      * @param[in] locationCodes - The location codes | 
 |      * | 
 |      * @return std::vector<std::string> - The inventory D-Bus paths | 
 |      */ | 
 |     std::vector<std::string> | 
 |         getInventoryPaths(const std::vector<std::string>& locationCodes) const; | 
 |  | 
 |     /** | 
 |      * @brief Sets the Functional property on the passed in | 
 |      *        inventory paths to false. | 
 |      * | 
 |      * There is code watching for this that will then turn on | 
 |      * any LEDs for that FRU. | 
 |      * | 
 |      * @param[in] inventoryPaths - The inventory D-Bus paths | 
 |      */ | 
 |     void setNotFunctional(const std::vector<std::string>& inventoryPaths) const; | 
 |  | 
 |     /** | 
 |      * @brief Sets the critical association on the passed in | 
 |      *        inventory paths. | 
 |      * | 
 |      * @param[in] inventoryPaths - The inventory D-Bus paths | 
 |      */ | 
 |     void createCriticalAssociation( | 
 |         const std::vector<std::string>& inventoryPaths) const; | 
 |  | 
 |     /** | 
 |      * @brief Checks if the callout priority is one that the policy | 
 |      *        may turn on an LED for. | 
 |      * | 
 |      * The priorities it cares about are high, medium, and medium | 
 |      * group A. | 
 |      * | 
 |      * @param[in] priority - The priority value from the PEL | 
 |      * | 
 |      * @return bool - If LightPath cares about a callout with this | 
 |      *                priority. | 
 |      */ | 
 |     bool isRequiredPriority(uint8_t priority) const; | 
 |  | 
 |     /** | 
 |      * @brief Checks if the callout is either a normal FRU | 
 |      *        callout or a symbolic FRU callout with a trusted | 
 |      *        location code, which is one of the requirements for | 
 |      *        LightPath to turn on an LED. | 
 |      * | 
 |      * @param[in] - callout - The Callout object | 
 |      * | 
 |      * @return bool - If the callout is a hardware callout | 
 |      */ | 
 |     bool isHardwareCallout(const src::Callout& callout) const; | 
 | }; | 
 |  | 
 | /** | 
 |  * @brief Returns the object for the service indicator policy | 
 |  *        implemented on the system. | 
 |  * | 
 |  * @param[in] dataIface - The DataInterface object | 
 |  * | 
 |  * @return std::unique_ptr<Policy> - The policy object | 
 |  * | 
 |  */ | 
 | std::unique_ptr<Policy> getPolicy(const DataInterfaceBase& dataIface); | 
 |  | 
 | } // namespace openpower::pels::service_indicators |