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