esrf

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

# $Log: mksrga.mac,v $
# Revision 1.4  2016/12/02 10:26:45  guilloud
# changed TANGO_ERR test.
#
# Revision 1.3  2011/11/07 12:30:39  claustre
# # missing, added again some macros like mksrgalim and enhanced mksrgastatus
#
# Revision 1.2  2011/11/07 09:41:23  claustre
# Added new macros.
#
# Revision 1.1  2011/10/20 14:53:59  claustre
# Initial revision
#

#%NAME%
# MKSRGA.MAC  - pseudo counters for MKS RGA controller partial pressure measurement
#
#%DESCRIPTION%
#
# %BR%
#
# This macro set is based on the use of the MKS_MicrovisionIP_RGA Tango device server. %BR%
# This device server is available from the package Control/Tango/Server/MKS_MicrovisionIP_RGA.
#%END%
#

#%UU% <name> <device name>
#%MDESC%
def mksrgasetup '{
  local rga_name rga_device arrayname
  global MKSRGA_DEV[]
  global MKSRGA_UNIT
  list_init MKSRGA_DEV



    if ($# !=2){
      print "Usage: $0 <name> <mksrga device name>"
      exit
    }

    rga_name = "$1"
    rga_device = "$2"

    list_add(MKSRGA_DEV,rga_name)
    MKSRGA_DEV[rga_name]["device"] = rga_device
    MKSRGA_DEV[rga_name]["enable"] = 1
    MKSRGA_DEV[rga_name]["cnt_on"] = 0
    tango_io(rga_device,"State")
    if (TANGO_ERR != "0") {
      _mksrga_error rga_name; printf ("device is not reachable\n")
      MSKRGA_DEV[rga_name]["enable"] = 0
      exit
    }
    tango_io(rga_device,"timeout", 10)

    MKSRGA_UNIT = rga_name

    arrayname = sprintf("mksrga_data_%s", rga_name)
    double array @arrayname[101]
    MKSRGA_DEV[rga_name]["arrayname"] = arrayname

    startmass = tango_get(rga_device,"StartMass")
    endmass = tango_get(rga_device,"EndMass")
    MKSRGA_DEV[rga_name]["startmass"] = startmass
    MKSRGA_DEV[rga_name]["endmass"] = endmass
    MKSRGA_DEV[rga_name]["cnt_on"] = 1

   setup_tail("mksrga", rga_name)
}'

#%UU% <name>
#%MDESC% unsetup rga name %BR%
# Remove all cdefs
def mksrgaunsetup '{
  local rganame
  if (!$#) {
    print "Usage: $0 <rganame>"
    exit
  }
  rganame= "$1"
  if (list_check(MKSRGA_DEV, rganame)>0) {
    arrname= MKSRGA_DEV[rganame]["arrname"]
    unglobal @arrname
    MKSRGA_DEV[rganame]["cnt_on"] = 0
  }
  if (MKSRGA_UNIT==rganame) {
    if (list_n(MKSRGA_DEV)>0) {
      MKSRGA_UNIT= list_item(MKSRGA_DEV, 1)
    } else {
      MKSRGA_UNIT= 0
    }
  }
}'

#%UU% <rga name> <cnt mne> <mass>
#%MDESC%
# Create a new pseudo counter for rga "rga name"  on mass "mass" using counter "cnt mne".
def mksrga_add_counter '{
    if ($# != 3) {
      print "Usage: $0 <rganame> <cntmne> <mass>"
      exit
    }
    _mksrga_add_counter("$1", "$2", $3)
}'

#%IU% ()
#%MDESC%
# Add a mass pseudo counter for rga "rganame" and mass "mass"
def _mksrga_add_counter(rganame, cntmne, mass) '{

  _mksrga_counter_init()

  if (list_check(MKSRGA_DEV, rganame)<=0) {
    _mksrga_error ; printf("<%s> is not a MKS RGA\n", "$1")
    exit
  }

  if (list_item(MKSRGA_CNT, cntmne)==-1)
    list_add(MKSRGA_CNT, cntmne)

  MKSRGA_CNT[cntmne]["rganame"] = rganame
  MKSRGA_CNT[cntmne]["mass"] = mass
}'


#%IU% ()
#%MDESC%
# Initialise associative array %B%MKSRGA_CNT%B% and create user_getcounts cdef
#
def _mksrga_counter_init ()'{
 global MKSRGA_CNT[]
 if (list_n(MKSRGA_CNT)<0)
    list_init MKSRGA_CNT

 cdef ("user_getcounts","_mksrga_getcounts\n","mksrga_counters", 0x20)
}'

#%UU% <roimne>
#%MDESC%
# Remove the specified mass counter
#
def mksrga_remove_counter '{
  local cntmne

  if ($#!=1) {
    print "Usage: $0 <cntmne>"
    exit
  }
  cntmne= "$1"

  if (list_check(MKSRGA_CNT, cntmne)<=0) {
    _mksrga_error ; printf("Unknown ROI <%s>\n", cntmne)
  } else {
    _mksrga_remove_counter(cntmne)
  }
}'

#%IU% (cntmne)
#%MDESC%
#  Remove the specified mass counter
#
def _mksrga_remove_counter(cntmne) '{
  local cntnum rganame

  rganame= MKSRGA_CNT[cntmne]["rganame"]

  list_remove(MKSRGA_CNT, cntmne)
  if ((cntnum= cnt_num(cntmne))!=-1) {
    S[cntnum]= 0
  }
  if (list_n(MKSRGA_CNT)<1) {
    cdef("", "", "mksrga_counters", "delete")
  }
}'

#%UU% [<rga name>]
#%MDESC%
# Show or change active MKS RGA.
# Active MKS RGA has to be set for acquisition macros like %B%mksrga_start%B%
#
def mksrgadev '{
  if ($#==1) {
    local rganame
    rganame= "$1"
    if (rganame == rganame + 0) {
      if (!_mksrga_setunit(rganame)) {
        _mksrga_error; printf("rga unit <%d> is not a RGA\n", rganame)
      }
    } else {
      if (!_mksrga_setname(rganame)) {
        _mksrga_error; printf("rga name <%s> is not a MKS RGA\n", rganame)
      }
    }
  } else {
    if (!MKSRGA_UNIT) {
      _mksrga_trace; printf("No default MKS RGA set !!\n")
    } else {
      _mksrga_trace; printf("Using <%s>\n", MKSRGA_UNIT)
    }
  }
}'

#%IU% (rgaunit)
def _mksrga_getname(unit) '{
  local irga rganame
  for (irga=1; irga<=list_n(MKSRGA_DEV); irga++) {
    rganame= list_item(MKSRGA_DEV, irga)
    if (MKSRGA_DEV[rganame]["unit"]==unit)
      return rganame
  }
  return 0
}'

#%IU% (rgaunit)
def _mksrga_setunit(unit) '{
  local rganame
  rganame= _mksrga_getname(unit)
  if (rganame) {
    MKSRGA_UNIT= rganame
    return rganame
  }
  return 0
}'

#%IU% (rganame)
def _mksrga_setname(rganame) '{
  local irga
  for (irga=1; irga<=list_n(MKSRGA_DEV); irga++) {
    if (rganame == list_item(MKSRGA_DEV, irga)
      MKSRGA_UNIT= rganame
      return rganame
  }
  return 0
}'


#%UU% [rganame]
#%MDESC% Switch on rga pseudo counters
def mksrgaon '{
  local rganame

  _mksrga_check_unit $*
  MKSRGA_DEV[rganame]["cnt_on"] = 1

}'

#%UU%
#%MDESC% Switch off rga pseudo counters
def mksrgaoff '{
  local rganame

  _mksrga_check_unit $*
  MKSRGA_DEV[rganame]["cnt_on"] = 0

}'


#%UU% [rganame]
#%MDESC% Switch off the rga filament, see mksrgasetfil to select the filament number
def mksrgafilon '{
  local rganame

  _mksrga_check_unit $*

  tango_io(MKSRGA_DEV[rganame]["device"],"On")
  _mksrga_trace ; printf("unit %s, filament switched ON\n", rganame)
}'


#%UU% [rganame]
#%MDESC% Switch on the rga filament, see mksrgasetfil to select the filament number
def mksrgafiloff '{
  local rganame

  _mksrga_check_unit $*

  tango_io(MKSRGA_DEV[rganame]["device"],"Off")
  _mksrga_trace ; printf("unit %s, filament switched OFF\n", rganame)
}'

#%UU% [filament number (1-2)]
#%MDESC% Set  or return the rga filament number, see mksrgafilon/off to switch on/off the filament
def mksrgafil '{
  local filn rganame

  rganame = MKSRGA_UNIT
  rgadev = MKSRGA_DEV[rganame]["device"]

  if ($#==1 && ($1!=1 && $1!=2)) {
    print "Usage: $0 <filament number (1-2)>"
    exit
  } else {
    if ($#==0){
      filn = tango_get(rgadev,"FilamentNumber")
      _mksrga_trace; printf("unit %s, active filament is %d\n",rganame, filn)
    }else {
      filn = $1
      tango_put(rgadev,"FilamentNumber", filn)
    }
  }
}'


#%UU% [<startmass> <endmass>]
#%MDESC% Set  the rga mass interval limits for scanning
def mksrgalim '{
  local startmass endmass rganame rgadev

  rganame = MKSRGA_UNIT
  rgadev = MKSRGA_DEV[rganame]["device"]
  if ($#!=2) {
    if ($#==0) {
      startmass = tango_get(rgadev,"StartMass")
      endmass = tango_get(rgadev,"EndMass")
      MKSRGA_DEV[rganame]["startmass"] = startmass
      MKSRGA_DEV[rganame]["endmass"] = endmass

      _mksrga_trace; printf("unit %s, mass interval = [%d - %d]\n",rganame,startmass, endmass)
    } else {
      print "Usage: $0 [<startmass> <endmass>]"
      exit
    }
  }else if ($# == 2) {
    startmass = $1; endmass = $2
    MKSRGA_DEV[rganame]["startmass"] = startmass
    MKSRGA_DEV[rganame]["endmass"] = endmass
    tango_put(rgadev,"StartMass", startmass)
    tango_put(rgadev,"EndMass", startmass)
    _mksrga_trace; printf("unit %s, new mass interval limits set\n", rganame)
  }

}'

#%UU% [rganame]
#%MDESC% Display the rga status
def mksrgastatus '{
  local rganame _status

  _mksrga_check_unit $*
  _status = tango_get(MKSRGA_DEV[rganame]["device"],"Status")
  _mksrga_trace; printf("%s\n", _status)

  mksrgafil
  mksrgalim

}'


#%UU% [rganame]
#%MDESC% Ask the device server to release the rga device, allows other application %BR%
# like web browser to get control of the device.
def mksrga_release '{
  local rganame

  _mksrga_check_unit $*

  tango_io(MKSRGA_DEV[rganame]["device"],"Release")
  _mksrga_trace ; printf("unit %s Released\n", rganame)
  mksrgastatus
}'

#%UU% [rganame]
#%MDESC% Ask the device server to take control the rga device %BR%
# it Supposes there is no more other client connected to the device (like a web browser).
def mksrga_init '{
  local rganame

  _mksrga_check_unit $*

  tango_io(MKSRGA_DEV[rganame]["device"],"Init")
  _mksrga_trace ; printf("unit %s Under control\n", rganame)
  mksrgastatus
}'

#%IU%
def _mksrga_check_unit '
  if ($#==1){
    rganame= "$1"
    if (list_check(MKSRGA_DEV, rganame)<=0) {
      _mksrga_error ; printf("<%s> is not a MKS RGA\n", "$1")
      exit
    }
  } else{
    rganame = MKSRGA_UNIT
  }
'

#%IU%
#%MDESC%
def _mksrga_getcounts '{
  local irga rganame arrayname device cnti
  local cntmne cntnum
  local device_list[] dev

  for (irga = 1; irga <= list_n(MKSRGA_CNT); irga++) {
    cntmne = list_item(MKSRGA_CNT, irga)
    cntnum = cnt_num(cntmne)
    rganame = MKSRGA_CNT[cntmne]["rganame"]
    if (MKSRGA_DEV[rganame]["enable"] && MKSRGA_DEV[rganame]["cnt_on"]) {
      device = MKSRGA_DEV[rganame]["device"]
      dev = (device in device_list)? 1:0
      # only read once the masses for each device
      if (!dev) {
        device_list[device]=1
        arrayname = MKSRGA_DEV[rganame]["arrayname"]
        tango_get(device,"Masses", @arrayname)
      }
      if (cntnum !=-1 && counter_par(cntnum,"disable")!=-1) {
        S[cntnum] = @arrayname[MKSRGA_CNT[cntmne]["mass"]]
      }
    }else {
      device_list[device]=1
    }

  }
}'

#%IU%
#%MDESC%
def _mksrga_error '{
  tty_cntl("md")
  printf("MKS-RGA%s ERROR > ", ($#==1) ? sprintf("[%s]", $1) : "")
  tty_cntl("me")
}'
#%IU%
def _mksrga_trace '{
  tty_cntl("md")
  printf("MKS-RGA%s > ", ($#==1) ? sprintf("[%s]", $1) : "")
  tty_cntl("me")
}'

#%MACROS%
#%IMACROS%
#%TOC%
#%AUTHOR% L.Claustre, $Revision: 1.4 $, $Date: 2016/12/02 10:26:45 $