Better file structure and build system
[sysstatus.git] / src / status / cpuusage.c
diff --git a/src/status/cpuusage.c b/src/status/cpuusage.c
new file mode 100644 (file)
index 0000000..1bb34ae
--- /dev/null
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "status/cpuusage.h"
+#include "config.h"
+
+#ifndef NUM_CPUS
+  #define NUM_CPUS 1
+#endif
+#ifndef CPU_HISTORY_SIZE
+  #define CPU_HISTORY_SIZE 1
+#endif
+#if CPU_HISTORY_SIZE < 1
+  #define CPU_HISTORY_SIZE 1
+#endif
+
+
+unsigned long last_cpu_used = 0;
+unsigned long last_cpu_total = 0;
+float cpu_history[CPU_HISTORY_SIZE]; // don't care about init values
+
+void status_cpuusage()
+{
+  double loadavg[3] = { -13.37, -13.37, -13.37 } ;
+
+  char *stline = NULL;
+  size_t stlen;
+  FILE *stfile;
+
+  unsigned long cpu_user;
+  unsigned long cpu_nice;
+  unsigned long cpu_sys;
+  unsigned long cpu_used;
+  unsigned long cpu_idle;
+  unsigned long cpu_total;
+  int i;
+
+
+  // Error signaling color
+  fputs("^fg(yellow)", stdout);
+
+  stfile = fopen("/proc/stat", "r");
+  if (stfile != NULL) {
+    for(i = CPU_HISTORY_SIZE - 1; i > 0; i--) {
+      cpu_history[i] = cpu_history[i - 1];
+    }
+
+    stlen = getline(&stline, &stlen, stfile);
+    fclose(stfile);
+
+    if ( 4 == sscanf(stline, "%*s %ld %ld %ld %ld",
+                    &cpu_user, &cpu_nice, &cpu_sys, &cpu_idle) ) {
+      cpu_used = cpu_user + cpu_nice + cpu_sys;
+      cpu_total = cpu_used + cpu_idle;
+
+      // Now do the percentage
+      cpu_history[0] = (float)(cpu_used - last_cpu_used) /
+                        (float)(cpu_total - last_cpu_total);
+
+      last_cpu_used = cpu_used;
+      last_cpu_total = cpu_total;
+
+
+      if (cpu_history[0] < 0.4) {
+        // CPU idling OK
+        fputs("^fg(#0077FF)", stdout);
+      } else {
+        // CPU busy
+        fputs("^fg(#FF00FF)", stdout);
+      }
+
+      //printf(" CPU: %.0f%% ", cpu_history[0] * 100);
+    }
+
+    free(stline);
+  }
+
+
+  if (getloadavg(loadavg, 3) > 0) {
+    printf(" %s%.0f,%.0f,%.0f,%.0f ",
+            cpu_history[0] < 0.1000 ? " " : "",
+            cpu_history[0] * 100,
+            loadavg[0] * (100 / 1),
+            loadavg[1] * (100 / 1),  // (100 / NUM_CPUS)
+            loadavg[2] * (100 / 1));
+  }
+
+  //fputs(" CPU usage ", stdout);
+}