#pragma once #include using IpmbMethodType = std::tuple>; enum class SDRType { sdrType01 = 1, sdrType02 = 2, sdrType03 = 3 }; namespace sdr { // IPMB Commands static constexpr uint8_t netfnStorageReq = 0x0a; static constexpr uint8_t cmdStorageGetSdrInfo = 0x20; static constexpr uint8_t cmdStorageReserveSdr = 0x22; static constexpr uint8_t cmdStorageGetSdr = 0x23; // Get SDR Commands static constexpr uint8_t sdrNxtRecLSB = 0; static constexpr uint8_t sdrNxtRecMSB = 1; static constexpr uint8_t perCountByte = 16; // Sensor Record Bytes static constexpr uint8_t sdrType = 5; static constexpr uint8_t dataLengthByte = 6; static constexpr uint8_t sdrSensorNum = 9; } // namespace sdr namespace sdrtype01 { // Negative Handle Commands static constexpr uint8_t maxPosReadingMargin = 127; static constexpr uint8_t twosCompVal = 128; static constexpr double thermalConst = 256; static constexpr uint8_t sdrSensNoThres = 0; static constexpr uint8_t sensorCapability = 13; static constexpr uint8_t sdrNegHandle = 24; static constexpr uint8_t sdrUnitType = 25; static constexpr uint8_t sdrLinearByte = 27; // SDR Type 1 Thresholds Commands static constexpr uint8_t mDataByte = 28; static constexpr uint8_t mTolDataByte = 29; static constexpr uint8_t bDataByte = 30; static constexpr uint8_t bAcuDataByte = 31; static constexpr uint8_t rbExpDataByte = 33; static constexpr uint8_t upperCriticalThreshold = 43; static constexpr uint8_t lowerCriticalThreshold = 46; static constexpr uint8_t nameLengthByte = 53; } // namespace sdrtype01 struct SensorInfo { std::string sensorReadName; uint8_t sensorUnit = 0; double thresUpperCri = 0; double thresLowerCri = 0; uint8_t sensorNumber = 0; uint8_t sensCap = 0; }; struct SensorValConversion { uint16_t mValue = 0; double bValue = 0; double expoVal = 0; uint8_t negRead = 0; }; inline std::map> sensorRecord; inline std::map> sensorValRecord; class IpmbSDRDevice : public std::enable_shared_from_this { public: IpmbSDRDevice(std::shared_ptr& dbusConnection, uint8_t cmdAddr); uint8_t commandAddress = 0; int hostIndex = 0; std::shared_ptr conn; std::vector sdrData; uint16_t validRecordCount = 1; uint8_t iCnt = 0; uint8_t nextRecordIDLSB = 0; uint8_t nextRecordIDMSB = 0; std::vector sdrCommandData; void getSDRRepositoryInfo(); void reserveSDRRepository(uint16_t recordCount); void getSDRSensorData(uint16_t recordCount, uint8_t resrvIDLSB, uint8_t resrvIDMSB); void handleSDRData(const std::vector& data, uint16_t recordCount, uint8_t resrvIDLSB, uint8_t resrvIDMSB); void checkSDRData(std::vector& sdrDataBytes, uint8_t dataLength) const; static void checkSDRType01Threshold(std::vector& sdrDataBytes, int busIndex, std::string tempName); inline static double sensorValCalculation(uint16_t mValue, double bValue, double expValue, double value); };