Better file structure and build system
[sysstatus.git] / src / status / battery.c
diff --git a/src/status/battery.c b/src/status/battery.c
new file mode 100644 (file)
index 0000000..34bfcc0
--- /dev/null
@@ -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);
+  }
+}