1 #pragma once
2 
3 #include "libpldm/platform.h"
4 
5 #include "libpldmresponder/pdr_utils.hpp"
6 #include "pldmd/dbus_impl_requester.hpp"
7 #include "requester/handler.hpp"
8 
9 #include <map>
10 
11 using namespace pldm::dbus_api;
12 using namespace pldm::responder;
13 
14 namespace pldm
15 {
16 
17 using SensorId = uint16_t;
18 using DbusObjMaps =
19     std::map<SensorId,
20              std::tuple<pdr_utils::DbusMappings, pdr_utils::DbusValMaps>>;
21 using sensorEvent =
22     std::function<void(SensorId sensorId, const DbusObjMaps& dbusMaps)>;
23 
24 namespace state_sensor
25 {
26 /** @class DbusToPLDMEvent
27  *  @brief This class can listen to the state sensor PDRs and send PLDM event
28  *         msg when a D-Bus property changes
29  */
30 class DbusToPLDMEvent
31 {
32   public:
33     DbusToPLDMEvent() = delete;
34     DbusToPLDMEvent(const DbusToPLDMEvent&) = delete;
35     DbusToPLDMEvent(DbusToPLDMEvent&&) = delete;
36     DbusToPLDMEvent& operator=(const DbusToPLDMEvent&) = delete;
37     DbusToPLDMEvent& operator=(DbusToPLDMEvent&&) = delete;
38     ~DbusToPLDMEvent() = default;
39 
40     /** @brief Constructor
41      *  @param[in] mctp_fd - fd of MCTP communications socket
42      *  @param[in] mctp_eid - MCTP EID of host firmware
43      *  @param[in] requester - reference to Requester object
44      *  @param[in] handler - PLDM request handler
45      */
46     explicit DbusToPLDMEvent(
47         int mctp_fd, uint8_t mctp_eid, Requester& requester,
48         pldm::requester::Handler<pldm::requester::Request>* handler);
49 
50   public:
51     /** @brief Listen all of the state sensor PDRs
52      *  @param[in] repo - pdr utils repo object
53      *  @param[in] dbusMaps - The map of D-Bus mapping and value
54      */
55     void listenSensorEvent(const pdr_utils::Repo& repo,
56                            const DbusObjMaps& dbusMaps);
57 
58   private:
59     /** @brief Send state sensor event msg when a D-Bus property changes
60      *  @param[in] sensorId - sensor id
61      */
62     void sendStateSensorEvent(SensorId sensorId, const DbusObjMaps& dbusMaps);
63 
64     /** @brief Send all of sensor event
65      *  @param[in] eventType - PLDM Event types
66      *  @param[in] eventDataVec - std::vector, contains send event data
67      */
68     void sendEventMsg(uint8_t eventType,
69                       const std::vector<uint8_t>& eventDataVec);
70 
71     /** @brief fd of MCTP communications socket */
72     int mctp_fd;
73 
74     /** @brief MCTP EID of host firmware */
75     uint8_t mctp_eid;
76 
77     /** @brief reference to Requester object, primarily used to access API to
78      *  obtain PLDM instance id.
79      */
80     Requester& requester;
81 
82     /** @brief D-Bus property changed signal match */
83     std::vector<std::unique_ptr<sdbusplus::bus::match::match>>
84         stateSensorMatchs;
85 
86     /** @brief PLDM request handler */
87     pldm::requester::Handler<pldm::requester::Request>* handler;
88 };
89 
90 } // namespace state_sensor
91 } // namespace pldm
92