summaryrefslogtreecommitdiff
path: root/src/get_battery_info.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2009-07-23 18:40:49 +0200
committerMichael Stapelberg <michael@stapelberg.de>2009-07-23 18:40:49 +0200
commita86361510c10ac5f19e2959d33e9ffb7f6c5099e (patch)
tree4b606ef03e6065f4d0eacdeed8ecac165d3f7ee1 /src/get_battery_info.c
parent3de290742744de5f08be17d14f1dce377815e3f4 (diff)
Implement battery status and thermal zones for FreeBSD (patch by Baptiste Daroussin)
Diffstat (limited to 'src/get_battery_info.c')
-rw-r--r--src/get_battery_info.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/get_battery_info.c b/src/get_battery_info.c
index 707afde..8ac7743 100644
--- a/src/get_battery_info.c
+++ b/src/get_battery_info.c
@@ -5,6 +5,11 @@
#include "i3status.h"
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
/*
* Get battery information from /sys. Note that it uses the design capacity to
* calculate the percentage, not the last full capacity, so you can see how
@@ -20,6 +25,7 @@ const char *get_battery_info(struct battery *bat) {
present_rate = -1;
charging_status_t status = CS_DISCHARGING;
+#if defined(LINUX)
slurp(bat->path, buf, sizeof(buf));
for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
@@ -85,5 +91,48 @@ const char *get_battery_info(struct battery *bat) {
(status == CS_DISCHARGING ? "BAT" : "FULL")),
(((float)remaining / (float)full_design) * 100));
}
+#elif defined(__FreeBSD__)
+ int state;
+ int sysctl_rslt;
+ size_t sysctl_size = sizeof(sysctl_rslt);
+
+ if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
+ return "No battery";
+
+ present_rate = sysctl_rslt;
+ if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
+ return "No battery";
+
+ remaining = sysctl_rslt;
+ if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0)
+ return "No battery";
+
+ state = sysctl_rslt;
+ if (state == 0 && present_rate == 100)
+ status = CS_FULL;
+ else if (state == 0 && present_rate < 100)
+ status = CS_CHARGING;
+ else
+ status = CS_DISCHARGING;
+
+ full_design = sysctl_rslt;
+
+ if (state == 1) {
+ int hours, minutes;
+ minutes = remaining;
+ hours = minutes / 60;
+ minutes -= (hours * 60);
+ (void)snprintf(part, sizeof(part), "%s %02d%% %02dh%02d",
+ (status == CS_CHARGING ? "CHR" :
+ (status == CS_DISCHARGING ? "BAT" : "FULL")),
+ present_rate,
+ max(hours, 0), max(minutes, 0));
+ } else {
+ (void)snprintf(part, sizeof(part), "%s %02d%%",
+ (status == CS_CHARGING ? "CHR" :
+ (status == CS_DISCHARGING ? "BAT" : "FULL")),
+ present_rate);
+ }
+#endif
return part;
}