esrf

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

#%TITLE% ccdutils.mac
#%NAME% 
#    Macros for testing purposes. Most of these macros are now obsolete
#    Check with BLISS before using them
#%CATEGORY% Detection, ccd
#%SETUP%
# Run the macro %B%ccdsetup%B% to setup the camera
#%DESCRIPTION%
# Configuration
# Macros for testing purposes.
#%DL%
#    %DT% ccdinit %DD% Initializes ccd
#    %DT% sdv 
#    %DT% ccdsdv 'sdv'
#    %DT% vxi 
#    %DT% ccdvxi 'vxi' 
#    %DT% ccdstatus 
#    %DT% Xstatus_update ' 
#    %DT% ccdstatus_normal
#    %DT% ccdserial 
#    %DT% ccdstatus_mpp 
#    %DT% ccdstatus_init_normal 
#    %DT% ccdstatus_init_mpp 
#    %DT% ccdtest 
#    %DT% ccdvxitest 
#    %DT% ccdoffset
#    %DT% ccd_1channel(cha,level,tol,bin,mode) 
#%XDL%
#Graphical user interface.Frelon camera
#%DL%
#    %DT% xfrelon %DD%  Update SpecGUI values
#    %DT% xbinroi %DD%  Binning and roi. when button pressed
#    %DT% xroi %DD% Roi change
#    %DT% xbin %DD% Bining change
#    %DT% xacquire %DD% Acquisition. Called from ACQUIRE button
#    %DT% xupdcurrent %DD% Updates current image on film
#    %DT% xupdstate %DD%  Updates CCD state
#    %DT% xcontinuous %DD%  Continuous acquisition. Called from button
#    %DT% xbloom %DD% Sets antiblooming option on and off
#    %DT% xshutter %DD%  Opens and close the camera shutter
#    %DT% xtunning %DD%  Camera started continuously whitout acquiring images
#    %DT% xfilm %DD% Starts a film on the images after a ACQUIRE action
#    %DT% xnext %DD% Shows next image in film
#    %DT% xprev %DD% Shows previous image in film
#    %DT% xwaitacq %DD% Will catch action on STOP button (~)
#    %DT% xstopacq %DD% STOP button is pressed.
#    %DT% xupdsetup %DD% Updates all variables in setup panel
#    %DT% xtrigger %DD% Sets external trigger on or off
#    %DT% xcmdout %DD% called from radio buttons
#    %DT% ccdsv  %DD%
#    %DT% xclosedacs %DD% close dacs pannel
#%XDL%
#%DL%
#    %DT% ccdpars %DD% send configuration (images sweeps op_mode)
#    %DT% ccdreadset %DD% Read roi and bin parameters from frelon
#    %DT% xdacs %DD% for managing the dacs pannel
#    %DT% xdacs_send_A %DD% xdacs_send_B ...... xdacs_send_G 
#    %DT% xdacs_send_all 
#    %DT% bumm_clear %DD%  For tesing purposes of accum mode
#    %DT% bumm_clear_always %DD%  For tesing purposes of accum mode
#%DL%
#    %DT% ccdsaveconf %DD%  Save dac values to a file
#    %DT% ccdgetconf %DD%  Restore DAC values from file
#%EXAMPLE%
# Some examples of macros
#%PRE%
#    NERON.213> ccdpars 0 1 1
#%PRE%
#
#%LOG%
#   $Revision: 1.7 $
#   $Log: ccdutils.mac,v $
#   Revision 1.7  2011/07/07 09:01:19  perez
#   Fix bug in xflip
#
#   Revision 1.6  2008/02/27 13:15:02  rey
#   documentation changes
#
#Revision 1.5  2006/02/28 16:33:46  ahoms
#Force binning in ccdoffset after setting hw_par
#
#Revision 1.4  2005/01/18 15:51:44  fernande
#ccdoffset. Gain set to 0 at the begining (the maximun) to avoid
#problems with the new algorithm
#
#Revision 1.3  2004/10/01 14:22:48  claustre
#The real version modified by David on racine (BM05) to add more ccdoffset
#modes (13,23,34 ...) + restore some macros like setfrelon2000 used by Xtomo.mac
#
#HISTORY
#     2002-Nov-18 DFC
#       xfrelon added xflip value to update
#     2005-01-18 AH + DFC
#       ccdoffset (ccd_1channel). First gain changed from 2000
#	to 0. Under some conditions on some cameras in some channels
#	with the new algorithm  (NEW_CCDOFFSET=1)  gain = 2000 gave a 
#	output level = 0 preventing the algorithm from converge
#	Now starting with the gain at the maximun level gain=0  this 
#	should be fixed . 
#%END%


#%UU%  
#%MDESC%
#  Runs fast1024 to initialize SDV card. Loads xilinx.
def ccdinit '{
   on("/dev/null");offt
   u /opt/EDTsdv/fast1024
   ont;close("/dev/null")
}'

#%IU%
#%MDESC%
# Configures the camera as SDV type
def sdv '{
   ccdinit
   getconf sdv
}'

#%IU%
#%MDESC%
# Same as %B%sdv%B%
#
def ccdsdv 'sdv'

def vxi '{
   getconf vxi
   #ccd_frelonsetup 0 
   image_par(CCD_U,"input_channel",15)
}'

def ccdvxi 'vxi'
global ARRAYNAME
def _my_sersleep ' sleep(0.3) '
def ccdstatus '{
   local answer retval
   local label min max val xal

   local bla,flo,vac,ccdtmp,vdd,vss,vdr,vgs,vld,vpad,vpd,vssd,pcbtemp

   ccdserial

   if (FRELON2000) {
     ccdstatus_init_2000
   } else {
     if (CCDSERNO == 5 ) {
       ccdstatus_init_mpp
     } else if (CCDSERNO == 1 || CCDSERNO == 4) {
       ccdstatus_init_mpp_new
     } else {
       ccdstatus_init_normal
     } 
   }

   for(;;) if ( image_par(CCD_U,"talk") == "" ) break;

   image_par(CCD_U,"talk","V\r\n") ; _my_sersleep
   
   answer = image_par(CCD_U,"talk")
   split(answer,bla,":")
   n_ret = split(bla[1],retval,",")

   if (FRELON2000) {
     ccdstatus_2000
   } else {
     if (CCDSERNO == 5 ) {
       ccdstatus_mpp
     } else if (CCDSERNO == 1 || CCDSERNO == 4) {
       ccdstatus_mpp_new
     } else {
       ccdstatus_normal
     } 
   }

  for (i =0;i<12;i++) {
      if ( val[i] < min[i] || val[i] > max[i] ) {
         xal[i] = "On"
      } else {
         xal[i] = "-"
      } 
   }

   if (GUI_RUN) {
       Xstatus_update
   } 

   printf("CCDSTATUS:\n")
   tty_cntl("md")
   printf("\t   %10s\t\t  %10s      %3s\n","Range","Measured","Alarm")
   tty_cntl("me")

   for(i=0;i<12;i++) {
     if (label[i] != "") {
        lim = sprintf("( %6s , %6s )",sprintf("%4.2f",min[i]),sprintf("%4.2f",max[i]))
   	printf(" %10s %19s  %6s \t%3s\n", \
             label[i],lim,sprintf("%4.2f",val[i]),xal[i])
     }
   }
# test
#   if (CCDSERNO == 1) {
#        xdacs_norm
#	p
#        printf(" %10s (Low=80e ,Norm=20e)  %6s\n", \
#             "Gain",GAIN? "Normal":"Low")
#
#   }

}'

def Xstatus_update '

       if (FRELON2000) {
          Xval("xccdtemp",sprintf("%3.2f",val[0]))
       } else {
          Xval("xccdtemp",sprintf("%3.2f",val[2]))
       }

       for (i=0;i<12;i++) {
          if (label[i] != "") {
           Xval(sprintf("\"xsta%d\"",i+1),sprintf("%3.2f",val[i]))
           Xval(sprintf("\"xran%d\"",i+1),sprintf("\( %3.2f, %3.2f \)", min[i],max[i]))
           Xval(sprintf("\"xal%d\"",i+1),xal[i])
           Xval(sprintf("\"xlab%d\"",i+1),label[i])
          }

       }

'

def ccdstatus_normal '{

   vac = retval[1]/102.4
#   if ( vac <= 8.20) {
#      val[1] = 37E-4 * pow(vac,4) -4E-2 * pow(vac,3) + 18.1E-2 * pow(vac,2) -15E-2 * vac + 7E-2
#   } else {
#      val[1] = 99.66 * pow(vac,4)- 3526.4 * pow(vac,3) + 46762 * pow(vac,2) -275404 * vac + 607810
#   }

  val[1]=retval[1]
   val[0]  = 1.8 * (retval[0]/1.57)/2.2
   val[2]  =             retval[2]  * 0.1525 - 74.6
   val[3]  = -0.012926 + retval[3]  * 0.00983
   val[4]  = -0.01906  - retval[4]  * 0.009764
   val[5]  =  2.455    + retval[5]  * 0.000404
   val[6]  =  0.03543  - retval[6]  * 0.009731
   val[7]  =  0.17267  + retval[7]  * 0.002463
   val[8]  =  1.2622   + retval[8]  * 0.0049145
   val[9]  =  1.9692   - retval[9]  * 0.00486
   val[10] = -0.209    - retval[10] * 0.0094355
   val[11] =             retval[11] * 0.4883


}'


def ccdstatus_2000 '{

#  vac = retval[2]/409.6
#   if ( vac <= 8.20) {
#      val[2] = 37E-4 * pow(vac,4) -4E-2 * pow(vac,3) + 18.1E-2 * pow(vac,2) -15E-2 * vac + 7E-2
#   } else {
#      val[2] = 99.66 * pow(vac,4)- 3526.4 * pow(vac,3) + 46762 * pow(vac,2) -275404 * vac + 607810
#   }

#  modified by  VBD and DFC 1/02/2001
#   val[0]  =            (retval[0] * 0.03853 - 75.24)*1.065
   val[0]  =            (101/16) * (((retval[0]*5000/4096)/200)-4)-50
#  modified by  VBD and DFC 1/02/2001
#  val[1]  =            (retval[1]*0.006414 - 0.3163)*0.74 #Frelon2000(11)
   val[1]  =    	retval[1]*5/4096.0  
   val[2]  =   		retval[2] * 1000 / 4096
#  modified by  VBD and DFC 1/02/2001
#   val[3]  =            retval[3] * 0.02442 - 0.00814
   val[3]  =            retval[3] * 100/4096

   val[4]  =    	retval[4]*5/4096.0  
   val[5]  =    	retval[5]*5/4096.0  
   val[6]  =    	retval[6]*5/4096.0  
   val[7]  =    	retval[7]*5/4096.0  

#   val[8]  =  retval[8]  
#   val[9]  =  retval[9]  
#   val[10] =  retval[10]


#   val[3]  = -0.012926 + retval[3]  * 0.00983
#   val[4]  = -0.01906  - retval[4]  * 0.009764
#   val[6]  =  0.03543  - retval[6]  * 0.009731
#   val[7]  =  0.17267  + retval[7]  * 0.002463
#   val[8]  =  1.2622   + retval[8]  * 0.0049145
#   val[9]  =  1.9692   - retval[9]  * 0.00486
#   val[10] = -0.209    - retval[10] * 0.0094355
#   val[11] =             retval[11] * 0.4883

}'


def ccdserial '{
   global CCDSERNO
   f3send OFF
   _my_sersleep
   image_par(CCD_U,"talk","?\r\n")
   _my_sersleep
   answer = image_par(CCD_U,"talk")
   sscanf(answer,"%s %s\t:%d",bof,bof2,serno)
   CCDSERNO = serno
}'

def ccdstatus_mpp '

  vac=retval[1]/102.4

#  if (vac<=8.20){
#      val[1]=37E-4*pow(vac,4)-4E-2*pow(vac,3)+18.1E-2*pow(vac,2)-15E-2*vac+7E-2
#  } else
#      val[1]=99.66*pow(vac,4)-3526.4*pow(vac,3)+46762*pow(vac,2)-275404*vac+607810

  val[1]=retval[1]
  val[0]    = 1.8*(retval[0]/1.57)/2.2
  val[2]    =   retval[2]  * 0.1525-74.6
  #val[2]    =   (retval[2] -488)/6.48 
  val[3]    =   retval[3]  * 0.009766
  val[4]    =  -retval[4]  * 0.009766
  val[5]    =   retval[5]  * 0.009766
  val[6]    =  -retval[6]  * 0.009766
  val[7]    = -(retval[9]  * 0.004883)-5
  val[8]    = -(retval[10] * 0.009766)-12
  val[9]    =   retval[11] * 0.4883
'

def ccdstatus_mpp_new '
  global GAIN
  val[1]=retval[1]

  val[0]    = 1.8*(retval[0]/1.57)/2.2
  val[2]    =   (retval[2] -488)/6.48 
  val[3]    =   retval[3]  * 0.009766
  val[4]    =  -retval[4]  * 0.009766
  val[5]    =   retval[5]  * 0.009766
  val[6]    =  -retval[6]  * 0.009766
  val[7]    =   retval[7]  * 0.004883  
  val[8]    = -(retval[9]  * 0.004883)-5
  val[9]    = -(retval[10] * 0.009766)-12
  val[10]   =   retval[11] * 0.09765
  
'

def ccdstatus_init_normal '
   min[0] = 10    ; max[0] = 30     ; label[0]  = "Water flow"
   min[1] = 100  ; max[1] = 670     ; label[1]  = "Vacuum"
   min[2] = -21   ; max[2] = -19    ; label[2]  = "CCD Temp"
   min[3] = 8.5   ; max[3] = 9.5    ; label[3]  = "VDD" 
   min[4] = -10.1 ; max[4] = -9.8   ; label[4]  = "VSS"
   min[5] = 2     ; max[5] = 3      ; label[5]  = "VDR"
   min[6] = -10   ; max[6] = -8.0   ; label[6]  = "VGS"
   min[7] = 0.2   ; max[7] = 0.6    ; label[7]  = "VLD"
   min[8] = 2.3   ; max[8] = 2.6    ; label[8]  = "VPAD" 
   min[9] = -1.7  ; max[9] = -1.4   ; label[9]  = "VPD"
   min[10] = -9.7 ; max[10] = -9.4  ; label[10] = "VSSD"
   min[11] = 25   ; max[11] = 65    ; label[11] = "PCB Temp"
'

def ccdstatus_init_mpp_new '
   min[0] = 18    ; max[0] = 40     ; label[0]  = "Water flow"
   min[1] = 100   ; max[1] = 670    ; label[1]  = "Vacuum"
   min[2] = -21   ; max[2] = -17    ; label[2]  = "CCD Temp"
   min[3] = 8.5   ; max[3] = 9.5    ; label[3]  = "VDD" 
   min[4] = -10.1 ; max[4] = -9.8   ; label[4]  = "VSS"
   min[5] = 2     ; max[5] = 3      ; label[5]  = "VDR"
   min[6] = -10   ; max[6] = -8.0   ; label[6]  = "VGS"
   min[7] = 0     ; max[7] = 5      ; label[7]  = "Pelt Cur"
   min[8] = -9 	  ; max[8] = -7     ; label[8]  = "VLH"
   min[9] = -22   ; max[9] = -18    ; label[9]  = "VSS2" 
   min[10] = 25   ; max[10] = 65    ; label[10] = "PCB Temp"
   min[11] = ""   ; max[11] = ""    ; label[11] = "" 
'

def ccdstatus_init_mpp '
   min[0] = 18    ; max[0] = 40     ; label[0]  = "Water flow"
   min[1] = 100   ; max[1] = 670    ; label[1]  = "Vacuum"
   min[2] = -21   ; max[2] = -17    ; label[2]  = "CCD Temp"
   min[3] = 8.5   ; max[3] = 9.5    ; label[3]  = "VDD" 
   min[4] = -10.1 ; max[4] = -9.8   ; label[4]  = "VSS"
   min[5] = 2     ; max[5] = 3      ; label[5]  = "VDR"
   min[6] = -10   ; max[6] = -8.0   ; label[6]  = "VGS"
   min[7] = -9    ; max[7] = -7     ; label[7]  = "VLH"
   min[8] = -22   ; max[8] = -18    ; label[8]  = "VSS2" 
   min[9] = 25    ; max[9] = 65     ; label[9] = "PCB Temp"
   min[10] = ""   ; max[10] = ""    ; label[10] = ""
   min[11] = ""   ; max[11] = ""    ; label[11] = ""
'

def ccdstatus_init_2000 '
   min[0] = -21   ; max[0] = -17   ; label[0]  = "CCDTEMP"
   min[1] = 2.5   ; max[1] = 4.5   ; label[1]  = "PELTCUR"
   min[2] = 100   ; max[2] = 670   ; label[2]  = "VACUUM"
   min[3] = 25    ; max[3] = 65    ; label[3]  = "PCBTEMP"
   min[4] = 0     ; max[4] = 5     ; label[4]  = "VDR1"
   min[5] = 0     ; max[5] = 5     ; label[5]  = "VDR2"
   min[6] = 0     ; max[6] = 5     ; label[6]  = "VDR3"
   min[7] = 0     ; max[7] = 5     ; label[7]  = "VDR4" 
   min[8] = ""    ; max[8] = ""    ; label[8]  = ""
   min[9] = ""    ; max[9] = ""    ; label[9]  = ""
   min[10] = ""   ; max[10] = ""   ; label[10] = ""
   min[11] = ""   ; max[11] = ""   ; label[11] = ""
'

def ccdrst '{
   f3send RST
}'

def ccdtest '{
   f3send X7
   xacquire 1 1 0 0
   p "Setting old Taxi mode = " CCD_TAXI_MODE
   f3send X"CCD_TAXI_MODE"
   #f3send X6
}'

def ccdvxitest '{
   image_par(CCD_U,"test_mode",2)
   ARRAYNAME=sprintf("image_data%d",CCD_U)
   image_get(CCD_U,@ARRAYNAME)
   image_par(CCD_U,"test_mode",0)
}'


#
# Set of macros to ajust the offset
#
def setfrelon2000 '
  global FRELON2000

  if (image_par(CCD_U,"type")&0x10)  {
     FRELON2000=1
  } else {
     FRELON2000=0
  }
'
#
# DFC 2004/09/10  Added channels 13 24 in ccdoffset
#
#
#
def ccdoffset '{
    global FRELON2000
    local thech _mirror _ccdtrig _ccdkinetics _ccdroi
  
    if (GUI_RUN) Xval("xstrout","")

    if (!$#) {
        channel = getval("Channel to adjust ( 0 = all )",4)
        level   = getval("Desired output level",100)
        itime   = getval("Integration time (in msec)",100)
        tolera  = getval("Error tolerance",0.5)
    } else {
        channel = $1
        level   = $2
        itime   = $3
        tolera  = $4
    }

    if (channel == 5 )
    	channel = 12
    if (channel == 6 )
    	channel = 13
    if (channel == 7 )
    	channel = 23
    if (channel == 8 )
    	channel = 34

    if ((channel!=0) && (channel!=1) && (channel!=2) && (channel!=3) && \
        (channel!=4) && (channel!=12) && (channel !=13) && (channel !=23) \
	 && (channel!=34) ) {
        printf("Channel must be between one of 0,1,2,3,4,12,13,23,34")
        exit
    }

    if ( level < 10 || level > 15000 ) {
        printf("Wrong value for output level ")
        exit 
    }
    
    setfrelon2000

    p "Setting Internal Trigger"
    _ccdtrig = image_par(CCD_U,"ext_trig")
    image_par(CCD_U,"ext_trig",0)

    p "Setting Kinetics off"
    _ccdkinetics = image_par(CCD_U,"kinetics")
    image_par(CCD_U,"kinetics",0)

    _ccdroi[1] = image_par(CCD_U,"row_beg")
    _ccdroi[2] = image_par(CCD_U,"row_end")
    _ccdroi[3] = image_par(CCD_U,"col_beg")
    _ccdroi[4] = image_par(CCD_U,"col_end")

    if ((_ccdroi[2] - _ccdroi[1] != image_par(CCD_U, "rows")-1 )  || \
         _ccdroi[4] - _ccdroi[3] != image_par(CCD_U, "cols")-1 ) { 
	
	_ccdroi[0] = 1
    } else {
	_ccdroi[0] = 1
    }

    p "Setting ROI off"
    ccdroi 0 0 2047 0 2047

    binn = 0
    
    print

    if ( image_par(CCD_U,"row_bin") == 2 ) {
       if ( image_par(CCD_U,"col_bin") == 2 ) {
           binn = 1
           printf("Binning\n")
       }
    } else {
           printf("No Binning\n")
    }

    printf("Closing SHUTTER...\n")

    image_par(CCD_U,"images",1)
    f3send U0

    if (image_par(CCD_U,"controller")=="CCD_PC") {
		local _res _myresult
        	_res = image_par(CCD_U,"hw_par")
		split(_res,_myresult," ")
		_mirror = _myresult[0]
		image_par(CCD_U,"hw_par",sprintf("%d %d %d %d", 0, _myresult[1], _myresult[2],_myresult[3]))
		if (binn) {
			ccdbin 1 1
			ccdbin 2 2
		}
    } else {
    		_mirror = image_par(CCD_U,"flip")
    		image_par(CCD_U,"flip",0)
    }
    printf("Make sure that the image is not mirrored \n")
    printf("mirror was %d \n",_mirror)

    if (image_par(CCD_U,"controller")=="CCD_PC")

    f3_dump
    sleep(0.5)

#    image_par(CCD_U,"preset",itime/1000)
#    image_par(CCD_U,"run")
#    sleep(0.2)
#    stop(4)
#    It makes the macro stops working with certain cameras (ID11 MPP)

    if ( channel == 0 ) {
        mode = 1
        #ccd_frelonsetup 0
        image_par(CCD_U,"input_channel",15)
        sleep(1)
        for ( ii = 1;ii<5;ii++) {
           ccd_1channel(ii,level,tolera,binn,mode)
        }
    } else if ((channel==1)||(channel==2)||(channel==3)||(channel==4)) {
        mode = 0
        #ccd_frelonsetup channel
        image_par(CCD_U,"input_channel",(channel == 0)?15:pow(2,channel-1))
        sleep(1)
        ccd_1channel(channel,level,tolera,binn,mode)
    } else if (channel == 12) {
        mode = 2
        #ccd_frelonsetup channel
        image_par(CCD_U,"input_channel",3)
        sleep(1)
        ccd_1channel(1,level,tolera,binn,mode)
        ccd_1channel(2,level,tolera,binn,mode)
    } else if (channel == 13) {
        mode = 2
        #ccd_frelonsetup channel
        image_par(CCD_U,"input_channel",5)
        sleep(1)
        ccd_1channel(1,level,tolera,binn,mode)
        ccd_1channel(3,level,tolera,binn,mode)
    } else if (channel == 23) {
        mode = 2
        #ccd_frelonsetup channel
        image_par(CCD_U,"input_channel",6)
        sleep(1)
        ccd_1channel(2,level,tolera,binn,mode)
        ccd_1channel(3,level,tolera,binn,mode)
    } else if (channel == 34) {
        mode = 2
        #ccd_frelonsetup channel
        image_par(CCD_U,"input_channel",12)
        sleep(1)
        ccd_1channel(3,level,tolera,binn,mode)
        ccd_1channel(4,level,tolera,binn,mode)
    }
    printf ("\n\n*****OFFSET CALIBRATION FINISHED*****\n")

    #image_data0[0][0]=image_data0[0][0]    

    print "Shutter control from Frelon active " 
    f3send U1

    if (_mirror) {
	printf("Reseting flip in mux to %d \n",_mirror) 
    	if (image_par(CCD_U,"controller")=="CCD_PC") {
		local _res _myresult
        	_res = image_par(CCD_U,"hw_par")
		split(_res,_myresult," ")
		_mirror = _myresult[0]
		image_par(CCD_U,"hw_par",sprintf("%d %d %d %d", _mirror, _myresult[1], _myresult[2],_myresult[3]))
		
	} else {
    		image_par(CCD_U,"flip",_mirror)
	}
    }
    if (_ccdroi[0]) {
	printf("Reseting roi to %d %d %d %d\n",_ccdroi[1], _ccdroi[2], _ccdroi[3], _ccdroi[4]) 
        ccdroi _ccdroi[0] _ccdroi[1] _ccdroi[2] _ccdroi[3] _ccdroi[4]
    }
    if (_ccdtrig) {
	printf("Reseting External trigger\n") 
    	image_par(CCD_U,"ext_trig",_ccdtrig)
    }
    if (_ccdkinetics) {
	printf("Reseting Kinetics (window size = %d)\n",\
				image_par(CCD_U,"kinwinsize")) 
    	image_par(CCD_U,"kinetics",_ccdkinetics)
    }

    xfrelon
}'
def ccd_1channel(cha,level,tol,bin,mode) '{
    local outerror thech cmd
    local gain total diff aver oldgain olddiff
    local FACTOR first 
    global NEW_CCDOFFSET
  
    NEW_CCDOFFSET = 1

    thech = cha - 1
    tty_cntl("md")
    printf("\n\nAdjusting channel--> ")
    printf(" %d ",cha)
    tty_cntl("me")
    printf("\n\n%d\n",FRELON2000)

    if (FRELON2000) {
      cmd[0] =  "DI"
      cmd[1] =  "DJ"
      cmd[2] =  "DK"
      cmd[3] =  "DL"
    } else {
      cmd[0] =  "DA"
      cmd[1] =  "DB"
      cmd[2] =  "DC"
      cmd[3] =  "DD"
    }
    gain     = 0
    iter     = 0 
    outerror = 16000
    first    = 1


    if (!bin) {
       if (mode == 0) {    # One channel - no binning
           fx     = 100 ; fy = 100
           lx     = 399 ; ly = 399
       } 

       if (mode == 1 || mode == 2) {      #  Four channels - no binning
           if (cha == 1 ) { fx = 125 ; fy = 125 }
           if (cha == 2 ) { fx = 125 ; fy = 625 }
           if (cha == 3 ) { fx = 625 ; fy = 125 }
           if (cha == 4 ) { fx = 625 ; fy = 625 }
           lx = fx + 250 ; ly = fy + 250
       }
    } else {
       if (mode == 0) {    # One channel - binning
           fx     = 50  ; fy = 50
           lx     = 199 ; ly = 199
       } 
       if (mode == 1 || mode == 2) {      #  Four channels. binning
           if (cha == 1 ) { fx = 62 ; fy = 62 }
           if (cha == 2 ) { fx = 62 ; fy = 317 }
           if (cha == 3 ) { fx = 317 ; fy = 62 }
           if (cha == 4 ) { fx = 317 ; fy = 317 }
           lx = fx + 125 ; ly = fy + 125
       }
    }

    # If FRELON 2000 (2048 x 2048 ) 
    if (FRELON2000) {
          FACTOR=2
    } else {      # If FRELON (1024 x 1024 ) 
          FACTOR=1
    }
   
    fx*=FACTOR; fy*=FACTOR; lx*=FACTOR; ly*=FACTOR
 
    n_pixels = ( lx - fx + 1) * ( ly - fy + 1)

    print

    while ( outerror > tol ) {
         newcmd = sprintf("%s%d",cmd[thech],gain)
         iter ++ 
         printf("\t - %2d. %s --> ",iter,newcmd)
         strout = sprintf("Ch%d-(%d) %4d -> ",thech+1,iter,gain)

         image_par(CCD_U,"talk",sprintf("%s\r\n",newcmd))
         if (GUI_RUN) 
              Xval("xccdstate",sprintf("Sending %s",newcmd))
         sleep(0.3)
         for(;(res =image_par(CCD_U,"talk"))!="";) {
            substr(res,0,3)
            if (res=="!OK"){ 
              if (GUI_RUN) 
                Xval("xccdstate",sprintf("WARN: Error sending %s",newcmd))
              else
                p "WARN: Error sending " newcmd
            }
         } 
         image_par(CCD_U,"run")
         waitacq 
   	 ARRAYNAME=sprintf("image_data%d",CCD_U)
   	 image_get(CCD_U,@ARRAYNAME)
        
         total = array_op("sum",@ARRAYNAME[fx:lx][fy:ly])

         aver = total / n_pixels

         printf("\tAverage = %3.2f",aver)
         strout= sprintf("%s av= %3.2f",strout,aver)

         diff = aver - level
         outerror=fabs(diff)

	 if (NEW_CCDOFFSET) {
	 	if (first) {
         		olddiff = diff
         		oldgain = gain
			gain = int(gain + diff*2.4)
			first = 0
			# it estimates the gain considering a factor 2.4
			# to calculate the next point we use the ecuation of a line
			# from the previous two points.
			#
			#  Marco Di Michie 
		} else {
			#
			# y = mx + q
			# y ---> diff     x ----> gain
			# it calculates two points and of a line and then it goes to the
			# third one (where diff is 0) 
			#
			local _tmp 
			if (olddiff != diff)
				_tmp = gain - diff * (oldgain -gain) / (olddiff - diff)
			else	
				_tmp = gain
			olddiff = diff
         		oldgain = gain
			gain = _tmp
		}
	 } else {
         	oldgain = gain
		gain = int(gain + diff*4)
	 }

         if (gain>4095) gain=4095

         if (gain<=0) gain = int(oldgain/2)

         strout = sprintf("%s. er = %3.3f", strout,outerror)
         printf(". Diff. = %3.3f                  \r", outerror)

         if (iter > 40) {
            printf ("\nCANNOT CONVERGE.  Sorry\n")
            strout = sprintf ("CANNOT CONVERGE.  Sorry")
            break
         } 
         if (GUI_RUN) Xval("xstrout",strout)
    }
    if (iter < 40 ) 
         if (GUI_RUN) Xval("xstrout","Calibration: DONE")
}'



#
#   Macros for Frelon CCD used from SpecGUI panels.
#   ( for demo on "Salon de la Physique 7-9 Oct 1997 )
#
#   Author: V.Rey
#
#   Date:   October 1997
#
global CCD_STATE CCD_CURRENT BINNING MULTIout
global CCD_LINE CCD_ROIY CCDINTF CCDINTFL

    #
    #   FRELON.PAN
    #

#%UU%
#%MDESC%
# Update SpecGUI values
# ( called when panel opened and at other several places )
#
def xfrelon '{

    global CCD_TAXI_MODE

    local ccdsize ccdtrig ccdtrig_state inch ccdinch xout
    local ccdxbin ccdybin ccdrbeg ccdrend ccdcbeg ccdcend
    local answer ccdtemp talkval
    local _bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw,_sln,_sinn
    local _p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_su,_u;

    if (whatis("CCDINTF") & 0x8000000 ) CCDINTF = "NONE"

    ccdsize = sprintf("%dx%d",image_par(CCD_U,"rows"),image_par(CCD_U,"cols"))
    ccdtrig = image_par(CCD_U,"ext_trig")?"Int":"Ext"
    ccdtrig_state = \
     image_par(CCD_U,"ext_trig")?"Trig.is ext.(TTL)":"Trig.is int.(Spec)"


    inch = image_par(CCD_U,"input_channel")

    if (inch == 15) { ccdinch = "all" }
    else {
       if ( inch & 1 ) ccdinch = sprintf("1 ")
       if ( inch & 2 ) ccdinch = sprintf("%s2 ",ccdinch)
       if ( inch & 4 ) ccdinch = sprintf("%s3 ",ccdinch)
       if ( inch & 8 ) ccdinch = sprintf("%s4 ",ccdinch)
    }

    for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
    image_par(CCD_U,"talk",sprintf("DUM\r\n")); # f3send DUMM
    sleep(.3)
    for(i=0;i<5;i++) {res =image_par(CCD_U,"talk")}

    sscanf(res,"%3s:%d",_bla,CCD_TAXI_MODE)
    sleep(.3);	res =image_par(CCD_U,"talk")
    
    if (FRELON2000) {
       sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
           %d,%d,%d,%d,%d,%d",_bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw, \
           _sln,_sinn,_p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_su,_u)
    } else {
       # Commented out by V.Rey. 4/6/1999 - I do not see the need for this
       #   and when left overwrites res with nothing and the sscanf does
       #   not work
       #res =image_par(CCD_U,"talk");
       sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
           %d,%d,%d,%d,%d",_bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw, \
           _sln,_sinn,_p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_u) # without _su
    }
    for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
#
#   I have commented out the actualization of the shutter state because
#   there was a problem with _su (some cameras have it some dont)
#   So we trurst the Shutter command, and we dont read the real state
#   in the camera 
#   DFC 2/3/2001 
#    if (_u==0) {
#          Xval("xsh","On")
#          Xval("shutter_state","Shutter is OFF")
#    }
#    else { 
#          Xval("xsh","Off")
#          Xval("shutter_state","Shutter is ON")
#    }
    if (_bl==0) {
          Xval("xblo","On")
          Xval("bloom_state","Antibloom. is OFF")
    }
      else {
          Xval("xblo","Off")
          Xval("bloom_state","Antibloom. is ON")
    }
    
    if (_bv || _bh ) {
        Xval("xroilist",3)
        BINNING=1
        if (!_bv || !_bh)
           Xval("xccdstate","WARN: Either BV or BH not set!!!!"  )
           sleep(1)
        if ( _r)  {
           Xval("xccdstate","WARN: Both ROI&BINNING are set!!!!"  )
           sleep(1)
        }
    } else  {
       BINNING=0
       if( _r) {
             if (_rf) Xval("xroilist",1)
             else  Xval("xroilist",2)
       } else  
             Xval("xroilist",0)
    }
    if (_r) {
    	Xval("xccdrbeg",_rlb)
    	Xval("xccdrend",_rlb+_rlw-1)
    	Xval("xccdcbeg",_rpb)
    	Xval("xccdcend",_rpb+_rpw-1)
    } else {
    	Xval("xccdrbeg","")
    	Xval("xccdrend","")
    	Xval("xccdcbeg","")
    	Xval("xccdcend","")
    }

    ccdstatus

#    In the lab they want to see the values in the camera (not in spec)
#    ccdrbin = image_par(CCD_U,"row_bin")
#    ccdcbin = image_par(CCD_U,"col_bin")
#
    ccdrbeg = image_par(CCD_U,"row_beg")
    ccdrend = image_par(CCD_U,"row_end")
    ccdcbeg = image_par(CCD_U,"col_beg")
    ccdcend = image_par(CCD_U,"col_end")

    #if  ( image_par(CCD_U,"rows") == ccdrend - ccdrbeg + 1) {
    #   if ( image_par(CCD_U,"cols") == ccdcend - ccdcbeg + 1 ) {
    #       CCD_ROIY = 0
    #   }  
    #} 

    
    if (ccdinch == "" ) ccdinch = "none"
    
    Xval("xccdsize",ccdsize)
    Xval("xsetuptrig",ccdtrig)
    Xval("trigger_state",ccdtrig_state)
    Xval("xccdinch",ccdinch)
    Xval("xroilist",CCD_ROIY)
#    Xval("xccdrbin",ccdrbin)
#    Xval("xccdcbin",ccdcbin)
    Xval("xccdrbeg",ccdrbeg)
    Xval("xccdrend",ccdrend)
    Xval("xccdcbeg",ccdcbeg)
    Xval("xccdcend",ccdcend)
    Xval("xccdintf",CCDINTF)
    Xval("xccdintfl",CCDINTFL)

    Xval("xccdstate","Idle")

    xkinetics

   inch = image_par(CCD_U,"input_channel")

   if (inch == 15 ) { xout = 0 ;MULTIout=1}
   else if ( inch == 1 ) { xout = 1 ;MULTIout=0}
   else if ( inch == 2 ) { xout = 2 ;MULTIout=0}
   else if ( inch == 4 ) { xout = 3 ;MULTIout=0}
   else if ( inch == 8 ) { xout = 4 ;MULTIout=0}
   else if ( inch == 3 ) { xout = 5 ;MULTIout=1}
   else if ( inch == 5 ) { xout = 6 ;MULTIout=1}
   else if ( inch == 10 ) { xout = 7 ;MULTIout=1}
   else if ( inch == 12 ) { xout = 8 ;MULTIout=1}
   else { xout = 0 ;MULTIout=0}
    
   Xval("xout",xout)

   Xval("xflip",XFLIP)

}'

#%UU%
#%MDESC%
#  Binning and roi.
#  ( called when APPLY button pressed )
#
def xbinroi '{
  if ($1==3) {
     xbin 2 2
     xroi 0 $2 $3 $4 $5
     CCD_ROIY = 3
     xfrelon
     Xval("xccdstate","Info: Binning doesnt allow ROI"  )
  } else {
     xbin 1 1 
     xroi $1 $2 $3 $4 $5
     xfrelon
     if (MULTIout && $1) {
       Xval("xccdstate","ROI & MultiOutput not available"  )
     }
  }
}'

#%UU%
#%MDESC%
#  ROI change
# ( called when REGION OF INTEREST list is changed or from xbinroi macro)
#
def xroi '{
    if ($1 == 1) { 
      print "Fast ROI"
      CCD_ROIY = 1
      f3send R1  #----
      f3send RF1
    }
    if ($1 == 2) {
      print "Slow ROI"
      CCD_ROIY = 2
      f3send R1 #----
      f3send RF0
    }
    if ($1 == 0) {
      CCD_ROIY = 0
      print "No ROI"
      f3send R0 #----
    }

    ccdroi $1 $2 $3 $4 $5 
}'

#
#  Binning. Called from xbinroi
#
def xbin '{
    local robin cobin

    if ($1 != 2 ) {
       robin = 1
       f3send BH0  
    } else {
       robin = $1
       f3send BH1  
    }
    sleep(0.3)
    if ($2 != 2 ) {
       cobin = 1
       f3send BV0  
    } else {
       cobin = $1
       f3send BV1 
    }
    ccdbin robin cobin
}'
#
# Send ROI values directly to the camera (Det Lab)
def send_roi_col_beg'{
   f3send RPB"$1" 
   image_par(CCD_U,"col_beg",$1)
}'
def send_roi_row_beg'{
   f3send RLB"$1" 
   image_par(CCD_U,"row_beg",$1)
}'
def send_roi_col_width '{
   local col_width
   col_width=$1-$2
   if (col_width <= 0)
	printf ("Column end - column begin must be positive \n")
   else {
   	f3send RPW"col_width" 
	image_par(CCD_U,"col_end",$1)
   }
}'
def send_roi_row_width '{
   local row_width
   row_width=$1-$2
   if (row_width <= 0)
	printf ("Row end - row begin must be positive \n")
   else {
   	f3send RLW"row_width" 
	image_par(CCD_U,"row_end",$1)
   }
}'

#
# Acquisition. Called from ACQUIRE button
#
def xacquire '{
   local noimg nsweeps sto_mode exptime 

   if ( $1 == 0 ) { 
     exptime = 1
   } else {
     exptime = $1
   }

   if ( int($2) == 0 ) { 
     noimg = 1
   } else {
     noimg = int($2)
   }

   if ( int($3) < 0 ) {
     nsweeps = 0
   } else {
     nsweeps = int($3)
   } 

   if ($# == 4 ) 
       sto_mode = $4 

   image_par(CCD_U,"get_offset",0)

   if (CCDINTFL==4)
     image_par(CCD_U,"storage",0)

   if (sto_mode == 0 ) {
       image_par(CCD_U,"sweeps",0)
   } else {
      if ( nsweeps > 1 ) {
         if (CCDINTFL==4) image_par(CCD_U,"storage",sto_mode+1)
         image_par(CCD_U,"sweeps",nsweeps)
         printf("\tAccumulation for %d sweeps ( \"%s\" mode ) \n",nsweeps, \
                (sto_mode==1)?"C":"D/E")
         printf("\ttotal number of images = %d \n",nsweeps * noimg ) 
      }
   }

   CCD_CURRENT = 1; xupdcurrent

   image_par(CCD_U,"preset",exptime)
   image_par(CCD_U,"images",noimg)

   ccd_createarray

   image_par(CCD_U,"run")
   aaa = time()

   CCD_STATE = "Acquiring"; xupdstate

   xwaitacq
   CCD_STATE = "Reading"; xupdstate
   ttime = time() - aaa
   atime = noimg/ttime

   ARRAYNAME=sprintf("image_data%d",CCD_U)
   image_get(CCD_U,@ARRAYNAME)
   CCD_STATE = sprintf("Idle.__%2.2f_i/sec",atime); xupdstate

   xfrelon
}'

#
# Updates current image on film
#
def xupdcurrent '{
   Xval("xcurrent",CCD_CURRENT)
}'

#
# Updates CCD state
#
def xupdstate '{
   Xval("xccdstate",CCD_STATE)
}'


#
# Continuous acquisition.
# (called from CONTINUOUS button. )
#
def xcontinuous '{
   local acqtime
 
   if ($1 == 0 ) {
      acqtime = 1
   } else {
      acqtime = $1
   }

   print "Acquiring continuous.  Exposure: " acqtime "sec."
   image_par(CCD_U,"images",1)
   image_par(CCD_U,"preset",acqtime)
   CCD_CURRENT = 1; xupdcurrent
   aaa = time()

   rdef cleanup \'ccd_cleancont\'

   for (ctr=1;;ctr++) {
       image_par(CCD_U,"run")
       xwaitacq
       ARRAYNAME=sprintf("image_data%d",CCD_U)
       image_get(CCD_U,@ARRAYNAME)

       if (ctr%5 == 0) {
         ttime = time() - aaa
         aaa = time()
         rate = 5 / ttime
         CCD_STATE = sprintf("%3.2f__im/sec",rate)
         xupdstate
       }
   }   
}'

def ccd_cleancont '{
 printf("xcontinuous stop\n")
 Xval("xccdstate","Idle")
 rdef cleanup ""
}'
#
# Sets antiblooming option on and off
# ( called from AntiBLOOM button )
def xbloom '{
   if ( "$1" == "On" ) {
       f3send BL1 
       Xval("xblo","Off")
       Xval("bloom_state","Antibloom. is ON")
   } else {
       f3send BL0 
       Xval("xblo","On")
       Xval("bloom_state","Antibloom. is OFF")
   }
}'

#
# Opens and close the camera shutter
# ( called from SHUTTER button )
def xshutter '{
   if ( "$1" == "On" ) {
       print "Setting Shutter ON"
       sleep(0.5)
       f3send U1 
       Xval("xsh","Off")
       Xval("shutter_state","Shutter is ON")
   } else {
       print "Setting Shutter OFF"
       sleep(0.5)
       f3send U0 
       Xval("xsh","On")
       Xval("shutter_state","Shutter is Off")
   }
}'

#
# sends acquisition time directly to the camera 
#
def send_acq_time'{
   local ptime
   ptime=$1*1000
   image_par(CCD_U,"preset","$1")
   f3send I"ptime" 
}'
#
# sends Number of images directly to the camera 
#
def send_no_images'{
   image_par(CCD_U,"images","$1")
   f3send N"$1" 
}'

#
# Starts stop tunning mode (automatic start)
# ( called from TUNNING button )
def xtunning_on_off '{
   local e_time
   if ( "$1" == "Tunning_Start" ) {
       print "Starting tunning"
       e_time=$2*1000
       f3send I"e_time"

       f3send N0 
       f3send S 
       Xval("xtunning","Tunning_Stop")
       CCD_STATE = "Tunning ON"; xupdstate
   } else {
       print "Stopping tunning"
       f3send N1 
       Xval("xtunning","Tunning_Start")
       CCD_STATE = "Tunning OFF"; xupdstate
   }
}'

#
# Starts a film on the images after a ACQUIRE action
# ( called from Film button )
def xfilm '{
     local filmtime 

     if ($1 == 0 ) {
        filmtime = 1
     }  else {
        filmtime = $1
     }

     for (i=0;i<image_par(CCD_U,"images");i++) {
        CCD_CURRENT = i +  1; xupdcurrent
        image_par(CCD_U,"get_offset",i)

        ARRAYNAME=sprintf("image_data%d",CCD_U)
        image_get(CCD_U,@ARRAYNAME)

        #if ( (ch = input(-1) ) != "")
        #  if (ch == "~")
        #      break
        sleep(filmtime)
     }
}'

#
# Shows next image in film
# ( NEXT button )
def xnext '{
     local nimages

     nimages = image_par(CCD_U,"images") 

     CCD_CURRENT = image_par(CCD_U,"get_offset") + 1

     if (CCD_CURRENT < nimages ) {
        image_par(CCD_U,"get_offset",CCD_CURRENT)

         ARRAYNAME=sprintf("image_data%d",CCD_U)
         image_get(CCD_U,@ARRAYNAME)

        CCD_CURRENT++; xupdcurrent
     }

}'

#
# Shows previous image in film
# ( PREV button )
def xprev '{
     local nimages

     nimages = image_par(CCD_U,"images") 

     CCD_CURRENT = image_par(CCD_U,"get_offset") + 1

     if (CCD_CURRENT > 1 ) {
        image_par(CCD_U,"get_offset",CCD_CURRENT-2)

        ARRAYNAME=sprintf("image_data%d",CCD_U)
        image_get(CCD_U,@ARRAYNAME)

        CCD_CURRENT--; xupdcurrent
     }

}'

#
# Polling on acquisition.
# Will catch action on STOP button (~)
#
def xwaitacq '{
   while (wait(0x24)) {
      sleep(0.1)
   }
   user_waitacq
}'

#
# Will stop current acquisition if
# STOP button is pressed.
def xstopacq '{
   print "Stop requested"
   stop(4)
}'
#
# Sets external trigger on or off
# ( called from TRIGGER button )
def xtrigger '{
    local new_trig

    if ( "$1" == "Ext" ) {
       image_par(CCD_U,"ext_trig",1) 
    } else {
       image_par(CCD_U,"ext_trig",0) 
    }

    xfrelon
}'


#
# Selects 
# ( called from radio buttons )
def xcmdout '{
    local thech  chanout chansend

    thech = $1 

    if (thech == 0 ) { chanout = 15 }
   else if ( thech == 1 ) { chanout = 1 }
   else if ( thech == 2 ) { chanout = 2 }
   else if ( thech == 3 ) { chanout = 4 }
   else if ( thech == 4 ) { chanout = 8 }
   else if ( thech == 5 ) { chanout = 3 }
   else if ( thech == 6 ) { chanout = 5 }
   else if ( thech == 7 ) { chanout = 10 }
   else if ( thech == 8 ) { chanout = 12 }
   else { chanout = 0 }
    
   image_par(CCD_U,"input_channel",chanout)

    if (thech == 0 ) { chansend = 9 }
   else if ( thech == 1 ) { chansend = 1 }
   else if ( thech == 2 ) { chansend = 2 }
   else if ( thech == 3 ) { chansend = 3 }
   else if ( thech == 4 ) { chansend = 4 }
   else if ( thech == 5 ) { chansend = 7 }
   else if ( thech == 6 ) { chansend = 5 }
   else if ( thech == 7 ) { chansend = 6 }
   else if ( thech == 8 ) { chansend = 8 }
   else { chansend = 0 }
    
   f3send  M"chansend"

    xfrelon
}'

def ccdsv  '{
   p "ccdsv " "$*"
   if ($1 == 0) {
      CCDINTF = "SDV"
      CCDINTFL = 0
      u /opt/EDTsdv/fast1024
      u cp /users/j/specadm/local/userconf/sdv /users/j/specadm/spec.d/neron/config
   } else  if ($1==1) {
      CCDINTF = "SDV_MUX"
      CCDINTFL = 1
      u /opt/EDTsdv/fastmux
      u cp /users/j/specadm/local/userconf/sdv /users/j/specadm/spec.d/neron/config
   } else  if ($1==2) {
      CCDINTF = "SDV_MUX_S"
      CCDINTFL = 2
      u /opt/EDTsdv/fastmux
      u cp /users/j/specadm/local/userconf/sdv_ser /users/j/specadm/spec.d/neron/config
    }
#   } else  if ($1==2) {
#      CCDINTF = "VXI"
#      CCDINTFL = 4
#      u cp /users/j/specadm/local/userconf/vxi /users/j/specadm/spec.d/neron/config
#   } 
   sleep(3);
   reconfig
   ccd_createarray;
   #ccd_frelonsetup CCD_INCH[0] 0
   #xfrelon
   #xupdsetup
}'

def xclosedacs '{
   # bpipe openclosepanel dacs close; epipe
}'

def ccdpars '{
    if ($# != 3 ) {
       print "usage: ccdpars images sweeps sto_mode"
       exit
    }

    image_par(CCD_U,"images",$1)

    image_par(CCD_U,"storage",0)
    if ( $3 > 1 ) {
        if ($2 > 1) {
        image_par(CCD_U,"storage",$3+1) 
        image_par(CCD_U,"sweeps",$2)
        }
    } else {
        image_par(CCD_U,"storage",0)
        image_par(CCD_U,"sweeps",0)
    }

    ccd_createarray

}'
def Xccdsize '{
  if ($1==0) {
        MANUALSIZE=0
  } else if ($1==1){
        MANUALSIZE=1	
  	FRELON2000=0
  } else if ($1==2){
        MANUALSIZE=1	
  	FRELON2000=1
  }
}'

#%IU%
#%MDESC%
#  Send command DUM. Get answers: two readings are necessary
#  for each string. 
#  First string:  dac values ( non binning )
#  Second string: dac values ( binning )
#  then clear serial line buffer and updata GUI values

def xdacs '{
  if (FRELON2000) {
     sleep(0.3)
     xdacs_2000
  }else {
     xdacs_norm 
  }
}'


def xdacs_norm '{

  local bla,i 
  local dac
  local dbin

  for(;(res =image_par(CCD_U,"talk"))!="";) ;  # clear buffer (f3_dumm)
  image_par(CCD_U,"talk",sprintf("D\r\n")) # f3send D
  res =image_par(CCD_U,"talk")

  for (i=0;i<4;i++)
     {
       res =image_par(CCD_U,"talk")
       sscanf(res,"%2s;%s%s\t:%d",bla,bla,bla,dac[i])
     } 
  for (i=4;i<6;i++)
     {
       res =image_par(CCD_U,"talk")
       sscanf(res,"%2s;%s%s%s%s\t:%d",bla,bla,bla,bla,bla,dac[i])
     } 
  for (i=6;i<12;i++)
     {
       res =image_par(CCD_U,"talk")
       sscanf(res,"%2s;%s%s%s\t:%d",bla,bla,bla,bla,dac[i])
     }
  res =image_par(CCD_U,"talk")
  sscanf(res,"%2s;%s%s\t:%d",bla,bla,bla,dac[i])
  for (i=13;i<16;i++)
     {
       res =image_par(CCD_U,"talk")
       sscanf(res,"%2s;%s%s%s\t:%d",bla,bla,bla,bla,dac[i])
     }
  for (i=16;i<20;i++)
     {
       res =image_par(CCD_U,"talk")
       sscanf(res,"%2s;%s\t:%d",bla,bla,dac[i])
     }

  for(;(res =image_par(CCD_U,"talk"))!="";);  # clear buffer (f3_dumm)


  Xval("xda_name","DA: Offset B1")
  Xval("xdb_name","DB: Offset B2")
  Xval("xdc_name","DC: Offset A3")
  Xval("xdd_name","DD: Offset A4")
  Xval("xde_name","DE: Duty Cycle phi L1")
  Xval("xdf_name","DF: Duty Cycle phi L2")
  Xval("xdg_name","DG: Position phi L")
  Xval("xdh_name","DH: Position phi R")
  Xval("xdi_name","DI: Offset Preamp B1")
  Xval("xdj_name","DJ: Offset Preamp B2")
  Xval("xdk_name","DK: Offset Preamp A3")
  Xval("xdl_name","DL: Offset Preamp A4")
  Xval("xdm_name","DM: CDS Position")
  Xval("xdn_name","DN: signal gate pos.")
  Xval("xdp_name","DP: CDS gate width")
  Xval("xdq_name","DQ: data convert pos.")
  Xval("xdr_name","DR: VDD")
  Xval("xds_name","DS: VDR")
  Xval("xdt_name","DT: VSSD")
  Xval("xdu_name","DU: VSS")
  Xval("xdv_name","DV: -------")
  Xval("xdw_name","DW: -------")
  Xval("xdx_name","DX: -------")
  Xval("xdy_name","DY: -------")
  Xval("xdz_name","DZ: -------")
  Xval("xdaa_name","Da: -------")
  Xval("xdab_name","Db: -------")
  Xval("xdac_name","Dc: -------")


  Xval("xda",dac[0])
  Xval("xdb",dac[1])
  Xval("xdc",dac[2])
  Xval("xdd",dac[3])
  Xval("xde",dac[4])
  Xval("xdf",dac[5])
  Xval("xdg",dac[6])
  Xval("xdh",dac[7])
  Xval("xdi",dac[8])
  Xval("xdj",dac[9])
  Xval("xdk",dac[10])
  Xval("xdl",dac[11])
  Xval("xdm",dac[12])
  Xval("xdn",dac[13])
  Xval("xdp",dac[14])
  Xval("xdq",dac[15])
  Xval("xdr",dac[16])
  Xval("xds",dac[17])
  Xval("xdt",dac[18])
  Xval("xdu",dac[19])

  GAIN=dac[19]
}'
def xdacs_2000 '{

  global bla  dac
  local i
  local dbin

  for(;(res =image_par(CCD_U,"talk"))!="";) ;  # clear buffer (f3_dumm)
  sleep(0.3)
  image_par(CCD_U,"talk",sprintf("DUM\r\n")) # f3send D
  sleep(0.3)
  if (BINNING) { # data are two lines after    
         res =image_par(CCD_U,"talk");sleep(0.3)
         res =image_par(CCD_U,"talk");sleep(0.3)
  }
  res =image_par(CCD_U,"talk")
  split(res,bla,":")
  n_ret = split(bla[1],dac,",")
  sscanf(dac["27"],"%d\\r\\n",dac["27"]) # takes \r and \n out

  for(;(res =image_par(CCD_U,"talk"))!="";);  # clear buffer (f3_dumm)

  Xval("xda_name","DA: PREAMP OFFSET B1")
  Xval("xdb_name","DB: PREAMP OFFSET B2")
  Xval("xdc_name","DC: PREAMP OFFSET A3")
  Xval("xdd_name","DD: PREAMP OFFSET A4")
  Xval("xde_name","DE: PREAMP GAIN B1")
  Xval("xdf_name","DF: PREAMP GAIN B2")
  Xval("xdg_name","DG: PREAMP GAIN A3")
  Xval("xdh_name","DH: PREAMP GAIN A4")
  Xval("xdi_name","DI: BACKGROUND LEVEL B1")
  Xval("xdj_name","DJ: BACKGROUND LEVEL B2")
  Xval("xdk_name","DK: BACKGROUND LEVEL A3")
  Xval("xdl_name","DL: BACKGROUND LEVEL A4")
  Xval("xdm_name","DM: CDS POSITION")
  Xval("xdn_name","DN: SIGNAL GATE POSITION")
  Xval("xdp_name","DP: CDS GATE WIDTH")
  Xval("xdq_name","DQ: DATA CONVERT POSITION")
  Xval("xdr_name","DR: VDR B1")
  Xval("xds_name","DS: VDR B2")
  Xval("xdt_name","DT: VDR A3")
  Xval("xdu_name","DU: VDR A4")
  Xval("xdv_name","DV: PHI R POSITION")
  Xval("xdw_name","DW: PHI R WIDTH")
  Xval("xdx_name","DX: PHI LA1 POSITION")
  Xval("xdy_name","DY: PHI LA1 WIDTH")
  Xval("xdz_name","DZ: PHI LA2 WIDTH")
  Xval("xdaa_name","Da: PHI LB1 POSITION")
  Xval("xdab_name","Db: PHI LB1 WIDTH")
  Xval("xdac_name","Dc: PHI LB2 WIDTH")


  Xval("xda",dac[0])
  Xval("xdb",dac[1])
  Xval("xdc",dac[2])
  Xval("xdd",dac[3])
  Xval("xde",dac[4])
  Xval("xdf",dac[5])
  Xval("xdg",dac[6])
  Xval("xdh",dac[7])
  Xval("xdi",dac[8])
  Xval("xdj",dac[9])
  Xval("xdk",dac[10])
  Xval("xdl",dac[11])
  Xval("xdm",dac[12])
  Xval("xdn",dac[13])
  Xval("xdp",dac[14])
  Xval("xdq",dac[15])
  Xval("xdr",dac[16])
  Xval("xds",dac[17])
  Xval("xdt",dac[18])
  Xval("xdu",dac[19])
  Xval("xdv",dac[20])
  Xval("xdw",dac[21])
  Xval("xdx",dac[22])
  Xval("xdy",dac[23])
  Xval("xdz",dac[24])
  Xval("xd_a",dac[25])
  Xval("xd_b",dac[26])
  Xval("xd_c",dac[27])


}'
#
# Send values from specGUI to each DAC
# Test version does not check the return string 
# "xdacs clears" clears the buffer at the beguining

def xdacs_send_A '{ image_par(CCD_U,"talk",sprintf("DA%d\r\n",$1)); xdacs }'
def xdacs_send_B '{ image_par(CCD_U,"talk",sprintf("DB%d\r\n",$1)); xdacs }'
def xdacs_send_C '{ image_par(CCD_U,"talk",sprintf("DC%d\r\n",$1)); xdacs }'
def xdacs_send_D '{ image_par(CCD_U,"talk",sprintf("DD%d\r\n",$1)); xdacs }'
def xdacs_send_E '{ image_par(CCD_U,"talk",sprintf("DE%d\r\n",$1)); xdacs }'
def xdacs_send_F '{ image_par(CCD_U,"talk",sprintf("DF%d\r\n",$1)); xdacs }'
def xdacs_send_G '{ image_par(CCD_U,"talk",sprintf("DG%d\r\n",$1)); xdacs }'
def xdacs_send_H '{ image_par(CCD_U,"talk",sprintf("DH%d\r\n",$1)); xdacs }'
def xdacs_send_I '{ image_par(CCD_U,"talk",sprintf("DI%d\r\n",$1)); xdacs }'
def xdacs_send_J '{ image_par(CCD_U,"talk",sprintf("DJ%d\r\n",$1)); xdacs }'
def xdacs_send_K '{ image_par(CCD_U,"talk",sprintf("DK%d\r\n",$1)); xdacs }'
def xdacs_send_L '{ image_par(CCD_U,"talk",sprintf("DL%d\r\n",$1)); xdacs }'
def xdacs_send_M '{ image_par(CCD_U,"talk",sprintf("DM%d\r\n",$1)); xdacs }'
def xdacs_send_N '{ image_par(CCD_U,"talk",sprintf("DN%d\r\n",$1)); xdacs }'
def xdacs_send_P '{ image_par(CCD_U,"talk",sprintf("DP%d\r\n",$1)); xdacs }'
def xdacs_send_Q '{ image_par(CCD_U,"talk",sprintf("DQ%d\r\n",$1)); xdacs }'
def xdacs_send_R '{ image_par(CCD_U,"talk",sprintf("DR%d\r\n",$1)); xdacs }'
def xdacs_send_S '{ image_par(CCD_U,"talk",sprintf("DS%d\r\n",$1)); xdacs }'
def xdacs_send_T '{ image_par(CCD_U,"talk",sprintf("DT%d\r\n",$1)); xdacs }'
def xdacs_send_U '{ image_par(CCD_U,"talk",sprintf("DU%d\r\n",$1)); xdacs }'
def xdacs_send_V '{ image_par(CCD_U,"talk",sprintf("DV%d\r\n",$1)); xdacs }'
def xdacs_send_W '{ image_par(CCD_U,"talk",sprintf("DW%d\r\n",$1)); xdacs }'
def xdacs_send_X '{ image_par(CCD_U,"talk",sprintf("DX%d\r\n",$1)); xdacs }'
def xdacs_send_Y '{ image_par(CCD_U,"talk",sprintf("DY%d\r\n",$1)); xdacs }'
def xdacs_send_Z '{ image_par(CCD_U,"talk",sprintf("DZ%d\r\n",$1)); xdacs }'
def xdacs_send_a '{ image_par(CCD_U,"talk",sprintf("Da%d\r\n",$1)); xdacs }'
def xdacs_send_b '{ image_par(CCD_U,"talk",sprintf("Db%d\r\n",$1)); xdacs }'
def xdacs_send_c '{ image_par(CCD_U,"talk",sprintf("Dc%d\r\n",$1)); xdacs }'

# Send new values from SpecGUI to frelon
# Test version
 
def xdacs_send_all '{
  local res 

  image_par(CCD_U,"talk",sprintf("DA%d\r\n",$1))
  Xval("xccdstate","Sending DA")
  sleep(0.3); 
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DA")
  } 

  image_par(CCD_U,"talk",sprintf("DB%d\r\n",$2))
  Xval("xccdstate","Sending DB")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DB")
  } 

  image_par(CCD_U,"talk",sprintf("DC%d\r\n",$3))
  Xval("xccdstate","Sending DC")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DC")
  } 

  image_par(CCD_U,"talk",sprintf("DD%d\r\n",$4))
  Xval("xccdstate","Sending DD")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DD")
  } 
  image_par(CCD_U,"talk",sprintf("DE%d\r\n",$5))
  Xval("xccdstate","Sending DE")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DE")
  } 
  image_par(CCD_U,"talk",sprintf("DF%d\r\n",$6))
  Xval("xccdstate","Sending DF")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DF")
  } 
  image_par(CCD_U,"talk",sprintf("DG%d\r\n",$7))
  Xval("xccdstate","Sending DG")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DG")
  } 
  image_par(CCD_U,"talk",sprintf("DH%d\r\n",$8))
  Xval("xccdstate","Sending DH")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DH")
  } 
  image_par(CCD_U,"talk",sprintf("DI%d\r\n",$9))
  Xval("xccdstate","Sending DI")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DI")
  } 
  image_par(CCD_U,"talk",sprintf("DJ%d\r\n",$10))
  Xval("xccdstate","Sending DJ")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DJ")
  } 
  image_par(CCD_U,"talk",sprintf("DK%d\r\n",$11))
  Xval("xccdstate","Sending DK")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DK")
  } 
  image_par(CCD_U,"talk",sprintf("DL%d\r\n",$12))
  Xval("xccdstate","Sending DL")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DL")
  } 
  image_par(CCD_U,"talk",sprintf("DM%d\r\n",$13))
  Xval("xccdstate","Sending DM")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DM")
  } 
  image_par(CCD_U,"talk",sprintf("DN%d\r\n",$14))
  Xval("xccdstate","Sending DN")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DN")
  } 
  image_par(CCD_U,"talk",sprintf("DP%d\r\n",$15))
  Xval("xccdstate","Sending DP")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DP")
  } 
  image_par(CCD_U,"talk",sprintf("DQ%d\r\n",$16))
  Xval("xccdstate","Sending DQ")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DQ")
  } 
  image_par(CCD_U,"talk",sprintf("DR%d\r\n",$17))
  Xval("xccdstate","Sending DR")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DR")
  } 
  image_par(CCD_U,"talk",sprintf("DS%d\r\n",$18))
  Xval("xccdstate","Sending DS")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DS")
  } 
  image_par(CCD_U,"talk",sprintf("DT%d\r\n",$19))
  Xval("xccdstate","Sending DT")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DT")
  } 
  image_par(CCD_U,"talk",sprintf("DU%d\r\n",$20))
  Xval("xccdstate","Sending DU")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DU")
  } 
  image_par(CCD_U,"talk",sprintf("DV%d\r\n",$21))
  Xval("xccdstate","Sending DV")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DV")
  } 
  image_par(CCD_U,"talk",sprintf("DW%d\r\n",$22))
  Xval("xccdstate","Sending DW")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DW")
  } 
  image_par(CCD_U,"talk",sprintf("DX%d\r\n",$23))
  Xval("xccdstate","Sending DX")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DX")
  } 
  image_par(CCD_U,"talk",sprintf("DY%d\r\n",$24))
  Xval("xccdstate","Sending DY")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DY")
  } 
  image_par(CCD_U,"talk",sprintf("DZ%d\r\n",$25))
  Xval("xccdstate","Sending DZ")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending DZ")
  } 
  image_par(CCD_U,"talk",sprintf("Da%d\r\n",$26))
  Xval("xccdstate","Sending Da")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending Da")
  } 
  image_par(CCD_U,"talk",sprintf("Db%d\r\n",$27))
  Xval("xccdstate","Sending Db")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending Db")
  } 
  image_par(CCD_U,"talk",sprintf("Dc%d\r\n",$28))
  Xval("xccdstate","Sending Dc")
  sleep(0.3)
  for(;(res =image_par(CCD_U,"talk"))!="";) {
    if (substr(res,0,3)!="!OK") 
           Xval("xccdstate","WARN: Error sending Dc")
  } 
  
  xdacs # refresh values

}' 

# For testing purposes (of specGUI panels)
# to be deleted

def bumm_clear '{
   image_par(CCD_U,"bumm_clear") 
   ARRAYNAME=sprintf("image_data%d",CCD_U)
   image_get(CCD_U,@ARRAYNAME)
 }' 

def bumm_clear_always '{image_par(CCD_U,"bumm_clear_always",$1) }'  

def xresetmux '{image_par(CCD_U,"reset_mux") }'  

def xflip '{
	global XFLIP
	if ($# !=1 || $1 > 3 || $1 <0) {
		p "usage xflip <[0 1 2 3]>"
	}
	if (image_par(CCD_U,"controller")=="CCD_PC") {
		local _res _myresult
		local  cmd i n
        	_res = image_par(CCD_U,"hw_par")
		n=split(_res,_myresult," ")
		cmd="$1"
		for(i=1;i<n;i++) { cmd=sprintf("%s %s",cmd,_myresult[i]) }
		image_par(CCD_U,"hw_par",cmd)
 	} else {
		image_par(CCD_U,"flip",$1)

	}
	XFLIP = $1
}'

def flip_set '{
}'

def ccd_hwpars '{
        global CCD_FLIP CCD_KINBEGIN CCD_KINSTRIPES
	local _mystring
	if (image_par(CCD_U,"controller")=="CCD_PC") {
		_mystring = image_par(CCD_U,"hw_par")	
		printf ( "hw parameters are : %s\n", _mystring)
		sscanf(_mystring, "%d %d %d", CCD_FLIP, CCD_KINBEGIN, CCD_KINSTRIPES)
	} 
	if ($# == 2) {
		if ("$1" == "flip" || "$1" == "FLIP") {
			if ($2 >= 0 && $2 <=3 ) {
				p "Setting flip to $2"
				image_par(CCD_U,"hw_par",sprintf("%d %d %d", $2, CCD_KINBEGIN, CCD_KINSTRIPES))	
			}else 
				printf("Error setting flip to the camera. It has to be in [0,1,2,3]\n")
		}
		if ($1 == "kinbegin" || $1 == "kinbegin") {
			if ($2 >= 0 && $2 <1024 ){
				p "Setting kinbegin to $2"
				image_par(CCD_U,"hw_par",sprintf("%d %d %d", CCD_FLIP, $2, CCD_KINSTRIPES))	
			}else 
				printf("Error setting flip to the camera. It has to be in [0..1023]\n")
		}
		if ($1 == "kinstripes" || $1 == "kinstripes") {
			if ($2 >= 0 && $2 <1024 ) {
				p "Setting kinstripes to $2"
				image_par(CCD_U,"hw_par",sprintf("%d %d %d", CCD_FLIP, CCD_KINBEGIN, $2))	
			}else 
				printf("Error setting flip to the camera. It has to be in [0..1023]\n")
		} 
	}
}'
def xsetkinetics '{
	if ($# !=1 || $1 > 2 || $1 <0) {
		p "usage xsetkinetics <[0 1 2]>"
		exit
	}
	image_par(CCD_U,"kinetics",$1)
	ccd_createarray
	if ($1 && image_par(CCD_U,"input_channel")==15) {
		p "Kinetics does not work with all 4 channels!!!!"
        	if (GUI_RUN) 
			Xval("xstrout","Kinetics does NOT work with 4 ch!!!")
	}
	xkinetics
}'
def xsetkinbegin '{
	if ($# !=1 || $1 > 1024) {
		p "usage xsetkinbegin <[0..1024]>"
		exit
	}
	image_par(CCD_U,"kinbegin",$1)
        if (GUI_RUN) Xval("xstrout","Line begining changed")
}'
def xsetkinwinsize '{
	if ($# !=1 || $1 > 2048) {
		p "usage xsetkinwinsize <[1..2048]>"
		exit
	}
	image_par(CCD_U,"kinwinsize",$1)
	ccd_createarray
        if (GUI_RUN) Xval("xstrout","Window size changed")
	xkinetics
}'
def xsetkinstripes '{
	if ($# !=1 || $1 > 2048) {
		p "usage xsekinstripes <[1..2048]>"
		exit
	}
	image_par(CCD_U,"kinstripes",$1)
	if (image_par(CCD_U,"kinetics")==2 && \
		image_par(CCD_U,"kinstripes")>0) {

		p "Stripes>0 not possible in pipeline"
        	if (GUI_RUN) 
			Xval("xstrout","Stripes not possible in pipeline")

	}
		
}'
def xkinetics '{
	local strout _res _my_result _kinbegin _kinstripes
	strout = sprintf("Stripes must be in [0..2048]") 
	
	if (image_par(CCD_U,"controller")=="CCD_PC") {
        	_res = image_par(CCD_U,"hw_par")
		split(_res,_myresult," ")
		_kinbegin = _myresult[1]
		_kinstripes = _myresult[2]
		

	} else {
        	_kinbegin = image_par(CCD_U,"kinbegin")
        	_kinstripes = image_par(CCD_U,"kinstripes")
	}

   	Xval("xkinstate",image_par(CCD_U,"kinetics"))
       	Xval("xkinwinsize",sprintf("%d",image_par(CCD_U,"kinwinsize")))
       	Xval("xkinbegin",sprintf("%d",_kinbegin))
       	Xval("xkinstripes",sprintf("%d",_kinstripes))
}'

def ccdgetconf '{

  local nmfl
  local nmflbinn
  f3send OFF
  sleep(0.1)

  ccdserial

  if (!BINNING) {  # NON BINNING 

  if (SPECBL=="det") {
     nmfl=sprintf("~camera/FRELON%d/frelon%d.cfg",CCDSERNO,CCDSERNO)
  } else {
     nmfl=sprintf("~specadm/local/userconf/frelon%d.cfg",CCDSERNO,CCDSERNO)
  }
    nmfl=getval("Filename (NO BINNING) :",nmfl)

    line=getline(nmfl,0)
    if (line==-1) {
       printf("Not such file or empty (%s)\n",nmfl )
    }
    else {
       p line
       sleep(0.3)
       image_par(CCD_U,"talk",sprintf("%s\r\n",line))
       for (;(line=getline(nmfl))!=-1;) {
         p line
         sleep(0.3)
         image_par(CCD_U,"talk",sprintf("%s\r\n",line))
       }
       for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)
    }

  } else {
    if (SPECBL=="det") {
       nmflbinn=sprintf("~camera/FRELON%d/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
    } else {
       nmflbinn=sprintf("~specadm/local/userconf/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
    }
    nmflbinn=getval("Filename (BINNING):",nmflbinn)

    line=getline(nmflbinn,0)
    if (line==-1) {
        printf("Not such file or empty (%s)\n",nmfl )
    } else {
      p line
      sleep(0.3)
      image_par(CCD_U,"talk",sprintf("%s\r\n",line))
      for (;(line=getline(nmflbinn))!=-1;) {
        p line
        sleep(0.3)
        image_par(CCD_U,"talk",sprintf("%s\r\n",line))
      }
      for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)
    }
  }
}'
# Save Camera DAC values to a file

def ccdsaveconf '{
local nmfl
local nmflbinn bla bla2

  f3send OFF
  sleep(0.1)
  image_par(CCD_U,"talk",sprintf("DUM\r\n"))
  sleep(0.3)
  res = image_par(CCD_U,"talk")
  if (FRELON2000) {
   sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
                  %d,%d,%d,%d,%d,%d,%d,%d",\
               bla,DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DP,DQ,DR,DS,DT,DU,\
                DV,DW,DX,DY,DZ,Da,Db,Dc)
  } else {
  sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",\
               bla,DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DP,DQ,DR,DS,DT,DU)
  }
  res = image_par(CCD_U,"talk")
  res = image_par(CCD_U,"talk")

  if (FRELON2000) {
    sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
                  %d,%d,%d,%d,%d,%d,%d,%d",\
               bla,DAb,DBb,DCb,DDb,DEb,DFb,DGb,DHb,DIb,DJb,DKb,DLb,DMb,DNb,\
               DPb,DQb,DRb,DSb,DTb,DUb,DVb,DWb,DXb,DYb,DZb,Dab,Dbb,Dcb)
  } else {
    sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,",\
               bla,DAb,DBb,DCb,DDb,DEb,DFb,DGb,DHb,DIb,DJb,DKb,DLb,DMb,DNb,\
               DPb,DQb,DRb,DSb,DTb,DUb)
  }

  for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)

  ccdserial
 
  if (SPECBL=="det") {
     nmfl=sprintf("~camera/FRELON%d/frelon%d.cfg",CCDSERNO,CCDSERNO)
  } else {
     nmfl=sprintf("~specadm/local/userconf/frelon%d.cfg",CCDSERNO,CCDSERNO)
  }
  nmfl=getval("Filename:",nmfl)
  close(nmfl)
  if (file_info(nmfl)) unix(sprintf("rm %s",nmfl))
  on (nmfl)
  printf ("DA%d\n",DA)
  printf ("DB%d\n",DB)
  printf ("DC%d\n",DC)
  printf ("DD%d\n",DD)
  printf ("DE%d\n",DE)
  printf ("DF%d\n",DF)
  printf ("DG%d\n",DG)
  printf ("DH%d\n",DH)
  printf ("DI%d\n",DI)
  printf ("DJ%d\n",DJ)
  printf ("DK%d\n",DK)
  printf ("DL%d\n",DL)
  printf ("DM%d\n",DM)
  printf ("DN%d\n",DN)
  printf ("DP%d\n",DP)
  printf ("DQ%d\n",DQ)
  printf ("DR%d\n",DR)
  printf ("DS%d\n",DS)
  printf ("DT%d\n",DT)
  printf ("DU%d\n",DU)
  printf ("DV%d\n",DV)
  printf ("DW%d\n",DW)
  printf ("DX%d\n",DX)
  printf ("DY%d\n",DY)
  printf ("DZ%d\n",DZ)
  printf ("Da%d\n",Da)
  printf ("Db%d\n",Db)
  printf ("Dc%d\n",Dc)
  close (nmfl)

  if (SPECBL=="det") {
     nmflbinn=sprintf("~camera/FRELON%d/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
  } else {
     nmflbinn=sprintf("~specadm/local/userconf/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
  }
 nmflbinn=getval("Filename:",nmflbinn)
 close(nmflbinn)
 if (file_info(nmflbinn)) unix(sprintf("rm %s",nmflbinn))
 on (nmflbinn)
  printf ("DA%d\n",DAb)

  printf ("DB%d\n",DBb)
  printf ("DC%d\n",DCb)
  printf ("DD%d\n",DDb)
  printf ("DE%d\n",DEb)
  printf ("DF%d\n",DFb)
  printf ("DG%d\n",DGb)
  printf ("DH%d\n",DHb)
  printf ("DI%d\n",DIb)
  printf ("DJ%d\n",DJb)
  printf ("DK%d\n",DKb)
  printf ("DL%d\n",DLb)
  printf ("DM%d\n",DMb)
  printf ("DN%d\n",DNb)
  printf ("DP%d\n",DPb)
  printf ("DQ%d\n",DQb)
  printf ("DR%d\n",DRb)
  printf ("DS%d\n",DSb)
  printf ("DT%d\n",DTb)
  printf ("DU%d\n",DUb)
  printf ("DV%d\n",DVb)
  printf ("DW%d\n",DWb)
  printf ("DX%d\n",DXb)
  printf ("DY%d\n",DYb)
  printf ("DZ%d\n",DZb)
  printf ("Da%d\n",Dab)
  printf ("Db%d\n",Dbb)
  printf ("Dc%d\n",Dcb)
close (nmflbinn)
f3send ON
}'



#%MACROS%
#%IMACROS%
#%SETUP%
# The macro ccd.mac has to be loaded
# The frelon ccd has to be configured in config
#
#%AUTHOR% David Fernandez and the DETECTOR/BLISS cooperation group
#%TOC%