HW/OpticalInstruments/FastCameras/ExilimFX1/EXF1_software/CAMERA_START.sh

#!/bin/sh

#zkusit nejak prohledat nejdrive USB jestli je to vubec propojene


#gcc -o ExF1Ctrl exf1ctrl.c libexf1.c exf1api.c  -lusb && ./ExF1Ctrl

  
# zaridit aby tento sript byl spousteny uvnitr jineho ktery by cekal na signal konec session a zabil skript + spustil znovu cekani !!!  killall -2 CAMERA_START.sh

#!!! je potreba any si tam svoboda zaridilo nejake nc co bude pouslouchat v nekonecne smycce a budy zychytavt zaslane errory !!!!

#MAIN_PATH="/home/michal/Desktop/Prace/Golem/SCRIPTY_SERVER/2.3./"
MAIN_PATH="/home"
CAMERA_PATH="$MAIN_PATH/camera"
#CAMERA_PATH="$MAIN_PATH"
TOMOGRAPHY_PATH="$MAIN_PATH/tomography"

export DISPLAY=":0.0"


echo compiling ...
cd $CAMERA_PATH
 gcc -o ExF1Ctrl exf1ctrl.c libexf1.c  exf1api.c  -lusb
cd $MAIN_PATH

 

 SERVER='192.168.2.125'
#SERVER='192.168.0.55'
# N_CAM=2

PORT='2044'  #initialization
PORT2='2045' #commands


GETPID_NC1='ps axf | grep "nc -l -p $PORT" | grep -v grep | awk '"'"'{print $1}'"'"''
GETPID_NC2='ps axf | grep "nc -l -p $PORT2" | grep -v grep | awk '"'"'{print $1}'"'"''


trap "echo Koncim ...;  echo -e  'q\n' >> COMMAND; echo EXIT >> LOG1;echo EXIT >> LOG2;sleep 3; killall ExF1Ctrl; killall tail;kill -9 `eval $GETPID_NC1`;kill -9 `eval $GETPID_NC2`; exit"  TERM INT KILL  EXIT

#!!! =====================================================
COMMAND1="S  0.2 0.0"  #  "S 0.0 0.2" #fotak 2, horni
COMMAND2="S  0.15 0.0" #fotak 1, bocni
#!!  ========================================================

#!! Je nutné nurne  opravit zmeny nastavení v souboru $CAMERA_PATH/parameters.txt aby se to projevilo na webu !!!



CHECK='ps axf | grep "ExF1Ctrl $CAMERA" | grep -v grep | wc -l'
GETPID='ps axf | grep "ExF1Ctrl $CAMERA" | grep -v grep | awk '"'"'{print $1}'"'"''

# cd $CAMERA_PATH

finalize() {

    PID=`eval $GETPID`
    
    if [ ! -e "$MAIN_PATH/$SHOT-$CAMERA.MOV" ]
    then
	echo "Video  $MAIN_PATH/$SHOT-$CAMERA.MOV neexistuje, $PID"
 	echo -e "q\n" >> COMMAND$CAMERA
	sleep 5
	echo  "kill $PID"
	kill $PID
	return 1
    fi

    echo START finalize $SHOT-$CAMERA
    
    mkdir "$CAMERA_PATH/$SHOT-$CAMERA" # 2>> /dev/null
    cd   "$CAMERA_PATH/$SHOT-$CAMERA"
  
    mv $MAIN_PATH/$SHOT-$CAMERA.MOV  ./
    #rm plasma*.png 2>> /dev/null #remove pictures from prew. run
    nice mplayer  -nosound -speed 100  -vo png:outdir=./:z=1   ./$SHOT-$CAMERA.MOV >> /dev/null
    #mplayer  -nosound -vo jpeg:outdir=./:quality=100   ../$SHOT-$CAMERA
	
    sleep 2
    echo hledam
    find -size -2500c -exec rm {} \;

    NUMPIC=`ls *.png | wc -w` 2> /dev/null

    if [ $NUMPIC -eq 0 ]
	then
	echo NO SNAPSHOT $SHOT-$CAMERA
	cd $MAIN_PATH
# 	echo 1 > ERROR
	scp   $CAMERA_PATH/icon.png  golem@$SERVER:/srv/www/svoboda/golem/shots/$SHOT/diagnostics/Radiation/0211FastCamera.ON/
	return 1
    fi
# 
    if [ $NUMPIC -gt 200 ]
	then
	echo TOO MUCH SNAPSHOTS $SHOT-$CAMERA, $NUMPIC
	cd $MAIN_PATH
# 	echo 1 > ERROR
	return 1
    fi

    
    echo convert  $NUMPIC
    
    
    for j in `ls *.png`
	do
	    convert -rotate 270  $j $j   #-flop
	#   convert -rotate 90 -flop  $j $j   #-flop
    done

    sleep 1

	
# 
#     convert   -delay 20   -loop 1   00*.png   plasma_animate-$CAMERA.gif

#    echo !!!  opravuji fotky !!!
    
    sleep 1

    echo $CAMERA_PATH/repair_photo.py $CAMERA_PATH/$SHOT-$CAMERA  $CAMERA_PATH/$SHOT-$CAMERA
    
    $CAMERA_PATH/repair_photo.py $CAMERA_PATH/$SHOT-$CAMERA  $CAMERA_PATH/$SHOT-$CAMERA


    echo montage
    montage  00*.png -tile `ls *.png | wc -w`x1 -background black  -geometry 96x336+8+0   plasma_all.png
    convert  -channel R -separate plasma_all.png  plasma_red.png
    convert  -channel G -separate plasma_all.png  plasma_green.png
    convert  -channel B -separate plasma_all.png  plasma_blue.png
    convert -resize 150x120  plasma_all.png icon.png

    cp $CAMERA_PATH/parameters.txt  ./

    $CAMERA_PATH/repair_photo.py $CAMERA_PATH/$SHOT-$CAMERA  $CAMERA_PATH/$SHOT-$CAMERA

    convert -resize 150x120 CorrectedRGB.png icon.png


    if [ -e $CAMERA_PATH/$SHOT-$CAMERA/CorrectedRGB.png ]
    then
	echo 0 > $CAMERA_PATH/$SHOT-$CAMERA/status   # sign to database that it is finished correctly
    fi
    
    echo Copy ...
    if ping -c1 $SERVER > /dev/null
        then
    							   #/srv/www/svoboda/golem/shots/$SHOT/diagnostics/Radiation/0211FastCamera.ON/tomography
        scp  -r $CAMERA_PATH/$SHOT-$CAMERA/  golem@$SERVER:/srv/www/svoboda/golem/shots/$SHOT/diagnostics/Radiation/0211FastCamera.ON/$CAMERA
        scp   $CAMERA_PATH/$SHOT-$CAMERA/icon.png  golem@$SERVER:/srv/www/svoboda/golem/shots/$SHOT/diagnostics/Radiation/0211FastCamera.ON/
        scp   $CAMERA_PATH/$SHOT-$CAMERA/status    golem@$SERVER:/srv/www/svoboda/golem/shots/$SHOT/diagnostics/Radiation/0211FastCamera.ON/
        
    else
        echo nejde ping na server $SERVER
    fi
    
#     cp plasma_all.png	$CAMERA_PATH/plasma_all-$SHOT-$CAMERA.png
#     cp plasma_red.png 	$CAMERA_PATH/plasma_red-$SHOT-$CAMERA.png
#     cp plasma_blue.png 	$CAMERA_PATH/plasma_blue-$SHOT-$CAMERA.png
#     cp plasma_green.png $CAMERA_PATH/plasma_green-$SHOT-$CAMERA.png


#      cp  plasma_all.png   /tmp/plasma_all.png
#      scp /tmp/plasma_all.png golem@$SERVER:/tmp/ 
    
    
    echo DONE $SHOT-$CAMERA CAMERA $CAMERA
    
    cd $MAIN_PATH
    
#    cp $CAMERA_PATH/$SHOT-$CAMERA/plasma_all.png /home/tomography/geometry_golem_camera/$SHOT-$CAMERA.png
    
    
    READY=`cat READY-$SHOT`
    let READY=READY+1
    echo $READY > READY-$SHOT
    return 0
}






initialize()
{
while [ 1 ]
    do
    echo 1 > STATUS_$CAMERA
    echo Initialize camera $CAMERA
     
    echo ====================================== $CAMERA >>  LOG$CAMERA 
    #tail -f -n1  LOG$CAMERA &
    echo SESSION START `date` >>  LOG$CAMERA
    
    $CAMERA_PATH/ExF1Ctrl $CAMERA r   #reload camera
    echo 1 > STATUS_$CAMERA
    sleep 5
    
    C="COMMAND$CAMERA"
    echo Init camera ...  ${!C}
    rm COMMAND$CAMERA
    touch COMMAND$CAMERA
    tail -f COMMAND$CAMERA | $CAMERA_PATH/ExF1Ctrl $CAMERA  >> LOG$CAMERA &
    sleep 2
    echo ${!C} >> COMMAND$CAMERA    #zapise prikazy pri inicializaci
    sleep 2
    if [ `eval $CHECK` -eq 0 ]
    then
        echo Reloading camera $CAMERA
        $CAMERA_PATH/ExF1Ctrl $CAMERA r  
        sleep 5
        continue
    fi
      
   
#     tail -f -n1  LOG$CAMERA &
    break   #ale pouze v pripade ze je to bez chyb
done
}


wait_for_init()
{
    for CAMERA in `seq $N_CAM`
    do
        echo Waiting calibration $CAMERA
        for i in `seq 60`
        do
            if [  `cat STATUS_$CAMERA` -eq 0  ]
                then
                tail -f COMMAND >> COMMAND$CAMERA &
                echo CAMERA $CAMERA READY
                break
            fi
            echo -en "$i\r"
            sleep 1
        done
        if [ $i -eq 60 ]
            then
            echo INIT FAILED !!!
            exit
        fi
    done
}


echo Waiting for  initial signal

# nc -l  -p  $PORT   #wait for tomography shot signal

echo SERVER CAMERA START INIT  `date`
N_CAM=`usb-devices | grep "Vendor=07cf ProdID=1023" | wc -l`   #!!!!!!!! NEJAK ZASLAT NA SERVER SVOBODOVI SIGN�L POKUD CHYB�

echo Pocet pripojenych fotaku $N_CAM



rm COMMAND
touch COMMAND



if [ $N_CAM -eq 0 ]
    then
	echo NO CAMERA !!!
	exit
    else
	echo CEKAM NA FOTAKY
	
	sleep 10
	N_CAM=`usb-devices | grep "Vendor=07cf ProdID=1023" | wc -l`   #!!!!!!!! NEJAK ZASLAT NA SERVER SVOBODOVI SIGN�L POKUD CHYB�
	
	for CAMERA in `seq $N_CAM`
	do
	    initialize &
	done
	sleep 2
        echo CALIBRATION CAM $CAMERA
        
        wait_for_init

        echo CALIBRATION DONE !!!!!
fi


# SHOT=0

while [ 1 ]
do
    echo 0 > ERROR
    echo 0 > READY-$SHOT


   
    echo  "Waiting for  trigger"

    SHOT=`nc -l  -p $PORT2`
    echo SHOT $SHOT

#     let SHOT=$SHOT+1

    if [ $SHOT -eq 0 ]
	then
	echo Konec relace !!!
	break
    fi
    

    rm $SHOT-1.MOV $SHOT-2.MOV 2> /dev/null
    
    echo TRIGGER ShotNo $SHOT
    sleep 15 # 14  #trigger je 10s pred vystrelem

    #===================================
    echo  "m 10  $SHOT"  >> COMMAND   # bere data 5s !!!
    #===================================
    
    echo Waiting for movie from camera
    for i in `seq 20`
    do
	if [  -e $SHOT-1.MOV  ] 
	    then
	    #SIZE_0=0
	    #SIZE=`ls -l $SHOT-1.MOV  | tr -s " " | cut -d " " -f 5`
	    
	    #while [ ! $SIZE -eq $SIZE_0 ]
	    #do
		#SIZE_0=SIZE
		#SIZE=`ls -l $SHOT-1.MOV  | tr -s " " | cut -d " " -f 5`
		#sleep 1
	    #done
	    break
	fi
	if [ `cat ERROR ` -eq 1 ]
	 then
            echo "Byl tam error"
            break
        fi
        echo -en "$i\r"
        echo cekam
        sleep 2
    done
    #sleep 8
    sleep 12  # bug fix !!!
    
    

    for CAMERA in `seq $N_CAM`
	do
	finalize &
	echo 0 > READY-$SHOT 
    done
    
    #reconstruct &
    ./CAMERA_TOMO.sh $SHOT >> TOMO_LOG & 


    echo DONE

    sleep 5

    N_USB=`usb-devices | grep "Vendor=07cf ProdID=1023" | wc -l`
    CAMERA=""
    N_CTRL=`eval $CHECK`

#     echo '$N_USB $N_CTRL' $N_USB $N_CTRL

    if [ $N_USB -eq 0 ]
        then
            echo NO CAMERA, =>  konec
            exit
    fi

    
    if [ ! $N_USB -eq  $N_CTRL ]
	then
	echo Zmizel nebo pribyl nejaky fotak pocet:
	echo pocet USB $N_USB
	echo pocet CTRL $N_CTRL
	for CAMERA in `seq $N_CAM`
	do
	    if [ `eval $CHECK` -eq 0 ]
	    then
                echo Reloading camera $CAMERA ================
#!!! když tam pribude nejaky fotak je potreba restartova tcely tento program !!! ale pozor, az to dodela ty veci na pozadi !!!
                $CAMERA_PATH/ExF1Ctrl $CAMERA r & #reload
                sleep 20

                if [ `eval $CHECK` -eq 0 ]
                then
                    PID=`eval $GETPID`
                    kill $PID
                fi

                initialize
                wait_for_init

                echo =========================================

                if [ `eval $CHECK` -eq 0 ]
                then
                    echo restart nefunguje !!!!!!!!
                    exit
                else
                    echo restart asi pomohl
                fi
            fi
	done
	#echo 1 > ERROR
    fi
    
done

#echo KONCIM ....
#echo -e "q\n" >> COMMAND   #ukonceni
#sleep 5
#echo =================================
#1;1Atail LOG1
#echo =================================
#tail LOG2
#echo =================================
#echo EXIT >> LOG1
#echo EXIT >> LOG2
#killall ExF1Ctrl; 
#killall tail;