mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Temp: fix severial issues. Fixes #398
1. Temp detection has been gated behind of `--*-temp`. Don't make it a slow operation 2. According to [the kernel doc](https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface), `temp1_input` is millidegree Celsius, which should be divided by 1000 3. There is no `/sys/class/hwmon/hwmon3/device/class` on my laptop, but `/sys/class/hwmon/hwmon3/device/device/class`. Need to confirm with @LinusDierheimer 4. Small code optimizations
This commit is contained in:
@@ -67,9 +67,9 @@ static double getFrequency(const char* info, const char* scaling)
|
||||
return getGHz(scaling);
|
||||
}
|
||||
|
||||
static double detectCPUTemp(const FFinstance* instance)
|
||||
static double detectCPUTemp()
|
||||
{
|
||||
const FFTempsResult* temps = ffDetectTemps(instance);
|
||||
const FFTempsResult* temps = ffDetectTemps();
|
||||
|
||||
for(uint32_t i = 0; i < temps->values.length; i++)
|
||||
{
|
||||
|
||||
@@ -146,20 +146,16 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev*
|
||||
ffStrbufDestroy(&path);
|
||||
}
|
||||
|
||||
static void pciDetectTemperatur(const FFinstance* instance, FFGPUResult* gpu, struct pci_dev* device)
|
||||
static void pciDetectTemperatur(FFGPUResult* gpu, struct pci_dev* device)
|
||||
{
|
||||
const FFTempsResult* tempsResult = ffDetectTemps(instance);
|
||||
const FFTempsResult* tempsResult = ffDetectTemps();
|
||||
|
||||
for(uint32_t i = 0; i < tempsResult->values.length; i++)
|
||||
{
|
||||
FFTempValue* tempValue = ffListGet(&tempsResult->values, i);
|
||||
|
||||
uint32_t tempClass;
|
||||
if(sscanf(tempValue->deviceClass.chars, "%x", &tempClass) != 1)
|
||||
continue;
|
||||
|
||||
//The kernel exposes the device class multiplied by 256 for some reason
|
||||
if(tempClass == device->device_class * 256)
|
||||
if(tempValue->deviceClass == device->device_class * 256)
|
||||
{
|
||||
gpu->temperature = tempValue->value;
|
||||
return;
|
||||
@@ -233,7 +229,7 @@ static void pciHandleDevice(const FFinstance* instance, FFlist* results, PCIData
|
||||
|
||||
gpu->temperature = FF_GPU_TEMP_UNSET;
|
||||
if(instance->config.gpuTemp)
|
||||
pciDetectTemperatur(instance, gpu, device);
|
||||
pciDetectTemperatur(gpu, device);
|
||||
}
|
||||
|
||||
static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus)
|
||||
|
||||
@@ -8,18 +8,19 @@
|
||||
|
||||
static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value)
|
||||
{
|
||||
//https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface
|
||||
uint32_t dirLength = dir->length;
|
||||
|
||||
FFstrbuf valueBuffer;
|
||||
FF_STRBUF_AUTO_DESTROY valueBuffer;
|
||||
ffStrbufInit(&valueBuffer);
|
||||
|
||||
ffStrbufAppendS(dir, "temp1_input");
|
||||
ffReadFileBuffer(dir->chars, &valueBuffer);
|
||||
if(!ffReadFileBuffer(dir->chars, &valueBuffer))
|
||||
return false;
|
||||
|
||||
ffStrbufSubstrBefore(dir, dirLength);
|
||||
|
||||
value->value = ffStrbufToDouble(&valueBuffer);
|
||||
|
||||
ffStrbufDestroy(&valueBuffer);
|
||||
value->value = ffStrbufToDouble(&valueBuffer) / 1000; // valueBuffer is millidegree Celsius
|
||||
|
||||
if(value->value != value->value)
|
||||
return false;
|
||||
@@ -28,14 +29,16 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value)
|
||||
ffReadFileBuffer(dir->chars, &value->name);
|
||||
ffStrbufSubstrBefore(dir, dirLength);
|
||||
|
||||
ffStrbufAppendS(dir, "device/class");
|
||||
ffReadFileBuffer(dir->chars, &value->deviceClass);
|
||||
ffStrbufAppendS(dir, "device/device/class");
|
||||
|
||||
if(ffReadFileBuffer(dir->chars, &valueBuffer))
|
||||
value->deviceClass = (uint32_t) strtoul(valueBuffer.chars, NULL, 16);
|
||||
ffStrbufSubstrBefore(dir, dirLength);
|
||||
|
||||
return value->name.length > 0 || value->deviceClass.length > 0;
|
||||
return value->name.length > 0 || value->deviceClass > 0;
|
||||
}
|
||||
|
||||
const FFTempsResult* ffDetectTemps(const FFinstance* instance)
|
||||
const FFTempsResult* ffDetectTemps()
|
||||
{
|
||||
static FFTempsResult result;
|
||||
static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER;
|
||||
@@ -49,13 +52,6 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance)
|
||||
}
|
||||
init = true;
|
||||
|
||||
if(!instance->config.allowSlowOperations)
|
||||
{
|
||||
ffListInitA(&result.values, sizeof(FFTempValue), 0);
|
||||
ffThreadMutexUnlock(&mutex);
|
||||
return &result;
|
||||
}
|
||||
|
||||
ffListInitA(&result.values, sizeof(FFTempValue), 16);
|
||||
|
||||
FFstrbuf baseDir;
|
||||
@@ -83,11 +79,10 @@ const FFTempsResult* ffDetectTemps(const FFinstance* instance)
|
||||
|
||||
FFTempValue* temp = ffListAdd(&result.values);
|
||||
ffStrbufInit(&temp->name);
|
||||
ffStrbufInit(&temp->deviceClass);
|
||||
temp->deviceClass = 0;
|
||||
if(!parseHwmonDir(&baseDir, temp))
|
||||
{
|
||||
ffStrbufDestroy(&temp->name);
|
||||
ffStrbufDestroy(&temp->deviceClass);
|
||||
--result.values.length;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
typedef struct FFTempValue
|
||||
{
|
||||
FFstrbuf name;
|
||||
FFstrbuf deviceClass;
|
||||
uint32_t deviceClass;
|
||||
double value;
|
||||
} FFTempValue;
|
||||
|
||||
@@ -17,6 +17,6 @@ typedef struct FFTempsResult
|
||||
FFlist values; //List of FFTempValue
|
||||
} FFTempsResult;
|
||||
|
||||
const FFTempsResult* ffDetectTemps(const FFinstance* instance);
|
||||
const FFTempsResult* ffDetectTemps();
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user