#!/bin/sh

DIV1=------------------------------------------------------------------------
DIV2=========================================================================


usage()
{
	echo "usage: $0 ref_dev test_dev" 1>&2
	exit 1
}


[ "$2" -a -z "$3" ] || usage
REF=$1
# DUT = Device Under Test
DUT=$2
LOG=_log
>$LOG

LIVE=

if [ ${REF#net:} = $REF ]; then
	REF_EXEC=
else
	REF_EXEC="ssh `echo $REF | sed 's/^net://;s/,.*$//'`"
fi

if [ ${DUT#net:} = $DUT ]; then
	LOCAL_EXEC=
	LOCAL_DUT=$DUT
else
	LOCAL_EXEC="ssh `echo $DUT | sed 's/^net://;s/,.*$//'`"
	LOCAL_DUT=`atrf-id -d $DUT -s -s`
fi


#####  Test setup  ############################################################


step()
{
	echo -n " ....  $1"
	step=$1
	cmd=
	>_out
	echo $DIV2 >>$LOG
}


#####  Test result  ###########################################################


g_echo()
{
	/bin/echo -e "$@"
}


finish()
{
	echo "$cmd" >>$LOG
	echo | sed "c$DIV1" >>$LOG
	cat _out >>$LOG
	sed "1i$DIV1" >>$LOG
}


pass()
{
	g_echo '\r\033[42;30m PASS \033[0m '
	echo "$step: PASS" >>$LOG
	finish </dev/null
}


fail()
{
	g_echo '\r\033[41;37m FAIL \033[0m '
	echo "$step: FAIL" >>$LOG
	finish
#
# to do: allow looping back
#
	exit 1
}


todo()
{
	g_echo '\r\033[43;30m TODO \033[0m '
	echo "$step: TODO" >>$LOG
	finish </dev/null
}


##### Test execution ##########################################################


cmd()
{
	cmd=$1
}


#####  Evaluation  ############################################################


_doit()
{
	if ${LIVE:-false}; then
		echo
		script -c "$cmd" -q _out ||
		    { echo "exit code $?" | fail; exit 1; }
	else
		eval "$cmd" >_out 2>&1 ||
		    { echo "exit code $?" | fail; exit 1; }
	fi
}


doit()
{
	_doit
	pass
}


expect()
{
	_doit
	fgrep -q "$@" _out || { echo "expected $*" | fail; exit 1; }
	pass
}


expect_re()
{
	_doit
	grep -q "$@" _out || { echo "expected $*" | fail; exit 1; }
	pass
}


#####  Tests  #################################################################


begin()
{
	if [ "$1" ]; then
		PROFILE=$1
		if [ ! -r $PROFILE ]; then
			echo "$PROFILE not found" 1>&2
			exit 1
		fi
	fi
	if [ "$2" ]; then
		CLKREF=$2
		if ! $LOCAL_EXEC "[ -r $CLKREF ]"; then
			echo "$CLKREF not found" 1>&2
			exit 1
		fi
	fi
}


identify()
{
	step "Identification"
	cmd "atrf-id -d $DUT"
	expect "AT86RF231, part 0x03 version 2 manufacturer xxxx001f (Atmel)"
}


spectrum()
{
	step "Spectrum"
# todo:
# - trim values (maybe)
# - decide on power
	cmd "atrf-path -g -P $PROFILE $REF $DUT 10"
	expect PASS
}


transmit()
{
	step "Receive"
# todo:
# - trim values (maybe)
# - channel
# - tolerate imperfection (e.g., 99/100|100/100)
	cmd "atrf-xmit -p 0 $REF $DUT 100"
	expect 100/100

	step "Send"
	cmd "atrf-xmit -p 15 $DUT $REF 100"
	expect 100/100
}
