#include namespace cpu { void detectHwmon(cpuSensors* target, std::string pci) { std::string path = "/sys/bus/pci/devices/" + pci + "/hwmon"; try { for (const auto& entry : std::filesystem::directory_iterator(path)) target->hwmon = getFirstDir(path); } catch (...) { log(LOG::ERR, "cpu::detectHwmon", "NO CPU HWMON KERNEL MODULE DETECTED"); return; } target->zenpower = readFile((target->hwmon + "/name"), 128) == "zenpower"; log(LOG::INF, "cpu::detectHwmon", "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon); } void update(cpuSensors* c) { // commented out unused values so its faster if (c->hwmon == "") return; // break if no module if (c->zenpower) { // cpu.tdie = std::stoi(readFile(hw.path + "/temp1_input", 2)); c->tctl = std::stoi(readFile(c->hwmon + "/temp2_input", 2)); c->tccd1 = std::stoi(readFile(c->hwmon + "/temp3_input", 2)); c->pcore = (double)(std::stoi(readFile(c->hwmon + "/power1_input", 3)) / 100.0); c->psoc = (double)(std::stoi(readFile(c->hwmon + "/power2_input", 3)) / 100.0); c->ptotal = c->pcore + c->psoc; c->vcore = (double)(std::stoul(readFile(c->hwmon + "/in1_input", 4)) / 1000.0); // cpu.vsoc = (double)(std::stoul(readFile(hw.path + "/in2_input")) / 1000.0); } else { c->tctl = std::stoi(readFile(c->hwmon + "/temp1_input", 2)); c->tccd1 = std::stoi(readFile(c->hwmon + "/temp3_input", 2)); } // lots of reads but still faster than reading /proc/cpuinfo char buf[5]; for (uint8_t i = 0; i < N_CPU; i++) { readFile2("/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq", buf, sizeof(buf)); c->avg_freq += strtol(buf, NULL, 10); } c->avg_freq /= N_CPU; } } // namespace cpu