diff options
Diffstat (limited to 'src/status/battery.c')
-rw-r--r-- | src/status/battery.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/status/battery.c b/src/status/battery.c new file mode 100644 index 0000000..34bfcc0 --- /dev/null +++ b/src/status/battery.c @@ -0,0 +1,104 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +#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); + } +} |