1 #include <algorithm> 2 #include <fstream> 3 4 #include "config.h" 5 #include "i2c_occ.hpp" 6 7 #ifdef I2C_OCC 8 9 namespace i2c_occ 10 { 11 12 namespace fs = std::experimental::filesystem; 13 14 // The device name's length, e.g. "p8-occ-hwmon" 15 constexpr auto DEVICE_NAME_LENGTH = 12; 16 17 // static assert to make sure the i2c occ device name is expected 18 static_assert(sizeof(I2C_OCC_DEVICE_NAME) -1 == DEVICE_NAME_LENGTH); 19 20 std::string getFileContent(const fs::path& f) 21 { 22 std::string ret(DEVICE_NAME_LENGTH, 0); 23 std::ifstream ifs(f.c_str(), std::ios::binary); 24 if (ifs.is_open()) 25 { 26 ifs.read(&ret[0], DEVICE_NAME_LENGTH); 27 ret.resize(ifs.gcount()); 28 } 29 return ret; 30 } 31 32 std::vector<std::string> getOccHwmonDevices(const char* path) 33 { 34 std::vector<std::string> result{}; 35 36 if (fs::is_directory(path)) 37 { 38 for (auto & p : fs::directory_iterator(path)) 39 { 40 // Check if a device's name is "p8-occ-hwmon" 41 auto f = p / "name"; 42 auto str = getFileContent(f); 43 if (str == I2C_OCC_DEVICE_NAME) 44 { 45 result.emplace_back(p.path().filename()); 46 } 47 } 48 std::sort(result.begin(), result.end()); 49 } 50 return result; 51 } 52 53 void i2cToDbus(std::string& path) 54 { 55 std::replace(path.begin(), path.end(), '-', '_'); 56 } 57 58 void dbusToI2c(std::string& path) 59 { 60 std::replace(path.begin(), path.end(), '_', '-'); 61 } 62 63 std::string getI2cDeviceName(const std::string& dbusPath) 64 { 65 auto name = fs::path(dbusPath).filename().string(); 66 dbusToI2c(name); 67 return name; 68 } 69 70 } // namespace i2c_occ 71 72 #endif 73 74