Add battery_remaining function on OpenBSD
authorTobias Tschinkowitz <he4d@posteo.de>
Fri, 18 May 2018 12:43:04 +0000 (14:43 +0200)
committerAaron Marcher <me@drkhsh.at>
Fri, 18 May 2018 13:25:42 +0000 (15:25 +0200)
Implementation of a battery_remaining function which returns the
remaining battery time in HH:MM format. Linux function still needs
implementation.
Move common code to load_apm_power_info

components/battery.c
config.def.h
slstatus.h

index 807a7e62ca18c993f6994e071b40872fcda1bde6..152777ef46da27dcbeb8594623cbfb2d74b1c34b 100644 (file)
                }
                return (i == LEN(map)) ? "?" : map[i].symbol;
        }
+
+       const char *
+       battery_remaining(const char *bat)
+       {
+               /* TODO: Implement */
+               return NULL;
+       }
 #elif defined(__OpenBSD__)
        #include <fcntl.h>
        #include <machine/apmvar.h>
        #include <sys/ioctl.h>
        #include <unistd.h>
 
-       const char *
-       battery_perc(const char *unused)
+       static int
+       load_apm_power_info(struct apm_power_info *apm_info)
        {
-               struct apm_power_info apm_info;
                int fd;
 
                fd = open("/dev/apm", O_RDONLY);
                if (fd < 0) {
                        warn("open '/dev/apm':");
-                       return NULL;
+                       return 0;
                }
 
-               if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) {
+               memset(apm_info, 0, sizeof(struct apm_power_info));
+               if (ioctl(fd, APM_IOC_GETPOWER, apm_info) < 0) {
                        warn("ioctl 'APM_IOC_GETPOWER':");
                        close(fd);
-                       return NULL;
+                       return 0;
+               }
+               return close(fd), 1;
+       }
+
+       const char *
+       battery_perc(const char *unused)
+       {
+               struct apm_power_info apm_info;
+
+               if (load_apm_power_info(&apm_info)) {
+                       return bprintf("%d", apm_info.battery_life);
                }
-               close(fd);
 
-               return bprintf("%d", apm_info.battery_life);
+               return NULL;
        }
 
        const char *
        battery_state(const char *unused)
        {
-               int fd;
-               size_t i;
                struct apm_power_info apm_info;
+               size_t i;
                struct {
                        unsigned int state;
                        char *symbol;
                        { APM_AC_OFF,     "-" },
                };
 
-               fd = open("/dev/apm", O_RDONLY);
-               if (fd < 0) {
-                       warn("open '/dev/apm':");
-                       return NULL;
+               if (load_apm_power_info(&apm_info)) {
+                       for (i = 0; i < LEN(map); i++) {
+                               if (map[i].state == apm_info.ac_state) {
+                                       break;
+                               }
+                       }
+                       return (i == LEN(map)) ? "?" : map[i].symbol;
                }
 
-               if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) {
-                       warn("ioctl 'APM_IOC_GETPOWER':");
-                       close(fd);
-                       return NULL;
-               }
-               close(fd);
+               return NULL;
+       }
 
-               for (i = 0; i < LEN(map); i++) {
-                       if (map[i].state == apm_info.ac_state) {
-                               break;
-                       }
+       const char *
+       battery_remaining(const char *unused)
+       {
+               struct apm_power_info apm_info;
+
+               if (load_apm_power_info(&apm_info)) {
+                       return bprintf("%u:%02u", apm_info.minutes_left / 60,
+                                      apm_info.minutes_left % 60);
                }
-               return (i == LEN(map)) ? "?" : map[i].symbol;
+
+               return NULL;
        }
 #endif
index 9dcd5d6267913756915cc79a1767e01f4dab5c5f..82a5df513ba0424cdc5f7d55f1d5f47b71a759e5 100644 (file)
@@ -16,6 +16,8 @@ static const char unknown_str[] = "n/a";
  *                                                      NULL on OpenBSD
  * battery_state        battery charging state          battery name (BAT0)
  *                                                      NULL on OpenBSD
+ * battery_remaining   battery remaining HH:MM         battery name (BAT0)
+ *                                                     NULL on OpenBSD
  * cpu_perc             cpu usage in percent            NULL
  * cpu_freq             cpu frequency in MHz            NULL
  * datetime             date and time                   format string (%F %T)
index 6a25209bd09d9642fd0d312d57a2c54fb2e8f43c..abe28d3fb46840ab1a7853e851b7fe111d6ad798 100644 (file)
@@ -3,6 +3,7 @@
 /* battery */
 const char *battery_perc(const char *);
 const char *battery_state(const char *);
+const char *battery_remaining(const char*);
 
 /* cpu */
 const char *cpu_freq(void);