blob: ce61d8f102160414ba00100c24c4e9ece6c9f587 [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
Chaul Lyfdf61cc2025-01-22 07:55:45 +000022using namespace pldm::pdr;
23
Gilbert Cheneac61a42022-02-23 20:56:19 +000024/**
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 */
31class 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,
Gilbert Chen77e6fe72024-08-06 09:23:30 +000043 TerminiMapper& termini, Manager* manager);
Gilbert Cheneac61a42022-02-23 20:56:19 +000044
45 /** @brief starting sensor polling task
46 */
47 void startPolling(pldm_tid_t tid);
48
Chau Ly75e00422024-03-19 12:33:08 +000049 /** @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
Gilbert Cheneac61a42022-02-23 20:56:19 +000058 /** @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 */
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 */
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
Chaul Lyfdf61cc2025-01-22 07:55:45 +0000122 /** @brief Round robin sensor iter of terminus */
123 std::map<pldm_tid_t, SensorID> roundRobinSensorItMap;
Gilbert Chen77e6fe72024-08-06 09:23:30 +0000124
125 /** @brief pointer to Manager */
126 Manager* manager;
Gilbert Cheneac61a42022-02-23 20:56:19 +0000127};
128} // namespace platform_mc
129} // namespace pldm