blob: 7b2fc6a03c7933696e39fdef1b57fe7c0e5945e9 [file] [log] [blame]
Thu Nguyen3c5486d2024-08-01 08:03:08 +00001#pragma once
2
3#include "libpldm/platform.h"
4#include "libpldm/pldm.h"
5
6#include "common/types.hpp"
7
8#include <sdbusplus/server/object.hpp>
9#include <xyz/openbmc_project/Association/Definitions/server.hpp>
10#include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
11#include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
12#include <xyz/openbmc_project/Sensor/Value/server.hpp>
13#include <xyz/openbmc_project/State/Decorator/Availability/server.hpp>
14#include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp>
15
16#include <string>
17
18namespace pldm
19{
20namespace platform_mc
21{
22
23using SensorUnit = sdbusplus::xyz::openbmc_project::Sensor::server::Value::Unit;
24using ValueIntf = sdbusplus::server::object_t<
25 sdbusplus::xyz::openbmc_project::Sensor::server::Value>;
26using ThresholdWarningIntf = sdbusplus::server::object_t<
27 sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Warning>;
28using ThresholdCriticalIntf = sdbusplus::server::object_t<
29 sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Critical>;
30using OperationalStatusIntf =
31 sdbusplus::server::object_t<sdbusplus::xyz::openbmc_project::State::
32 Decorator::server::OperationalStatus>;
33using AvailabilityIntf = sdbusplus::server::object_t<
34 sdbusplus::xyz::openbmc_project::State::Decorator::server::Availability>;
35using AssociationDefinitionsInft = sdbusplus::server::object_t<
36 sdbusplus::xyz::openbmc_project::Association::server::Definitions>;
37
38/**
39 * @brief NumericSensor
40 *
41 * This class handles sensor reading updated by sensor manager and export
42 * status to D-Bus interface.
43 */
44class NumericSensor
45{
46 public:
47 NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
48 std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr,
49 std::string& sensorName, std::string& associationPath);
50
51 NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
52 std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr,
53 std::string& sensorName, std::string& associationPath);
54
Patrick Williams16c2a0a2024-08-16 15:20:59 -040055 ~NumericSensor() {};
Thu Nguyen3c5486d2024-08-01 08:03:08 +000056
Gilbert Cheneac61a42022-02-23 20:56:19 +000057 /** @brief The function called by Sensor Manager to set sensor to
58 * error status.
59 */
60 void handleErrGetSensorReading();
61
62 /** @brief Updating the sensor status to D-Bus interface
63 */
64 void updateReading(bool available, bool functional, double value = 0);
65
Thu Nguyen3c5486d2024-08-01 08:03:08 +000066 /** @brief ConversionFormula is used to convert raw value to the unit
67 * specified in PDR
68 *
69 * @param[in] value - raw value
70 * @return double - converted value
71 */
72 double conversionFormula(double value);
73
74 /** @brief UnitModifier is used to apply the unit modifier specified in PDR
75 *
76 * @param[in] value - raw value
77 * @return double - converted value
78 */
79 double unitModifier(double value);
80
Gilbert Cheneac61a42022-02-23 20:56:19 +000081 /** @brief Check if value is over threshold.
82 *
83 * @param[in] alarm - previous alarm state
84 * @param[in] direction - upper or lower threshold checking
85 * @param[in] value - raw value
86 * @param[in] threshold - threshold value
87 * @param[in] hyst - hysteresis value
88 * @return bool - new alarm state
89 */
90 bool checkThreshold(bool alarm, bool direction, double value,
91 double threshold, double hyst);
92
93 /** @brief Updating the association to D-Bus interface
94 * @param[in] inventoryPath - inventory path of the entity
95 */
96 inline void setInventoryPath(const std::string& inventoryPath)
97 {
98 if (associationDefinitionsIntf)
99 {
100 associationDefinitionsIntf->associations(
101 {{"chassis", "all_sensors", inventoryPath}});
102 }
103 }
104
105 /** @brief Get Upper Critical threshold
106 *
107 * @return double - Upper Critical threshold
108 */
109 double getThresholdUpperCritical()
110 {
111 if (thresholdCriticalIntf)
112 {
113 return thresholdCriticalIntf->criticalHigh();
114 }
115 else
116 {
117 return std::numeric_limits<double>::quiet_NaN();
118 }
119 };
120
121 /** @brief Get Lower Critical threshold
122 *
123 * @return double - Lower Critical threshold
124 */
125 double getThresholdLowerCritical()
126 {
127 if (thresholdCriticalIntf)
128 {
129 return thresholdCriticalIntf->criticalLow();
130 }
131 else
132 {
133 return std::numeric_limits<double>::quiet_NaN();
134 }
135 };
136
137 /** @brief Get Upper Warning threshold
138 *
139 * @return double - Upper Warning threshold
140 */
141 double getThresholdUpperWarning()
142 {
143 if (thresholdWarningIntf)
144 {
145 return thresholdWarningIntf->warningHigh();
146 }
147 else
148 {
149 return std::numeric_limits<double>::quiet_NaN();
150 }
151 };
152
153 /** @brief Get Lower Warning threshold
154 *
155 * @return double - Lower Warning threshold
156 */
157 double getThresholdLowerWarning()
158 {
159 if (thresholdWarningIntf)
160 {
161 return thresholdWarningIntf->warningLow();
162 }
163 else
164 {
165 return std::numeric_limits<double>::quiet_NaN();
166 }
167 };
168
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000169 /** @brief Terminus ID which the sensor belongs to */
170 pldm_tid_t tid;
171
172 /** @brief Sensor ID */
173 uint16_t sensorId;
174
Gilbert Cheneac61a42022-02-23 20:56:19 +0000175 /** @brief The time stamp since last getSensorReading command in usec */
176 uint64_t timeStamp;
177
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000178 /** @brief The time of sensor update interval in usec */
179 uint64_t updateTime;
180
181 /** @brief sensorName */
182 std::string sensorName;
183
184 /** @brief sensorNameSpace */
185 std::string sensorNameSpace;
186
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000187 private:
Gilbert Cheneac61a42022-02-23 20:56:19 +0000188 /**
189 * @brief Check sensor reading if any threshold has been crossed and update
190 * Threshold interfaces accordingly
191 */
192 void updateThresholds();
193
Thu Nguyen3c5486d2024-08-01 08:03:08 +0000194 std::unique_ptr<ValueIntf> valueIntf = nullptr;
195 std::unique_ptr<ThresholdWarningIntf> thresholdWarningIntf = nullptr;
196 std::unique_ptr<ThresholdCriticalIntf> thresholdCriticalIntf = nullptr;
197 std::unique_ptr<AvailabilityIntf> availabilityIntf = nullptr;
198 std::unique_ptr<OperationalStatusIntf> operationalStatusIntf = nullptr;
199 std::unique_ptr<AssociationDefinitionsInft> associationDefinitionsIntf =
200 nullptr;
201
202 /** @brief Amount of hysteresis associated with the sensor thresholds */
203 double hysteresis;
204
205 /** @brief The resolution of sensor in Units */
206 double resolution;
207
208 /** @brief A constant value that is added in as part of conversion process
209 * of converting a raw sensor reading to Units */
210 double offset;
211
212 /** @brief A power-of-10 multiplier for baseUnit */
213 int8_t baseUnitModifier;
214};
215} // namespace platform_mc
216} // namespace pldm