#!/bin/bash

echo "=================================================="
echo "=                 START_SYSTEM                   ="
echo "=================================================="
echo

HOST=silab15c

GLUEX=XXXXXXXX__Do_NOT_Run_Gluex__XXXXXXXX
REMOTE_GLUEX=NO
#GLUEX=gluex.sh
KILLALL=NO
RESTART=NO
FORCE=
XTERM=YES
NMOD=1

SVN_DIR=svn/V3/host
SVN_DIR_V4=svn/V4/host

LIST_DAQ="  rc_server2.exe  rc_gui.sh event-builder.exe  gluex.exe  Monitor_srv.sh Monitor.exe"
#===========================================================================================
function help {
    echo "---------------------------------------"
    echo " Usage: $0 -h[elp] -m[od] <N> -s[tatus]  -d[epfet] <loc/rem/no> -w[arm]  -r[estart] -killall -x [-force] [-link] "
    echo " Example: "
#    echo " $0                 <--- Start All" 
    echo " ----  startup ---"
    echo " $0 -w              <--- Warm StartUp = start not running program[s] only, default " 
    echo " $0 -r              <--- Cold StartUp / Restart All programs" 
    echo " $0 -m <Nmod>       <--- Number of gluex modules, default Nmod=1" 
    echo " $0 -x              <--- Start in BG, without Xterm and graphics" 
    echo " $0 -d no           <--- Do NOT Start Gluex Producer(s), default " 
    echo " $0 -d local        <--- Start Gluex Producer(s) on Local Computer" 
    echo " $0 -d remote       <--- Start Gluex Producer(s) on Remote Computer(s) from: gluex.conf" 
    echo " ----  manage ---"
    echo " $0 -s              <--- Check status, running programs" 
    echo " $0 -killall        <--- STOP All (local) processes, !!! STOP Remote Producers from RC" 
    echo " ----  utility  ---"
    echo " $0 -link           <--- make a default links to executables " 
    echo " $0 -force -link    <--- remove existing link[s] and make a default links to executables " 
    echo "---------------------------------------"
}
#===========================================================================================
function check () {
    echo
    echo "========================================================"
    echo "--------->  Check list of DAQ  programs  <------------- "
    echo "========================================================"
    echo
    echo "LIST= $LIST_DAQ"
    echo
    echo "--------------------------------------------------------"
    PIDS=
    for ff in $LIST_DAQ 
    do 
#	echo "----->  Check file = $ff"
#	PRG=`ps -ef | grep $ff | grep -v grep | grep -v "xterm -title" | awk '{printf "%s %s %s ",$2, $8, $9, $10}'`
#	PRGNAME=`ps -ef | grep $ff | grep -v grep | grep -v "xterm -title" | awk '{printf "%s ",$8}'`
	PRG=`ps -ef | awk '{print $8,$9}'    | grep $ff | awk '$1!="grep" {print $1,$2}' `
	PID=`ps -ef | awk '{print $2,$8,$9}' | grep $ff | awk '$2!="grep" {print $1}'`
	if test "$PRG"
	then
	    echo -e  "==>  $ff \t\t ==> is running pid(s) = " $PID
	    PIDS="$PIDS $PID"
	else
	    echo -e  "==>  $ff \t  ** not found **" 
	fi
    done    
}
#===========================================================================================
function status() {
    echo
    echo "===============  Processes now  ====================="
#    ps2 | grep -e rc_server -e event-builder.exe -e RC_DAQ.exe -e gluex.exe | grep -v grep
    echo 
    
    for ff in $LIST_DAQ 
    do 
	ps -ef  | awk '{print $2,$8}'| grep $ff | awk '$2!="grep" {print $1,$2}'
    done
    echo 
}
#===========================================================================================
function link() {
    echo
    echo "===============  Make Default link   ====================="
    echo 
    set -x

#    ln -s $FORCE ${SVN_DIR}/linux/daq/exe/gluex.exe 
    ln -s $FORCE ${SVN_DIR_V4}/DAQ/build/bin/gluex gluex.exe
    ln -s $FORCE ${SVN_DIR}/linux/monitor/event-builder.exe
    ln -s $FORCE ${SVN_DIR}/linux/monitor/Monitor.exe
    ln -s $FORCE ${SVN_DIR_V4}/DAQ/RC_client/rc_client_DHP.tcl rc_gui.sh
    ln -s $FORCE ${SVN_DIR}/linux/run_control/server/exe/rc_server.exe
    ln -s $FORCE ${SVN_DIR}/linux/monitor/shmem_evb.exe 
    ln -s $FORCE ${SVN_DIR}/linux/monitor/TCPclient.exe

    ln -s $FORCE ${SVN_DIR}/linux/scripts/START_UP.sh
    ln -s $FORCE ${SVN_DIR}/linux/scripts/gluex.sh
    cp           ${SVN_DIR}/linux/scripts/gluex.config   .
    ln -s $FORCE ${SVN_DIR}/linux/scripts/RootENV.sh
    ln -s $FORCE ${SVN_DIR}/linux/scripts/Monitor_srv.sh

    ln -s $FORCE ${SVN_DIR_V4}/DAQ/SystemStuff
    cd -

    if [ x$FORCE = "x-f" ]
    then
	/bin/rm -f rc.ini
    fi

#    set +x
#    echo ". RootENV.sh"       > Monitor_srv.sh
#    echo "./Monitor -nogra  | grep -v shmem_thread " >> Monitor_srv.sh
#    chmod +x             	Monitor_srv.sh

#    echo "export ROOTSYS=~fourl/cern/root"                         > RootENV.sh
#    echo "export PATH=\$ROOTSYS/bin:\$PATH"                       >> RootENV.sh
#    echo "export LD_LIBRARY_PATH=\$ROOTSYS/lib:\$LD_LIBRARY_PATH" >> RootENV.sh
#    echo "export MANPATH=\$MANPATH:\$ROOTSYS/man"                 >> RootENV.sh

#    echo \
#    "./gluex.exe \$* | grep -e \"Event Number\" -e FULL -e Init -e INIT -e BOR -e timeout -e BoardID -e END " > gluex.sh
#    chmod +x gluex.sh

    echo "$HOST" > rc.ini
    echo "32767" >> rc.ini

}
#===========================================================================================

echo "Nargs= $# : $0 $1 $2 $3"

if test $# -lt 1 
then
    help
    exit 1
fi

#for ((i=0;i<3;i+=1))
for ((i=0;$#>=1;i+=1))
do
    echo arg $i of $# $1
#    CMD=`echo $1 | gawk '{print substr(toupper($0),0,4)}'`
    CMD=$1

    case $1 in
	
	-h  | -help )
	    help
	    exit 0
            ;;
	-s  | -status )
	    check
	    status
	    exit 0
            ;;
	-x | -xterm )
	    XTERM=NO
            ;;
	-force )
	    FORCE="-f"
            ;;
	-link )
	    link
	    ls -l
	    exit 0
            ;;
	-m | -mod )
	    shift
	    NMOD=$1
 	    echo "Use NMOD=$NMOD"
	    ;;
	-d | -gluex )
	    shift
	    echo param for GLUEX=$1
	    case $1 in 
		loc | local )
		    GLUEX=gluex.sh 
 		    echo "Use Local Gluex=$GLUEX"
		    ;;
		rem | remote )
		    REMOTE_GLUEX=YES
		    GLUEX="gluex.sh -remote -host $HOST"
 		    echo "Use Remote Gluex=$GLUEX"
		    ;;
 		* ) 
		    echo 
		    echo "---------------------------------------"
 		    echo " Do NOT run  Gluex=$GLUEX"
		    echo "---------------------------------------"
		    ;;	
	    esac
	    ;;
	-killall )
	    KILLALL=YES
 	    echo "Kill ALL DAQ programs"
	    ;;
	-kill )
	    shift
	    KILLPRG=$1
	    if test -z $KILLPRG 
	    then
		echo " Error in arg: -kill $KILLPRG"
		exit 1
	    else
 		echo "Kill |${KILLPRG}| program"
		killall $KILLPRG
	    fi
	    ;;
	-r | -restart )  
	    echo " ------->  Cold Startup <------------"
	    KILLALL=YES
	    RESTART=YES
 	    echo "Kill ALL and Restart DAQ programs"
	    ;;
	-w | -warm )
	    echo " ------->  Warm Startup <------------"
            ;;
 	*) 
            echo 
            echo "---------------------------------------"
            echo " ERROR: CMD=$1 ($CMD)"
            help
            exit 1
            ;;	
   esac
    
    #-------- next arg ------
    shift
done
#===========================================================================================
#                             Always check status
check

#===========================================================================================

if [ $KILLALL = "YES" ]
then
    echo 
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "!!!     kill -9  " $PIDS  
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo
    sleep 3
    kill -9  $PIDS
    sleep 1
    status
    if [ $RESTART = "NO" ]
    then
	exit
    fi
else
    echo keep running PID = $PIDS
fi

#===========================================================================================

echo "--------------------------------------------------- "

if test "$PIDS"
then 
  echo " "
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
  echo "!!!!         some processes still runnig       !!! "
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "
  echo "use: kill -9" $PIDS
  sleep 1
else
  echo "---- no processes are running, continue ..."
fi

#===========================================================================================

echo "--------------------------------------------------- "


if [ $XTERM = "NO" ]
then
    echo
    echo "============================================================"
    echo "==               Start DAQ in Background                  =="
    echo "============================================================"
    echo
#    echo " --->  start RC server  <---"
#    nohup   ./rc_server.exe           > /dev/null &
#    sleep 1
#    echo " ---> start Event Builder <---"
#    nohup   ./event-builder.exe -m=1  > /dev/null &
#    echo " ---> start Producer: gluex.sh  <---"
#    nohup   ./depfet.sh -m=1          > /dev/null &
#    echo " ---> start Monitor_srv.sh <---"
#    nohup   ./Monitor_srv.sh          > /dev/null &
#    sleep 1
#    echo " ----------------> All Done. <------------------------------"
#    echo
#    check
#    status
#    echo
#    echo "============================================================"
#    echo " Check status: "
#    echo "cmd status"   > /dev/tcp/localhost/32767
#    echo "rcm status "  > /dev/tcp/localhost/32767
#    echo "============================================================"
#    echo
#    echo "===> Connect to Run Control, use:  cmd help "
#    echo
#    telnet localhost 32767
#    exit
fi



#-----------------------------------------------------------------------------------------------
#                             RUN CONTROL  Server 
#-----------------------------------------------------------------------------------------------
proc=rc_server2.exe
if test -z "`ps -ef | grep -e $proc | grep -v grep`"
then
    echo  Start process $proc
    if [ $XTERM = "YES" ]
    then
	xterm -title RC-server     -bg \#ddaa00 -geometry 80x15-0+10  -e ./$proc &
	sleep 1
	xterm -title RC-Client     -bg \#11aa55 -geometry 100x35-0+200 -e   telnet localhost 32767 &
    else
	nohup  ./$proc  > /dev/null &
    fi
else
    pid=`ps -ef | grep -e $proc  | grep -v grep | awk '{print $2}'`
    echo  Process $proc already running: $pid
fi

#-----------------------------------------------------------------------------------------------
#                             RUN CONTROL  GUI
#-----------------------------------------------------------------------------------------------
#proc=RC_DAQ.exe
proc=rc_gui.tcl
if test -z "`ps -ef | grep -e $proc | grep -v grep`"
then
    echo  Start process $proc
    if [ $XTERM = "YES" ]
    then
#    xterm -title RC-GUI        -bg \#11aa33 -geometry 80x15-0+100 -e ./$proc &
	./$proc -geometry -0+0 &
	sleep 1
    else
	echo " Do NOT start RC_GUI without X"
    fi
else
    pid=`ps -ef | grep -e $proc  | grep -v grep | awk '{print $2}'`
    echo  Process $proc already running: $pid
fi

#-----------------------------------------------------------------------------------------------
#                             EVB
#-----------------------------------------------------------------------------------------------
proc=event-builder.exe
if test -z "`ps -ef | grep -e $proc | grep -v grep`"
then
    echo  Start process $proc
    if [ $XTERM = "YES" ]
    then
	xterm -title $proc -bg \#11ccaa -geometry 100x30-0-0  -e ./$proc -m=$NMOD &
    else
	nohup  ./$proc -m=$NMOD > /dev/null &
    fi
    sleep 1
else
    pid=`ps -ef | grep -e $proc | grep -v grep | awk '{print $2}'`
    echo  Process $proc already running: $pid   
fi

#-----------------------------------------------------------------------------------------------
#                          DEPFET PRODUCER
#-----------------------------------------------------------------------------------------------
echo "----->  Try to start depfet producer  <-----"
proc=`echo $DEPFET | awk '{print $1}' `
proc_arg="$DEPFET -mod $NMOD"

#if test -z "`ps -ef | awk '$8!=\"grep\" {print $8}' | grep -e $proc`"
#then
#set -x
    if test -x $proc
    then
	echo  Start process $proc_arg
	if [ $XTERM = "YES" ]
	then
	    xterm -title $proc -bg \#55cc11 -geometry 100x24+0+500  -e "./$proc_arg"&
#	    nohup  ./$proc_arg &
	else
	    if [ $REMOTE_DEPFET = "YES" ]
	    then
		./$proc_arg -x &
	    else
		nohup  ./$proc_arg -x &
	    fi
	fi
	sleep 1
    else
	echo ">-------------------------------------------------------"
	echo " !!!!!     DEPFET Program $proc not found        !!!!!"
	echo ">-------------------------------------------------------"
    fi
#set +x
#else
#    pid=`ps -ef | grep -e $proc  | grep -v grep | awk '{print $2}'`
#    echo  Process $proc already running: $pid   
#fi

#-----------------------------------------------------------------------------------------------
#                          MONITOR = HIST SERVER 
#-----------------------------------------------------------------------------------------------
proc=Monitor_srv.sh
if test -z "`ps -ef | grep -e $proc | grep -v grep`"
then
    echo  Start process $proc
    if [ $XTERM = "YES" ]
    then
	xterm -title $proc -bg \#55cc11 -geometry 80x24-0-0  -e ./$proc&
    else
	nohup  ./$proc > /dev/null &
    fi
    sleep 1
else
    pid=`ps -ef | grep -e $proc  | grep -v grep | awk '{print $2}'`
    echo  Process $proc already running: $pid   
fi

#-----------------------------------------------------------------------------------------------
#
#-----------------------------------------------------------------------------------------------

check
status

#-----------------------------------------------------------------------------------------------
#
#-----------------------------------------------------------------------------------------------

if [ $XTERM = "NO" ]
then
    echo "============================================================"
    echo
    echo "===> Connect to Run Control, use:  cmd help "
    echo
#    telnet localhost 32767
fi
