#!/bin/bash -i
exec 2>/dev/null

line1=1
line3=3

if [ -z $1 ]; then
    red='\e[0;31m'
    green='\e[0;32m'
    yellow='\e[0;33m'
    NC='\e[0m' # No Color
else
    red=''
    green=''
    yellow=''
    NC=''
fi

rc=0

. /tmp/cmdline 

control_c()
# run if user hits control-c
{
    tput clear
    setterm -cursor on

    killall checkpattern
    sleep 1
    killall genpattern
    sleep 1
    killall writetrans

    tput clear
    setterm -cursor on

    exit -1
}
 
# trap keyboard interrupt (control-c)
trap control_c SIGINT

checkRead() {
    file=${1}
    let y=${2}
    let x=0

    let y=$y+7

    id=$(echo ${file} | cut -d "_" -f 3)
    device=$(getchannels -d 2>& 1 | grep -e "^${id}")
    port=$(echo ${device} | cut -d "/" -f 1) 
    type=$(echo ${device} | cut -d "/" -f 3)
    
    tput cup $y $x 

    l=$(cat "$file")
    let llen=${#l}
    printf "  %-3.3s %s rx: " ${type} ${port} 
    if [ ${llen} -lt ${cols} ] ; then
        echo -n "${l:1}"
    else
        let offset=1+$llen-$cols
        echo -n "${l:$offset}"
    fi
}

startS2MIsdnAtomBox() {
    genpattern | writetrans /dev/ilid ${line3}.a/B1 >/tmp/selftest_isdn_${line3}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.b/B1 >/tmp/selftest_isdn_${line3}.b_write.log 2>&1 &

    readtrans /dev/ilid ${line3}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.b_read.log 2>&1 &
}

startS0IsdnAtomBox() {
    termResistor /dev/ilid ${line1}.a/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.b/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.c/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.d/D 1 >/dev/null

    checkl1 /dev/ilid ${line1}.a/D te >/dev/null
    checkl1 /dev/ilid ${line1}.b/D nt >/dev/null
    checkl1 /dev/ilid ${line1}.c/D te >/dev/null
    checkl1 /dev/ilid ${line1}.d/D nt >/dev/null

    checkl1 /dev/ilid ${line1}.a/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.b/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.c/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid ${line1}.a/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.b/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.c/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.d/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &

    readtrans /dev/ilid ${line1}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.b_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.c/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.c_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.d/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.d_read.log 2>&1 &
}

startS2MIsdnMgb() {
    genpattern | writetrans /dev/ilid ${line1}.a/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.b/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &

    readtrans /dev/ilid ${line1}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.b_read.log 2>&1 &
}

startS0IsdnMgb() {
    checkl1 /dev/ilid ${line3}.a/D te >/dev/null
    checkl1 /dev/ilid ${line3}.b/D nt >/dev/null
    checkl1 /dev/ilid ${line3}.c/D te >/dev/null
    checkl1 /dev/ilid ${line3}.d/D nt >/dev/null

    checkl1 /dev/ilid ${line3}.a/D 1 >/dev/null
    checkl1 /dev/ilid ${line3}.b/D 1 >/dev/null
    checkl1 /dev/ilid ${line3}.c/D 1 >/dev/null
    checkl1 /dev/ilid ${line3}.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid ${line3}.a/B1 >/tmp/selftest_isdn_${line3}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.b/B1 >/tmp/selftest_isdn_${line3}.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.c/B1 >/tmp/selftest_isdn_${line3}.c_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.d/B1 >/tmp/selftest_isdn_${line3}.d_write.log 2>&1 &

    readtrans /dev/ilid ${line3}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.b_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.c/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.c_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.d/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.d_read.log 2>&1 &
}

startS2MIsdnS2MPCIE() {
    genpattern | writetrans /dev/ilid ${line1}.a/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.b/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &

    readtrans /dev/ilid ${line1}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.b_read.log 2>&1 &
}

startS2MIsdnQUADE1() {
    genpattern | writetrans /dev/ilid ${line1}.a/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.b/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.a/B1 >/tmp/selftest_isdn_${line3}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line3}.b/B1 >/tmp/selftest_isdn_${line3}.b_write.log 2>&1 &

    readtrans /dev/ilid ${line1}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.b_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line3}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line3}.b_read.log 2>&1 &
}

startS0IsdnSingleUnit4S0() {
    termResistor /dev/ilid ${line1}.a/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.b/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.c/D 1 >/dev/null
    termResistor /dev/ilid ${line1}.d/D 1 >/dev/null

    checkl1 /dev/ilid ${line1}.a/D te >/dev/null
    checkl1 /dev/ilid ${line1}.b/D nt >/dev/null
    checkl1 /dev/ilid ${line1}.c/D te >/dev/null
    checkl1 /dev/ilid ${line1}.d/D nt >/dev/null

    checkl1 /dev/ilid ${line1}.a/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.b/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.c/D 1 >/dev/null
    checkl1 /dev/ilid ${line1}.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid ${line1}.a/B1 >/tmp/selftest_isdn_${line1}.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.b/B1 >/tmp/selftest_isdn_${line1}.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.c/B1 >/tmp/selftest_isdn_${line1}.c_write.log 2>&1 &
    genpattern | writetrans /dev/ilid ${line1}.d/B1 >/tmp/selftest_isdn_${line1}.d_write.log 2>&1 &

    readtrans /dev/ilid ${line1}.a/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.a_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.b/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.b_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.c/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.c_read.log 2>&1 &
    readtrans /dev/ilid ${line1}.d/B1 | checkpattern -t >/tmp/selftest_isdn_${line1}.d_read.log 2>&1 &
}

TEMP=`getopt -o hdfkb: --long details,forever,keepmodules,help,board: -n 'selftest' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

forever="0"
details="0"
keepmodules="1"

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
while true ; do
    case "$1" in
	-b|--board)
	    board=${2}
	    echo "board given: ${board}"
	    shift 2
            line1=$((line1 + ((board-1)*100)))
            line3=$((line3 + ((board-1)*100)))
	    ;;
        -f|--forever) 
            forever="1"
            details="1"
            shift
            ;;
        -d|--details) 
            details="1"
            shift
            ;;
        -k|--keepmodules) 
            keepmodules="0"
            shift
            ;;
        -h|--help)
            echo "Usage: selftest [-b boardnr | --board=boardnr]   [-f | --forever] [-d | --details] [-k | --keepmodules]"
            exit
            ;;

        --) shift
            break
            ;;
        *)
            echo "parameter error"
            exit 1
            ;;
    esac
done

rm -f /tmp/selftest_isdn*

if [ -z $1 ]; then
    setterm -cursor off
    tput clear
fi

let cols=$COLUMNS-20

#echo "forever=$forever details='$details' keepmodules=$keepmodules cols=$cols"

echo "stopping running Tasks"
omgstop 2>/dev/null >/dev/null

if [ "${keepmodules}" = "0" ] ; then
    omgstopall 2>/dev/null >/dev/null
    echo "loading modules" 
    omgstartilid 2>/dev/null >/dev/null
fi
   

if [ "${HWTYPE}" = "AtomBox" ] ; then
    echo "checking AtomBox"
    #set internal clock as master on all three prioritys
    echo "clk_master 8 8 8" | confTool /dev/ilid 0.a/X 2>/dev/null >/dev/null
    
    echo "starting S2M ports"
    startS2MIsdnAtomBox
    echo "starting S0  ports"
    startS0IsdnAtomBox
fi

if [ "${HWTYPE}" = "MGB" ] ; then
    echo "checking MGB"

    #set internal clock as master on all three prioritys
    echo "set clock master" 
    echo "clk_master 8 8 8" | confTool /dev/ilid 0.a/X 2>/dev/null >/dev/null
    
    echo "set termination S0 ports"
    i2cutil -y ${I2CBUS} 0x08 0x0a 0x0a b 2>/dev/null >/dev/null

    echo "starting S2M ports"
    startS2MIsdnMgb
    echo "starting S0  ports"
    startS0IsdnMgb
fi

if [ "${HWTYPE}" = "QUADE1" ] ; then
    echo "checking QUADE1"
    #set internal clock as master on all three prioritys
    echo "clk_master 8 8 8" | confTool /dev/ilid 0.a/X 2>/dev/null >/dev/null
    
    echo "starting S2M ports"
    startS2MIsdnQUADE1
fi

if [ "${HWTYPE}" = "S2MPCIE" ] ; then
    echo "checking S2MPCIE"
    #set internal clock as master on all three prioritys
    echo "clk_master 8 8 8" | confTool /dev/ilid 0.a/X 2>/dev/null >/dev/null
    
    echo "starting S2M ports"
    startS2MIsdnS2MPCIE
fi

if [ "${HWTYPE}" = "SingleUnit4S0" ] ; then
    echo "checking SingleUnit4S0"
    echo "starting S0 ports"
    startS0IsdnSingleUnit4S0
fi

if [ "${details}" = "1" ] ; then
    echo " "
    echo "testing (*=ok x=error):"

    while : ; do
        for j in $(seq 0 30);do
            let i=0
            for file in /tmp/selftest_isdn_*_read.log; do
                checkRead $file $i
                let i=$i+1
            done
            sleep 1
        done
        [[ "$forever" = "0" ]] && break
    done
else
    sleep 30
fi

killall checkpattern
sleep 1
killall genpattern
sleep 1
killall writetrans

if [ "${details}" = "0" ] ; then
    for i in /tmp/selftest_isdn_*_read.log; do
        id=$(echo ${i} | cut -d "_" -f 3)
        device=$(getchannels -d 2>& 1 | grep -e "^${id}")
        port=$(echo ${device} | cut -d "/" -f 1) 
        type=$(echo ${device} | cut -d "/" -f 3)
        
        if grep -q "\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*" ${i} ;then
            state="${green}OK${NC}"
        else
            rc=-1
            state="${red}failure${NC}"
        fi

        printf "    %-3.3s %s %s " ${type} ${port}
        echo -e ${state}
    done
fi

if [ "$keepmodules" = "0" ] ; then
    echo restarting normal service
    omgrestart 2>/dev/null >/dev/null
fi

echo ""
echo "done"

if [ -z $1 ]; then setterm -cursor on; fi

exit ${rc}
