| #pragma once |
| |
| #include "include/dbus_utility.hpp" |
| |
| #include <boost/container/flat_map.hpp> |
| #include <nlohmann/json.hpp> |
| #include <phosphor-logging/lg2.hpp> |
| #include <sdbusplus/asio/property.hpp> |
| |
| #include <chrono> |
| #include <ctime> |
| #include <filesystem> |
| #include <fstream> |
| #include <iostream> |
| #include <regex> |
| #include <variant> |
| #include <vector> |
| |
| #ifdef UNIT_TEST |
| #include "test/include/mock_dbus_utility.hpp" |
| #endif |
| |
| using PageIdMap = boost::container::flat_map<uint8_t, std::string>; |
| using PropertyValue = std::variant<uint8_t, uint16_t, std::string>; |
| using json = nlohmann::json; |
| namespace fs = std::filesystem; |
| |
| namespace util |
| { |
| |
| inline const std::string_view kSumLogName = "sumLog"; |
| inline const std::string_view kSumBBLogName = "sumBBLog"; |
| const uint64_t kMaxLogSize = static_cast<uint64_t>(20 * 1024); // 20 KB |
| |
| /** |
| * @brief Find files in a directory that match a given string. |
| * |
| * @param dirPath The path to the directory to search in. |
| * @param matchString The string to match against file names. |
| * @return A vector of paths to the found files. |
| */ |
| std::vector<fs::path> findFiles(const fs::path& dirPath, |
| const std::string& matchString); |
| |
| /** |
| * @brief Get the board name and part number from a JSON object. |
| * |
| * @param configuration The JSON object containing the board name and part |
| * number. |
| * @return A pair containing the board name and part number. |
| */ |
| inline std::pair<std::string, std::vector<std::string>> |
| getBoardAndPartNumberPrefixes(const json& configuration) |
| { |
| std::string boardName = configuration.value("Board", ""); |
| std::vector<std::string> partNumberPrefixes = |
| configuration.value("PartNumberPrefixes", std::vector<std::string>()); |
| return {boardName, partNumberPrefixes}; |
| } |
| |
| /** |
| * @brief Check if the part number in a file name matches the part number in the |
| * configuration. |
| * |
| * @param fileName The path to the file. |
| * @param configuration The JSON object containing the part number. |
| * @return True if the part number matches, false otherwise. |
| */ |
| bool checkPartNumber(std::string_view fileName, const json& configuration); |
| |
| /** |
| * @brief Summarize a log message and append it to a log file. Make sure the log |
| * file does not exceed a certain size. |
| * |
| * @param msg The message to summarize. |
| * @param logDirPath The path to the directory containing the log file. |
| * @param filename The name of the log file. |
| */ |
| void summarizeLog(DbusUtil* dbusUtil, std::string_view msg, |
| const fs::path& logDirPath, std::string_view filename); |
| |
| /** |
| * @brief Store a power fault message in a log file if there is any. |
| * |
| * @param message The message to store. |
| * @param powerFault True if it is a power fault, false otherwise. |
| * @param logPath The path to the log file. |
| */ |
| inline void storePowerFaultIfAny(std::string_view message, |
| const bool powerFault, const fs::path& logPath) |
| { |
| if (!powerFault) |
| { |
| lg2::info("No power fault detected"); |
| return; |
| } |
| summarizeLog(getDbusUtil(), message, logPath.parent_path(), kSumBBLogName); |
| } |
| |
| /** |
| * @brief Get the value of a D-Bus property. |
| * |
| * @param serviceName The name of the D-Bus service. |
| * @param objectPath The path to the D-Bus object. |
| * @param interface The name of the D-Bus interface. |
| * @param propertyName The name of the property. |
| * @return A pair containing a boolean indicating if the property value was |
| * successfully retrieved and the property value. |
| */ |
| std::pair<bool, PropertyValue> getProperty(const std::string& serviceName, |
| const std::string& objectPath, |
| const std::string& interface, |
| const std::string& propertyName); |
| |
| /** |
| * @brief Open an I2C device. |
| * |
| * @param bus The I2C bus number. |
| * @param address The I2C device address. |
| * @return The file descriptor of the opened device, or -1 if an error occurred. |
| */ |
| int i2cOpenDevice(uint16_t bus, uint16_t address); |
| |
| /** |
| * @brief Write a byte to an I2C device. |
| * |
| * @param bus The I2C bus number. |
| * @param address The I2C device address. |
| * @param command The command byte. |
| * @param value The value byte. |
| */ |
| void i2cWriteByte(uint8_t bus, uint8_t address, uint8_t command, uint8_t value); |
| |
| /** |
| * @brief Write data to an I2C device and read data from it. |
| * |
| * @param bus The I2C bus number. |
| * @param address The I2C device address. |
| * @param writeBuf The buffer containing the data to write. |
| * @param writeLen The length of the data to write. |
| * @param recvLen The length of the data to read. |
| * @return The read data. |
| */ |
| std::vector<uint8_t> i2cWriteRead(uint8_t bus, uint8_t address, |
| const std::vector<uint8_t>& writeBuf, |
| uint16_t writeLen, uint16_t recvLen); |
| |
| /** |
| * @brief Read a byte from an I2C device. |
| * |
| * @param bus The I2C bus number. |
| * @param address The I2C device address. |
| * @param reg The register address. |
| * @return The read byte. |
| */ |
| std::uint8_t i2cReadByte(uint8_t bus, uint8_t address, uint8_t reg); |
| |
| /** |
| * @brief Read multiple bytes from an I2C device. |
| * |
| * @param bus The I2C bus number. |
| * @param address The I2C device address. |
| * @param reg The register address. |
| * @param length The number of bytes to read. |
| * @return The read bytes. |
| */ |
| std::vector<uint8_t> i2cReadBytes(uint8_t bus, uint8_t address, uint8_t reg, |
| uint16_t length); |
| /** |
| * @brief Convert a linear value to a floating-point value. |
| * |
| * @param value The linear value. |
| * @return The converted floating-point value. |
| */ |
| double convertFromLinear(uint16_t value); |
| |
| /** |
| * @brief Convert a linear value to a floating-point value using a given |
| * exponent. |
| * |
| * @param value The linear value. |
| * @param exponent The exponent. |
| * @return The converted floating-point value. |
| */ |
| double convertFromVoutLinear(uint16_t value, int8_t exponent); |
| |
| /** |
| * @brief Convert a direct value to a floating-point value using a given slope, |
| * intercept, and resolution. |
| * |
| * @param value The direct value. |
| * @param m The slope. |
| * @param b The intercept. |
| * @param r The resolution. |
| * @return The converted floating-point value. |
| */ |
| double convertFromDirect(uint16_t value, int16_t m, int16_t b, int8_t r); |
| |
| /** |
| * @brief Parse a decimal value from a JSON element. |
| * |
| * @param element The JSON element. |
| * @return The parsed decimal value. |
| */ |
| uint16_t parseDec(const json& element); |
| |
| /** |
| * @brief Parse a hexadecimal byte array from a JSON element. |
| * |
| * @param element The JSON element. |
| * @return The parsed hexadecimal byte array. |
| */ |
| std::vector<uint8_t> parseHexByteArray(const json& element); |
| |
| /** |
| * @brief Parse a hexadecimal byte from a JSON element. |
| * |
| * @param element The JSON element. |
| * @return The parsed hexadecimal byte. |
| */ |
| uint8_t parseHexByte(const json& element); |
| |
| /** |
| * @brief Convert two bytes into a word. |
| * |
| * @param upperByte The upper byte. |
| * @param lowerByte The lower byte. |
| * @return The converted word. |
| */ |
| uint16_t bytesIntoWord(std::string_view upperByte, std::string_view lowerByte); |
| |
| /** |
| * @brief Convert a byte array to a hexadecimal string. |
| * |
| * @param buf The byte array. |
| * @param len The length of the byte array. |
| * @return The hexadecimal string. |
| */ |
| std::string byteArrayToHexString(uint8_t* buf, uint16_t len); |
| |
| /** |
| * @brief Get the current timestamp in the PST time zone. |
| * |
| * @return The current timestamp. |
| */ |
| std::string getCurrentTimestamp(); |
| |
| } // namespace util |