|
1 | 1 | #!/usr/bin/env sh
|
2 | 2 |
|
3 |
| -# CPU model |
4 |
| -model=$(cat /proc/cpuinfo | grep 'model name' | head -n 1 | awk -F ': ' '{print $2}') |
5 |
| - |
6 |
| -# CPU utilization |
7 |
| -utilization=$(top -bn1 | awk '/^%Cpu/ {print 100 - $8}') |
8 |
| - |
9 |
| -# Clock speed |
10 |
| -freqlist=$(cat /proc/cpuinfo | grep "cpu MHz" | awk '{ print $4 }') |
11 |
| -maxfreq=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq | sed 's/...$//') |
12 |
| -frequency=$(echo $freqlist | tr ' ' '\n' | awk "{ sum+=\$1 } END {printf \"%.0f/$maxfreq MHz\", sum/NR}") |
13 |
| - |
14 |
| -# CPU temp |
15 |
| -sensorsdata=$(sensors) |
16 |
| -temp=$(awk '/Package id 0/ {print $4}' <<< "$sensorsdata" | awk -F '[+.]' '{print $2}') |
17 |
| -if [ -z "$temp" ]; then |
18 |
| - temp=$(awk '/Tctl/ {print $2}' <<< "$sensorsdata" | tr -d '+°C') |
19 |
| -fi |
20 |
| -if [ -z "$temp" ]; then |
21 |
| - temp="N/A" |
| 3 | +map_floor() { |
| 4 | + |
| 5 | + IFS=', ' read -r -a pairs <<< "$1" |
| 6 | + |
| 7 | + if [[ ${pairs[-1]} != *":"* ]]; then |
| 8 | + def_val="${pairs[-1]}" |
| 9 | + unset 'pairs[${#pairs[@]}-1]' |
| 10 | + fi |
| 11 | + for pair in "${pairs[@]}"; do |
| 12 | + IFS=':' read -r key value <<< "$pair" |
| 13 | + if [ ${2%%.*} -gt $key ]; then |
| 14 | + echo "$value" |
| 15 | + return |
| 16 | + fi |
| 17 | + done |
| 18 | + [ -n "$def_val" ] && echo $def_val || echo " " |
| 19 | +} |
| 20 | + |
| 21 | +# Define glyphs |
| 22 | +if [[ $NO_EMOJI -eq 1 ]]; then |
| 23 | + temp_lv="85:, 65:, 45:☁, ❄" |
22 | 24 | else
|
23 |
| - temp=`printf "%.0f\n" $temp` |
| 25 | + temp_lv="85:🌋, 65:🔥, 45:☁️, ❄️" |
24 | 26 | fi
|
| 27 | +util_lv="90:, 60:, 30:, " |
25 | 28 |
|
26 |
| -# map icons |
27 |
| -set_ico="{\"thermo\":{\"0\":\"\",\"45\":\"\",\"65\":\"\",\"85\":\"\"},\"emoji\":{\"0\":\"❄️\",\"45\":\"☁️\",\"65\":\"🔥\",\"85\":\"🌋\"},\"util\":{\"0\":\"\",\"30\":\"\",\"60\":\"\",\"90\":\"\"}}" |
28 |
| -eval_ico() { |
29 |
| - map_ico=$(echo "${set_ico}" | jq -r --arg aky "$1" --argjson avl "$2" '.[$aky] | keys_unsorted | map(tonumber) | map(select(. <= $avl)) | max') |
30 |
| - echo "${set_ico}" | jq -r --arg aky "$1" --arg avl "$map_ico" '.[$aky] | .[$avl]' |
31 |
| -} |
| 29 | +# Get static CPU information |
| 30 | +model=$(lscpu | awk -F': ' '/Model name/ {gsub(/^ *| *$| CPU.*/,"",$2); print $2}') |
| 31 | +maxfreq=$(lscpu | awk '/CPU max MHz/ { sub(/\..*/,"",$4); print $4}') |
| 32 | + |
| 33 | +# Get CPU stat |
| 34 | +statFile=$(cat /proc/stat | head -1) |
| 35 | +prevStat=$(awk '{print $2+$3+$4+$6+$7+$8 }' <<< $statFile) |
| 36 | +prevIdle=$(awk '{print $5 }' <<< $statFile) |
| 37 | + |
| 38 | +while true; do |
| 39 | + # Get CPU stat |
| 40 | + statFile=$(cat /proc/stat | head -1) |
| 41 | + currStat=$(awk '{print $2+$3+$4+$6+$7+$8 }' <<< $statFile) |
| 42 | + currIdle=$(awk '{print $5 }' <<< $statFile) |
| 43 | + diffStat=$((currStat-prevStat)) |
| 44 | + diffIdle=$((currIdle-prevIdle)) |
| 45 | + |
| 46 | + # Get dynamic CPU information |
| 47 | + utilization=$(awk -v stat="$diffStat" -v idle="$diffIdle" 'BEGIN {printf "%.1f", (stat/(stat+idle))*100}') |
| 48 | + temperature=$(sensors | awk -F': ' '/Package id 0|Tctl/ { gsub(/^ *\+?|\..*/,"",$2); print $2; f=1; exit} END { if (!f) print "N/A"; }') |
| 49 | + frequency=$(cat /proc/cpuinfo | awk '/cpu MHz/{ sum+=$4; c+=1 } END { printf "%.0f", sum/c }') |
| 50 | + |
| 51 | + # Generate glyphs |
| 52 | + icons=$(echo "$(map_floor "$util_lv" $utilization)$(map_floor "$temp_lv" $temperature)") |
| 53 | + speedo=$(echo ${icons:0:1}) |
| 54 | + thermo=$(echo ${icons:1:1}) |
| 55 | + emoji=$(echo ${icons:2}) |
32 | 56 |
|
33 |
| -thermo=$(eval_ico thermo $temp) |
34 |
| -emoji=$(eval_ico emoji $temp) |
35 |
| -speedo=$(eval_ico util $utilization) |
| 57 | + # Print the output |
| 58 | + echo "{\"text\":\"$thermo $temperature°C\", \"tooltip\":\"$model\n$thermo Temperature: $temperature°C $emoji\n$speedo Utilization: $utilization%\n Clock Speed: $frequency/$maxfreq MHz\"}" |
36 | 59 |
|
37 |
| -# Print cpu info (json) |
38 |
| -echo "{\"text\":\"${thermo} ${temp}°C\", \"tooltip\":\"${model}\n${thermo} Temperature: ${temp}°C ${emoji}\n${speedo} Utilization: ${utilization}%\n Clock Speed: ${frequency}\"}" |
| 60 | + # Store state and sleep |
| 61 | + prevStat=$currStat |
| 62 | + prevIdle=$currIdle |
| 63 | + sleep 5 |
| 64 | +done |
0 commit comments