#!/bin/sh

if [ `whoami` = "root" ] ; then
	/bin/false
else
	echo "Vous devez être root pour utiliser ce script"
	exit 1
fi

if [ -d /sys/devices/system/cpu/cpu0/cpufreq ] ; then
	cd /sys/devices/system/cpu/cpu0/cpufreq/
else
	echo "cpufreq innexistant"
	exit 2
fi

# Fréquence actuelle, minimale et maximale
if [ -f cpuinfo_cur_freq ] && [ -f cpuinfo_max_freq ] && [ -f cpuinfo_min_freq ] ; then
	cpuinfo_cur_freq=$(( `cat cpuinfo_cur_freq` / 1000 ))
	cpuinfo_max_freq=$(( `cat cpuinfo_max_freq` / 1000 ))
	cpuinfo_min_freq=$(( `cat cpuinfo_min_freq` / 1000 ))
else
	echo "cpuinfo* innexistant"
	exit 3
fi

# Fréquences disponibles
if [ -f scaling_available_frequencies ] ; then
	i=0
	for frequency in `cat scaling_available_frequencies` ; do
		i=$(($i+1))
		frequencies[$i]=$(($frequency / 1000))
		#echo $i - ${frequencies[$i]}
	done
else
	echo "scaling_available_frequencies innexistant"
	exit 3
fi

# Governors disonibles
if [ -f scaling_available_governors ] ; then
	i=0
	for governor in `cat scaling_available_governors` ; do
		i=$(($i+1))
		governors[$i]=$governor
		#echo $i - ${governors[$i]}
	done
else
	echo "scaling_available_governors innexistant"
	exit 3
fi

function getgovernor() {
	# Governor actuelle
	if [ -f scaling_governor ] ; then
		scaling_governor=`cat scaling_governor`
	else
		echo "scaling_governor innexistant"
		exit 3
	fi
}

function getfrequency() {
	# Frequence actuelle
	if [ -f scaling_cur_freq ] ; then
		scaling_cur_freq=$(( `cat scaling_cur_freq` / 1000 ))
	else
		echo "scaling_cur_freq innexistant"
		exit 3
	fi
}

getgovernor
getfrequency

function drawline() {
	local text=$1
	local textlen=${#text}
	local linelen=70
	local space=" "
	local spaces=""
	local i
	for i in `seq ${textlen} $(($linelen - 5))` ; do
		spaces="${spaces}${space}"
	done
	local result="| ${text}${spaces} |"
	echo "${result}"
}

function drawbar() {
	local linelen=70
	local space="-"
	local spaces=""
	local i
	for i in `seq ${textlen} $(($linelen - 2))` ; do
		spaces="${spaces}${space}"
	done
	local result="+${spaces}+"
	echo "${result}"
}

function drawtitle() {
	drawbar
	drawline "$1"
	drawbar
	drawline "Governors standards"
	drawline " - powersave : fréquence minimale, soit $cpuinfo_min_freq MHz"
	local userspace=" - userspace : au choix"
	local i=1
	while [ ${frequencies[$i]} ] ; do 
		userspace="${userspace} ${frequencies[$i]}"
		i=$(($i+1))
		if [ ${frequencies[$i]} ] ; then
			userspace="${userspace} /"
		else
			userspace="${userspace} MHz"
		fi
	done
	drawline "${userspace}"
	drawline " - performance : fréquence maximle, soit $cpuinfo_max_freq MHz"
	drawbar
	drawline "Actuelement : ${scaling_governor} / $scaling_cur_freq MHz"
	drawbar
}

#scaling_driver
#scaling_cur_freq
#scaling_max_freq
#scaling_min_freq

clear
mainmenu=9
until [ $mainmenu -eq 0 ] ; do
	
	drawtitle "Menu Principal"
	drawline "1 - Changer de Governor"
	if [ $scaling_governor = "userspace" ] ; then
		drawline "2 - Changer de Fréquence"
	fi
	drawline
	drawline "0 - Quitter"
	drawbar
	echo -n "Votre choix : "
	read mainmenu
	clear
	if [ $mainmenu = 1 ] ; then
		menugovernor=9
		until [ $menugovernor -eq 0 ] ; do
			drawtitle "Menu Governor"
			i=1
			while [ ${governors[$i]} ] ; do
				drawline "$i - ${governors[$i]}"
				i=$(($i+1))
			done
			drawline
			drawline "0 - Retour"
			drawbar
			echo -n "Votre choix : "
			read menugovernor
			clear
			if [ $(($menugovernor)) -gt $((0)) ] && [ $(($menugovernor)) -lt $(($i)) ] ; then
				echo ${governors[$menugovernor]} > scaling_governor
				getgovernor
				getfrequency
				if [ $scaling_governor = ${governors[$menugovernor]} ] ; then
					menugovernor=O
					break
				else
					echo "Foiré $scaling_governor != ${governors[$menugovernor]}"
				fi
			else
				if [ $menugovernor -ne 0 ] ; then
					echo "Les choix valides sont 0-$(($i-1))"
				fi
			fi
		done
	elif [ $mainmenu = 2 ] && [ $scaling_governor = "userspace" ] ; then
		menufreq=9
		until [ $menufreq -eq 0 ] ; do
			drawtitle "Menu Frequence"
			i=1
			while [ ${frequencies[$i]} ] ; do 
				drawline "$i - ${frequencies[$i]} MHz"
				i=$(($i+1))
			done
			drawline
			drawline "0 - Retour"
			drawbar
			echo -n "Votre choix : "
			read menufreq
			clear
			if [ $(($menufreq)) -gt $((0)) ] && [ $(($menufreq)) -lt $(($i)) ] ; then
				echo $((${frequencies[$menufreq]} * 1000)) > scaling_setspeed
				getfrequency
				if [ $scaling_cur_freq = ${frequencies[$menufreq]} ] ; then
					menugovernor=O
					break
				else
					echo "Foiré $scaling_cur_freq = ${frequencies[$menufreq]}"
					ls -l
				fi
			else
				if [ $menufreq -ne 0 ] ; then
					echo "Les choix valides sont 0-$(($i-1))"
				fi
			fi
		done
	fi
done

echo "Fin attendue du script"
