esrf

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

#%TITLE% DCP3000.MAC
#
#%NAME%
#  DCP3000.MAC - Macros to control DCP3000 pressure controller
#
#%OVERVIEW%
#  
#
#%END%
def dcp3000_setup '{
    global DCP3000_LIST[]
    global DCP3000_SCANON
    global DCP3000_WAIT
    
    DCP3000_WAIT = 0.2
    
    list_init DCP3000_LIST

    # ct
    cdef("user_getcounts","_dcp3000_set_cnts; ","dcp3000")
    #screen
    cdef("user_prescan_head","_dcp3000_scan_read();","_dcp3000_scan") 
    #datafile
    cdef("user_Fheader","_dcp3000_scan_read();","_dcp3000_scan") 
    #screen
    cdef("user_scan_tail","_dcp3000_scan_read();","_dcp3000_scan") 
    #datafile
    cdef("Ftail","_dcp3000_scan_read();","_dcp3000_scan") 
}'
    

#%UU%
#%MDESC%
# Syntax : dcp3000_add [name] [counter] [serial device number]%BR%
# Add pressure sensor controller DCP3000 
def dcp3000_add '{
    local name counter dev 
    
    if ($# != 3) {
        printf("Usage: dcp3000_add [name] [counter] [serial device number]\n")
        exit
    }
    
    name    = "$1"
    counter = "$2"
    dev     =  $3
    
    if (cnt_num(counter) == -1) {
        printf("Counter \"%s\" not configured in SPEC, exit !!!\n", counter)
        exit
    }

    if (!list_check(DCP3000_LIST, name)) {
        list_add(DCP3000_LIST, name)
	list_setpar(DCP3000_LIST, name, "on", 0)
    }
    
    list_setpar(DCP3000_LIST, name, "counter", counter)
    list_setpar(DCP3000_LIST, name, "dev", dev)
}'

#%UU% 
#%MDESC%
# Syntax : dcp3000_scanon%BR%
# To introduce the printing of pressure in scans
def dcp3000scanon '{
   DCP3000_SCANON = 1
}'


#%UU% 
#%MDESC%
# Syntax : dcp3000_scanoff%BR%
# To remove the printing of pressure in scans
def dcp3000scanoff '{
   DCP3000_SCANON = 0
}'

#%IU%()
#%MDESC% writes the pressure in scans macro
def _dcp3000_scan_read()'{
    local dcp_name temp1 temp2 dcp_pres
  
    if (DCP3000_SCANON) {
        dcp_n = list_n(DCP3000_LIST)

        for (dcp_nb=1 ; dcp_nb<=dcp_n ; dcp_nb++) {
	    dcp_name = DCP3000_LIST[dcp_nb]
            dcp_dev = list_getpar(DCP3000_LIST, dcp_name, "dev")
            dcp_pres = _dcp3000_read(dcp_dev)
            printf("#C DCP3000 PRES (%s) = %7.3f \n",DCP3000_LIST[dcp_name], dcp_pres)
        }
    }
}'

def _dcp3000_read(dev) '{
    local msg_in msg_out myarr
   
    msg_in  = sprintf("IN_PV_1\r")
    ser_put(dev, msg_in)
    sleep(DCP3000_WAIT)
    msg_out = ser_get(dev)   
    split(msg_out,myarr)
    return myarr[0]
}'
#IU%
#%MDESC%
# Syntax : _dcp3000_set_cnts()%BR%
# Read pressure and set the corresponding pseudo counters
# added by %B%dcp3000_add%B% 

def _dcp3000_set_cnts '{
    local dcp_n  dcp_counter dcp_dev dcp_pres

    dcp_n = list_n(DCP3000_LIST)
    if(dcp_n != 0){  
        for (dcp_nb=1 ; dcp_nb<=dcp_n ; dcp_nb++) {
            dcp_name = DCP3000_LIST[dcp_nb]
            if (list_getpar(DCP3000_LIST, dcp_name, "on")){
               dcp_counter = list_getpar(DCP3000_LIST, dcp_name, "counter")
               dcp_dev = list_getpar(DCP3000_LIST, dcp_name, "dev")
               dcp_pres = _dcp3000_read(dcp_dev)
               num_cnt = cnt_num(dcp_counter)
               S[num_cnt] = dcp_pres
	     }
        }
    }
}'
 
#%UU%
#%MDESC%
# Syntax : dcp3000on%BR%
# Switch pressure logging on. Spec will read the pressure at each
# count and load sensor values into the pseudo counters 
# added by %B%dcp3000_add%B%
# Syntax : dcp3000on [name1] [name2] [name4] [...]
# Switch pressure logging on. Spec will read the pressure at each
# count and load sensor values into the pseudo counters for the selected DCP3000%BR%

def dcp3000on '{
    local dcp_n dcp_nb dcp_name str dcp_list[]

    if ($# == 0) {
        dcp_n = list_n(DCP3000_LIST)
        if (dcp_n != 0){  
            for (dcp_nb=1 ; dcp_nb<=dcp_n ; dcp_nb++) {
                dcp_name = DCP3000_LIST[dcp_nb]
                list_setpar(DCP3000_LIST, dcp_name, "on", 1)
            }
        }
    } else {
        str = "$*"
        dcp_n = split(str, dcp_list)
        for (dcp_nb=0 ; dcp_nb<dcp_n ; dcp_nb++) {
            dcp_name = dcp_list[dcp_nb]
            if (list_check(DCP3000_LIST, dcp_name)){
                list_setpar(DCP3000_LIST, dcp_name, "on", 1)
            }   
        }
    }
}'


#%UU%
#%MDESC%
# Syntax : dcp3000off%BR%
# Switch pressure logging off.

def dcp3000off '{
    local dcp_n dcp_nb dcp_name str dcp_list[] dcp_counter num_cnt

    if ($# == 0) {
        dcp_n = list_n(DCP3000_LIST)
        if (dcp_n != 0){  
            for (dcp_nb=1 ; dcp_nb<=dcp_n ; dcp_nb++) {
                dcp_name = DCP3000_LIST[dcp_nb]
                dcp_counter = list_getpar(DCP3000_LIST, dcp_name, "counter")
                num_cnt = cnt_num(dcp_counter)
                S[num_cnt] = -1
                list_setpar(DCP3000_LIST, dcp_name, "on", 0)
            }
        }
    } else {
        str = "$*"
        dcp_n = split(str, dcp_list)
        for (dcp_nb=0 ; dcp_nb<dcp_n ; dcp_nb++) {
            dcp_name = dcp_list[dcp_nb]
            if (list_check(DCP3000_LIST, dcp_name)){
                list_setpar(DCP3000_LIST, dcp_name, "on", 0)
                dcp_counter = list_getpar(DCP3000_LIST, dcp_name, "counter")
                num_cnt = cnt_num(dcp_counter)
                S[num_cnt] = -1
            }   
        }
    }            
}'
#%MACROS%
#%DEPENDENCIES%
#  No dependencies
#%AUTHOR% A. Mauro, G. Berruyer, (Original 04/14). %BR%
#  $Revision: 1.0 $ / $Date: 2014/04/07 09:14:39 $
#%TOC%