--- /dev/null
+#! /bin/sh
+
+proc_stat_parse() {
+ proc_stat="$1"
+ n='[0-9]\+'
+ echo "$proc_stat" \
+ | grep "^cpu$n $n $n $n $n $n $n $n $n $n $n$" \
+ | awk '
+ {
+ cpu = $1;
+ user = $2;
+ sys = $4;
+ idle = $5;
+
+ total = user + sys + idle;
+ busy = user + sys;
+
+ if (NR > 1) {printf " "};
+
+ out = sprintf("%s %d %d", cpu, total, busy);
+ #print out >> "cpu_usage_debug.txt";
+ printf "%s", out;
+ }
+ END {
+ #print "" >> "cpu_usage_debug.txt";
+ print "";
+ }
+ '
+}
+
+calc_delta() {
+ for proc_stat in "$1" "$2"; do
+ proc_stat_parse "$proc_stat"
+ done \
+ | awk '
+ {
+ t = NR;
+ for (i = 1; i <= (NF - 2); i += 3) {
+ cpu_count[t]++;
+ cpu_id = $i; # For occasional debugging
+ total = $(i + 1);
+ busy = $(i + 2);
+ cpu[cpu_count[t], "total", t] = total;
+ cpu[cpu_count[t], "busy" , t] = busy;
+ }
+ }
+
+ END {
+ for (c=1; c<=cpu_count[2]; c++) {
+ total_1 = cpu[c, "total", 1];
+ total_2 = cpu[c, "total", 2];
+ busy_1 = cpu[c, "busy" , 1];
+ busy_2 = cpu[c, "busy" , 2];
+ total_d = total_2 - total_1;
+ busy_d = busy_2 - busy_1;
+ percent_busy = (busy_d / total_d) * 100;
+
+ #printf(\
+ # "c: %d, total_1: %f total_2: %f, total_d: %f\n",
+ # c, total_1, total_2, total_d \
+ #) >> "cpu_usage_debug.txt";
+ #printf(\
+ # "c: %d, busy_1: %f busy_2: %f, busy_d: %f\n",
+ # c, busy_1, busy_2, busy_d \
+ #) >> "cpu_usage_debug.txt";
+ #printf(\
+ # "c: %d, percent_busy: %f\n",
+ # c, percent_busy \
+ #) >> "cpu_usage_debug.txt";
+
+ if (c > 1) {printf " "};
+ out = sprintf("%3.0f%%", percent_busy)
+ #printf "c: %d, out: %s\n", c, out >> "cpu_usage_debug.txt";
+ printf "%s", out;
+ }
+ #print "" >> "cpu_usage_debug.txt";
+ print "";
+ }
+ '
+}
+
+main() {
+ last_proc_stat="$HOME/var/run/cpu_usage_from_proc_since_last_check/last_proc_stat"
+
+ if [ ! -f "$last_proc_stat" ]
+ then
+ mkdir -p `dirname "$last_proc_stat"`
+ cat /proc/stat > "$last_proc_stat"
+ sleep 0.1
+ fi
+
+ previous=`cat $last_proc_stat`;
+ cat /proc/stat > "$last_proc_stat"
+ current=`cat $last_proc_stat`;
+
+ calc_delta "$previous" "$current"
+}
+
+main $@
--- /dev/null
+#! /bin/bash
+
+set -e
+
+BIN=$HOME/bin
+STATUS_DIR=$HOME/var/run/status
+STATUS_FILE__WIFI=$STATUS_DIR/wifi
+STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF=$STATUS_DIR/notified_energy_bellow_half
+
+#load=$(cat /proc/loadavg | awk '{printf "%4.2f %4.2f %4.2f", $1, $2, $3}')
+
+fan=$(awk '/^speed:/ {printf "%4d", $2}' /proc/acpi/ibm/fan)
+
+cpu=$($BIN/khatus_cpu_usage_from_proc_since_last_check)
+
+memory=$(
+ free \
+ | awk '
+ function round(n) {return int(n + 0.5)}
+
+ $1 == "Mem:" {
+ total=$2;
+ used=$3;
+ cache=$6;
+ file = "/home/siraaj/var/run/status/memory_used_percentage";
+ curr = round(used / total * 100);
+ getline prev < file;
+ print curr > file;
+ if (curr > prev) {
+ direction = ">";
+ } else if (curr < prev) {
+ direction = "<";
+ } else {
+ direction = "=";
+ }
+ printf("%s%d%%", direction, curr);
+ }')
+
+temp=$(awk 'NR == 1 {print $1 / 1000}' /sys/class/thermal/thermal_zone0/temp)
+
+disk=$(
+ df \
+ | awk '
+ function round(n) {return int(n + 0.5)}
+
+ $1 == "/dev/mapper/kubuntu--vg-root" {
+ total = $2;
+ used = $3;
+ file = "/home/siraaj/var/run/status/disk_space_used_percentage";
+ curr = round(used / total * 100);
+ getline prev < file;
+ print curr > file;
+ if (curr > prev) {
+ direction = ">";
+ } else if (curr < prev) {
+ direction = "<";
+ } else {
+ direction = "=";
+ }
+ printf("%s%d%%", direction, curr);
+ }')
+
+energy=$(
+ upower -e \
+ | grep battery \
+ | xargs upower -i \
+ | awk '
+ /^ +percentage: +/ {percentage=$2}
+ /^ +state: +/ {state=$2}
+ END {
+ if (state == "discharging") {
+ direction_of_change = "<"
+ } else if (state == "charging") {
+ direction_of_change = ">"
+ } else {
+ direction_of_change = "="
+ };
+ printf("%s%s", direction_of_change, percentage)
+ }')
+
+datetime=$(date +'%a, %b %d, %H:%M:%S')
+
+#volume_amixer=$(
+# amixer get Master \
+# | tail -1 \
+# | awk '
+# {
+# level = $4;
+# sub("^\\[", "", level);
+# sub("\\]$", "", level);
+# print level;
+# }' \
+# )
+
+#volume_amixer=$(
+# amixer get Master \
+# | tail -n 1 \
+# | awk '{print $4}' \
+# | tr -d '[]'
+#)
+
+volume_pactl=$(
+ pactl list sinks \
+ | awk '
+ /^\tMute:/ {
+ printf("%s,", $0);
+ }
+ /^\tVolume:/ {
+ for (i=2; i<=NF; i++) printf(" %s", $i);
+ }' \
+ | awk -v RS=',' '
+ /^[ \t]*Mute:/ {mute = $2}
+ /^[ \t]*front-left:/ {left = $4}
+ /^[ \t]*front-right:/ {right = $4}
+ END {
+ if (mute == "yes") {
+ printf("x")
+ } else {
+ printf("%s %s", left, right)
+ }
+ }
+ '
+)
+
+volume="[$volume_pactl]"
+
+wifi=$(cat $STATUS_FILE__WIFI)
+
+screen_brightness=$(
+ max=$(cat /sys/class/backlight/acpi_video0/max_brightness)
+ cur=$(cat /sys/class/backlight/acpi_video0/brightness)
+ awk -v max=$max -v cur=$cur 'BEGIN {printf("%d%%", cur/max*100)}'
+)
+
+#bluetooth_status=$(
+# grep '^status:' /proc/acpi/ibm/bluetooth \
+# | awk '
+# $2 == "disabled" {printf "off"}
+# $2 == "enabled" {printf "on"}
+# '
+#)
+
+bluetooth_power=$(
+ echo -e 'show \n quit' \
+ | bluetoothctl \
+ | awk '
+ /^Controller / {
+ controller = $2;
+ controllers[++ctrl_count] = controller;
+ }
+ /^\t[A-Z][A-Za-z]+:/ {
+ key = $1;
+ sub(":$", "", key);
+ val = $2;
+ for (i=3; i<=NF; i++) {
+ val = val " " $i};
+ data[controller, key] = val;
+ }
+ END {
+ # Using the 1st seen controller. Should we select specific instead?
+ power_status = data[controllers[1], "Powered"];
+ if (ctrl_count > 0) {
+ if (power_status == "no") {
+ power_status = "off"
+ } else if (power_status == "yes") {
+ power_status = "on"
+ } else {
+ printf("Unexpected bluetooth power status: %s\n", power_status)\
+ > "/dev/stderr";
+ power_status = "ERROR"
+ }
+ } else {
+ power_status = "off" # TODO: Perhaps use differentiated marker?
+ }
+ printf("%s", power_status);
+ }'
+)
+
+#touchpad_status=$(
+# xinput list-props 12 \
+# | awk '
+# /^\tDevice Enabled \([0-9]+\):/ {
+# status = $4;
+# printf("%s", status);
+# }'
+#)
+
+#color_off='\033[0m'
+#color_on_bg_gray='\033[m\033[40m'
+
+energy_direction=$(echo "$energy" | cut -b 1)
+energy_percentage=$(echo "$energy" | tr -d '<>=%')
+if [[ "$energy_direction" = '<' ]]
+then
+ if [[ $energy_percentage -le 5 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy CRITICALLY low: $energy" \
+ 'CHARGE NOW!!! GO GO GO!!!'
+ elif [[ $energy_percentage -le 10 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy VERY low: $energy" \
+ 'Plug it in ASAP.'
+ elif [[ $energy_percentage -le 15 ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u critical \
+ "Energy low: $energy" \
+ 'Get the charger.'
+ elif [[ $energy_percentage -le 50 ]]
+ then
+ if [[ ! -a "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" ]]
+ then
+ DISPLAY=:0.0 notify-send \
+ -u normal \
+ "Energy bellow half: $energy" \
+ 'Where is the charger?'
+ touch "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
+ fi
+ fi
+else
+ rm -f "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
+fi
+
+weather="$(cat ~/var/run/metar-KJFK-decoded-temp-fahrenheit)°F"
+
+signal_last_msg_age=$(
+ ls -lt --time-style=+%s $HOME/var/lib/signal/latest_message.json \
+ | awk -v now_seconds=$(date +%s) \
+ '{
+ mtime_seconds = $6;
+ seconds = now_seconds - mtime_seconds;
+ minutes = seconds / 60;
+ hours = minutes / 60;
+ days = hours / 24;
+ weeks = days / 7;
+ months = days / 30;
+ #fmt = "%.1f";
+ fmt = "%d";
+ #printf(fmt " s\n", seconds);
+ printf(fmt " m\n", minutes);
+ printf(fmt " h\n", hours);
+ printf(fmt " d\n", days);
+ printf(fmt " w\n", weeks);
+ printf(fmt " mo\n", months);
+ }' \
+ | awk '$1 >= 1' \
+ | sort -n -k 1 \
+ | head -1 \
+ | tr -d ' '
+)
+
+echo \
+"\
+ E$energy\
+ M$memory\
+ D$disk\
+ C=[$cpu ${temp}°C ${fan}rpm]\
+ |\
+ S=$screen_brightness\
+ V=$volume\
+ B:$bluetooth_power\
+ W:$wifi\
+ |\
+ $weather\
+ \
+ $datetime \
+"