#!/bin/bash
do {
	#////////////////////////////////////
	# DietPi CPU Info Script
	#
	#////////////////////////////////////
	# Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com
	#
	#////////////////////////////////////
	#
	# Info:
	# - Prints CPU information
	#
	# Usage:
	# - /DietPi/dietpi/dietpi-cpuinfo 		Obtain stats and print
	# - /DietPi/dietpi/dietpi-cpuinfo 2 	Generates file of available, ordered scaling freq's "$FP_CPU_SCALINGAVAILABLE_FREQ"
	#////////////////////////////////////

	#Grab Input
	setvar INPUT = '0'
	if [[ $1 =~ ^-?[0-9]+$ ]] {

		setvar INPUT = "$1"

	}

	#Import DietPi-Globals ---------------------------------------------------------------
	source /DietPi/dietpi/func/dietpi-globals
	G_CHECK_ROOT_USER
	export G_PROGRAM_NAME='DietPi-CPU_info'
	#Import DietPi-Globals ---------------------------------------------------------------

	#Exit path for VM
	if (( $G_HW_MODEL == 20 )) {

		echo -e "\nNotice: CPU information is not available for VM.\n"
		exit

	}

	#Funcs
	setvar CPU_GOV_CURRENT = ''Unknown''

	setvar aCPU_CURRENT_FREQ = '0'
	setvar aCPU_MIN_FREQ = '0'
	setvar aCPU_MAX_FREQ = '0'
	setvar aCPU_SCALINGAVAILABLE_FREQ = '0'
	setvar CPU_SCALINGSUPPORTED = '1'
	setvar FP_CPU_SCALINGAVAILABLE_FREQ = ''/tmp/dietpi-available_cpu_freqs''
	proc Obtain_Cpu_Freq {

		for ((i=0; i<$(nproc --all); i++))
		do

			if [ -f /sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq ]; then

				aCPU_CURRENT_FREQ[$i]=$(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq)

			fi

			if [ -f /sys/devices/system/cpu/cpu$i/cpufreq/scaling_min_freq ]; then

				aCPU_MIN_FREQ[$i]=$(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_min_freq)

			fi

			if [ -f /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq ]; then

				aCPU_MAX_FREQ[$i]=$(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq)

			fi

		done

		#Obtain available scaling freqs:
		# - Standard
		if test -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies {

			for ((i=0; i<$(nproc --all); i++))
			do

				aCPU_SCALINGAVAILABLE_FREQ[$i]=$(cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_available_frequencies | tr ' ' '\n' | sed -e 's/[^0-9]//g' | sed '/^$/d')

			done

		# - XU4 3.x
		} elif test -f /sys/devices/system/cpu/cpufreq/mp-cpufreq/cpu_freq_table {

			setvar aCPU_SCALINGAVAILABLE_FREQ[0]=$(cat /sys/devices/system/cpu/cpufreq/mp-cpufreq/cpu_freq_table | tr ' ' '\n' | sed -e 's/[^0-9]//g' | sed '/^$/d')

		} else {

			setvar CPU_SCALINGSUPPORTED = '0'

		}

	}

	setvar CPU_TEMP_CURRENT = ''Unknown''
	setvar CPU_TEMP_PRINT = ''Unknown''


	proc Obtain_Cpu_Temp {

		setvar CPU_TEMP_CURRENT = $(G_OBTAIN_CPU_TEMP)

		local cpu_temp_current_f='Unknown'
		if [[ $CPU_TEMP_CURRENT =~ ^-?[0-9]+$ ]] {

			setvar cpu_temp_current_f = $(( ( $CPU_TEMP_CURRENT * 9 / 5 ) + 32 ))
			if (( $CPU_TEMP_CURRENT >= 70 )) {

				setvar CPU_TEMP_PRINT = ""\e[91mWarning: $CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f | Reducing the life of your device.\e[0m""

			} elif (( $CPU_TEMP_CURRENT >= 60 )) {

				setvar CPU_TEMP_PRINT = ""\e[38;5;202m$CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f\e[90m | Running hot, not recommended.\e[0m""

			} elif (( $CPU_TEMP_CURRENT >= 50 )) {

				setvar CPU_TEMP_PRINT = ""\e[93m$CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f\e[0m \e[90m | Running warm, but safe.\e[0m""

			} elif (( $CPU_TEMP_CURRENT >= 40 )) {

				setvar CPU_TEMP_PRINT = ""\e[92m$CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f\e[0m\e[90m | Optimal temperature.\e[0m""

			} elif (( $CPU_TEMP_CURRENT >= 30 )) {

				setvar CPU_TEMP_PRINT = ""\e[96m$CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f\e[0m\e[90m | Cool runnings.\e[0m""

			} else {

				setvar CPU_TEMP_PRINT = ""\e[96m$CPU_TEMP_CURRENT'c : $cpu_temp_current_f'f \e[0m \e[90m| Who put me in the freezer!\e[0m""

			}

		} else {

				setvar CPU_TEMP_PRINT = ""\e[91mKERNELERR: $CPU_TEMP_CURRENT'c\e[0m""

		}

	}

	proc Obtain_Cpu_Gov {

		if test -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor {

			setvar CPU_GOV_CURRENT = $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)

		}

	}

	proc Print_Stats {

		echo -e ""
		echo -e " \e[38;5;154m─────────────────────────────────────────────────────\e[0m\n \e[1mDietPi CPU Info\e[0m\n\e[90m Use dietpi-config to change CPU / performance options\e[0m\n \e[38;5;154m─────────────────────────────────────────────────────\e[0m"

		#Processor Type
		echo -e " Architecture \e[90m|\e[0m     $(uname -m)"

		#Current Temp
		echo -e " Temp         \e[90m|\e[0m     $CPU_TEMP_PRINT"

		#Current Gov
		echo -e " Governor     \e[90m|\e[0m     $CPU_GOV_CURRENT"

		if test $CPU_GOV_CURRENT = "ondemand" ||
			test $CPU_GOV_CURRENT = "conservative" {

			echo -e " Throttle up  \e[90m|\e[0m     $(cat /DietPi/dietpi.txt | grep -m1 '^CONFIG_CPU_USAGE_THROTTLE_UP=' | sed 's/.*=//')% CPU usage"

		}

		#Current Frequency
		echo -e ""
		echo -e " \e[90m                Current Freq    Min Freq   Max Freq\e[0m"
		for ((i=0; i<${#aCPU_CURRENT_FREQ[@]}; i++))
		do

			echo -e " \e[90mCPU$i\e[0m         \e[90m|\e[0m      $(( ${aCPU_CURRENT_FREQ[$i]} / 1000 )) MHz      \e[90m$(( ${aCPU_MIN_FREQ[$i]} / 1000 )) MHz    $(( ${aCPU_MAX_FREQ[$i]} / 1000 )) MHz\e[0m"

		done

		echo -e ""

		#CPU scaling may bump up with script
		G_DIETPI-NOTIFY 2 'CPU current frequency, may be affected by this script, due to the processing required to run it.\n'

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Main Loop
	#/////////////////////////////////////////////////////////////////////////////////////
	#-----------------------------------------------------------------------------------

	#Return mode
	if (( $INPUT == 2 )) {

		Obtain_Cpu_Freq

		#	Export to file
		rm $FP_CPU_SCALINGAVAILABLE_FREQ &> /dev/null

		if (( $CPU_SCALINGSUPPORTED )) {

			for ((i=0; i<${#aCPU_SCALINGAVAILABLE_FREQ[@]}; i++))
			do

				echo -e "${aCPU_SCALINGAVAILABLE_FREQ[$i]}" >> "$FP_CPU_SCALINGAVAILABLE_FREQ"

			done

			#	Order, remove dupes
			sort -u -n $FP_CPU_SCALINGAVAILABLE_FREQ -o $FP_CPU_SCALINGAVAILABLE_FREQ

		}

	#Print all stats
	} else {

		Obtain_Cpu_Freq
		# Obtain_Cpu_Usage
		Obtain_Cpu_Temp
		Obtain_Cpu_Gov

		Print_Stats

	}

	#-----------------------------------------------------------------------------------
	#Delete[] array
	unset aCPU_CURRENT_FREQ
	unset aCPU_MIN_FREQ
	unset aCPU_MAX_FREQ
	unset aCPU_SCALINGAVAILABLE_FREQ
	unset afp_temperature
	#-----------------------------------------------------------------------------------
	exit
	#-----------------------------------------------------------------------------------
}