source $cfPath(commands)/commands_common.tcl namespace eval beamstops { array set bs_target {bs3 66.5 bs4 66 bs5 64} namespace export selbs } namespace eval motor { # is_homing_list = comma separated list of motors which are safe to send "home" variable is_homing_list "" } # Some metadata variables about the beamstop and the beam foreach {var lname type priv units klass} { BeamCenterX BeamCenterX float user mm parameter BeamCenterY BeamCenterY float user mm parameter BeamStop BeamStop int user none parameter } { ::utility::mkVar $var $type $priv $lname true $klass true true if {$units != "none"} { sicslist setatt $var units $units } } # TODO Implement BeamStop as a macro which checks actual beamstop positions. BeamStop -1 ## # @brief Beamstop select command # @param bs beamstop, 1,2,3,4,5 or 6 command ::beamstops::selbs {int=3,4,5 bs} { variable bs_target set bsdriving false array set bsl [subst { 3 [SplitReply [bs3 softlowerlim]] 4 [SplitReply [bs4 softlowerlim]] 5 [SplitReply [bs5 softlowerlim]] }] if [ catch { switch $bs { "3" { set bsmot "bs3" set bsdownCmd "drive bs4 $bsl(4) bs5 $bsl(5)" } "4" { set bsmot "bs4" set bsdownCmd "drive bs3 $bsl(3) bs5 $bsl(5)" } "5" { set bsmot "bs5" set bsdownCmd "drive bs4 $bsl(4) bs5 $bsl(5)" } default { error "beamstop selection must be an integer from 3 to 5" } } statemon start selbs if {[info level] > 1} {statemon start [lindex [info level -1] 0]} set bsdriving true BeamStop -1 drive $bsmot $bs_target($bs) eval $bsdownCmd BeamStop $bs set bsdriving false statemon stop selbs if {[info level] > 1} {statemon stop [lindex [info level -1] 0]} } msg ] { if {$bsdriving} { statemon stop selbs if {[info level] > 1} {statemon stop [lindex [info level -1] 0]} } return -code error $msg } } namespace import ::beamstops::selbs publish selbs user proc ::commands::isc_initialize {} { ::commands::ic_initialize }