53 lines
1.1 KiB
C
53 lines
1.1 KiB
C
#include <dirent.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
int main() {
|
|
DIR *dir = opendir("/sys/class/power_supply");
|
|
if (!dir)
|
|
return 1;
|
|
|
|
struct dirent *entry;
|
|
int total = 0, count = 0, charging = 0;
|
|
|
|
// Iterate every battery
|
|
while ((entry = readdir(dir))) {
|
|
if (strncmp(entry->d_name, "BAT", 3) != 0)
|
|
continue;
|
|
|
|
char path[512];
|
|
FILE *fp;
|
|
int capacity;
|
|
char status[20];
|
|
|
|
// Read current charge value
|
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/capacity",
|
|
entry->d_name);
|
|
fp = fopen(path, "r");
|
|
if (!fp)
|
|
return 1;
|
|
if (fscanf(fp, "%d", &capacity) == 1) {
|
|
total += capacity;
|
|
count++;
|
|
fclose(fp);
|
|
}
|
|
|
|
// Check if charging
|
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/status",
|
|
entry->d_name);
|
|
fp = fopen(path, "r");
|
|
if (!fp)
|
|
return 1;
|
|
if (fscanf(fp, "%19s", status) == 1) {
|
|
if (strncmp(status, "Charging", 8) == 0)
|
|
charging = 1;
|
|
fclose(fp);
|
|
}
|
|
}
|
|
closedir(dir);
|
|
|
|
if (count > 0)
|
|
printf("Bat: %s%d%%\n", charging ? "+" : "", total / count);
|
|
return 0;
|
|
}
|