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