#! /bin/csh -f # # operate the fast shutter # # if(! $?beamline) then # default to beamline this computer belongs to setenv beamline `beamline.com` if($status) then echo "ERROR: $beamline" exit 9 endif endif #if(! $?beamline) setenv beamline 831 set pmac = pmac2 set control = bl${beamline}c if($beamline =~ 82?) set pmac = $control set motor = 4 if($beamline == 1231) set motor = 2 set tempfile = /tmp/shutter_temp$$ set test = `echo -n "\r" |& od -c | wc -w` if("$test" != 3) then alias echo /bin/echo set test = `echo -n "\r" |& od -c | wc -w` if("$test" != 3) alias echo '/bin/echo -e' set test = `echo -n "\r" |& od -c | wc -w` if("$test" != 3) alias echo /usr/bin/echo set test = `echo -n "\r" |& od -c | wc -w` if("$test" != 3) alias echo '/bin/echo \!* | awk '\''/^-n/{printf "%s", substr($0,4) ; exit} {print}'\' set test = `echo -n "\r" |& od -c | wc -w` if("$test" != 3) then echo "ERROR: echo command is broken" exit 9 endif endif trigger: set goal = "$1" if("$goal" == "closed") set goal = "close" if("$goal" == "open" || "$goal" == "close") then # command the shutter to a new state # command the shutter via motor controller if("$goal" == "open") set temp = 1 if("$goal" == "close") set temp = 0 echo -n "M${motor}12=$temp\rM${motor}11=1\r" | sock_exchange.tcl $pmac 14001 2 "\006" >& /dev/null if(! $status) goto report set use_XOS # pretend to be a gui, become master, command the shutter, and then disconnect echo "gtos_become_master force\ngtos_set_shutter_state shutter $goal" |\ xos3_exchange.tcl 1 "report_shutter_state" 30 >& /dev/null if(! $status) goto report # try direct LabView socket connection set bit = `echo "$goal" | awk '{print ($1=="open")}'` pxmotor.com Shutter $bit >& /dev/null if(! $status) goto report # try BLAK-ICE echo "gtos_set_shutter_state shutter $goal" |\ xos_exchange.tcl $control 1 "illum" 3 >& /dev/null if(! $status) goto report echo "ERROR operating shutter! " set BAD = "unreachable" else if("$1" != "") echo "usage $0 [open|close]" set goal = "" endif report: # report on status of shutter set state = "unknown" if("$goal" == "close") set goal = "closed" set timeout = 20 while("$state" != "$goal" && ! $?BAD) if(("$state" == "")||("$state" == "unknown")) then set temp = `echo -n "M${motor}16\r" | sock_exchange.tcl $pmac 14001 1 "\r" | awk '{gsub("[\006\r]"," ",$0); print}'` if("$temp" == 1) set state = "open" if("$temp" == 0) set state = "closed" endif # get shutter state via XOS if((("$state" == "")||("$state" == "unknown"))) then set state = `echo -n "" | xos3_exchange.tcl 1 "set_motor_dependency" 30 |& awk '/^stog_configure_shutter shutter/{print $NF}'` endif # get shutter status from LabView socket if((("$state" == "")||("$state" == "unknown"))) then set state = `pxmotor.com Shutter | awk '/ 1$/{print "open"} / 0$/{print "closed"}'` endif # try BLAK-ICE if((("$state" == "")||("$state" == "unknown"))) then set state = `echo -n "" | xos_exchange.tcl $control 1 "illum" 1 |& awk '/^stog_configure_shutter shutter/{print $NF}'` endif if("$goal" == "") set goal = "$state" if("$goal" != "$state") then set state = unknown usleep 200000 @ timeout = ( $timeout - 1 ) if ( $timeout == 0 ) set BAD = timeout endif end finish: if( ! $?state) set state = "" if(("$state" == "")||("$state" == "unknown")) then if (! $?BAD) set BAD = unknown set state = "in unknown state: $BAD" endif echo "shutter is $state" if($?BAD) exit 9 exit # wait for shutter to reach desired state? set state = "open" set goal = "closed" while ("$state" != "$goal") # get port number from DCSS set port = ` echo -n "" | sock_exchange.tcl $control 14242 1 "" 1 | awk '{print $2+0}' ` # pretend to be a gui, get shutter state, and then disconnect echo "gtos_client_is_gui\000\n" |\ awk '{while(length($0)<200) $0 = $0 " "; printf "%s", $0}' |\ sock_exchange.tcl $control $port 1 "" 1 |\ od -An -w200 -cv |\ awk '{for(i=2;i<=length($0);i+=4){split(substr($0,i,3),c); if(c[1]=="\\0") {print ""; next}; if(c[1]=="") c[1]=" "; printf "%s", c[1]}; print ""}' |\ tee /dev/tty >! ${tempfile} set state = `awk '/^stog_configure_shutter shutter/{print $NF}' ${tempfile}` rm -f ${tempfile} >& /dev/null end echo "shutter is $state" exit # read the shutter position echo -n "M${motor}16\r" | sock_exchange.tcl $pmac 14001 1 "\r" | awk '{gsub("[\006\r]"," ",$0); print}' # open the shutter directly echo -n "M${motor}12=1\rM${motor}11=1\r" | sock_exchange.tcl $pmac 14001 2 "\006" | od -c # close the shutter directly echo -n "M${motor}12=0\rM${motor}11=1\r" | sock_exchange.tcl $pmac 14001 2 "\006" | od -c