esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]

#%TITLE% wagoatt.mac
#%NAME%
#   Macros to handle attenuators on wago box
#%DESCRIPTION%
#%SETUP%
# wago box has to be configured by %B%wagosetup%B% from %B%wagocore.mac%B%
#%END%

#%UU% <cmd_wago_key_name> [<stat_wago_key_name>]
#%MDESC%
# setup the attenuator using given wago key name(s)
#%BR% <cmd_wago_key_name> : wago key name to control attenuator blades
#%BR% <stat_wago_key_name> (optionnal): wago key name to read status of blades
#
def wagoattsetup '{

    if (($#<1)||($#>3)) {
	print "$0 <cmd_wago_key_name> [\"inv\"] [<stat_wago_key_name>]"
	exit
    }
    global WATT_NAME WATT_NCH WATT_MAX WATT_TIME WATT_STAT WATT_CINV

    WATT_CINV= 0
    WATT_STAT= 0
    WATT_TIME= 0.3

    WATT_NAME= "$1"
    if ($#==1) {
        WATT_CINV= 0
        WATT_STAT= 0
    } else if ($#==2) {
	WATT_CINV= ("$2"=="inv") ? 1 : 0
	WATT_STAT= WATT_CINV ? 0 : "$2"
    } else {	
	WATT_CINV= ("$2"=="inv") ? 1 : 0
	WATT_STAT= "$3"
    }

    if (!(WATT_NAME in WAGOKEYS)) {
	_watt_error("attenuator name not defined on wago box")
	WATT_NCH= 0
    }
    else {
	WATT_NCH= WAGOKEYS[WATT_NAME]["nch"]
    }
    WATT_MAX= (1<<WATT_NCH)-1
    
    cdef("Ftail", "_watt_Ftail;", "_watt_")
    setup_tail("wagoatt")
}'

#%IU%
def wagoattunsetup '{
    unglobal WATT_NAME WATT_NCH WATT_MAX WATT_TIME WATT_STAT
    cdef("", "", "_watt_", "delete")
}'

#%IU% (msg)
def _watt_error(msg) '{
    tty_cntl("md")
    printf("ERROR <%s> ", WATT_NAME)
    tty_cntl("me")
    print msg
}'

#%UU%
#%MDESC%
# Print out current attenuator state
#
def attshow '{
    if (!WATT_NCH) {
	_watt_error("attenuator not properly configured")
    }
    else {
	local shead sval ival
	local attval[] value

	value= _watt_get(attval)
	if (value != -1) {
	    shead= "#  "
	    sval = ""
	    for (ival=0; ival<WATT_NCH; ival++) {
		shead= shead sprintf(" F%d ", pow(2,ival))
		sval= sval sprintf("%3.3s ", attval[ival]?"IN":"OUT")
	    }
	    print shead
	    printf("%2d %s\n", value, sval)
	}
    }
}'


#%IU%
def _watt_Ftail '{
    local pars[] value
    if (WATT_NCH>0) {
	value= _watt_get(pars)
        printf("#ATT %d\n",value)
    }
}'

#%UU%
#%MDESC%
# set new value for attenuator
#
def attset '{
    local val
    if ($#!=1) {
	print "Usage: $0 <att_value>"
	exit
    }
    val= int($1)
    if ((val<0)||(val>WATT_MAX)) {
	_watt_error(sprintf("set value out of range [0..%d]", WATT_MAX))
    }
    else {
	_watt_set(val)
    }
}'

#%IU% (pars)
def _watt_get(pars) '{
    local npar ipar value
    if (!WATT_STAT) {
        npar= wago_readch(WATT_NAME, pars)
    } else {
	npar= wago_readch(WATT_STAT, pars)
    }
    if (npar != WATT_NCH) {
	_watt_error("Cannot read att. on wago")
	return (-1)
    }
    value= 0
    for (ipar=0; ipar<npar; ipar++)
        value += (pars[ipar]<<ipar)
    return value
}'

#%IU% (value)
def _watt_set(val) '{
    local vask[] vset[] vget[] ipar npar iset iask vback

    if (_watt_get(vget)==-1)
	return (-1)

    iset= 0
    for (ipar=0; ipar<WATT_NCH; ipar++) {
	vask[ipar]= (val & (1<<ipar)) ? 1 : 0
	vset[ipar]= vget[ipar]|vask[ipar]
	iset += (vset[ipar]!=vget[ipar])
	iask += (vask[ipar]!=vset[ipar])
	if (WATT_CINV) {
	    vask[ipar]= \!vask[ipar]
	    vset[ipar]= \!vset[ipar]
	}
    }
    if (iset) {
	if (wago_writech(WATT_NAME, vset)!=WATT_NCH) {
	    _watt_error("cannot set attenuator (intermediate state)")
	    return (-1)
	}
	sleep(WATT_TIME)
    }
    if (iask) {
	if (wago_writech(WATT_NAME, vask)!=WATT_NCH) {
	    _watt_error("cannot set attenuator (final state)")
	    return (-1)
	}
	sleep(WATT_TIME)
    }
    if (WATT_STAT != 0) {
        vback= _watt_get(vget)
        if (vback != val) {
	    _watt_error("read back not correct")
	    return (-2)
	}
    }
	
    return val
}'

#%UU% [<attvalue>]
#%MDESC%
# Without argument, print out current attenuator state,
#%BR% With argument, set new attenuator value
#
def att '{
    if ($#) attset $* 
    else attshow
}'

#%UU%
#%MDESC%
# set maximum attenuation
#
def attmax '{
    _watt_set(WATT_MAX)
}'

#%UU%
#%MDESC%
# set minimum attenuation
#
def attmin '{
    _watt_set(0)
}'

#%MACROS%
#%IMACROS%
#%TOC%
#%AUTHOR% E.Papillon