#%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
|