1 #pragma once 2 3 #include "config.h" 4 5 #include <sdbusplus/bus.hpp> 6 #include <sdbusplus/server.hpp> 7 8 #include <string> 9 10 namespace phosphor 11 { 12 namespace led 13 { 14 namespace fru 15 { 16 namespace fault 17 { 18 namespace monitor 19 { 20 21 /** @brief Assert or deassert an LED based on the input FRU 22 * @param[in] bus - The Dbus bus object 23 * @param[in] path - Inventory path of the FRU 24 * @param[in] assert - Assert if true deassert if false 25 */ 26 void action(sdbusplus::bus::bus& bus, const std::string& path, bool assert); 27 28 class Remove; 29 30 /** @class Add 31 * @brief Implementation of LED handling during FRU fault 32 * @details This implements methods for watching for a FRU fault 33 * being logged to assert the corresponding LED 34 */ 35 class Add 36 { 37 public: 38 Add() = delete; 39 ~Add() = default; 40 Add(const Add&) = delete; 41 Add& operator=(const Add&) = delete; 42 Add(Add&&) = default; 43 Add& operator=(Add&&) = default; 44 45 /** @brief constructs Add a watch for FRU faults. 46 * @param[in] bus - The Dbus bus object 47 */ 48 explicit Add(sdbusplus::bus::bus& bus) : 49 matchCreated( 50 bus, 51 sdbusplus::bus::match::rules::interfacesAdded() + 52 sdbusplus::bus::match::rules::path_namespace( 53 "/xyz/openbmc_project/logging"), 54 std::bind(std::mem_fn(&Add::created), this, std::placeholders::_1)) 55 { 56 processExistingCallouts(bus); 57 } 58 59 private: 60 /** @brief sdbusplus signal match for fault created */ 61 sdbusplus::bus::match_t matchCreated; 62 63 std::vector<std::unique_ptr<Remove>> removeWatches; 64 65 /** @brief Callback function for fru fault created 66 * @param[in] msg - Data associated with subscribed signal 67 */ 68 void created(sdbusplus::message::message& msg); 69 70 /** @brief This function process all callouts at application start 71 * @param[in] bus - The Dbus bus object 72 */ 73 void processExistingCallouts(sdbusplus::bus::bus& bus); 74 }; 75 76 /** @class Remove 77 * @brief Implementation of LED handling after resolution of FRU fault 78 * @details Implement methods for watching the resolution of FRU faults 79 * and deasserting corresponding LED. 80 */ 81 class Remove 82 { 83 public: 84 Remove() = delete; 85 ~Remove() = default; 86 Remove(const Remove&) = delete; 87 Remove& operator=(const Remove&) = delete; 88 Remove(Remove&&) = default; 89 Remove& operator=(Remove&&) = default; 90 91 /** @brief constructs Remove 92 * @param[in] bus - The Dbus bus object 93 * @param[in] path - Inventory path to fru 94 */ 95 Remove(sdbusplus::bus::bus& bus, const std::string& path) : 96 inventoryPath(path), 97 matchRemoved(bus, match(path), 98 std::bind(std::mem_fn(&Remove::removed), this, 99 std::placeholders::_1)) 100 { 101 // Do nothing 102 } 103 104 private: 105 /** @brief inventory path of the FRU */ 106 std::string inventoryPath; 107 108 /** @brief sdbusplus signal matches for fault removed */ 109 sdbusplus::bus::match_t matchRemoved; 110 111 /** @brief Callback function for fru fault created 112 * @param[in] msg - Data associated with subscribed signal 113 */ 114 void removed(sdbusplus::message::message& msg); 115 116 /** @brief function to create fault remove match for a fru 117 * @param[in] path - Inventory path of the faulty unit. 118 */ 119 std::string match(const std::string& path) 120 { 121 namespace MatchRules = sdbusplus::bus::match::rules; 122 123 std::string matchStmt = 124 MatchRules::interfacesRemoved() + 125 MatchRules::argNpath(0, path + "/" + CALLOUT_REV_ASSOCIATION); 126 127 return matchStmt; 128 } 129 }; 130 } // namespace monitor 131 } // namespace fault 132 } // namespace fru 133 } // namespace led 134 } // namespace phosphor 135