# init functions for LNS
# Copyright (c) 2013 Paratronic S.A.
# All rights reserved.
#

echo_lcd() {
	[ -e /sys/devices/virtual/tty/tty0/active ] && echo "$@" > /dev/$(cat /sys/devices/virtual/tty/tty0/active)
}

console_on() {
	[ -d  /sys/module/fbcon ] || modprobe -s fbcon
        # switch off lcd cursor
        echo_lcd -n -e '\e[?17;0;0c'
}

lcd_on() {
	head -1 /sys/class/graphics/fb0/modes > /sys/class/graphics/fb0/mode
	echo 0 > /sys/class/backlight/backlight/bl_power
        # switch off lcd cursor
        echo_lcd -n -e '\e[?17;0;0c'
	# remove screensaver
	echo_lcd -e "\033[13]"
	echo "lcd_backlight on" > /dev/ttyS3
}

lcd_off() {
	local fb_sz
	echo "lcd_backlight off" > /dev/ttyS3
	echo 4 > /sys/class/backlight/backlight/bl_power
	if [ -e /sys/class/graphics/fb0/virtual_size ] && [ -e /dev/fb0 ]; then
		fb_sz=$(( $(cat /sys/class/graphics/fb0/bits_per_pixel) / 8 ))
		fb_sz=$(( $(tr ',' '*' < /sys/class/graphics/fb0/virtual_size) * fb_sz ))
		dd if=/dev/zero bs=$fb_sz count=1 of=/dev/fb0 2>/dev/null
	fi
	# enable screensaver
	echo_lcd -e "\033[9;1]"
}

clear_console() {
	echo_lcd -e "\033[H""\033[J"
}

gpio_val() {
	[ -f $1/value ] || return 0;
	return $(cat $1/value)
}

log() {
	local prio verbose
	prio=$1
	shift
	if [ "$prio" != "debug" ] ; then
		verbose="-s"
	fi
	logger $verbose -t $0 -p local1.$prio "$@"
}

echo_both() {
	echo_lcd
	echo_lcd $@
	log info "$@"
	echo "$@" > /dev/console
}

kill_group() {
	local pretty_name prog_name pgid pid
	pretty_name=$1
	shift
	prog_name=$1
	shift

	if [ $# = 1 ]; then
		pidfile=$1
		shift
	else
		pidfile=/var/run/$prog_name.pid
	fi

	echo -n "Stopping $pretty_name: "
	pid=$(head $pidfile 2>/dev/null)
	if [ -z "$pid" ]; then
		# no pid file ? just get out
		echo "OK"
		return 0
	fi
	pgid=$(cat /proc/$pid/stat 2>/dev/null | cut -d ' ' -f 5)
	if [ -z "$pgid" ]; then
		echo "OK"
		return 0
	fi
	kill -s TERM -$pgid
	echo "OK"
}

stop_pid() {
	local i pid max_time

	pid=$1
	shift
	max_time=$1
	shift

	kill $pid 2>/dev/null
	for i in $(seq 1 $max_time) ; do
		# pidof doesn't check for zombie state
		head -2 /proc/$pid/status 2>/dev/null | tail -1 | grep -q -v zombie
		if [ $? -eq 1 ]; then
			return 0
		fi
		sleep 1
	done
	kill -9 $pid 2>/dev/null
	return 1
}

daemon_stop() {
	local pretty_name prog_name stopped pid

	pretty_name=$1
	shift
	prog_name=$1
	shift
	
	if [ $# = 1 ]; then
		pidfile=$1
		shift
	else
		pidfile=/var/run/$prog_name.pid
	fi

	stopped=0
	echo -n "Stopping $pretty_name: "
	start-stop-daemon -K -q -p $pidfile
	pid=$(head $pidfile 2>/dev/null)
	if [ -z "$pid" ]; then
		# no pid file ? just get out
		echo "OK"
		return 0
	fi
	for i in $(seq 1 50) ; do
		# kill 0 report 0 even if the process is a zombie
		# so we have to use this trick
		head -2 /proc/$pid/status 2>/dev/null | tail -1 | grep -q -v zombie
		if [ $? -eq 1 ] ; then
			stopped=1
			break;
		fi
		echo -n "."
		usleep 1
	done
	if [ $stopped -ne 1 ] ; then
		log err "Failed to stop $prog_name daemon. Sending SIGKILL"
		start-stop-daemon -s 9 -K -q -p $pidfile
		for i in $(seq 1 20) ; do
			head -2 /proc/$pid/status 2>/dev/null | tail -1 | grep -q -v zombie
			if [ $? -eq 1 ] ; then
				stopped=1
				break;
			fi
			echo -n "."
			usleep 1
		done
	fi

	if [ "$stopped" -eq 1 ]; then
		echo "OK"
		rm -f "$pidfile"
	else
		echo "Failed"
	fi
}

ubi_get_vol_nb() {
	local i
	for i in $(find /sys/class/ubi/ -name "ubi*_*") ; do
		if [ x"$(cat $i/name)" = x"$1" ]; then
			echo $(basename $i);
		 fi;
	 done
}

wait4process() {
	local i name max_time

	name=$1
	shift
	max_time=$1
	shift

	for i in $(seq 1 $max_time) ; do
		pidof $name 1>/dev/null 2>/dev/null
		if [ $? -eq 0 ]; then
			return 0
		fi
		sleep 1
	done
	return 1
}
