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