1*77e6fe7aSGilbert Chen #pragma once
2*77e6fe7aSGilbert Chen 
3*77e6fe7aSGilbert Chen #include "libpldm/platform.h"
4*77e6fe7aSGilbert Chen #include "libpldm/pldm.h"
5*77e6fe7aSGilbert Chen 
6*77e6fe7aSGilbert Chen #include "common/types.hpp"
7*77e6fe7aSGilbert Chen #include "numeric_sensor.hpp"
8*77e6fe7aSGilbert Chen #include "pldmd/dbus_impl_requester.hpp"
9*77e6fe7aSGilbert Chen #include "requester/handler.hpp"
10*77e6fe7aSGilbert Chen #include "terminus.hpp"
11*77e6fe7aSGilbert Chen #include "terminus_manager.hpp"
12*77e6fe7aSGilbert Chen 
13*77e6fe7aSGilbert Chen namespace pldm
14*77e6fe7aSGilbert Chen {
15*77e6fe7aSGilbert Chen namespace platform_mc
16*77e6fe7aSGilbert Chen {
17*77e6fe7aSGilbert Chen 
18*77e6fe7aSGilbert Chen /**
19*77e6fe7aSGilbert Chen  * @brief EventManager
20*77e6fe7aSGilbert Chen  *
21*77e6fe7aSGilbert Chen  * This class manages PLDM events from terminus. The function includes providing
22*77e6fe7aSGilbert Chen  * the API for process event data and using phosphor-logging API to log the
23*77e6fe7aSGilbert Chen  * event.
24*77e6fe7aSGilbert Chen  *
25*77e6fe7aSGilbert Chen  */
26*77e6fe7aSGilbert Chen class EventManager
27*77e6fe7aSGilbert Chen {
28*77e6fe7aSGilbert Chen   public:
29*77e6fe7aSGilbert Chen     EventManager() = delete;
30*77e6fe7aSGilbert Chen     EventManager(const EventManager&) = delete;
31*77e6fe7aSGilbert Chen     EventManager(EventManager&&) = delete;
32*77e6fe7aSGilbert Chen     EventManager& operator=(const EventManager&) = delete;
33*77e6fe7aSGilbert Chen     EventManager& operator=(EventManager&&) = delete;
34*77e6fe7aSGilbert Chen     virtual ~EventManager() = default;
35*77e6fe7aSGilbert Chen 
36*77e6fe7aSGilbert Chen     explicit EventManager(TerminusManager& terminusManager,
37*77e6fe7aSGilbert Chen                           TerminiMapper& termini) :
38*77e6fe7aSGilbert Chen         terminusManager(terminusManager), termini(termini) {};
39*77e6fe7aSGilbert Chen 
40*77e6fe7aSGilbert Chen     /** @brief Handle platform event
41*77e6fe7aSGilbert Chen      *
42*77e6fe7aSGilbert Chen      *  @param[in] tid - tid where the event is from
43*77e6fe7aSGilbert Chen      *  @param[in] eventId - event Id
44*77e6fe7aSGilbert Chen      *  @param[in] eventClass - event class
45*77e6fe7aSGilbert Chen      *  @param[in] eventData - event data
46*77e6fe7aSGilbert Chen      *  @param[in] eventDataSize - size of event data
47*77e6fe7aSGilbert Chen      *  @return PLDM completion code
48*77e6fe7aSGilbert Chen      */
49*77e6fe7aSGilbert Chen     int handlePlatformEvent(pldm_tid_t tid, uint16_t eventId,
50*77e6fe7aSGilbert Chen                             uint8_t eventClass, const uint8_t* eventData,
51*77e6fe7aSGilbert Chen                             size_t eventDataSize);
52*77e6fe7aSGilbert Chen 
53*77e6fe7aSGilbert Chen     /** @brief Set available state of terminus for pldm request.
54*77e6fe7aSGilbert Chen      *
55*77e6fe7aSGilbert Chen      *  @param[in] tid - terminus ID
56*77e6fe7aSGilbert Chen      *  @param[in] state - Terminus available state for PLDM request messages
57*77e6fe7aSGilbert Chen      */
58*77e6fe7aSGilbert Chen     void updateAvailableState(pldm_tid_t tid, Availability state)
59*77e6fe7aSGilbert Chen     {
60*77e6fe7aSGilbert Chen         availableState[tid] = state;
61*77e6fe7aSGilbert Chen     };
62*77e6fe7aSGilbert Chen 
63*77e6fe7aSGilbert Chen     /** @brief Get available state of terminus for pldm request.
64*77e6fe7aSGilbert Chen      *
65*77e6fe7aSGilbert Chen      *  @param[in] tid - terminus ID
66*77e6fe7aSGilbert Chen      */
67*77e6fe7aSGilbert Chen     bool getAvailableState(pldm_tid_t tid)
68*77e6fe7aSGilbert Chen     {
69*77e6fe7aSGilbert Chen         if (!availableState.contains(tid))
70*77e6fe7aSGilbert Chen         {
71*77e6fe7aSGilbert Chen             return false;
72*77e6fe7aSGilbert Chen         }
73*77e6fe7aSGilbert Chen         return availableState[tid];
74*77e6fe7aSGilbert Chen     };
75*77e6fe7aSGilbert Chen 
76*77e6fe7aSGilbert Chen   protected:
77*77e6fe7aSGilbert Chen     /** @brief Helper method to process the PLDM Numeric sensor event class
78*77e6fe7aSGilbert Chen      *
79*77e6fe7aSGilbert Chen      *  @param[in] tid - tid where the event is from
80*77e6fe7aSGilbert Chen      *  @param[in] sensorId - Sensor ID which is the source of event
81*77e6fe7aSGilbert Chen      *  @param[in] sensorData - Numeric sensor event data
82*77e6fe7aSGilbert Chen      *  @param[in] sensorDataLength - event data length
83*77e6fe7aSGilbert Chen      *
84*77e6fe7aSGilbert Chen      *  @return PLDM completion code
85*77e6fe7aSGilbert Chen      */
86*77e6fe7aSGilbert Chen     int processNumericSensorEvent(pldm_tid_t tid, uint16_t sensorId,
87*77e6fe7aSGilbert Chen                                   const uint8_t* sensorData,
88*77e6fe7aSGilbert Chen                                   size_t sensorDataLength);
89*77e6fe7aSGilbert Chen 
90*77e6fe7aSGilbert Chen     /** @brief Reference of terminusManager */
91*77e6fe7aSGilbert Chen     TerminusManager& terminusManager;
92*77e6fe7aSGilbert Chen 
93*77e6fe7aSGilbert Chen     /** @brief List of discovered termini */
94*77e6fe7aSGilbert Chen     TerminiMapper& termini;
95*77e6fe7aSGilbert Chen 
96*77e6fe7aSGilbert Chen     /** @brief Available state for pldm request of terminus */
97*77e6fe7aSGilbert Chen     std::unordered_map<pldm_tid_t, Availability> availableState;
98*77e6fe7aSGilbert Chen };
99*77e6fe7aSGilbert Chen } // namespace platform_mc
100*77e6fe7aSGilbert Chen } // namespace pldm
101