#pragma once #include "libpldmresponder/pdr_utils.hpp" #include "pldmd/instance_id.hpp" #include "requester/handler.hpp" #include <libpldm/platform.h> #include <map> namespace pldm { using SensorId = uint16_t; using DbusObjMaps = std::map<SensorId, std::tuple<pldm::responder::pdr_utils::DbusMappings, pldm::responder::pdr_utils::DbusValMaps>>; using sensorEvent = std::function<void(SensorId sensorId, const DbusObjMaps& dbusMaps)>; namespace state_sensor { /** @class DbusToPLDMEvent * @brief This class can listen to the state sensor PDRs and send PLDM event * msg when a D-Bus property changes */ class DbusToPLDMEvent { public: DbusToPLDMEvent() = delete; DbusToPLDMEvent(const DbusToPLDMEvent&) = delete; DbusToPLDMEvent(DbusToPLDMEvent&&) = delete; DbusToPLDMEvent& operator=(const DbusToPLDMEvent&) = delete; DbusToPLDMEvent& operator=(DbusToPLDMEvent&&) = delete; ~DbusToPLDMEvent() = default; /** @brief Constructor * @param[in] mctp_fd - fd of MCTP communications socket * @param[in] mctp_eid - MCTP EID of host firmware * @param[in] requester - reference to Requester object * @param[in] handler - PLDM request handler */ explicit DbusToPLDMEvent( int mctp_fd, uint8_t mctp_eid, pldm::InstanceIdDb& instanceIdDb, pldm::requester::Handler<pldm::requester::Request>* handler); public: /** @brief Listen all of the state sensor PDRs * @param[in] repo - pdr utils repo object * @param[in] dbusMaps - The map of D-Bus mapping and value */ void listenSensorEvent(const pldm::responder::pdr_utils::Repo& repo, const DbusObjMaps& dbusMaps); private: /** @brief Send state sensor event msg when a D-Bus property changes * @param[in] sensorId - sensor id */ void sendStateSensorEvent(SensorId sensorId, const DbusObjMaps& dbusMaps); /** @brief Send all of sensor event * @param[in] eventType - PLDM Event types * @param[in] eventDataVec - std::vector, contains send event data */ void sendEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec); /** @brief fd of MCTP communications socket */ int mctp_fd; /** @brief MCTP EID of host firmware */ uint8_t mctp_eid; /** @brief reference to an Instance ID database object, used to obtain PLDM * instance IDs */ pldm::InstanceIdDb& instanceIdDb; /** @brief D-Bus property changed signal match */ std::vector<std::unique_ptr<sdbusplus::bus::match_t>> stateSensorMatchs; /** @brief PLDM request handler */ pldm::requester::Handler<pldm::requester::Request>* handler; }; } // namespace state_sensor } // namespace pldm