diff options
| author | Øyvin Halfdan Thuv | 2017-12-13 13:46:50 +0100 | 
|---|---|---|
| committer | oth007 | 2018-03-27 11:52:08 +0200 | 
| commit | 3e1213123fb0d49339b11eafa8b283f87b237d6f (patch) | |
| tree | 7e915eed5bbf0cd9e726b47191a0336396a28836 | |
| parent | Merge pull request #255 from eplanet/update_readme (diff) | |
Read multiple batteries on DragonFly BSD.
Using ACPI to read individual battery information instead of just
accumulations from sysctl.
| -rw-r--r-- | src/print_battery_info.c | 65 | 
1 files changed, 56 insertions, 9 deletions
| diff --git a/src/print_battery_info.c b/src/print_battery_info.c index e22ca3e..fa70714 100644 --- a/src/print_battery_info.c +++ b/src/print_battery_info.c @@ -1,9 +1,9 @@  // vim:ts=4:sw=4:expandtab  #include <ctype.h> -#include <time.h> -#include <string.h> -#include <stdlib.h>  #include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h>  #include <yajl/yajl_gen.h>  #include <yajl/yajl_version.h> @@ -16,16 +16,20 @@  #endif  #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) -#include <sys/types.h> -#include <sys/sysctl.h>  #include <dev/acpica/acpiio.h> +#include <sys/sysctl.h> +#include <sys/types.h>  #endif -#if defined(__OpenBSD__) -#include <sys/types.h> -#include <sys/ioctl.h> +#if defined(__DragonFly__)  #include <sys/fcntl.h> +#endif + +#if defined(__OpenBSD__)  #include <machine/apmvar.h> +#include <sys/fcntl.h> +#include <sys/ioctl.h> +#include <sys/types.h>  #endif  #if defined(__NetBSD__) @@ -55,6 +59,22 @@ struct battery_info {      charging_status_t status;  }; +#if defined(__DragonFly__) +#define ACPIDEV "/dev/acpi" +static int acpifd; + +static bool acpi_init(void) { +    if (acpifd == 0) { +        acpifd = open(ACPIDEV, O_RDWR); +        if (acpifd == -1) +            acpifd = open(ACPIDEV, O_RDONLY); +        if (acpifd == -1) +            return false; +    } +    return true; +} +#endif +  #if defined(LINUX) || defined(__NetBSD__)  /*   * Add batt_info data to acc. @@ -189,7 +209,34 @@ static bool slurp_battery_info(struct battery_info *batt_info, yajl_gen json_gen              batt_info->full_last = (((float)voltage / 1000.0) * ((float)batt_info->full_last / 1000.0));          }      } -#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#elif defined(__DragonFly__) +    union acpi_battery_ioctl_arg battio; +    if (acpi_init()) { +        battio.unit = number; +        ioctl(acpifd, ACPIIO_BATT_GET_BIF, &battio); +        batt_info->full_design = battio.bif.dcap; +        batt_info->full_last = battio.bif.lfcap; +        battio.unit = number; +        ioctl(acpifd, ACPIIO_BATT_GET_BATTINFO, &battio); +        batt_info->percentage_remaining = battio.battinfo.cap; +        batt_info->present_rate = battio.battinfo.rate; +        batt_info->seconds_remaining = battio.battinfo.min * 60; +        switch (battio.battinfo.state) { +            case 0: +                batt_info->status = CS_FULL; +                break; +            case ACPI_BATT_STAT_CHARGING: +                batt_info->status = CS_CHARGING; +                break; +            case ACPI_BATT_STAT_DISCHARG: +                batt_info->status = CS_DISCHARGING; +                break; +            default: +                batt_info->status = CS_UNKNOWN; +        } +        OUTPUT_FULL_TEXT(format_down); +    } +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)      int state;      int sysctl_rslt;      size_t sysctl_size = sizeof(sysctl_rslt); | 
