From d4c361ae1297d0e88cf02f99dc3ec3a094b592f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 10 Jan 2023 12:27:51 +0800 Subject: [PATCH] Battery: support FreeBSD Completely untested --- CHANGELOG.md | 1 + CMakeLists.txt | 3 +- src/detection/battery/battery_bsd.c | 56 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/detection/battery/battery_bsd.c diff --git a/CHANGELOG.md b/CHANGELOG.md index fc2eed5a4..caeb3e0d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Features: * Add `--list-config-paths` option which list search paths of config files * Add `--list-data-paths` option which list search paths for presets and logos * Add `Brightness` module support +* Add `Battery` module support for FreeBSD Logos: * Raspbian (@IamNoRobot, #373) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64f732c09..393784eaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -382,7 +382,7 @@ elseif(BSD) src/common/networking_linux.c src/common/processing_linux.c src/common/sysctl.c - src/detection/battery/battery_nosupport.c + src/detection/battery/battery_bsd.c src/detection/bios/bios_bsd.c src/detection/board/board_nosupport.c src/detection/brightness/brightness_nosupport.c @@ -424,6 +424,7 @@ elseif(APPLE) src/common/processing_linux.c src/common/sysctl.c src/detection/battery/battery_apple.c + src/detection/battery/battery_bsd.c src/detection/bios/bios_apple.c src/detection/board/board_nosupport.c src/detection/brightness/brightness_apple.c diff --git a/src/detection/battery/battery_bsd.c b/src/detection/battery/battery_bsd.c new file mode 100644 index 000000000..f1a6136be --- /dev/null +++ b/src/detection/battery/battery_bsd.c @@ -0,0 +1,56 @@ +#include "fastfetch.h" +#include "battery.h" + +#include +#include +#include +#include + +const char* ffDetectBatteryImpl(FF_UNUSED_PARAM FFinstance* instance, FFlist* results) +{ + int acpifd = open("/dev/acpi", O_RDONLY); + if(acpifd < 0) + return "open(\"/dev/acpi\", O_RDONLY) failed"; + + int units = ioctl(acpifd, ACPIIO_BATT_GET_UNITS, 0); + if(units < 0) + { + close(acpifd); + return "No acpiio battery units found"; + } + + for(int i = 0; i < units; ++i) + { + union acpi_battery_ioctl_arg battio; + battio.unit = 0; + + if(ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio) < 0 || (battio.battinfo.state & ACPI_BATT_STAT_NOT_PRESENT)) + continue; + + BatteryResult* battery = ffListAdd(results); + battery->temperature = FF_BATTERY_TEMP_UNSET; + ffStrbufInit(&battery->manufacturer); + ffStrbufInit(&battery->modelName); + ffStrbufInit(&battery->status); + ffStrbufInit(&battery->technology); + + battery->capacity = battio.battinfo.cap; + if(battio.battinfo.state & ACPI_BATT_STAT_INVALID) + { + ffStrbufAppendS(&battery->status, "Invalid"); + } + else + { + if(battio.battinfo.state & ACPI_BATT_STAT_DISCHARG) + ffStrbufAppendS(&battery->status, "Discharging, "); + else if(battio.battinfo.state & ACPI_BATT_STAT_CHARGING) + ffStrbufAppendS(&battery->status, "Charging, "); + if(battio.battinfo.state & ACPI_BATT_STAT_CRITICAL) + ffStrbufAppendS(&battery->status, "Ctritical"); + ffStrbufTrimRight(&battery->status, ' '); + ffStrbufTrimRight(&battery->status, ','); + } + } + close(acpifd); + return NULL; +}