From 0f454b7140ec2d95437d4adc4f420947bf72eced Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 21 Dec 2024 12:04:57 +0800 Subject: [PATCH] Battery (OpenBSD): add support --- CMakeLists.txt | 2 +- src/detection/battery/battery_obsd.c | 52 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/detection/battery/battery_obsd.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 447286642..a70379ee4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -780,7 +780,7 @@ elseif(OpenBSD) src/common/networking_linux.c src/common/processing_linux.c src/common/sysctl.c - src/detection/battery/battery_nosupport.c + src/detection/battery/battery_obsd.c src/detection/bios/bios_nosupport.c src/detection/bluetooth/bluetooth_linux.c src/detection/bluetoothradio/bluetoothradio_linux.c diff --git a/src/detection/battery/battery_obsd.c b/src/detection/battery/battery_obsd.c new file mode 100644 index 000000000..034f8b20d --- /dev/null +++ b/src/detection/battery/battery_obsd.c @@ -0,0 +1,52 @@ +#include "battery.h" +#include "common/io/io.h" + +#include +#include +#include +#include + +const char* ffDetectBattery(FF_MAYBE_UNUSED FFBatteryOptions* options, FFlist* result) +{ + FF_AUTO_CLOSE_FD int devfd = open("/dev/apm", O_RDONLY); + + if (devfd < 0) return "open(dev/apm, O_RDONLY) failed"; + + struct apm_power_info info = {}; + + if (ioctl(devfd, APM_IOC_GETPOWER, &info) < 0) + return "ioctl(APM_IOC_GETPOWER) failed"; + + if (info.battery_state == APM_BATTERY_ABSENT) + return NULL; + + FFBatteryResult* battery = (FFBatteryResult*) ffListAdd(result); + battery->temperature = FF_BATTERY_TEMP_UNSET; + battery->cycleCount = 0; + battery->timeRemaining = -1; + battery->capacity = info.battery_life; + ffStrbufInit(&battery->manufacturer); + ffStrbufInit(&battery->modelName); + ffStrbufInit(&battery->status); + ffStrbufInit(&battery->technology); + ffStrbufInit(&battery->serial); + ffStrbufInit(&battery->manufactureDate); + + if (info.ac_state == APM_AC_ON) + ffStrbufAppendS(&battery->status, "AC Connected"); + else if (info.ac_state == APM_AC_BACKUP) + ffStrbufAppendS(&battery->status, "Backup In Use"); + else if (info.ac_state == APM_AC_OFF) + { + battery->timeRemaining = info.minutes_left * 60 + ffStrbufAppendS(&battery->status, "Discharging"); + } + + if (info.battery_state == APM_BATT_CRITICAL || info.battery_state == APM_BATT_CHARGING) + { + if (battery->status.length) ffStrbufAppendS(&battery->status, ", "); + ffStrbufAppendS(&battery->status, info.battery_state == APM_BATT_CRITICAL ? "Critical" : "Charging"); + } + + return NULL; +}