#include #include #include #include #include "status/battery.h" #include "tools.h" #ifndef POWER_BASEDIR #define POWER_BASEDIR "/sys/class/power_supply/" #endif void status_battery(char *batname) { char batpath[256]; int batpathlen; char stline[16]; ssize_t stlen; int chargeNow = 0; int chargeFull = -1; int chargePercent = -1; int battW = 1; float battTime = -1; /* Prepare path */ batpathlen = sizeof(POWER_BASEDIR) - 1 + strlen(batname); if (batpathlen + 1 + sizeof("/energy_full") >= sizeof(batpath)) { statusError("status_battery", "batpath buffer too small", batname); return; } strcpy(batpath, POWER_BASEDIR); strcat(batpath, batname); /* Is the battery present? */ if (access(batpath, F_OK)) { //printf(" ^fg(grey)[%s] ", batname); return; } /* Get info */ strcpy(&batpath[batpathlen], "/energy_now"); stlen = fileRead(stline, sizeof(stline), batpath); if (stlen > 0) { chargeNow = atoi(stline); } strcpy(&batpath[batpathlen], "/energy_full"); stlen = fileRead(stline, sizeof(stline), batpath); if (stlen > 0) { chargeFull = atoi(stline); } strcpy(&batpath[batpathlen], "/power_now"); stlen = fileRead(stline, sizeof(stline), batpath); if (stlen > 0) { battW = atoi(stline); } /* Prettyprint */ if (chargeFull > 0) { chargePercent = chargeNow / (chargeFull / 100); } if (chargePercent <= 40) { if (chargePercent <= 25) { if (chargePercent <= 10) { fputs("^fg(red)", stdout); } else { // 11-25% fputs("^fg(orange)", stdout); } } else { // 26-40% fputs("^fg(yellow)", stdout); } } else { if (chargePercent > 70) { fputs("^fg(white)", stdout); } else { // 41-70% fputs("^fg(green)", stdout); } } battTime = (float)chargeNow / (float)battW; if (battW == 0) { // fully charged and not in use printf(" %s: %d%% _ _ ", batname, chargePercent); } else { printf(" %s: %d%% %.1fh %.1fW ", batname, chargePercent, battTime, (float)battW / 1000000.0); } }