#!/bin/bash

# defines
CPU_DIR="/sys/devices/system/cpu"
GPU_DIR="/sys/class/kgsl/kgsl-3d0"

# helper functions
fileexists() {
  [ `adb shell "[ -f $1 ] && echo found"` ]
}
getprop() {
  if fileexists $1; then
    echo `adb shell cat $1 | tr -d '\r'`
  else
    echo "FILE $1 NOT FOUND"
  fi
}
setprop() {
  if fileexists $1; then
    adb shell "echo -n $2 > $1"
  else
    echo "FILE $1 NOT FOUND"
  fi
}

# setup
echo
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
  adb root
  adb wait-for-device
fi

# device name
echo Device: `adb shell getprop ro.product.model`
echo

# collect and count all cores
frequency=
frequencies=
cores=`adb shell ls /sys/devices/system/cpu/ | grep cpu[0-9].* | tr -d '\r'`
for core in $cores; do

  # display cpu
  echo "$core:"

  # display current status
  if fileexists $CPU_DIR/$core/online && [ `getprop $CPU_DIR/$core/online` -eq 0 ]; then
    echo "  Status: OFFLINE"
  else
    echo "  Status: ONLINE"
  fi

  # display available frequencies
  if fileexists $CPU_DIR/$core/cpufreq/scaling_available_frequencies; then
    frequencies=(`getprop $CPU_DIR/$core/cpufreq/scaling_available_frequencies`)
  elif fileexists $CPU_DIR/$core/cpufreq/stats/time_in_state; then
    frequencies=(`adb shell cat $CPU_DIR/$core/cpufreq/stats/time_in_state | cut -f1 -d " " | tr -d '\r'`)
  fi
  frequencies=( `printf "%s\n" "${frequencies[@]}" | sort -n` )
  echo "  Available Frequencies: ${frequencies[@]} (Hz)"

  # display current frequency
  if fileexists $CPU_DIR/$core/cpufreq/scaling_cur_freq; then
    frequency=`getprop $CPU_DIR/$core/cpufreq/scaling_cur_freq`
  fi
  echo "  Current Frequency: $frequency (Hz)"

done

# poll gpu
echo
echo "GPU:"

# get available gpu frequencies in sorted order
if fileexists $GPU_DIR/devfreq/available_frequencies; then
  frequencies=(`getprop $GPU_DIR/devfreq/available_frequencies`)
elif fileexists $GPU_DIR/gpu_available_frequencies; then
  frequencies=(`getprop $GPU_DIR/gpu_available_frequencies`)
elif fileexists /d/clock/gbus/possible_rates; then
  frequencies=(`getprop /d/clock/gbus/possible_rates`)
else
  echo "  Unable to find available GPU frequencies"
  echo
  exit
fi
frequencies=( `printf "%s\n" "${frequencies[@]}" | sort -n` )
if [ ${frequencies[0]} == "(kHz)" ]; then
  frequencies=(`printf "%s000\n" "${frequencies[@]:1}"`)
fi
echo "  Available Frequencies: ${frequencies[@]} (Hz)"

# collect and print current gpu frequency
if fileexists $GPU_DIR/max_gpuclk; then
  freq=`getprop $GPU_DIR/max_gpuclk`
elif fileexists /d/clock/override.gbus/rate; then
  freq=`getprop /d/clock/override.gbus/rate`
else
  echo "ERROR: unable to find current GPU frequency"
  exit
fi
echo "  Current Frequency: $freq (Hz)"
echo


