diff options
author | nerd972 <37052833+nerd972@users.noreply.github.com> | 2018-03-05 01:54:37 +0100 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-03-26 15:14:12 -0300 |
commit | 1cf8f429a5b672d44c7e87ca21b0a451f581fdae (patch) | |
tree | a6f19d6a350be11deb8346dc6c8e8767a516ba55 /openbsd | |
parent | 23f96048c74a5a958dfb20b37eba9cde35a4e97d (diff) |
OpenBSD: read Battery data
Signed-off-by: Hisham Muhammad <hisham@gobolinux.org>
Diffstat (limited to 'openbsd')
-rw-r--r-- | openbsd/Battery.c | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/openbsd/Battery.c b/openbsd/Battery.c index f9d0969a..3a0bae14 100644 --- a/openbsd/Battery.c +++ b/openbsd/Battery.c @@ -7,10 +7,65 @@ in the source distribution for its full text. */ #include "BatteryMeter.h" +#include <sys/sysctl.h> +#include <sys/sensors.h> +#include <errno.h> + +static bool findDevice(const char* name, int* mib, struct sensordev* snsrdev, size_t* sdlen) { + for (int devn = 0;; devn++) { + mib[2] = devn; + if (sysctl(mib, 3, snsrdev, sdlen, NULL, 0) == -1) { + if (errno == ENXIO) + continue; + if (errno == ENOENT) + return false; + } + if (strcmp(name, snsrdev->xname) == 0) { + return true; + } + } +} void Battery_getData(double* level, ACPresence* isOnAC) { - // TODO + static int mib[] = {CTL_HW, HW_SENSORS, 0, 0, 0}; + struct sensor s; + size_t slen = sizeof(struct sensor); + struct sensordev snsrdev; + size_t sdlen = sizeof(struct sensordev); + + bool found = findDevice("acpibat0", mib, &snsrdev, &sdlen); + *level = -1; + if (found) { + /* last full capacity */ + mib[3] = 7; + mib[4] = 0; + double last_full_capacity = 0; + if (sysctl(mib, 5, &s, &slen, NULL, 0) != -1) { + last_full_capacity = s.value; + } + if (last_full_capacity > 0) { + /* remaining capacity */ + mib[3] = 7; + mib[4] = 3; + if (sysctl(mib, 5, &s, &slen, NULL, 0) != -1) { + double charge = s.value; + *level = 100*(charge / last_full_capacity); + if (charge >= last_full_capacity) { + *level = 100; + } + } + } + } + + found = findDevice("acpiac0", mib, &snsrdev, &sdlen); + *isOnAC = AC_ERROR; + if (found) { + mib[3] = 9; + mib[4] = 0; + if (sysctl(mib, 5, &s, &slen, NULL, 0) != -1) { + *isOnAC = s.value; + } + } } - |