1*3c5486d4SThu Nguyen #pragma once
2*3c5486d4SThu Nguyen 
3*3c5486d4SThu Nguyen #include "libpldm/platform.h"
4*3c5486d4SThu Nguyen #include "libpldm/pldm.h"
5*3c5486d4SThu Nguyen 
6*3c5486d4SThu Nguyen #include "common/types.hpp"
7*3c5486d4SThu Nguyen 
8*3c5486d4SThu Nguyen #include <sdbusplus/server/object.hpp>
9*3c5486d4SThu Nguyen #include <xyz/openbmc_project/Association/Definitions/server.hpp>
10*3c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
11*3c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
12*3c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Value/server.hpp>
13*3c5486d4SThu Nguyen #include <xyz/openbmc_project/State/Decorator/Availability/server.hpp>
14*3c5486d4SThu Nguyen #include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp>
15*3c5486d4SThu Nguyen 
16*3c5486d4SThu Nguyen #include <string>
17*3c5486d4SThu Nguyen 
18*3c5486d4SThu Nguyen namespace pldm
19*3c5486d4SThu Nguyen {
20*3c5486d4SThu Nguyen namespace platform_mc
21*3c5486d4SThu Nguyen {
22*3c5486d4SThu Nguyen 
23*3c5486d4SThu Nguyen using SensorUnit = sdbusplus::xyz::openbmc_project::Sensor::server::Value::Unit;
24*3c5486d4SThu Nguyen using ValueIntf = sdbusplus::server::object_t<
25*3c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::server::Value>;
26*3c5486d4SThu Nguyen using ThresholdWarningIntf = sdbusplus::server::object_t<
27*3c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Warning>;
28*3c5486d4SThu Nguyen using ThresholdCriticalIntf = sdbusplus::server::object_t<
29*3c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Critical>;
30*3c5486d4SThu Nguyen using OperationalStatusIntf =
31*3c5486d4SThu Nguyen     sdbusplus::server::object_t<sdbusplus::xyz::openbmc_project::State::
32*3c5486d4SThu Nguyen                                     Decorator::server::OperationalStatus>;
33*3c5486d4SThu Nguyen using AvailabilityIntf = sdbusplus::server::object_t<
34*3c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::State::Decorator::server::Availability>;
35*3c5486d4SThu Nguyen using AssociationDefinitionsInft = sdbusplus::server::object_t<
36*3c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Association::server::Definitions>;
37*3c5486d4SThu Nguyen 
38*3c5486d4SThu Nguyen /**
39*3c5486d4SThu Nguyen  * @brief NumericSensor
40*3c5486d4SThu Nguyen  *
41*3c5486d4SThu Nguyen  * This class handles sensor reading updated by sensor manager and export
42*3c5486d4SThu Nguyen  * status to D-Bus interface.
43*3c5486d4SThu Nguyen  */
44*3c5486d4SThu Nguyen class NumericSensor
45*3c5486d4SThu Nguyen {
46*3c5486d4SThu Nguyen   public:
47*3c5486d4SThu Nguyen     NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
48*3c5486d4SThu Nguyen                   std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr,
49*3c5486d4SThu Nguyen                   std::string& sensorName, std::string& associationPath);
50*3c5486d4SThu Nguyen 
51*3c5486d4SThu Nguyen     NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
52*3c5486d4SThu Nguyen                   std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr,
53*3c5486d4SThu Nguyen                   std::string& sensorName, std::string& associationPath);
54*3c5486d4SThu Nguyen 
55*3c5486d4SThu Nguyen     ~NumericSensor(){};
56*3c5486d4SThu Nguyen 
57*3c5486d4SThu Nguyen     /** @brief ConversionFormula is used to convert raw value to the unit
58*3c5486d4SThu Nguyen      * specified in PDR
59*3c5486d4SThu Nguyen      *
60*3c5486d4SThu Nguyen      *  @param[in] value - raw value
61*3c5486d4SThu Nguyen      *  @return double - converted value
62*3c5486d4SThu Nguyen      */
63*3c5486d4SThu Nguyen     double conversionFormula(double value);
64*3c5486d4SThu Nguyen 
65*3c5486d4SThu Nguyen     /** @brief UnitModifier is used to apply the unit modifier specified in PDR
66*3c5486d4SThu Nguyen      *
67*3c5486d4SThu Nguyen      *  @param[in] value - raw value
68*3c5486d4SThu Nguyen      *  @return double - converted value
69*3c5486d4SThu Nguyen      */
70*3c5486d4SThu Nguyen     double unitModifier(double value);
71*3c5486d4SThu Nguyen 
72*3c5486d4SThu Nguyen     /** @brief Terminus ID which the sensor belongs to */
73*3c5486d4SThu Nguyen     pldm_tid_t tid;
74*3c5486d4SThu Nguyen 
75*3c5486d4SThu Nguyen     /** @brief Sensor ID */
76*3c5486d4SThu Nguyen     uint16_t sensorId;
77*3c5486d4SThu Nguyen 
78*3c5486d4SThu Nguyen     /** @brief  The time of sensor update interval in usec */
79*3c5486d4SThu Nguyen     uint64_t updateTime;
80*3c5486d4SThu Nguyen 
81*3c5486d4SThu Nguyen     /** @brief  sensorName */
82*3c5486d4SThu Nguyen     std::string sensorName;
83*3c5486d4SThu Nguyen 
84*3c5486d4SThu Nguyen     /** @brief  sensorNameSpace */
85*3c5486d4SThu Nguyen     std::string sensorNameSpace;
86*3c5486d4SThu Nguyen 
87*3c5486d4SThu Nguyen     /** @brief indicate if sensor is polled in priority */
88*3c5486d4SThu Nguyen     bool isPriority;
89*3c5486d4SThu Nguyen 
90*3c5486d4SThu Nguyen   private:
91*3c5486d4SThu Nguyen     std::unique_ptr<ValueIntf> valueIntf = nullptr;
92*3c5486d4SThu Nguyen     std::unique_ptr<ThresholdWarningIntf> thresholdWarningIntf = nullptr;
93*3c5486d4SThu Nguyen     std::unique_ptr<ThresholdCriticalIntf> thresholdCriticalIntf = nullptr;
94*3c5486d4SThu Nguyen     std::unique_ptr<AvailabilityIntf> availabilityIntf = nullptr;
95*3c5486d4SThu Nguyen     std::unique_ptr<OperationalStatusIntf> operationalStatusIntf = nullptr;
96*3c5486d4SThu Nguyen     std::unique_ptr<AssociationDefinitionsInft> associationDefinitionsIntf =
97*3c5486d4SThu Nguyen         nullptr;
98*3c5486d4SThu Nguyen 
99*3c5486d4SThu Nguyen     /** @brief Amount of hysteresis associated with the sensor thresholds */
100*3c5486d4SThu Nguyen     double hysteresis;
101*3c5486d4SThu Nguyen 
102*3c5486d4SThu Nguyen     /** @brief The resolution of sensor in Units */
103*3c5486d4SThu Nguyen     double resolution;
104*3c5486d4SThu Nguyen 
105*3c5486d4SThu Nguyen     /** @brief A constant value that is added in as part of conversion process
106*3c5486d4SThu Nguyen      * of converting a raw sensor reading to Units */
107*3c5486d4SThu Nguyen     double offset;
108*3c5486d4SThu Nguyen 
109*3c5486d4SThu Nguyen     /** @brief A power-of-10 multiplier for baseUnit */
110*3c5486d4SThu Nguyen     int8_t baseUnitModifier;
111*3c5486d4SThu Nguyen };
112*3c5486d4SThu Nguyen } // namespace platform_mc
113*3c5486d4SThu Nguyen } // namespace pldm
114