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