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