/************************************************/
/*                                              */
/* File        : calb.h                         */
/* Description : CALB library                   */
/*                                              */
/* Authors: G.Cabibbo, A.Passeri                */
/*                                              */
/* Created      : 12.02.1997                    */
/* Last modified: 03.04.1997                    */
/*                                              */
/************************************************/

/* =h=> CALB library 
   =f=> 
   This is the CALB library
   ===<
 */

#ifndef CALB_H
#define CALB_H

#include "calbhard.h"
#include "calbbits.h"


/************************************************/
/*                                              */
/*   The result should be CALB_ERROR_OK,        */
/*   else there have been an error              */
/*   (see CALB_ERROR_.. constants)              */
/*   if not stated otherwise                    */
/*                                              */
/************************************************/

#define CALB_ERROR_OK            0     /* MUST be 0 */
#define CALB_ERROR_TEST          CALBH_ERROR_TEST
#define CALB_ERROR_UNKNOWN       CALBH_ERROR_UNKNOWN
#define CALB_ERROR_OUTRANGE      CALBH_ERROR_OUTRANGE
#define CALB_WARNING_ZSUP        CALBH_WARNING_ZSUP 

/*********************************************************************/
/*                       bit values                                  */
/*********************************************************************/

#define CALB_BIT_ON       CALBB_BIT_ON
#define CALB_BIT_OFF      CALBB_BIT_OFF

/*********************************************************************/
/*                                                                   */
/*                   Initialisation routines                         */
/*                                                                   */
/*********************************************************************/

typedef CALBH_id        CALB_id;


#define calb_open(/*int          */ chain,           /* IN  */  \
	          /*int          */ crate,           /* IN  */  \
	          /*int          */ slot,            /* IN  */  \
	          /*CALB_id *    */ calb_id)         /* OUT */  \
	calbh_open(chain,crate,slot,calb_id)

#define calb_close(/*int          */ chain,           /* IN  */  \
                   /*int          */ crate,           /* IN  */  \
                   /*int          */ slot,            /* IN  */  \
                   /*CALBH_id */ calb_id)              /* IN  */  \
        calbh_close(chain,crate,slot,calb_id)


/*********************************************************************/
/**************                types               *******************/
/*********************************************************************/

typedef CALBB_CREG_bits          CALB_CREG_bits;
typedef CALBB_SREG_bits          CALB_SREG_bits;
typedef CALBB_HFIFO_bits         CALB_HFIFO_bits;
typedef CALBB_DFIFO_bits         CALB_DFIFO_bits;
typedef CALBB_HFIFO_unpack       CALB_HFIFO_unpack;
typedef CALBB_DFIFO_unpack       CALB_DFIFO_unpack;

typedef CALBB_PAGE_CSR_bits      CALB_PAGE_CSR_bits;

/*********************************************************************/
/*                                                                   */
/*                   Register oriented routines                      */
/*                                                                   */
/*********************************************************************/


/***********************/
/*       internal      */
/* Do not use directly */
/***********************/

int calb_read_i_creg(CALB_id calb_id,                     /* IN  */
			     CALB_CREG_bits *creg);  /* OUT */

int calb_read_i_sreg(CALB_id calb_id,                     /* IN  */
			     CALB_SREG_bits *sreg);  /* OUT */

int calb_read_i_hfifo(CALB_id calb_id,                     /* IN  */
			     CALB_HFIFO_bits *hfifo);  /* OUT */

int calb_read_i_dfifo(CALB_id calb_id,                     /* IN  */
			     CALB_DFIFO_bits *dfifo);  /* OUT */


/***********************/
/*      Use this       */
/***********************/

/*********************************************************************/
/*                       read routines                               */
/*               does not return a valid code                        */
/*********************************************************************/

#define  calb_read_creg(/*CALB_id*/ calb_id,          /* IN  */ \
			    /* CALB_CREG_bits*/ creg)  /* OUT */ \
         calb_read_i_creg(calb_id,&(creg)) 

#define  calb_read_sreg(/* CALB_id */ calb_id,           /* IN  */ \
			     /* CALB_SREG_bits */ sreg)  /* OUT */ \
         calb_read_i_sreg(calb_id,&(sreg)) 

#define  calb_read_hfifo(/* CALB_id */ calb_id,    /* IN  */\
			    /* CALB_HFIFO_bits */ hfifo)  /* OUT */\
         calb_read_i_hfifo(calb_id,&(hfifo)) 

#define calb_read_dfifo(/* CALB_id */ calb_id ,   /* IN  */\
			     /* CALB_DFIFO_bits */ dfifo);  /* OUT */\
         calb_read_i_dfifo(calb_id,&(dfifo))

#define calb_read_rdtrg(/*CALB_id        */ calbid)   /* IN  */ \
         calbh_read_rdtrg(calbid) 
			  

/*********************************************************************/
/*                       write routines                              */
/*********************************************************************/


/* =i=> */
#define calb_write_creg(/*CALB_id        */ calbid,   /* IN */ \
			 /*CALB_CREG_bits*/ creg)    /* IN */ \
        calbh_write_creg(calbid,calbb_cregtonr(creg),1)

/* =i=> */
#define calb_write_reset(/*CALB_id        */ calbid)   /* IN */ \
        calbh_write_reset(calbid)

/* =i=> */
#define calb_write_clrtrg(/*CALB_id        */ calbid)   /* IN */ \
        calbh_write_clrtrg(calbid)

/* =i=> */
#define calb_write_swtrg(/*CALB_id        */ calbid)   /* IN */ \
        calbh_write_swtrg(calbid)


/*********************************************************************/
/*                                                                   */
/*                     Bit oriented routines                         */
/*                                                                   */
/*********************************************************************/

/*********************************************************************/
/**************         get bit routines           *******************/
/**************   does not return a valid code     *******************/
/*********************************************************************/

/* control */

/* =i=> */
#define calb_get_acqen(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_acqen(calbh_read_creg(calbid))

/* =i=> */
#define calb_get_zsen(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_zsen(calbh_read_creg(calbid))

/* =i=> */
#define calb_get_berren(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_berren(calbh_read_creg(calbid))

/* =i=> */
#define calb_get_alu(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_alu(calbh_read_creg(calbid))

/* =i=> */
#define calb_get_d12force(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_d12force(calbh_read_creg(calbid))

/* =i=> */
#define calb_get_xresen(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_xresen(calbh_read_creg(calbid))

/* status */

/* =i=> */
#define calb_get_efd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_efd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_hfd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_hfd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_ffd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_ffd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_efhd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_efhd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_hfhd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_hfhd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_ffhd(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_ffhd(calbh_read_sreg(calbid))

/* =i=> */
#define calb_get_xberr(/*CALB_id */ calbid)  /* IN */  \
        calbb_get_xberr(calbh_read_sreg(calbid))

/*********************************************************************/
/**************         set bit routines           *******************/
/*********************************************************************/

/* control */

/* =i=> */
#define calb_set_acqen(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_acqen(calbh_read_creg(calb_id),value),1)

/* =i=> */
#define calb_set_zsen(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_zsen(calbh_read_creg(calb_id),value),1)

/* =i=> */
#define calb_set_berren(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_berren(calbh_read_creg(calb_id),value),1)

/* =i=> */
#define calb_set_alu(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_alu(calbh_read_creg(calb_id),value),1)

/* =i=> */
#define calb_set_d12force(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_d12force(calbh_read_creg(calb_id),value),1)

/* =i=> */
#define calb_set_xresen(/*CALB_id       */ calb_id,  /* IN */  \
		       /*unsigned char */ value)    /* IN */  \
        calbh_write_creg(calb_id,calbb_set_xresen(calbh_read_creg(calb_id),value),1)


/*********************************************************************/
/*                                                                   */
/*                      readpage routines                            */
/*                                                                   */
/*********************************************************************/

/***********************/
/*       internal      */
/* Do not use directly */
/***********************/

int calb_readpage_i_csr(CALB_id calb_id,                     /* IN  */
			     CALB_PAGE_CSR_bits *bits);  /* OUT */

/***********************/
/*      Use this       */
/***********************/

#define calb_readpage_csr(/*CALB_id                 */ calb_id,    /* IN  */  \
			       /*CALB_PAGE_CSR_bits */ bits)   /* OUT */  \
        calb_readpage_i_csr(calb_id,&(bits))


/*********************************************************************/
/*                     readfifo routines                             */
/*********************************************************************/


/*********************/
/*                   */
/*   event structure */
/*                   */
/*********************/

/*******   just a guess 
typedef struct  {
unsigned int ntrig;
unsigned int nchan;
CHANNELS chan;
CHANNELS data;
} CALB_FIFO_single_EVENT;

typedef CALB_FIFO_single_EVENT *CALB_FIFO_EVENT;  
  ************/

/***********************/
/*       internal      */
/* Do not use directly */
/***********************/

/*******  not yet available
int calb_read_pio_i_bothfifo ( CALBH_id calb_id,
	                       CALB_FIFO_EVENT data);   
 ************/
		 
/***********************/
/*      Use this       */
/***********************/

#define calb_read_pio_hfifo(/*CALBH_id       */ calb_id,	/* IN  */    \
			     /*unsigned int   */ count,		/* IN nr els to read, OUT nr els really read */    \
			     /*unsigned int * */ buffer)	/* OUT */ \
	calbh_read_pio_hfifo(calb_id,count,buffer)

#define calb_read_pio_dfifo(/*CALBH_id       */ calb_id,	/* IN  */    \
			     /*unsigned int   */ count,		/* IN nr els to read, OUT nr els really read */    \
			     /*unsigned int * */ buffer)	/* OUT */ \
	calbh_read_pio_dfifo(calb_id,count,buffer)

#define calb_read_blt_dfifo(/*CALBH_id       */ calb_id,	/* IN  */    \
			     /*unsigned int   */ count,		/* IN nr els to read, OUT nr els really read */    \
			     /*unsigned int * */ buffer)	/* OUT */ \
	calbh_read_blt_dfifo(calb_id,count,buffer)


#endif /* CALB_H */