diff --git a/src/detection/battery/battery_bsd.c b/src/detection/battery/battery_bsd.c index 96a8cb079..0430f2c33 100644 --- a/src/detection/battery/battery_bsd.c +++ b/src/detection/battery/battery_bsd.c @@ -1,4 +1,5 @@ #include "fastfetch.h" +#include "common/sysctl.h" #include "battery.h" #include @@ -11,23 +12,23 @@ const char* ffDetectBattery(FF_MAYBE_UNUSED FFinstance* instance, FF_MAYBE_UNUSE //https://www.freebsd.org/cgi/man.cgi?acpi_battery(4) //https://gitlab.xfce.org/panel-plugins/xfce4-battery-plugin/-/blob/master/panel-plugin/libacpi.c + int units = ffSysctlGetInt("hw.acpi.battery.units", -100); + if (units < 0) + return "sysctlbyname(\"hw.acpi.battery.units\") failed"; + + if(units == 0) + return NULL; + 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 = i; - if(ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio) < 0 || (battio.battinfo.state & ACPI_BATT_STAT_NOT_PRESENT)) + if(ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio) < 0 || (battio.battinfo.state == ACPI_BATT_STAT_NOT_PRESENT)) continue; BatteryResult* battery = ffListAdd(results); @@ -38,9 +39,9 @@ const char* ffDetectBattery(FF_MAYBE_UNUSED FFinstance* instance, FF_MAYBE_UNUSE ffStrbufInit(&battery->technology); battery->capacity = battio.battinfo.cap; - if(battio.battinfo.state & ACPI_BATT_STAT_INVALID) + if(battio.battinfo.state == ACPI_BATT_STAT_INVALID) { - ffStrbufAppendS(&battery->status, "Invalid"); + ffStrbufAppendS(&battery->status, "Unknown, "); } else { @@ -49,10 +50,27 @@ const char* ffDetectBattery(FF_MAYBE_UNUSED FFinstance* instance, FF_MAYBE_UNUSE 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"); + ffStrbufAppendS(&battery->status, "Ctritical, "); + } + + int acadStatus; + if (ioctl(acpifd, ACPIIO_ACAD_GET_STATUS, &acadStatus) >= 0 && acadStatus) + { + ffStrbufAppendS(&battery->status, "AC connected"); + } + else + { ffStrbufTrimRight(&battery->status, ' '); ffStrbufTrimRight(&battery->status, ','); } + + battio.unit = i; + if (ioctl(acpifd, ACPIIO_BATT_GET_BIX, &battio) >= 0) + { + ffStrbufAppendS(&battery->manufacturer, battio.bix.oeminfo); + ffStrbufAppendS(&battery->modelName, battio.bix.model); + ffStrbufAppendS(&battery->technology, battio.bix.type); + } } close(acpifd); return NULL;