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