13c5486d4SThu Nguyen #pragma once
23c5486d4SThu Nguyen 
33c5486d4SThu Nguyen #include "libpldm/platform.h"
43c5486d4SThu Nguyen #include "libpldm/pldm.h"
53c5486d4SThu Nguyen 
63c5486d4SThu Nguyen #include "common/types.hpp"
73c5486d4SThu Nguyen 
83c5486d4SThu Nguyen #include <sdbusplus/server/object.hpp>
93c5486d4SThu Nguyen #include <xyz/openbmc_project/Association/Definitions/server.hpp>
103c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
113c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
123c5486d4SThu Nguyen #include <xyz/openbmc_project/Sensor/Value/server.hpp>
133c5486d4SThu Nguyen #include <xyz/openbmc_project/State/Decorator/Availability/server.hpp>
143c5486d4SThu Nguyen #include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp>
153c5486d4SThu Nguyen 
163c5486d4SThu Nguyen #include <string>
173c5486d4SThu Nguyen 
183c5486d4SThu Nguyen namespace pldm
193c5486d4SThu Nguyen {
203c5486d4SThu Nguyen namespace platform_mc
213c5486d4SThu Nguyen {
223c5486d4SThu Nguyen 
233c5486d4SThu Nguyen using SensorUnit = sdbusplus::xyz::openbmc_project::Sensor::server::Value::Unit;
243c5486d4SThu Nguyen using ValueIntf = sdbusplus::server::object_t<
253c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::server::Value>;
263c5486d4SThu Nguyen using ThresholdWarningIntf = sdbusplus::server::object_t<
273c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Warning>;
283c5486d4SThu Nguyen using ThresholdCriticalIntf = sdbusplus::server::object_t<
293c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Critical>;
303c5486d4SThu Nguyen using OperationalStatusIntf =
313c5486d4SThu Nguyen     sdbusplus::server::object_t<sdbusplus::xyz::openbmc_project::State::
323c5486d4SThu Nguyen                                     Decorator::server::OperationalStatus>;
333c5486d4SThu Nguyen using AvailabilityIntf = sdbusplus::server::object_t<
343c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::State::Decorator::server::Availability>;
353c5486d4SThu Nguyen using AssociationDefinitionsInft = sdbusplus::server::object_t<
363c5486d4SThu Nguyen     sdbusplus::xyz::openbmc_project::Association::server::Definitions>;
373c5486d4SThu Nguyen 
383c5486d4SThu Nguyen /**
393c5486d4SThu Nguyen  * @brief NumericSensor
403c5486d4SThu Nguyen  *
413c5486d4SThu Nguyen  * This class handles sensor reading updated by sensor manager and export
423c5486d4SThu Nguyen  * status to D-Bus interface.
433c5486d4SThu Nguyen  */
443c5486d4SThu Nguyen class NumericSensor
453c5486d4SThu Nguyen {
463c5486d4SThu Nguyen   public:
473c5486d4SThu Nguyen     NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
483c5486d4SThu Nguyen                   std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr,
493c5486d4SThu Nguyen                   std::string& sensorName, std::string& associationPath);
503c5486d4SThu Nguyen 
513c5486d4SThu Nguyen     NumericSensor(const pldm_tid_t tid, const bool sensorDisabled,
523c5486d4SThu Nguyen                   std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr,
533c5486d4SThu Nguyen                   std::string& sensorName, std::string& associationPath);
543c5486d4SThu Nguyen 
~NumericSensor()553c5486d4SThu Nguyen     ~NumericSensor() {};
563c5486d4SThu Nguyen 
57*eac61a4bSGilbert Chen     /** @brief The function called by Sensor Manager to set sensor to
58*eac61a4bSGilbert Chen      * error status.
59*eac61a4bSGilbert Chen      */
60*eac61a4bSGilbert Chen     void handleErrGetSensorReading();
61*eac61a4bSGilbert Chen 
62*eac61a4bSGilbert Chen     /** @brief Updating the sensor status to D-Bus interface
63*eac61a4bSGilbert Chen      */
64*eac61a4bSGilbert Chen     void updateReading(bool available, bool functional, double value = 0);
65*eac61a4bSGilbert Chen 
663c5486d4SThu Nguyen     /** @brief ConversionFormula is used to convert raw value to the unit
673c5486d4SThu Nguyen      * specified in PDR
683c5486d4SThu Nguyen      *
693c5486d4SThu Nguyen      *  @param[in] value - raw value
703c5486d4SThu Nguyen      *  @return double - converted value
713c5486d4SThu Nguyen      */
723c5486d4SThu Nguyen     double conversionFormula(double value);
733c5486d4SThu Nguyen 
743c5486d4SThu Nguyen     /** @brief UnitModifier is used to apply the unit modifier specified in PDR
753c5486d4SThu Nguyen      *
763c5486d4SThu Nguyen      *  @param[in] value - raw value
773c5486d4SThu Nguyen      *  @return double - converted value
783c5486d4SThu Nguyen      */
793c5486d4SThu Nguyen     double unitModifier(double value);
803c5486d4SThu Nguyen 
81*eac61a4bSGilbert Chen     /** @brief Check if value is over threshold.
82*eac61a4bSGilbert Chen      *
83*eac61a4bSGilbert Chen      *  @param[in] alarm - previous alarm state
84*eac61a4bSGilbert Chen      *  @param[in] direction - upper or lower threshold checking
85*eac61a4bSGilbert Chen      *  @param[in] value - raw value
86*eac61a4bSGilbert Chen      *  @param[in] threshold - threshold value
87*eac61a4bSGilbert Chen      *  @param[in] hyst - hysteresis value
88*eac61a4bSGilbert Chen      *  @return bool - new alarm state
89*eac61a4bSGilbert Chen      */
90*eac61a4bSGilbert Chen     bool checkThreshold(bool alarm, bool direction, double value,
91*eac61a4bSGilbert Chen                         double threshold, double hyst);
92*eac61a4bSGilbert Chen 
93*eac61a4bSGilbert Chen     /** @brief Updating the association to D-Bus interface
94*eac61a4bSGilbert Chen      *  @param[in] inventoryPath - inventory path of the entity
95*eac61a4bSGilbert Chen      */
setInventoryPath(const std::string & inventoryPath)96*eac61a4bSGilbert Chen     inline void setInventoryPath(const std::string& inventoryPath)
97*eac61a4bSGilbert Chen     {
98*eac61a4bSGilbert Chen         if (associationDefinitionsIntf)
99*eac61a4bSGilbert Chen         {
100*eac61a4bSGilbert Chen             associationDefinitionsIntf->associations(
101*eac61a4bSGilbert Chen                 {{"chassis", "all_sensors", inventoryPath}});
102*eac61a4bSGilbert Chen         }
103*eac61a4bSGilbert Chen     }
104*eac61a4bSGilbert Chen 
105*eac61a4bSGilbert Chen     /** @brief Get Upper Critical threshold
106*eac61a4bSGilbert Chen      *
107*eac61a4bSGilbert Chen      *  @return double - Upper Critical threshold
108*eac61a4bSGilbert Chen      */
getThresholdUpperCritical()109*eac61a4bSGilbert Chen     double getThresholdUpperCritical()
110*eac61a4bSGilbert Chen     {
111*eac61a4bSGilbert Chen         if (thresholdCriticalIntf)
112*eac61a4bSGilbert Chen         {
113*eac61a4bSGilbert Chen             return thresholdCriticalIntf->criticalHigh();
114*eac61a4bSGilbert Chen         }
115*eac61a4bSGilbert Chen         else
116*eac61a4bSGilbert Chen         {
117*eac61a4bSGilbert Chen             return std::numeric_limits<double>::quiet_NaN();
118*eac61a4bSGilbert Chen         }
119*eac61a4bSGilbert Chen     };
120*eac61a4bSGilbert Chen 
121*eac61a4bSGilbert Chen     /** @brief Get Lower Critical threshold
122*eac61a4bSGilbert Chen      *
123*eac61a4bSGilbert Chen      *  @return double - Lower Critical threshold
124*eac61a4bSGilbert Chen      */
getThresholdLowerCritical()125*eac61a4bSGilbert Chen     double getThresholdLowerCritical()
126*eac61a4bSGilbert Chen     {
127*eac61a4bSGilbert Chen         if (thresholdCriticalIntf)
128*eac61a4bSGilbert Chen         {
129*eac61a4bSGilbert Chen             return thresholdCriticalIntf->criticalLow();
130*eac61a4bSGilbert Chen         }
131*eac61a4bSGilbert Chen         else
132*eac61a4bSGilbert Chen         {
133*eac61a4bSGilbert Chen             return std::numeric_limits<double>::quiet_NaN();
134*eac61a4bSGilbert Chen         }
135*eac61a4bSGilbert Chen     };
136*eac61a4bSGilbert Chen 
137*eac61a4bSGilbert Chen     /** @brief Get Upper Warning threshold
138*eac61a4bSGilbert Chen      *
139*eac61a4bSGilbert Chen      *  @return double - Upper Warning threshold
140*eac61a4bSGilbert Chen      */
getThresholdUpperWarning()141*eac61a4bSGilbert Chen     double getThresholdUpperWarning()
142*eac61a4bSGilbert Chen     {
143*eac61a4bSGilbert Chen         if (thresholdWarningIntf)
144*eac61a4bSGilbert Chen         {
145*eac61a4bSGilbert Chen             return thresholdWarningIntf->warningHigh();
146*eac61a4bSGilbert Chen         }
147*eac61a4bSGilbert Chen         else
148*eac61a4bSGilbert Chen         {
149*eac61a4bSGilbert Chen             return std::numeric_limits<double>::quiet_NaN();
150*eac61a4bSGilbert Chen         }
151*eac61a4bSGilbert Chen     };
152*eac61a4bSGilbert Chen 
153*eac61a4bSGilbert Chen     /** @brief Get Lower Warning threshold
154*eac61a4bSGilbert Chen      *
155*eac61a4bSGilbert Chen      *  @return double - Lower Warning threshold
156*eac61a4bSGilbert Chen      */
getThresholdLowerWarning()157*eac61a4bSGilbert Chen     double getThresholdLowerWarning()
158*eac61a4bSGilbert Chen     {
159*eac61a4bSGilbert Chen         if (thresholdWarningIntf)
160*eac61a4bSGilbert Chen         {
161*eac61a4bSGilbert Chen             return thresholdWarningIntf->warningLow();
162*eac61a4bSGilbert Chen         }
163*eac61a4bSGilbert Chen         else
164*eac61a4bSGilbert Chen         {
165*eac61a4bSGilbert Chen             return std::numeric_limits<double>::quiet_NaN();
166*eac61a4bSGilbert Chen         }
167*eac61a4bSGilbert Chen     };
168*eac61a4bSGilbert Chen 
1693c5486d4SThu Nguyen     /** @brief Terminus ID which the sensor belongs to */
1703c5486d4SThu Nguyen     pldm_tid_t tid;
1713c5486d4SThu Nguyen 
1723c5486d4SThu Nguyen     /** @brief Sensor ID */
1733c5486d4SThu Nguyen     uint16_t sensorId;
1743c5486d4SThu Nguyen 
175*eac61a4bSGilbert Chen     /** @brief  The time stamp since last getSensorReading command in usec */
176*eac61a4bSGilbert Chen     uint64_t timeStamp;
177*eac61a4bSGilbert Chen 
1783c5486d4SThu Nguyen     /** @brief  The time of sensor update interval in usec */
1793c5486d4SThu Nguyen     uint64_t updateTime;
1803c5486d4SThu Nguyen 
1813c5486d4SThu Nguyen     /** @brief  sensorName */
1823c5486d4SThu Nguyen     std::string sensorName;
1833c5486d4SThu Nguyen 
1843c5486d4SThu Nguyen     /** @brief  sensorNameSpace */
1853c5486d4SThu Nguyen     std::string sensorNameSpace;
1863c5486d4SThu Nguyen 
1873c5486d4SThu Nguyen   private:
188*eac61a4bSGilbert Chen     /**
189*eac61a4bSGilbert Chen      * @brief Check sensor reading if any threshold has been crossed and update
190*eac61a4bSGilbert Chen      * Threshold interfaces accordingly
191*eac61a4bSGilbert Chen      */
192*eac61a4bSGilbert Chen     void updateThresholds();
193*eac61a4bSGilbert Chen 
1943c5486d4SThu Nguyen     std::unique_ptr<ValueIntf> valueIntf = nullptr;
1953c5486d4SThu Nguyen     std::unique_ptr<ThresholdWarningIntf> thresholdWarningIntf = nullptr;
1963c5486d4SThu Nguyen     std::unique_ptr<ThresholdCriticalIntf> thresholdCriticalIntf = nullptr;
1973c5486d4SThu Nguyen     std::unique_ptr<AvailabilityIntf> availabilityIntf = nullptr;
1983c5486d4SThu Nguyen     std::unique_ptr<OperationalStatusIntf> operationalStatusIntf = nullptr;
1993c5486d4SThu Nguyen     std::unique_ptr<AssociationDefinitionsInft> associationDefinitionsIntf =
2003c5486d4SThu Nguyen         nullptr;
2013c5486d4SThu Nguyen 
2023c5486d4SThu Nguyen     /** @brief Amount of hysteresis associated with the sensor thresholds */
2033c5486d4SThu Nguyen     double hysteresis;
2043c5486d4SThu Nguyen 
2053c5486d4SThu Nguyen     /** @brief The resolution of sensor in Units */
2063c5486d4SThu Nguyen     double resolution;
2073c5486d4SThu Nguyen 
2083c5486d4SThu Nguyen     /** @brief A constant value that is added in as part of conversion process
2093c5486d4SThu Nguyen      * of converting a raw sensor reading to Units */
2103c5486d4SThu Nguyen     double offset;
2113c5486d4SThu Nguyen 
2123c5486d4SThu Nguyen     /** @brief A power-of-10 multiplier for baseUnit */
2133c5486d4SThu Nguyen     int8_t baseUnitModifier;
2143c5486d4SThu Nguyen };
2153c5486d4SThu Nguyen } // namespace platform_mc
2163c5486d4SThu Nguyen } // namespace pldm
217