xref: /openbmc/pldm/platform-mc/sensor_manager.hpp (revision fe2527954be36a3013dc6b8c8ff13ae649bb58a6)
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