#pragma once #include "libpldmresponder/platform.hpp" #include #include #include #include #include #include namespace pldm { using namespace sdbusplus::bus::match::rules; namespace responder { using ObjectPath = std::string; using AssociatedEntityMap = std::map; /** @class SlotHandler * * @brief This class performs the necessary operation in pldm for * Slot Enable operation. That includes taking actions on the * setStateEffecterStates calls from Host and also sending * notification to inventory manager application */ class SlotHandler { public: SlotHandler() = delete; ~SlotHandler() = default; SlotHandler(const SlotHandler&) = delete; SlotHandler& operator=(const SlotHandler&) = delete; SlotHandler(SlotHandler&&) = delete; SlotHandler& operator=(SlotHandler&&) = delete; /** @brief SlotHandler Constructor * * @param[in] event - reference for the main event loop * @param[in] repo - pointer to the BMC's Primary PDR repo * */ SlotHandler(const sdeventplus::Event& event, pldm_pdr* repo) : timer(event, std::bind(std::mem_fn(&SlotHandler::timeOutHandler), this)), pdrRepo(repo) { fruPresenceMatch = nullptr; currentOnGoingSlotEntity.entity_type = 0; currentOnGoingSlotEntity.entity_instance_num = 0; currentOnGoingSlotEntity.entity_container_id = 0; } /** @brief Method to be called when enabling a Slot for ADD/REMOVE/REPLACE * @param[in] effecterID - The effecter ID of the effecter that is set from * host * @param[in] fruAssociationMap - the dbus path to pldm entity stored while * creating the pldm fru records * @param[in] stateFieldValue - the current Effecter stateFieldValue */ void enableSlot(uint16_t effecterId, const AssociatedEntityMap& fruAssociationMap, uint8_t stateFieldValue); /** @brief Method to be used for fetching the slot sensor value * @param[in] slotObjectPath - the dbus object path for slot object * @return - returns the sensor state for the respective slot sensor */ uint8_t fetchSlotSensorState(const std::string& slotObjectPath); /** @brief Method to set the oem platform handler in SlotHandler class * @param[in] handler - pointer to the oem platform handler */ void setOemPlatformHandler(pldm::responder::oem_platform::Handler* handler); private: /** @brief call back method called when the timer is expired. This handler * is called when the change of state cannot be made for a slot. */ void timeOutHandler(); /** @brief Abstracted method for obtaining the entityID from effecterID * @param[in] effecterID - The effecterID of the BMC effecter * @return - pldm entity ID for the given effecter ID */ pldm_entity getEntityIDfromEffecterID(uint16_t effecterID); /** @brief Abstracted method for processing the Slot Operations * @param[in] slotObjPath - The slot dbus object path * @param[in] entity - the current slot pldm entity under operation * @param[in] stateFieldValue - the current Effecter stateFieldValue */ void processSlotOperations(const std::string& slotObjectPath, const pldm_entity& entity, uint8_t stateFieldValue); /** @brief Method to obtain the Adapter dbus Object Path from Slot Adapter * path * @param[in] slotObjPath - The slot dbus object path * @return - if Successfull, returns the adapter dbus object path */ std::optional getAdapterObjPath(const std::string& slotObjPath); /** @brief Method to call VPD collection & VPD removal API's * @param[in] adapterObjectPath - The adapter D-Bus object path * @param[in] stateFieldvalue - The current stateField value from set * effecter call */ void callVPDManager(const std::string& adapterObjPath, uint8_t stateFieldValue); /** @brief Method to create a matcher to catch the property change signal * @param[in] adapterObjectPath - The adapter D-Bus object path * @param[in] stateFieldvalue - The current stateField value from set * effecter call * @param[in] entity - the current slot pldm entity under operation */ void createPresenceMatch(const std::string& adapterObjectPath, const pldm_entity& entity, uint8_t stateFieldValue); /** @brief Method to process the Property change signal from Preset Property * @param[in] presentValue - The current value of present Value * @param[in] stateFieldvalue - The current stateField value from set * effecter call * @param[in] entity - the current slot pldm entity under operation */ void processPresentPropertyChange( bool presentValue, uint8_t stateFieldvalue, const pldm_entity& entity); /** @brief Get the sensor state from D-Bus * @param[in] adapterObjectPath - reference of the Adapter dbus object path * @return - Boolean value of sensor state */ bool fetchSensorStateFromDbus(const std::string& adapterObjectPath); /* @brief Method to send a state sensor event to Host from SlotHandler class * @param[in] sensorId - sensor id for the event * @param[in] sensorEventClass - sensor event class wrt DSP0248 * @param[in] sensorOffset - sensor offset * @param[in] eventState - new event state * @param[in] prevEventState - previous state */ void sendStateSensorEvent(uint16_t sensorId, enum sensor_event_class_states sensorEventClass, uint8_t sensorOffset, uint8_t eventState, uint8_t prevEventState); pldm::responder::oem_platform::Handler* oemPlatformHandler = nullptr; //!< oem platform handler /** @brief pointer to tha matcher for Present State for adapter object*/ std::unique_ptr fruPresenceMatch; /** @brief Timer used for Slot VPD Collection operation */ sdeventplus::utility::Timer timer; /** @brief pointer to BMC's primary PDR repo */ const pldm_pdr* pdrRepo; /** @brief variable to store the current slot entity under operation */ pldm_entity currentOnGoingSlotEntity; }; } // namespace responder } // namespace pldm