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