1eac61a4bSGilbert Chen #pragma once 2eac61a4bSGilbert Chen 3eac61a4bSGilbert Chen #include "common/types.hpp" 4eac61a4bSGilbert Chen #include "requester/handler.hpp" 5eac61a4bSGilbert Chen #include "terminus.hpp" 6eac61a4bSGilbert Chen #include "terminus_manager.hpp" 7eac61a4bSGilbert Chen 8*fe252795SManojkiran Eda #include <libpldm/platform.h> 9*fe252795SManojkiran Eda #include <libpldm/pldm.h> 10*fe252795SManojkiran Eda 11eac61a4bSGilbert Chen #include <map> 12eac61a4bSGilbert Chen #include <memory> 13eac61a4bSGilbert Chen #include <optional> 14eac61a4bSGilbert Chen #include <utility> 15eac61a4bSGilbert Chen #include <vector> 16eac61a4bSGilbert Chen 17eac61a4bSGilbert Chen namespace pldm 18eac61a4bSGilbert Chen { 19eac61a4bSGilbert Chen namespace platform_mc 20eac61a4bSGilbert Chen { 21eac61a4bSGilbert Chen 22fdf61cc3SChaul Ly using namespace pldm::pdr; 23fdf61cc3SChaul Ly 24eac61a4bSGilbert Chen /** 25eac61a4bSGilbert Chen * @brief SensorManager 26eac61a4bSGilbert Chen * 27eac61a4bSGilbert Chen * This class manages the sensors found in terminus and provides 28eac61a4bSGilbert Chen * function calls for other classes to start/stop sensor monitoring. 29eac61a4bSGilbert Chen * 30eac61a4bSGilbert Chen */ 31eac61a4bSGilbert Chen class SensorManager 32eac61a4bSGilbert Chen { 33eac61a4bSGilbert Chen public: 34eac61a4bSGilbert Chen SensorManager() = delete; 35eac61a4bSGilbert Chen SensorManager(const SensorManager&) = delete; 36eac61a4bSGilbert Chen SensorManager(SensorManager&&) = delete; 37eac61a4bSGilbert Chen SensorManager& operator=(const SensorManager&) = delete; 38eac61a4bSGilbert Chen SensorManager& operator=(SensorManager&&) = delete; 39eac61a4bSGilbert Chen virtual ~SensorManager() = default; 40eac61a4bSGilbert Chen 41eac61a4bSGilbert Chen explicit SensorManager(sdeventplus::Event& event, 42eac61a4bSGilbert Chen TerminusManager& terminusManager, 4377e6fe7aSGilbert Chen TerminiMapper& termini, Manager* manager); 44eac61a4bSGilbert Chen 45eac61a4bSGilbert Chen /** @brief starting sensor polling task 46eac61a4bSGilbert Chen */ 47eac61a4bSGilbert Chen void startPolling(pldm_tid_t tid); 48eac61a4bSGilbert Chen 4975e00422SChau Ly /** @brief Helper function to start sensor polling timer 5075e00422SChau Ly */ 5175e00422SChau Ly void startSensorPollTimer(pldm_tid_t tid); 5275e00422SChau Ly 5375e00422SChau Ly /** @brief Helper function to set all terminus sensor as nan when the 5475e00422SChau Ly * terminus is not available for pldm request 5575e00422SChau Ly */ 5675e00422SChau Ly void disableTerminusSensors(pldm_tid_t tid); 5775e00422SChau Ly 58eac61a4bSGilbert Chen /** @brief stopping sensor polling task 59eac61a4bSGilbert Chen */ 60eac61a4bSGilbert Chen void stopPolling(pldm_tid_t tid); 61eac61a4bSGilbert Chen 62eac61a4bSGilbert Chen /** @brief Set available state of terminus for pldm request. 63eac61a4bSGilbert Chen */ updateAvailableState(pldm_tid_t tid,Availability state)64eac61a4bSGilbert Chen void updateAvailableState(pldm_tid_t tid, Availability state) 65eac61a4bSGilbert Chen { 66eac61a4bSGilbert Chen availableState[tid] = state; 67eac61a4bSGilbert Chen }; 68eac61a4bSGilbert Chen 69eac61a4bSGilbert Chen /** @brief Get available state of terminus for pldm request. 70eac61a4bSGilbert Chen */ getAvailableState(pldm_tid_t tid)71eac61a4bSGilbert Chen bool getAvailableState(pldm_tid_t tid) 72eac61a4bSGilbert Chen { 73eac61a4bSGilbert Chen if (!availableState.contains(tid)) 74eac61a4bSGilbert Chen { 75eac61a4bSGilbert Chen return false; 76eac61a4bSGilbert Chen } 77eac61a4bSGilbert Chen return availableState[tid]; 78eac61a4bSGilbert Chen }; 79eac61a4bSGilbert Chen 80eac61a4bSGilbert Chen protected: 81eac61a4bSGilbert Chen /** @brief start a coroutine for polling all sensors. 82eac61a4bSGilbert Chen */ 83eac61a4bSGilbert Chen virtual void doSensorPolling(pldm_tid_t tid); 84eac61a4bSGilbert Chen 85eac61a4bSGilbert Chen /** @brief polling all sensors in each terminus 86eac61a4bSGilbert Chen * 87eac61a4bSGilbert Chen * @param[in] tid - Destination TID 88eac61a4bSGilbert Chen * @return coroutine return_value - PLDM completion code 89eac61a4bSGilbert Chen */ 90eac61a4bSGilbert Chen exec::task<int> doSensorPollingTask(pldm_tid_t tid); 91eac61a4bSGilbert Chen 92eac61a4bSGilbert Chen /** @brief Sending getSensorReading command for the sensor 93eac61a4bSGilbert Chen * 94eac61a4bSGilbert Chen * @param[in] sensor - the sensor to be updated 95eac61a4bSGilbert Chen * @return coroutine return_value - PLDM completion code 96eac61a4bSGilbert Chen */ 97eac61a4bSGilbert Chen exec::task<int> getSensorReading(std::shared_ptr<NumericSensor> sensor); 98eac61a4bSGilbert Chen 99eac61a4bSGilbert Chen /** @brief Reference to to PLDM daemon's main event loop. 100eac61a4bSGilbert Chen */ 101eac61a4bSGilbert Chen sdeventplus::Event& event; 102eac61a4bSGilbert Chen 103eac61a4bSGilbert Chen /** @brief reference of terminusManager */ 104eac61a4bSGilbert Chen TerminusManager& terminusManager; 105eac61a4bSGilbert Chen 106eac61a4bSGilbert Chen /** @brief List of discovered termini */ 107eac61a4bSGilbert Chen TerminiMapper& termini; 108eac61a4bSGilbert Chen 109eac61a4bSGilbert Chen /** @brief sensor polling interval in ms. */ 110eac61a4bSGilbert Chen uint32_t pollingTime; 111eac61a4bSGilbert Chen 112eac61a4bSGilbert Chen /** @brief sensor polling timers */ 113eac61a4bSGilbert Chen std::map<pldm_tid_t, std::unique_ptr<sdbusplus::Timer>> sensorPollTimers; 114eac61a4bSGilbert Chen 115eac61a4bSGilbert Chen /** @brief coroutine handle of doSensorPollingTasks */ 116eac61a4bSGilbert Chen std::map<pldm_tid_t, std::pair<exec::async_scope, std::optional<int>>> 117eac61a4bSGilbert Chen doSensorPollingTaskHandles; 118eac61a4bSGilbert Chen 119eac61a4bSGilbert Chen /** @brief Available state for pldm request of terminus */ 120eac61a4bSGilbert Chen std::map<pldm_tid_t, Availability> availableState; 121eac61a4bSGilbert Chen 122fdf61cc3SChaul Ly /** @brief Round robin sensor iter of terminus */ 123fdf61cc3SChaul Ly std::map<pldm_tid_t, SensorID> roundRobinSensorItMap; 12477e6fe7aSGilbert Chen 12577e6fe7aSGilbert Chen /** @brief pointer to Manager */ 12677e6fe7aSGilbert Chen Manager* manager; 127eac61a4bSGilbert Chen }; 128eac61a4bSGilbert Chen } // namespace platform_mc 129eac61a4bSGilbert Chen } // namespace pldm 130