From f362fdb01d80cf1fbadf28a48e090fe32cb30b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 16 Sep 2022 11:03:46 +0800 Subject: [PATCH] Battery: move detection code into `src/detection` Prepare for macOS implementation --- CMakeLists.txt | 3 + src/detection/battery/battery.h | 19 +++ src/detection/battery/battery_android.c | 10 ++ src/detection/battery/battery_apple.c | 7 ++ src/detection/battery/battery_linux.c | 117 +++++++++++++++++++ src/modules/battery.c | 146 ++++-------------------- 6 files changed, 177 insertions(+), 125 deletions(-) create mode 100644 src/detection/battery/battery.h create mode 100644 src/detection/battery/battery_android.c create mode 100644 src/detection/battery/battery_apple.c create mode 100644 src/detection/battery/battery_linux.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c6a1ff8b..81c703e5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,6 +240,7 @@ if(APPLE) src/detection/os/os_apple.c src/detection/cpu/cpu_apple.c src/detection/gpu/gpu_apple.c + src/detection/battery/battery_apple.c src/detection/memory/memory_apple.c src/detection/displayserver/displayserver_apple.c ) @@ -249,6 +250,7 @@ elseif(ANDROID) src/detection/os/os_android.c src/detection/cpu/cpu_linux.c src/detection/gpu/gpu_android.c + src/detection/battery/battery_android.c src/detection/memory/memory_linux.c src/detection/displayserver/displayserver_android.c ) @@ -259,6 +261,7 @@ else() src/detection/cpu/cpu_linux.c src/detection/gpu/gpu_linux.c src/detection/memory/memory_linux.c + src/detection/battery/battery_linux.c src/detection/displayserver/linux/displayserver_linux.c src/detection/displayserver/linux/wayland.c src/detection/displayserver/linux/xcb.c diff --git a/src/detection/battery/battery.h b/src/detection/battery/battery.h new file mode 100644 index 000000000..e7c2a859a --- /dev/null +++ b/src/detection/battery/battery.h @@ -0,0 +1,19 @@ +#pragma once + +#ifndef FF_INCLUDED_detection_battery_battery +#define FF_INCLUDED_detection_battery_battery + +#include "fastfetch.h" + +typedef struct BatteryResult +{ + FFstrbuf manufacturer; + FFstrbuf modelName; + FFstrbuf technology; + FFstrbuf capacity; + FFstrbuf status; +} BatteryResult; + +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results); + +#endif diff --git a/src/detection/battery/battery_android.c b/src/detection/battery/battery_android.c new file mode 100644 index 000000000..2fc2b1d85 --- /dev/null +++ b/src/detection/battery/battery_android.c @@ -0,0 +1,10 @@ +#include "fastfetch.h" +#include "common/io.h" +#include "battery.h" + +#include + +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { + FF_UNUSED(instance, results) + return "Unimplemented"; +} diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c new file mode 100644 index 000000000..fa056c568 --- /dev/null +++ b/src/detection/battery/battery_apple.c @@ -0,0 +1,7 @@ +#include "fastfetch.h" +#include "battery.h" + +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { + FF_UNUSED(instance, results); + return "Unimplemented"; +} diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c new file mode 100644 index 000000000..db6aee162 --- /dev/null +++ b/src/detection/battery/battery_linux.c @@ -0,0 +1,117 @@ +#include "fastfetch.h" +#include "common/io.h" +#include "battery.h" + +#include + +static void parseBattery(FFstrbuf* dir, FFlist* results) +{ + uint32_t dirLength = dir->length; + + FFstrbuf testBatteryBuffer; + ffStrbufInit(&testBatteryBuffer); + + //type must exist and be "Battery" + ffStrbufAppendS(dir, "/type"); + ffReadFileBuffer(dir->chars, &testBatteryBuffer); + ffStrbufSubstrBefore(dir, dirLength); + + if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Battery") != 0) + { + ffStrbufDestroy(&testBatteryBuffer); + return; + } + + //scope may not exist or must not be "Device" + ffStrbufAppendS(dir, "/scope"); + ffReadFileBuffer(dir->chars, &testBatteryBuffer); + ffStrbufSubstrBefore(dir, dirLength); + + if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Device") == 0) + { + ffStrbufDestroy(&testBatteryBuffer); + return; + } + + ffStrbufDestroy(&testBatteryBuffer); + BatteryResult* result = ffListAdd(results); + + //capacity must exist and be not empty + ffStrbufInit(&result->capacity); + ffStrbufAppendS(dir, "/capacity"); + ffReadFileBuffer(dir->chars, &result->capacity); + ffStrbufSubstrBefore(dir, dirLength); + + if(result->capacity.length == 0) + { + ffStrbufDestroy(&result->capacity); + --results->length; + return; + } + + //At this point, we have a battery. Try to get as much values as possible. + + ffStrbufInit(&result->manufacturer); + ffStrbufAppendS(dir, "/manufacturer"); + ffReadFileBuffer(dir->chars, &result->manufacturer); + ffStrbufSubstrBefore(dir, dirLength); + + ffStrbufInit(&result->modelName); + ffStrbufAppendS(dir, "/model_name"); + ffReadFileBuffer(dir->chars, &result->modelName); + ffStrbufSubstrBefore(dir, dirLength); + + ffStrbufInit(&result->technology); + ffStrbufAppendS(dir, "/technology"); + ffReadFileBuffer(dir->chars, &result->technology); + ffStrbufSubstrBefore(dir, dirLength); + + ffStrbufInit(&result->status); + ffStrbufAppendS(dir, "/status"); + ffReadFileBuffer(dir->chars, &result->status); + ffStrbufSubstrBefore(dir, dirLength); +} + +const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results) { + FFstrbuf baseDir; + ffStrbufInitA(&baseDir, 64); + if(instance->config.batteryDir.length > 0) + { + ffStrbufAppend(&baseDir, &instance->config.batteryDir); + if (!ffStrbufEndsWithC(&baseDir, '/')) + { + ffStrbufAppendC(&baseDir, '/'); + } + } + else + { + ffStrbufAppendS(&baseDir, "/sys/class/power_supply/"); + } + + uint32_t baseDirLength = baseDir.length; + + DIR* dirp = opendir(baseDir.chars); + if(dirp == NULL) + { + ffStrbufDestroy(&baseDir); + return "opendir(batteryDir) == NULL"; + } + + struct dirent* entry; + while((entry = readdir(dirp)) != NULL) + { + ffStrbufAppendS(&baseDir, entry->d_name); + parseBattery(&baseDir, results); + ffStrbufSubstrBefore(&baseDir, baseDirLength); + } + + closedir(dirp); + + if(results->length == 0) { + ffStrbufDestroy(&baseDir); + return "batteryDir doesn't contain any battery folder"; + } + + ffStrbufDestroy(&baseDir); + return NULL; +} diff --git a/src/modules/battery.c b/src/modules/battery.c index d6c7f2587..8900ef2ec 100644 --- a/src/modules/battery.c +++ b/src/modules/battery.c @@ -1,89 +1,10 @@ #include "fastfetch.h" -#include "common/io.h" #include "common/printing.h" - -#include +#include "detection/battery/battery.h" #define FF_BATTERY_MODULE_NAME "Battery" #define FF_BATTERY_NUM_FORMAT_ARGS 5 -typedef struct BatteryResult -{ - FFstrbuf manufacturer; - FFstrbuf modelName; - FFstrbuf technology; - FFstrbuf capacity; - FFstrbuf status; -} BatteryResult; - -static void parseBattery(FFstrbuf* dir, FFlist* results) -{ - uint32_t dirLength = dir->length; - - FFstrbuf testBatteryBuffer; - ffStrbufInit(&testBatteryBuffer); - - //type must exist and be "Battery" - ffStrbufAppendS(dir, "/type"); - ffReadFileBuffer(dir->chars, &testBatteryBuffer); - ffStrbufSubstrBefore(dir, dirLength); - - if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Battery") != 0) - { - ffStrbufDestroy(&testBatteryBuffer); - return; - } - - //scope may not exist or must not be "Device" - ffStrbufAppendS(dir, "/scope"); - ffReadFileBuffer(dir->chars, &testBatteryBuffer); - ffStrbufSubstrBefore(dir, dirLength); - - if(ffStrbufIgnCaseCompS(&testBatteryBuffer, "Device") == 0) - { - ffStrbufDestroy(&testBatteryBuffer); - return; - } - - ffStrbufDestroy(&testBatteryBuffer); - BatteryResult* result = ffListAdd(results); - - //capacity must exist and be not empty - ffStrbufInit(&result->capacity); - ffStrbufAppendS(dir, "/capacity"); - ffReadFileBuffer(dir->chars, &result->capacity); - ffStrbufSubstrBefore(dir, dirLength); - - if(result->capacity.length == 0) - { - ffStrbufDestroy(&result->capacity); - --results->length; - return; - } - - //At this point, we have a battery. Try to get as much values as possible. - - ffStrbufInit(&result->manufacturer); - ffStrbufAppendS(dir, "/manufacturer"); - ffReadFileBuffer(dir->chars, &result->manufacturer); - ffStrbufSubstrBefore(dir, dirLength); - - ffStrbufInit(&result->modelName); - ffStrbufAppendS(dir, "/model_name"); - ffReadFileBuffer(dir->chars, &result->modelName); - ffStrbufSubstrBefore(dir, dirLength); - - ffStrbufInit(&result->technology); - ffStrbufAppendS(dir, "/technology"); - ffReadFileBuffer(dir->chars, &result->technology); - ffStrbufSubstrBefore(dir, dirLength); - - ffStrbufInit(&result->status); - ffStrbufAppendS(dir, "/status"); - ffReadFileBuffer(dir->chars, &result->status); - ffStrbufSubstrBefore(dir, dirLength); -} - static void printBattery(FFinstance* instance, const BatteryResult* result, uint8_t index) { if(instance->config.battery.outputFormat.length == 0) @@ -127,56 +48,31 @@ static void printBattery(FFinstance* instance, const BatteryResult* result, uint void ffPrintBattery(FFinstance* instance) { - FFstrbuf baseDir; - ffStrbufInitA(&baseDir, 64); - if(instance->config.batteryDir.length > 0) + FFlist results; + ffListInitA(&results, sizeof(BatteryResult), 0); + + const char* error = ffDetectBatteryImpl(instance, &results); + + if (error) { - ffStrbufAppend(&baseDir, &instance->config.batteryDir); - ffStrbufEndsWithC(&baseDir, '/'); + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "%s", error); } else { - ffStrbufAppendS(&baseDir, "/sys/class/power_supply/"); + for(uint8_t i = 0; i < (uint8_t) results.length; i++) + { + BatteryResult* result = ffListGet(&results, i); + printBattery(instance, result, i); + + ffStrbufDestroy(&result->manufacturer); + ffStrbufDestroy(&result->modelName); + ffStrbufDestroy(&result->technology); + ffStrbufDestroy(&result->capacity); + ffStrbufDestroy(&result->status); + } + if(results.length == 0) + ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "No batteries found"); } - uint32_t baseDirLength = baseDir.length; - - DIR* dirp = opendir(baseDir.chars); - if(dirp == NULL) - { - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "opendir(\"%s\") == NULL", baseDir.chars); - ffStrbufDestroy(&baseDir); - return; - } - - FFlist results; - ffListInitA(&results, sizeof(BatteryResult), 4); - - struct dirent* entry; - while((entry = readdir(dirp)) != NULL) - { - ffStrbufAppendS(&baseDir, entry->d_name); - parseBattery(&baseDir, &results); - ffStrbufSubstrBefore(&baseDir, baseDirLength); - } - - closedir(dirp); - - for(uint8_t i = 0; i < (uint8_t) results.length; i++) - { - BatteryResult* result = ffListGet(&results, i); - printBattery(instance, result, i); - - ffStrbufDestroy(&result->manufacturer); - ffStrbufDestroy(&result->modelName); - ffStrbufDestroy(&result->technology); - ffStrbufDestroy(&result->capacity); - ffStrbufDestroy(&result->status); - } - - if(results.length == 0) - ffPrintError(instance, FF_BATTERY_MODULE_NAME, 0, &instance->config.battery, "%s doesn't contain any battery folder", baseDir.chars); - ffListDestroy(&results); - ffStrbufDestroy(&baseDir); }