8 #if defined(__FreeBSD__)
10 #include <sys/sysctl.h>
14 * Get battery information from /sys. Note that it uses the design capacity to
15 * calculate the percentage, not the last full capacity, so you can see how
16 * worn off your battery is.
19 const char *get_battery_info(struct battery *bat) {
21 static char part[512];
26 charging_status_t status = CS_DISCHARGING;
29 if (!slurp(bat->path, buf, sizeof(buf)))
32 for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
41 if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW") ||
42 BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW"))
43 remaining = atoi(walk+1);
44 else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
45 present_rate = atoi(walk+1);
46 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
48 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
51 /* The only thing left is the full capacity */
52 if (bat->use_last_full) {
53 if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
54 !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
57 if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
58 !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
62 full_design = atoi(walk+1);
66 if ((full_design == 1) || (remaining == -1))
69 if (present_rate > 0) {
71 int seconds, hours, minutes;
72 if (status == CS_CHARGING)
73 remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
74 else if (status == CS_DISCHARGING)
75 remaining_time = ((float)remaining / (float)present_rate);
76 else remaining_time = 0;
78 seconds = (int)(remaining_time * 3600.0);
79 hours = seconds / 3600;
80 seconds -= (hours * 3600);
81 minutes = seconds / 60;
82 seconds -= (minutes * 60);
84 (void)snprintf(part, sizeof(part), "%s %.02f%% %02d:%02d:%02d",
85 (status == CS_CHARGING ? "CHR" :
86 (status == CS_DISCHARGING ? "BAT" : "FULL")),
87 (((float)remaining / (float)full_design) * 100),
88 max(hours, 0), max(minutes, 0), max(seconds, 0));
90 (void)snprintf(part, sizeof(part), "%s %.02f%%",
91 (status == CS_CHARGING ? "CHR" :
92 (status == CS_DISCHARGING ? "BAT" : "FULL")),
93 (((float)remaining / (float)full_design) * 100));
95 #elif defined(__FreeBSD__)
98 size_t sysctl_size = sizeof(sysctl_rslt);
100 if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
103 present_rate = sysctl_rslt;
104 if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
107 remaining = sysctl_rslt;
108 if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0)
112 if (state == 0 && present_rate == 100)
114 else if (state == 0 && present_rate < 100)
115 status = CS_CHARGING;
117 status = CS_DISCHARGING;
119 full_design = sysctl_rslt;
124 hours = minutes / 60;
125 minutes -= (hours * 60);
126 (void)snprintf(part, sizeof(part), "%s %02d%% %02dh%02d",
127 (status == CS_CHARGING ? "CHR" :
128 (status == CS_DISCHARGING ? "BAT" : "FULL")),
130 max(hours, 0), max(minutes, 0));
132 (void)snprintf(part, sizeof(part), "%s %02d%%",
133 (status == CS_CHARGING ? "CHR" :
134 (status == CS_DISCHARGING ? "BAT" : "FULL")),