esrf

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

#%TITLE% XNAP44.MAC
#
#%NAME%
#  XNAP44.MAC - Macros for defining xnapp44 pixel as pseudocounters
#
#%OVERVIEW%
#  Pixel counters are channels 0 to 15
#  channel 16 = total number of counts (in pixel counters)
#  channel 17 = total number of events (LIST mode)
#  channel 18 = pileup events (LIST mode)
#  channel 19 = lost events (LIST mode)
#
#%EXAMPLE%
#  %DL%
#  %DT%deepdev_add(\"mydev\", 2, 0, 0)
#  %DD%Configures the first device connected IP ... and assigns 
#      the name \"mydev\" to it.
#  %XDL%
#
#%DEPENDENCIES%
#  These macros make use of the following macro sets:
#  %UL%
#  %LI%deepdevice.mac
#  %XUL%
#%END%

#$Log: xnap44.mac,v $
#Revision 1.0  2012/04/23 11:42:42  perez
#PF macros, used on Apr 2012 xlab tests
#
#

#%UU%(<name>, <comdev>, <type>, <id>)
#%MDESC%
# Checks ...
def xnap44_add(name, comdev, type, id) '{
}'

#%IU%
def xnap44_par(mne, key, cmd, val) '{
   if (cmd == "get") 
      print "getting parameter " key
   else if (cmd == "set")
      print "setting parameter ",  key " to value ", val
}'

#%IU%
def xnap44__get_status(addr) '{
   return(deepdev_comm(addr, "?STATE") != "IDLE")
}'


#%IU%
def motxnap44_config(chan, cmd, p1, p2, p3) '{
   if (cmd == "ctrl") 
      return(motxnap44__ctrl_config(motxnap44_ADDR, p1, p2))
   else if (cmd == "mot") 
      return(motxnap44__mot_config(motxnap44_ADDR, chan))
}'


#%IU%
def motxnap44__ctrl_config(addr, unit, nchan) '{
   if (!deepdev_add(addr, addr, 3, "XNAP44"))
      return(".error.")
   if (deepdev_comm(addr, "?STATE") != "IDLE") {
      print "XNAP device not idle (use FAKE?)"
      return(".error.")
   }
}'

#%IU%
def motxnap44__mot_config(addr, mne) '{
   local parname querypar
   parname = motor_mne(mne)
   querypar = "?" parname

   answ = deepdev_comm(addr, querypar)
   if (answ == DEEPDEV_ERR) {
      print "Communication problem with XNAP device", addr
      return(".error.")
   } else if (answ == DEEPDEV_ERRANSW) {
      print parname, "is not a valid XNAP parameter"
      return(".error.")
   } else {
      print "setting xnap pseudomotor", parname, "in", addr
   }
}'


#%IU%
def motxnap44_cmd(mne, cmd, p1, p2, unit) '{
   if (cmd == "position")
      return(motxnap44__get_value(motxnap44_ADDR, mne))
   else if (cmd == "set_position")
      return(motxnap44__set_value(motxnap44_ADDR, mne, p1))
   else if (cmd == "start_one")
      return(motxnap44__set_value(motxnap44_ADDR, mne, p1))
   else if (cmd == "get_status")
      return(xnap44__get_status(motxnap44_ADDR))
   else {
#      print "Not implemented ", cmd
#      print A
   }
}'

#%IU%
def motxnap44__get_value(addr, mot) '{
   local comm value
   comm = "?" motor_mne(mot)

   value = deepdev_comm(addr, comm)
   if (value == DEEPDEV_ERR || value == DEEPDEV_ERRANSW) {
      return(".error.")
   } else {
      value += 0
      return(value)
   }
}'

#%IU%
def motxnap44__set_value(addr, mot, value) '{
   local comm answ
   comm = sprintf("%s %d", motor_mne(mot), value)

   answ = deepdev_comm(addr, comm)
   if (answ == DEEPDEV_ERR || answ == DEEPDEV_ERRANSW) {
      return(".error.")
   }
}'








#%IU%
def cntxnap44_config(chan, cmd, p1, p2, p3) '{
   global XNAP_CNT[]
   global XNAP_CNTMNE[]

   if (cmd == "ctrl") 
      return(cntxnap44__ctrl_config(cntxnap44_ADDR, p1, p2))
   else if (cmd == "cnt") 
      return(cntxnap44__cnt_config(cntxnap44_ADDR, p3, chan))
}'


#%IU%
def cntxnap44__ctrl_config(addr, unit, nchan) '{
   for (i in XNAP_CNTMNE)
      delete XNAP_CNTMNE[i]

   if (!deepdev_add(addr, addr, 3, "XNAP44"))
      return(".error.")
   if (nchan != 23) {
      print "Number of xnap channels is not 23"
      return(".error.")
   }
   if (deepdev_comm(addr, "?STATE") != "IDLE") {
      print "XNAP device not idle (use FAKE?)"
      return(".error.")
   }
}'


#%IU%
def cntxnap44__cnt_config(addr, chan, mne) '{
#   print cnt_mne(mne), "is xnap channel", chan, "in", addr
   XNAP_CNTMNE[chan + 0] = mne
}'


#%IU%
def cntxnap44_cmd(mne, cmd, p1, p2, unit) '{
   if (cmd == "get_status")
      return(cntxnap44__get_status(cntxnap44_ADDR))
   else if (cmd == "prestart_all") 
      return(cntxnap44__cntstart(cntxnap44_ADDR, p1, p2))
   else if (cmd == "counts")
      return(cntxnap44__get_counts(cntxnap44_ADDR, mne, p1, p2))
   else if (cmd == "halt_all")
      return(cntxnap44__cntstop(cntxnap44_ADDR))
   else {
#      print "Not implemented ", cmd
#      print A
   }
}'

#%IU%
def cntxnap44__get_status(addr) '{
   if (xnap44__get_status(addr))
      return(1)
   else {
      XNAP_CNT["cntdone"] = 1
      return(0)
   }
}'

#%IU%
def cntxnap44__cntstart(addr, ctime, mode) '{
#   print "XNAP start", ctime, mode

   if (mode != 2) {
      print "XNAP cannot run in mode", mode
      return(".error.")
   }
   deepdev_comm(addr, sprintf("COUNT %g", ctime))
   XNAP_CNT["cntdone"] = 0
   for (i in XNAP_CNT)
      XNAP_CNT[i] = 0
}'

#%IU%
def cntxnap44__cntstop(addr) '{
#   print "XNAP stop"
   deepdev_comm(addr, "STOP")
}'

#%IU%
def cntxnap44__get_counts(addr, mne, nct, p2) '{
   local n listmodeon

#   if (nct > 0 && deepdev_comm(addr, "?STATE") == "IDLE") {
   if (XNAP_CNT["cntdone"] == 1) {
      XNAP_CNT["cntdone"] = 2
      answ = deepdev_comm(addr, "?COUNTS")
      if (answ != DEEPDEV_ERR && answ != DEEPDEV_ERRANSW) {
         local xcnts[]

         n = split(answ, xcnts)
#         print "XNAP reading counts:", n
         listmodeon = (n != 16 && n!= 32)
         totcnt = 0
         for (i = 0; i < n; i++) {
            #print i, xcnts[i]
            if (listmodeon) {
               if (i < 3)
                  XNAP_CNT[XNAP_CNTMNE[17 + i]] = xcnts[i]
               else {
                  pxcnt = xcnts[i]
                  XNAP_CNT[XNAP_CNTMNE[i - 3]] = pxcnt
                  totcnt += pxcnt
               }
            } else {
               pxcnt = xcnts[i]
               XNAP_CNT[XNAP_CNTMNE[i]] = pxcnt
               totcnt += pxcnt
            }
         }
         XNAP_CNT[XNAP_CNTMNE[16]] = totcnt
      }
      answ = deepdev_comm(addr, "?TEMP0")
      if (answ != DEEPDEV_ERR && answ != DEEPDEV_ERRANSW) {
         XNAP_CNT[XNAP_CNTMNE[20]] = answ + 0
      }
      answ = deepdev_comm(addr, "?TEMP")
      if (answ != DEEPDEV_ERR && answ != DEEPDEV_ERRANSW) {
         split(answ, xcnts)
         XNAP_CNT[XNAP_CNTMNE[21]] = xcnts[0] + 0
         XNAP_CNT[XNAP_CNTMNE[22]] = xcnts[1] + 0
      }
   } 
   return(XNAP_CNT[mne])
}'

#%UU%
def xnap44setup '{
   local addr macrodef

   addr = "$1"
   if ($# == 0 || !deepdev_add(addr, addr, 3, "XNAP44")) {
      if (SETUP) print "Error in line: $0 $*"
      print "Usage:  $0 xnap44_addr"
      if (yesno("\nDisplay online help", 0)) eval("help local xnap44")
   } 

   macrodef = sprintf("xnap44_Fheader %s\n", addr)
   cdef("user_Fheader", macrodef, addr)
   
   setup_tail("xnap44", addr)
}'

#%IU%
def xnap44unsetup '{
   local addr key

   addr = "$1"
   cdef("", "", addr, "delete")
}'



#%UU%
def xnap44_Fheader '{
   local answ nlines list[] i

   answ = deepdev_comm("$1", "?CONFIG")
   nlines = split(answ, list, "\n")

   if (DATAFILE != "") {
      local i
      for(i = 0; i < nlines - 1; i++)
         printf("#C %s\n", list[i])
   }
}'



#%MACROS%
#%AUTHOR% P.Fajardo, (Original 6/10).
#  $Revision: 1.0 $ / $Date: 2012/04/23 11:42:42 $
#%TOC%