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

. /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 3.a/B1 >/tmp/selftest_isdn_3.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.b/B1 >/tmp/selftest_isdn_3.b_write.log 2>&1 &

    readtrans /dev/ilid 3.a/B1 | checkpattern -t >/tmp/selftest_isdn_3.a_read.log 2>&1 &
    readtrans /dev/ilid 3.b/B1 | checkpattern -t >/tmp/selftest_isdn_3.b_read.log 2>&1 &
}

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

    checkl1 /dev/ilid 1.a/D te >/dev/null
    checkl1 /dev/ilid 1.b/D nt >/dev/null
    checkl1 /dev/ilid 1.c/D te >/dev/null
    checkl1 /dev/ilid 1.d/D nt >/dev/null

    checkl1 /dev/ilid 1.a/D 1 >/dev/null
    checkl1 /dev/ilid 1.b/D 1 >/dev/null
    checkl1 /dev/ilid 1.c/D 1 >/dev/null
    checkl1 /dev/ilid 1.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid 1.a/B1 >/tmp/selftest_isdn_1.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.b/B1 >/tmp/selftest_isdn_1.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.c/B1 >/tmp/selftest_isdn_1.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.d/B1 >/tmp/selftest_isdn_1.b_write.log 2>&1 &

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

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

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

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

    checkl1 /dev/ilid 3.a/D 1 >/dev/null
    checkl1 /dev/ilid 3.b/D 1 >/dev/null
    checkl1 /dev/ilid 3.c/D 1 >/dev/null
    checkl1 /dev/ilid 3.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid 3.a/B1 >/tmp/selftest_isdn_3.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.b/B1 >/tmp/selftest_isdn_3.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.c/B1 >/tmp/selftest_isdn_3.c_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.d/B1 >/tmp/selftest_isdn_3.d_write.log 2>&1 &

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

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

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

startS2MIsdnQUADE1() {
    genpattern | writetrans /dev/ilid 1.a/B1 >/tmp/selftest_isdn_1.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.b/B1 >/tmp/selftest_isdn_1.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.a/B1 >/tmp/selftest_isdn_3.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 3.b/B1 >/tmp/selftest_isdn_3.b_write.log 2>&1 &

    readtrans /dev/ilid 1.a/B1 | checkpattern -t >/tmp/selftest_isdn_1.a_read.log 2>&1 &
    readtrans /dev/ilid 1.b/B1 | checkpattern -t >/tmp/selftest_isdn_1.b_read.log 2>&1 &
    readtrans /dev/ilid 3.a/B1 | checkpattern -t >/tmp/selftest_isdn_3.a_read.log 2>&1 &
    readtrans /dev/ilid 3.b/B1 | checkpattern -t >/tmp/selftest_isdn_3.b_read.log 2>&1 &
}

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

    checkl1 /dev/ilid 1.a/D te >/dev/null
    checkl1 /dev/ilid 1.b/D nt >/dev/null
    checkl1 /dev/ilid 1.c/D te >/dev/null
    checkl1 /dev/ilid 1.d/D nt >/dev/null

    checkl1 /dev/ilid 1.a/D 1 >/dev/null
    checkl1 /dev/ilid 1.b/D 1 >/dev/null
    checkl1 /dev/ilid 1.c/D 1 >/dev/null
    checkl1 /dev/ilid 1.d/D 1 >/dev/null

    genpattern | writetrans /dev/ilid 1.a/B1 >/tmp/selftest_isdn_1.a_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.b/B1 >/tmp/selftest_isdn_1.b_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.c/B1 >/tmp/selftest_isdn_1.c_write.log 2>&1 &
    genpattern | writetrans /dev/ilid 1.d/B1 >/tmp/selftest_isdn_1.d_write.log 2>&1 &

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

TEMP=`getopt -o hdfk --long details,forever,keepmodules,help -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
        -f|--forever) 
            forever="1"
            details="1"
            shift
            ;;
        -d|--details) 
            details="1"
            shift
            ;;
        -k|--keepmodules) 
            keepmodules="0"
            shift
            ;;
        -h|--help)
            echo "Usage: selftest [-f | --forever] [-d | --details] [-k | --keepmodules]"
            exit
            ;;

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

rm -f /tmp/selftest_isdn*

setterm -cursor off
tput clear
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="OK"
        else
            state="failure"
        fi

        printf "    %-3.3s %s %s\n" ${type} ${port} ${state}
    done
fi

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

echo ""
echo "done"

setterm -cursor on

