1 #pragma once 2 3 #include "common/instance_id.hpp" 4 #include "libpldmresponder/pdr_utils.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 using stateSensorCacheMaps = 21 std::map<pldm::pdr::SensorID, pldm::responder::pdr_utils::EventStates>; 22 23 namespace state_sensor 24 { 25 /** @class DbusToPLDMEvent 26 * @brief This class can listen to the state sensor PDRs and send PLDM event 27 * msg when a D-Bus property changes 28 */ 29 class DbusToPLDMEvent 30 { 31 public: 32 DbusToPLDMEvent() = delete; 33 DbusToPLDMEvent(const DbusToPLDMEvent&) = delete; 34 DbusToPLDMEvent(DbusToPLDMEvent&&) = delete; 35 DbusToPLDMEvent& operator=(const DbusToPLDMEvent&) = delete; 36 DbusToPLDMEvent& operator=(DbusToPLDMEvent&&) = delete; 37 ~DbusToPLDMEvent() = default; 38 39 /** @brief Constructor 40 * @param[in] mctp_fd - fd of MCTP communications socket 41 * @param[in] mctp_eid - MCTP EID of host firmware 42 * @param[in] requester - reference to Requester object 43 * @param[in] handler - PLDM request handler 44 */ 45 explicit DbusToPLDMEvent( 46 int mctp_fd, uint8_t mctp_eid, pldm::InstanceIdDb& instanceIdDb, 47 pldm::requester::Handler<pldm::requester::Request>* handler); 48 49 public: 50 /** @brief Listen all of the state sensor PDRs 51 * @param[in] repo - pdr utils repo object 52 * @param[in] dbusMaps - The map of D-Bus mapping and value 53 */ 54 void listenSensorEvent(const pldm::responder::pdr_utils::Repo& repo, 55 const DbusObjMaps& dbusMaps); 56 57 /** @brief get the sensor state cache */ 58 inline const stateSensorCacheMaps& getSensorCache() 59 { 60 return sensorCacheMap; 61 } 62 63 /** @brief function to update the sensor cache 64 * @param[in] sensorId - sensor Id of the corresponding sensor 65 * @param[in] sensorRearm - sensor rearm value with in the sensor 66 * @param[in] previousState - previous state of the sensor 67 */ 68 inline void updateSensorCacheMaps(pldm::pdr::SensorID sensorId, 69 size_t sensorRearm, uint8_t previousState) 70 { 71 // update the sensor cache 72 sensorCacheMap[sensorId][sensorRearm] = previousState; 73 } 74 75 private: 76 /** @brief Send state sensor event msg when a D-Bus property changes 77 * @param[in] sensorId - sensor id 78 */ 79 void sendStateSensorEvent(SensorId sensorId, const DbusObjMaps& dbusMaps); 80 81 /** @brief Send all of sensor event 82 * @param[in] eventType - PLDM Event types 83 * @param[in] eventDataVec - std::vector, contains send event data 84 */ 85 void sendEventMsg(uint8_t eventType, 86 const std::vector<uint8_t>& eventDataVec); 87 88 /** @brief fd of MCTP communications socket */ 89 int mctp_fd; 90 91 /** @brief MCTP EID of host firmware */ 92 uint8_t mctp_eid; 93 94 /** @brief reference to an Instance ID database object, used to obtain PLDM 95 * instance IDs 96 */ 97 pldm::InstanceIdDb& instanceIdDb; 98 99 /** @brief D-Bus property changed signal match */ 100 std::vector<std::unique_ptr<sdbusplus::bus::match_t>> stateSensorMatchs; 101 102 /** @brief PLDM request handler */ 103 pldm::requester::Handler<pldm::requester::Request>* handler; 104 105 /** @brief sensor cache */ 106 stateSensorCacheMaps sensorCacheMap; 107 }; 108 109 } // namespace state_sensor 110 } // namespace pldm 111