Battry (Linux): try detecting cycle count and temperature

This commit is contained in:
李通洲
2023-11-06 19:08:17 +08:00
parent 5ab2c3456d
commit f8eabdd8a6
5 changed files with 36 additions and 32 deletions
+24 -7
View File
@@ -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 <dirent.h>
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";
+2 -4
View File
@@ -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 ||
+2 -4
View File
@@ -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)
{
+7 -11
View File
@@ -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;
}
+1 -6
View File
@@ -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