8 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
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 void print_battery_info(int number, const char *format) {
25 charging_status_t status = CS_DISCHARGING;
28 static char batpath[512];
29 sprintf(batpath, "/sys/class/power_supply/BAT%d/uevent", number);
30 if (!slurp(batpath, buf, sizeof(buf))) {
35 for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
44 if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW") ||
45 BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW"))
46 remaining = atoi(walk+1);
47 else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
48 present_rate = atoi(walk+1);
49 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
51 else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
54 /* The only thing left is the full capacity */
56 if (bat->use_last_full) {
57 if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
58 !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
62 if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
63 !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
67 full_design = atoi(walk+1);
71 if ((full_design == 1) || (remaining == -1))
74 if (present_rate > 0) {
76 int seconds, hours, minutes;
77 if (status == CS_CHARGING)
78 remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
79 else if (status == CS_DISCHARGING)
80 remaining_time = ((float)remaining / (float)present_rate);
81 else remaining_time = 0;
83 seconds = (int)(remaining_time * 3600.0);
84 hours = seconds / 3600;
85 seconds -= (hours * 3600);
86 minutes = seconds / 60;
87 seconds -= (minutes * 60);
89 (void)printf("%s %.02f%% %02d:%02d:%02d",
90 (status == CS_CHARGING ? "CHR" :
91 (status == CS_DISCHARGING ? "BAT" : "FULL")),
92 (((float)remaining / (float)full_design) * 100),
93 max(hours, 0), max(minutes, 0), max(seconds, 0));
95 (void)printf("%s %.02f%%",
96 (status == CS_CHARGING ? "CHR" :
97 (status == CS_DISCHARGING ? "BAT" : "FULL")),
98 (((float)remaining / (float)full_design) * 100));
100 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
103 size_t sysctl_size = sizeof(sysctl_rslt);
105 if (sysctlbyname(BATT_LIFE, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
106 printf("No battery");
110 present_rate = sysctl_rslt;
111 if (sysctlbyname(BATT_TIME, &sysctl_rslt, &sysctl_size, NULL, 0) != 0) {
112 printf("No battery");
116 remaining = sysctl_rslt;
117 if (sysctlbyname(BATT_STATE, &sysctl_rslt, &sysctl_size, NULL,0) != 0) {
118 printf("No battery");
123 if (state == 0 && present_rate == 100)
125 else if (state == 0 && present_rate < 100)
126 status = CS_CHARGING;
128 status = CS_DISCHARGING;
130 full_design = sysctl_rslt;
135 hours = minutes / 60;
136 minutes -= (hours * 60);
137 (void)printf("%s %02d%% %02dh%02d",
138 (status == CS_CHARGING ? "CHR" :
139 (status == CS_DISCHARGING ? "BAT" : "FULL")),
141 max(hours, 0), max(minutes, 0));
143 (void)printf("%s %02d%%",
144 (status == CS_CHARGING ? "CHR" :
145 (status == CS_DISCHARGING ? "BAT" : "FULL")),