diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c index a0bbf85f6..0a704682a 100644 --- a/src/detection/battery/battery_linux.c +++ b/src/detection/battery/battery_linux.c @@ -1,11 +1,11 @@ -#include "fastfetch.h" -#include "common/io/io.h" #include "battery.h" +#include "common/io/io.h" +#include "detection/temps/temps_linux.h" #include "util/stringUtils.h" #include -static void parseBattery(FFstrbuf* dir, FFlist* results) +static void parseBattery(FFstrbuf* dir, const char* id, FFBatteryOptions* options, FFlist* results) { uint32_t dirLength = dir->length; @@ -65,7 +65,26 @@ static void parseBattery(FFstrbuf* dir, FFlist* results) ffReadFileBuffer(dir->chars, &result->status); ffStrbufSubstrBefore(dir, dirLength); + ffStrbufAppendS(dir, "/cycle_count"); + ffReadFileBuffer(dir->chars, &testBatteryBuffer); + ffStrbufSubstrBefore(dir, dirLength); + if(dir->length) + result->cycleCount = (int32_t) ffStrbufToUInt(&testBatteryBuffer, 0); + result->temperature = FF_BATTERY_TEMP_UNSET; + if (options->temp) + { + const FFlist* tempsResult = ffDetectTemps(); + + FF_LIST_FOR_EACH(FFTempValue, value, *tempsResult) + { + if (ffStrbufEqualS(&value->name, id)) + { + result->temperature = value->value; + break; + } + } + } } const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) @@ -84,7 +103,7 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) uint32_t baseDirLength = baseDir.length; - DIR* dirp = opendir(baseDir.chars); + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir.chars); if(dirp == NULL) return "opendir(batteryDir) == NULL"; @@ -95,12 +114,10 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) continue; ffStrbufAppendS(&baseDir, entry->d_name); - parseBattery(&baseDir, results); + parseBattery(&baseDir, entry->d_name, options, results); ffStrbufSubstrBefore(&baseDir, baseDirLength); } - closedir(dirp); - if(results->length == 0) return "batteryDir doesn't contain any battery folder"; diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 9acae0aa8..4b190cfc7 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -83,12 +83,10 @@ static double getFrequency(const char* info, const char* scaling) static double detectCPUTemp(void) { - const FFTempsResult* temps = ffDetectTemps(); + const FFlist* tempsResult = ffDetectTemps(); - for(uint32_t i = 0; i < temps->values.length; i++) + FF_LIST_FOR_EACH(FFTempValue, value, *tempsResult) { - FFTempValue* value = ffListGet(&temps->values, i); - if( ffStrbufFirstIndexS(&value->name, "cpu") < value->name.length || ffStrbufCompS(&value->name, "k10temp") == 0 || diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index e6056d744..0404a5fef 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -138,12 +138,10 @@ static void pciDetectDriverName(FFGPUResult* gpu, PCIData* pci, struct pci_dev* FF_MAYBE_UNUSED static void pciDetectTemp(FFGPUResult* gpu, struct pci_dev* device) { - const FFTempsResult* tempsResult = ffDetectTemps(); + const FFlist* tempsResult = ffDetectTemps(); - for(uint32_t i = 0; i < tempsResult->values.length; i++) + FF_LIST_FOR_EACH(FFTempValue, tempValue, *tempsResult) { - FFTempValue* tempValue = ffListGet(&tempsResult->values, i); - //The kernel exposes the device class multiplied by 256 for some reason if(tempValue->deviceClass == device->device_class * 256) { diff --git a/src/detection/temps/temps_linux.c b/src/detection/temps/temps_linux.c index 1599321f1..e9b51215a 100644 --- a/src/detection/temps/temps_linux.c +++ b/src/detection/temps/temps_linux.c @@ -41,23 +41,21 @@ static bool parseHwmonDir(FFstrbuf* dir, FFTempValue* value) return value->name.length > 0 || value->deviceClass > 0; } -const FFTempsResult* ffDetectTemps(void) +const FFlist* ffDetectTemps(void) { - static FFTempsResult result; - static bool init = false; + static FFlist result; - if(init) + if(result.elementSize > 0) return &result; - init = true; - ffListInitA(&result.values, sizeof(FFTempValue), 16); + ffListInitA(&result, sizeof(FFTempValue), 16); FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64); ffStrbufAppendS(&baseDir, "/sys/class/hwmon/"); uint32_t baseDirLength = baseDir.length; - DIR* dirp = opendir(baseDir.chars); + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir.chars); if(dirp == NULL) return &result; @@ -70,19 +68,17 @@ const FFTempsResult* ffDetectTemps(void) ffStrbufAppendS(&baseDir, entry->d_name); ffStrbufAppendC(&baseDir, '/'); - FFTempValue* temp = ffListAdd(&result.values); + FFTempValue* temp = ffListAdd(&result); ffStrbufInit(&temp->name); temp->deviceClass = 0; if(!parseHwmonDir(&baseDir, temp)) { ffStrbufDestroy(&temp->name); - --result.values.length; + --result.length; } ffStrbufSubstrBefore(&baseDir, baseDirLength); } - closedir(dirp); - return &result; } diff --git a/src/detection/temps/temps_linux.h b/src/detection/temps/temps_linux.h index 569bd0401..f99dd4138 100644 --- a/src/detection/temps/temps_linux.h +++ b/src/detection/temps/temps_linux.h @@ -12,11 +12,6 @@ typedef struct FFTempValue double value; } FFTempValue; -typedef struct FFTempsResult -{ - FFlist values; //List of FFTempValue -} FFTempsResult; - -const FFTempsResult* ffDetectTemps(); +const FFlist* /* List of FFTempValue */ ffDetectTemps(); #endif