#!/bin/bash

C_LRED='\033[1;31m'
C_LGREEN='\033[1;32m'
C_LCYAN='\033[1;36m'
C_NC='\033[0m'
C_BLINK='\033[5m'
C_BOLD='\033[1m'


PING_ADDR="192.168.10.1"
MAC_ADDR=""
ETH_NAME="eth0"
SUMMARY_PATH="/tmp/list"
JIG_PATH="/root/.falinux/prime_jig/"
RESULT_LOG="${JIG_PATH}result_log"
THREAD_FUNC_SCRIPT="${JIG_PATH}thread_func.sh"
FRAM_TEST_APP="${JIG_PATH}fram_test"
COMPLETE_TEST_NAME=""

function Init()
{

	if [ -f "${SUMMARY_PATH}" ]; then
		rm -rf ${SUMMARY_PATH}
	fi
}

function summary()
{
	clear
	echo -e ""
	echo -e "============================"
	echo -e "        Test Summary        "
	echo -e "============================"
	cat $SUMMARY_PATH
	echo -e "============================"
	echo -e " MAC: ${MAC_ADDR}"
	echo -e "============================"
	echo -e ""
	echo -e ""
}

function save_result()
{
	echo -e "" >> ${RESULT_LOG}
	echo -e "============================" >> ${RESULT_LOG}
	echo -e "        Test Summary        " >> ${RESULT_LOG}
	echo -e "============================" >> ${RESULT_LOG}
	cat $SUMMARY_PATH >> ${RESULT_LOG}
	echo -e "============================" >> ${RESULT_LOG}
	echo -e " MAC: ${MAC_ADDR}" >> ${RESULT_LOG}
	echo -e "============================" >> ${RESULT_LOG}
	echo -e "" >> ${RESULT_LOG}
	echo -e "" >> ${RESULT_LOG}
	sync
}

function error_check()
{
	if [ "$1" != "0" ]; then
		echo -e "[${C_LRED}ERR${C_NC}]: $2" >> $SUMMARY_PATH
	else
		echo -e "[${C_LGREEN} OK${C_NC}]: $2" >> $SUMMARY_PATH
	fi
}


function test_mac()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}


	for i in 0xfa 0xfb 0xfc 0xfd 0xfe 0xff
	do
		if [ "$i" == "0xfa" ]; then
			EEPROM_MAC=$(i2cget -f -y 1 0x50 $i b | sed 's/0x//')
		else
			EEPROM_MAC+=$(i2cget -f -y 1 0x50 $i b | sed 's/0x/:/')
		fi
	done

	MAC_ADDR="${EEPROM_MAC^^}"

	ETH_MAC=$(ifconfig | grep eth0 | awk {'print $5'})

	if [ "${EEPROM_MAC^^}" = "${ETH_MAC^^}" ]; then
		return $?
	else
		return -1
	fi
}

function check_ping()
{
	for i in 1 2 3 4
	do
		sleep 1
		ping -c 1 -w 1 $PING_ADDR > /dev/null
		if [ "$?" = "0" ]; then
			return $?
		fi
	done

	return -1
}

function check_ethernet()
{
	echo "Check Ethernet Link Up/Down"
	if [ $(cat /sys/class/net/$1/operstate) = "up" ]; then
		return 0
	else
		ifconfig eth0 up
		return -1
	fi
}

function test_ethernet()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	IFACE="$1"

	for i in {1..10}
	do
		check_ethernet $IFACE
		if [ "$?" = "0" ]; then
			break
		else
			echo "$IFACE Link is down"
		fi
		sleep 1
	done

	udhcpc -i eth0 -n -q
	if [ "$?" != 0 ]; then
		return -1
	fi

	check_ping
	if [ "$?" != 0 ]; then
		return -1
	fi
	
	return $?
}

function test_rtc()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	ls /dev/rtc0
	if [ "$?" != 0 ]; then
		return -1
	fi

	return $?
}

TOUCH_IC_NAME="TSC2007"
function test_touch()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	cat /proc/bus/input/devices | grep $TOUCH_IC_NAME
	if [ "$?" != "0" ]; then
		return -1
	fi

	hexdump /dev/input/event0 &
	if [ "$?" != "0" ]; then
		return -1
	fi

	echo -e ""
	echo -e "${C_BLINK}${C_BOLD}Press any key to ${FUNCNAME} exit...${C_NC}"
	echo -e ""
	read -rs

	killall hexdump

	return 0
}

BACK_LIGHT="/sys/class/backlight/backlight_lvds.19/brightness"
function test_lcd()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	fb-test
	if [ "$?" != 0 ]; then
		return -1
	fi

	sleep 1
	echo 0 > $BACK_LIGHT

	sleep 1
	echo 10 > $BACK_LIGHT

	sleep 1
	echo 0 > $BACK_LIGHT

	sleep 1
	echo 10 > $BACK_LIGHT

	sleep 1
	echo 0 > $BACK_LIGHT

	sleep 1
	echo 5 > $BACK_LIGHT
	
	return $?
}

function test_encoder()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	${THREAD_FUNC_SCRIPT} evtest &
	if [ "$?" != 0 ]; then
		return -1
	fi

	echo -e ""
	echo -e "${C_BLINK}${C_BOLD}Press any key to ${FUNCNAME} exit...${C_NC}"
	echo -e ""
	read -rs

	killall evtest

	return $?
}

WAV_FILE="${JIG_PATH}opening.wav"
function test_audio()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	aplay $WAV_FILE
	if [ "$?" != "0" ]; then
		return -1
	fi

	return $?
}

function test_usb_storage()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	ls /dev/sda
	if [ "$?" != "0" ]; then
		return -1
	fi

	ls /dev/sdb
	return $?
}

function test_fram()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	${FRAM_TEST_APP}
	if [ "$?" != "0" ]; then
		return -1
	fi

	return $?
}

function test_tty()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}
	WRITE_MSG="FALINUX_TTY"

	# TODO Test

	DEV_TTY_PATH="/dev/ttymxc1"

	${THREAD_FUNC_SCRIPT} tty ${DEV_TTY_PATH} ${WRITE_MSG} &
	read -s -t 5 READ_MSG < ${DEV_TTY_PATH}
	if [ "$?" != 0 ]; then
		return -1
	fi
	echo "Read: [${READ_MSG}]"

	if [ "${WRITE_MSG}" != "${READ_MSG}" ]; then
		return -1
	fi

	return $?
}

function test_rs485()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test

	DEV_RS485_PATH1="/dev/ttymxc2"
	DEV_RS485_PATH2="/dev/ttymxc3"

	# Read : RS485_1, Write : RS485_2
	RS485_WRITE_MSG="FALINUX_TEST:"${DEV_RS485_PATH2}
	${THREAD_FUNC_SCRIPT} rs485 ${DEV_RS485_PATH2} ${RS485_WRITE_MSG} &
	read -s -t 5 RS485_READ_MSG < ${DEV_RS485_PATH1}
	if [ "$?" != 0 ]; then
		return -1
	fi
	echo "Read: [${RS485_READ_MSG}]"

	if [ "${RS485_WRITE_MSG}" != "${RS485_READ_MSG}" ]; then
		return -1
	fi

	# Read : RS485_2, Write : RS485_1
	RS485_WRITE_MSG="FALINUX_TEST:"${DEV_RS485_PATH1}
	${THREAD_FUNC_SCRIPT} rs485 ${DEV_RS485_PATH1} ${RS485_WRITE_MSG} &
	read -s -t 5 RS485_READ_MSG < ${DEV_RS485_PATH2}
	if [ "$?" != 0 ]; then
		return -1
	fi
	echo "Read: [${RS485_READ_MSG}]"

	if [ "${RS485_WRITE_MSG}" != "${RS485_READ_MSG}" ]; then
		return -1
	fi

	return $?
}


function test_default()
{
	echo ""
	echo -e "${C_LCYAN}### [${FUNCNAME}] ###${C_NC}"
	echo ""

	COMPLETE_TEST_NAME=${FUNCNAME}

	# TODO Test


	return $?
}

function main()
{
	echo ""
	echo -e " ### Start DEV Test - [${FUNCNAME}] ###"
	echo ""

	Init

	test_mac
	error_check $? ${COMPLETE_TEST_NAME}

	test_ethernet ${ETH_NAME}
	error_check $? ${COMPLETE_TEST_NAME}

	test_rtc 
	error_check $? ${COMPLETE_TEST_NAME}

	test_touch
	error_check $? ${COMPLETE_TEST_NAME}

	test_lcd
	error_check $? ${COMPLETE_TEST_NAME}

	test_encoder
	error_check $? ${COMPLETE_TEST_NAME}

	test_audio
	error_check $? ${COMPLETE_TEST_NAME}

	test_usb_storage
	error_check $? ${COMPLETE_TEST_NAME}

	test_fram
	error_check $? ${COMPLETE_TEST_NAME}

	test_tty
	error_check $? ${COMPLETE_TEST_NAME}

	test_rs485
	error_check $? ${COMPLETE_TEST_NAME}

	summary
	save_result
}

function test_func()
{
	echo ""
	echo -e " ### TEST Func - [${FUNCNAME}] ###"
	echo ""
	
	test_encoder
	error_check $? ${COMPLETE_TEST_NAME}
}


main