xref: /openbmc/dbus-sensors/src/smbpbi/SmbpbiSensor.hpp (revision 021261ce7a0b6686e4f040f7212718ba74d15137)
1*021261ceSAushim Nagarkatti /*
2*021261ceSAushim Nagarkatti  * SPDX-FileCopyrightText: Copyright (c) 2022-2025 NVIDIA CORPORATION &
3*021261ceSAushim Nagarkatti  * AFFILIATES. All rights reserved.
4*021261ceSAushim Nagarkatti  * SPDX-License-Identifier: Apache-2.0
5*021261ceSAushim Nagarkatti  */
6*021261ceSAushim Nagarkatti 
7*021261ceSAushim Nagarkatti #pragma once
8*021261ceSAushim Nagarkatti #include "Thresholds.hpp"
9*021261ceSAushim Nagarkatti 
10*021261ceSAushim Nagarkatti #include <boost/asio/io_context.hpp>
11*021261ceSAushim Nagarkatti #include <boost/asio/random_access_file.hpp>
12*021261ceSAushim Nagarkatti #include <boost/asio/steady_timer.hpp>
13*021261ceSAushim Nagarkatti #include <sdbusplus/asio/connection.hpp>
14*021261ceSAushim Nagarkatti #include <sdbusplus/asio/object_server.hpp>
15*021261ceSAushim Nagarkatti #include <sensor.hpp>
16*021261ceSAushim Nagarkatti 
17*021261ceSAushim Nagarkatti #include <array>
18*021261ceSAushim Nagarkatti #include <cstddef>
19*021261ceSAushim Nagarkatti #include <cstdint>
20*021261ceSAushim Nagarkatti #include <memory>
21*021261ceSAushim Nagarkatti #include <string>
22*021261ceSAushim Nagarkatti #include <vector>
23*021261ceSAushim Nagarkatti 
24*021261ceSAushim Nagarkatti constexpr std::array<size_t, 3> i2CReadLenValues = {4, 8, 8};
25*021261ceSAushim Nagarkatti 
26*021261ceSAushim Nagarkatti enum class I2C_READ_LEN_INDEX
27*021261ceSAushim Nagarkatti {
28*021261ceSAushim Nagarkatti     FLOAT32,
29*021261ceSAushim Nagarkatti     FLOAT64,
30*021261ceSAushim Nagarkatti     UINT64
31*021261ceSAushim Nagarkatti };
32*021261ceSAushim Nagarkatti 
33*021261ceSAushim Nagarkatti struct SmbpbiSensor : public Sensor
34*021261ceSAushim Nagarkatti {
35*021261ceSAushim Nagarkatti     SmbpbiSensor(
36*021261ceSAushim Nagarkatti         std::shared_ptr<sdbusplus::asio::connection>& conn,
37*021261ceSAushim Nagarkatti         boost::asio::io_context& io, const std::string& name,
38*021261ceSAushim Nagarkatti         const std::string& sensorConfiguration, const std::string& objType,
39*021261ceSAushim Nagarkatti         sdbusplus::asio::object_server& objectServer,
40*021261ceSAushim Nagarkatti         std::vector<thresholds::Threshold>&& thresholdData, uint8_t busId,
41*021261ceSAushim Nagarkatti         uint8_t addr, uint16_t offset, std::string& sensorUnits,
42*021261ceSAushim Nagarkatti         std::string& valueType, size_t pollTime, double minVal, double maxVal,
43*021261ceSAushim Nagarkatti         std::string& path);
44*021261ceSAushim Nagarkatti     ~SmbpbiSensor() override;
45*021261ceSAushim Nagarkatti 
46*021261ceSAushim Nagarkatti     void checkThresholds() override;
47*021261ceSAushim Nagarkatti 
getPollRateSmbpbiSensor48*021261ceSAushim Nagarkatti     size_t getPollRate() const
49*021261ceSAushim Nagarkatti     {
50*021261ceSAushim Nagarkatti         return pollRateSecond;
51*021261ceSAushim Nagarkatti     }
52*021261ceSAushim Nagarkatti     void read();
53*021261ceSAushim Nagarkatti     void init();
54*021261ceSAushim Nagarkatti 
55*021261ceSAushim Nagarkatti     uint8_t busId;
56*021261ceSAushim Nagarkatti     uint8_t addr;
57*021261ceSAushim Nagarkatti     uint16_t offset;
58*021261ceSAushim Nagarkatti     std::string sensorUnits;
59*021261ceSAushim Nagarkatti     std::string sensorType;
60*021261ceSAushim Nagarkatti     std::string valueType;
61*021261ceSAushim Nagarkatti 
62*021261ceSAushim Nagarkatti   private:
63*021261ceSAushim Nagarkatti     int i2cReadDataBytes(uint8_t* reading, int length);
64*021261ceSAushim Nagarkatti     int i2cReadDataBytesDouble(double& reading);
65*021261ceSAushim Nagarkatti     int i2cReadDataBytesUI64(uint64_t& reading);
66*021261ceSAushim Nagarkatti     int readRawEEPROMData(double& data);
67*021261ceSAushim Nagarkatti     int readFloat64EEPROMData(double& data);
68*021261ceSAushim Nagarkatti     static double convert2Temp(const uint8_t* rawData);
69*021261ceSAushim Nagarkatti     static double convert2Power(const uint8_t* rawData);
70*021261ceSAushim Nagarkatti     void waitReadCallback(const boost::system::error_code& ec);
71*021261ceSAushim Nagarkatti     sdbusplus::asio::object_server& objectServer;
72*021261ceSAushim Nagarkatti     boost::asio::random_access_file inputDev;
73*021261ceSAushim Nagarkatti     boost::asio::steady_timer waitTimer;
74*021261ceSAushim Nagarkatti     size_t pollRateSecond;
75*021261ceSAushim Nagarkatti };
76*021261ceSAushim Nagarkatti 
checkInvalidReading(uint8_t * reading,int length)77*021261ceSAushim Nagarkatti bool checkInvalidReading(uint8_t* reading, int length)
78*021261ceSAushim Nagarkatti {
79*021261ceSAushim Nagarkatti     // there is no value updated from HMC if reading data is all 0xff
80*021261ceSAushim Nagarkatti     uint8_t* ptr = reading;
81*021261ceSAushim Nagarkatti     for (int i = 0; i < length; i++, ptr++)
82*021261ceSAushim Nagarkatti     {
83*021261ceSAushim Nagarkatti         if (*ptr != 0xFF)
84*021261ceSAushim Nagarkatti         {
85*021261ceSAushim Nagarkatti             return false;
86*021261ceSAushim Nagarkatti         }
87*021261ceSAushim Nagarkatti     }
88*021261ceSAushim Nagarkatti     return true;
89*021261ceSAushim Nagarkatti }
90