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 slurp(bat->path, buf, sizeof(buf));
31 for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
40 if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW") ||
41 BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW"))
42 remaining = atoi(walk+1);
43 else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
44 present_rate = atoi(walk+1);
45 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
47 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
50 /* The only thing left is the full capacity */
51 if (bat->use_last_full) {
52 if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
53 !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
56 if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
57 !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
61 full_design = atoi(walk+1);
65 if ((full_design == 1) || (remaining == -1))
68 if (present_rate > 0) {
70 int seconds, hours, minutes;
71 if (status == CS_CHARGING)
72 remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
73 else if (status == CS_DISCHARGING)
74 remaining_time = ((float)remaining / (float)present_rate);
75 else remaining_time = 0;
77 seconds = (int)(remaining_time * 3600.0);
78 hours = seconds / 3600;
79 seconds -= (hours * 3600);
80 minutes = seconds / 60;
81 seconds -= (minutes * 60);
83 (void)snprintf(part, sizeof(part), "%s %.02f%% %02d:%02d:%02d",
84 (status == CS_CHARGING ? "CHR" :
85 (status == CS_DISCHARGING ? "BAT" : "FULL")),
86 (((float)remaining / (float)full_design) * 100),
87 max(hours, 0), max(minutes, 0), max(seconds, 0));
89 (void)snprintf(part, sizeof(part), "%s %.02f%%",
90 (status == CS_CHARGING ? "CHR" :
91 (status == CS_DISCHARGING ? "BAT" : "FULL")),
92 (((float)remaining / (float)full_design) * 100));
94 #elif defined(__FreeBSD__)
97 size_t sysctl_size = sizeof(sysctl_rslt);
99 if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
102 present_rate = sysctl_rslt;
103 if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0)
106 remaining = sysctl_rslt;
107 if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0)
111 if (state == 0 && present_rate == 100)
113 else if (state == 0 && present_rate < 100)
114 status = CS_CHARGING;
116 status = CS_DISCHARGING;
118 full_design = sysctl_rslt;
123 hours = minutes / 60;
124 minutes -= (hours * 60);
125 (void)snprintf(part, sizeof(part), "%s %02d%% %02dh%02d",
126 (status == CS_CHARGING ? "CHR" :
127 (status == CS_DISCHARGING ? "BAT" : "FULL")),
129 max(hours, 0), max(minutes, 0));
131 (void)snprintf(part, sizeof(part), "%s %02d%%",
132 (status == CS_CHARGING ? "CHR" :
133 (status == CS_DISCHARGING ? "BAT" : "FULL")),