1*fa5e4d32SSunny Srivastava #pragma once 2*fa5e4d32SSunny Srivastava 3*fa5e4d32SSunny Srivastava #include "worker.hpp" 4*fa5e4d32SSunny Srivastava 5*fa5e4d32SSunny Srivastava #include <boost/asio/steady_timer.hpp> 6*fa5e4d32SSunny Srivastava #include <nlohmann/json.hpp> 7*fa5e4d32SSunny Srivastava #include <sdbusplus/asio/connection.hpp> 8*fa5e4d32SSunny Srivastava 9*fa5e4d32SSunny Srivastava #include <vector> 10*fa5e4d32SSunny Srivastava 11*fa5e4d32SSunny Srivastava namespace vpd 12*fa5e4d32SSunny Srivastava { 13*fa5e4d32SSunny Srivastava /** 14*fa5e4d32SSunny Srivastava * @brief class for GPIO event handling. 15*fa5e4d32SSunny Srivastava * 16*fa5e4d32SSunny Srivastava * Responsible for detecting events and handling them. It continuously 17*fa5e4d32SSunny Srivastava * monitors the presence of the FRU. If it detects any change, performs 18*fa5e4d32SSunny Srivastava * deletion of FRU VPD if FRU is not present, otherwise performs VPD 19*fa5e4d32SSunny Srivastava * collection if FRU gets added. 20*fa5e4d32SSunny Srivastava */ 21*fa5e4d32SSunny Srivastava class GpioEventHandler 22*fa5e4d32SSunny Srivastava { 23*fa5e4d32SSunny Srivastava public: 24*fa5e4d32SSunny Srivastava GpioEventHandler() = delete; 25*fa5e4d32SSunny Srivastava ~GpioEventHandler() = default; 26*fa5e4d32SSunny Srivastava GpioEventHandler(const GpioEventHandler&) = delete; 27*fa5e4d32SSunny Srivastava GpioEventHandler& operator=(const GpioEventHandler&) = delete; 28*fa5e4d32SSunny Srivastava GpioEventHandler(GpioEventHandler&&) = delete; 29*fa5e4d32SSunny Srivastava GpioEventHandler& operator=(GpioEventHandler&&) = delete; 30*fa5e4d32SSunny Srivastava 31*fa5e4d32SSunny Srivastava /** 32*fa5e4d32SSunny Srivastava * @brief Constructor 33*fa5e4d32SSunny Srivastava * 34*fa5e4d32SSunny Srivastava * @param[in] i_fruPath - EEPROM path of the FRU. 35*fa5e4d32SSunny Srivastava * @param[in] i_worker - pointer to the worker object. 36*fa5e4d32SSunny Srivastava * @param[in] i_ioContext - pointer to the io context object 37*fa5e4d32SSunny Srivastava */ GpioEventHandler(const std::string i_fruPath,const std::shared_ptr<Worker> & i_worker,const std::shared_ptr<boost::asio::io_context> & i_ioContext)38*fa5e4d32SSunny Srivastava GpioEventHandler( 39*fa5e4d32SSunny Srivastava const std::string i_fruPath, const std::shared_ptr<Worker>& i_worker, 40*fa5e4d32SSunny Srivastava const std::shared_ptr<boost::asio::io_context>& i_ioContext) : 41*fa5e4d32SSunny Srivastava m_fruPath(i_fruPath), m_worker(i_worker) 42*fa5e4d32SSunny Srivastava { 43*fa5e4d32SSunny Srivastava setEventHandlerForGpioPresence(i_ioContext); 44*fa5e4d32SSunny Srivastava } 45*fa5e4d32SSunny Srivastava 46*fa5e4d32SSunny Srivastava private: 47*fa5e4d32SSunny Srivastava /** 48*fa5e4d32SSunny Srivastava * @brief API to take action based on GPIO presence pin value. 49*fa5e4d32SSunny Srivastava * 50*fa5e4d32SSunny Srivastava * This API takes action based on the change in the presence pin value. 51*fa5e4d32SSunny Srivastava * It performs deletion of FRU VPD if FRU is not present, otherwise performs 52*fa5e4d32SSunny Srivastava * VPD collection if FRU gets added. 53*fa5e4d32SSunny Srivastava * 54*fa5e4d32SSunny Srivastava * @param[in] i_isFruPresent - Holds the present status of the FRU. 55*fa5e4d32SSunny Srivastava */ 56*fa5e4d32SSunny Srivastava void handleChangeInGpioPin(const bool& i_isFruPresent); 57*fa5e4d32SSunny Srivastava 58*fa5e4d32SSunny Srivastava /** 59*fa5e4d32SSunny Srivastava * @brief An API to set event handler for FRUs GPIO presence. 60*fa5e4d32SSunny Srivastava * 61*fa5e4d32SSunny Srivastava * An API to set timer to call event handler to detect GPIO presence 62*fa5e4d32SSunny Srivastava * of the FRU. 63*fa5e4d32SSunny Srivastava * 64*fa5e4d32SSunny Srivastava * @param[in] i_ioContext - pointer to io context object 65*fa5e4d32SSunny Srivastava */ 66*fa5e4d32SSunny Srivastava void setEventHandlerForGpioPresence( 67*fa5e4d32SSunny Srivastava const std::shared_ptr<boost::asio::io_context>& i_ioContext); 68*fa5e4d32SSunny Srivastava 69*fa5e4d32SSunny Srivastava /** 70*fa5e4d32SSunny Srivastava * @brief API to handle timer expiry. 71*fa5e4d32SSunny Srivastava * 72*fa5e4d32SSunny Srivastava * This API handles timer expiry and checks on the GPIO presence state, 73*fa5e4d32SSunny Srivastava * takes action if there is any change in the GPIO presence value. 74*fa5e4d32SSunny Srivastava * 75*fa5e4d32SSunny Srivastava * @param[in] i_errorCode - Error Code 76*fa5e4d32SSunny Srivastava * @param[in] i_timerObj - Pointer to timer Object. 77*fa5e4d32SSunny Srivastava */ 78*fa5e4d32SSunny Srivastava void handleTimerExpiry( 79*fa5e4d32SSunny Srivastava const boost::system::error_code& i_errorCode, 80*fa5e4d32SSunny Srivastava const std::shared_ptr<boost::asio::steady_timer>& i_timerObj); 81*fa5e4d32SSunny Srivastava 82*fa5e4d32SSunny Srivastava const std::string m_fruPath; 83*fa5e4d32SSunny Srivastava 84*fa5e4d32SSunny Srivastava const std::shared_ptr<Worker>& m_worker; 85*fa5e4d32SSunny Srivastava 86*fa5e4d32SSunny Srivastava // Preserves the GPIO pin value to compare. Default value is false. 87*fa5e4d32SSunny Srivastava bool m_prevPresencePinValue = false; 88*fa5e4d32SSunny Srivastava }; 89*fa5e4d32SSunny Srivastava 90*fa5e4d32SSunny Srivastava class GpioMonitor 91*fa5e4d32SSunny Srivastava { 92*fa5e4d32SSunny Srivastava public: 93*fa5e4d32SSunny Srivastava GpioMonitor() = delete; 94*fa5e4d32SSunny Srivastava ~GpioMonitor() = default; 95*fa5e4d32SSunny Srivastava GpioMonitor(const GpioMonitor&) = delete; 96*fa5e4d32SSunny Srivastava GpioMonitor& operator=(const GpioMonitor&) = delete; 97*fa5e4d32SSunny Srivastava GpioMonitor(GpioMonitor&&) = delete; 98*fa5e4d32SSunny Srivastava GpioMonitor& operator=(GpioMonitor&&) = delete; 99*fa5e4d32SSunny Srivastava 100*fa5e4d32SSunny Srivastava /** 101*fa5e4d32SSunny Srivastava * @brief constructor 102*fa5e4d32SSunny Srivastava * 103*fa5e4d32SSunny Srivastava * @param[in] i_sysCfgJsonObj - System config JSON Object. 104*fa5e4d32SSunny Srivastava * @param[in] i_worker - pointer to the worker object. 105*fa5e4d32SSunny Srivastava * @param[in] i_ioContext - pointer to IO context object. 106*fa5e4d32SSunny Srivastava */ GpioMonitor(const nlohmann::json i_sysCfgJsonObj,const std::shared_ptr<Worker> & i_worker,const std::shared_ptr<boost::asio::io_context> & i_ioContext)107*fa5e4d32SSunny Srivastava GpioMonitor(const nlohmann::json i_sysCfgJsonObj, 108*fa5e4d32SSunny Srivastava const std::shared_ptr<Worker>& i_worker, 109*fa5e4d32SSunny Srivastava const std::shared_ptr<boost::asio::io_context>& i_ioContext) : 110*fa5e4d32SSunny Srivastava m_sysCfgJsonObj(i_sysCfgJsonObj) 111*fa5e4d32SSunny Srivastava { 112*fa5e4d32SSunny Srivastava if (!m_sysCfgJsonObj.empty()) 113*fa5e4d32SSunny Srivastava { 114*fa5e4d32SSunny Srivastava initHandlerForGpio(i_ioContext, i_worker); 115*fa5e4d32SSunny Srivastava } 116*fa5e4d32SSunny Srivastava else 117*fa5e4d32SSunny Srivastava { 118*fa5e4d32SSunny Srivastava throw std::runtime_error( 119*fa5e4d32SSunny Srivastava "Gpio Monitoring can't be instantiated with empty config JSON"); 120*fa5e4d32SSunny Srivastava } 121*fa5e4d32SSunny Srivastava } 122*fa5e4d32SSunny Srivastava 123*fa5e4d32SSunny Srivastava private: 124*fa5e4d32SSunny Srivastava /** 125*fa5e4d32SSunny Srivastava * @brief API to instantiate GpioEventHandler for GPIO pins. 126*fa5e4d32SSunny Srivastava * 127*fa5e4d32SSunny Srivastava * This API will extract the GPIO information from system config JSON 128*fa5e4d32SSunny Srivastava * and instantiate event handler for GPIO pins. 129*fa5e4d32SSunny Srivastava * 130*fa5e4d32SSunny Srivastava * @param[in] i_ioContext - Pointer to IO context object. 131*fa5e4d32SSunny Srivastava * @param[in] i_worker - Pointer to worker class. 132*fa5e4d32SSunny Srivastava */ 133*fa5e4d32SSunny Srivastava void initHandlerForGpio( 134*fa5e4d32SSunny Srivastava const std::shared_ptr<boost::asio::io_context>& i_ioContext, 135*fa5e4d32SSunny Srivastava const std::shared_ptr<Worker>& i_worker); 136*fa5e4d32SSunny Srivastava 137*fa5e4d32SSunny Srivastava // Array of event handlers for all the attachable FRUs. 138*fa5e4d32SSunny Srivastava std::vector<std::shared_ptr<GpioEventHandler>> m_gpioEventHandlerObjects; 139*fa5e4d32SSunny Srivastava 140*fa5e4d32SSunny Srivastava const nlohmann::json& m_sysCfgJsonObj; 141*fa5e4d32SSunny Srivastava }; 142*fa5e4d32SSunny Srivastava } // namespace vpd 143