/***********************************************************/
/*                                                         */
/* File        : rockmfarm.h                               */
/* Description : ROCKM farm frame specific library header  */
/*                                                         */
/* Author: Sfiligoi Igor                                   */
/*                                                         */
/* Created      : 07.07.1997                               */
/* Recreated    : 29.08.1997                               */
/* Last modified: 29.08.1997                               */
/*                                                         */
/***********************************************************/

#ifndef ROCKMFARM_H
#define ROCKMFARM_H

#include <bits.h>

#define ROCKM_ERROR_FARM_OK             0
#define ROCKM_ERROR_FARM_UNKNOWN     -300
#define ROCKM_ERROR_FARM_SUBHEADER   -301
#define ROCKM_ERROR_FARM_SLAVE       -302
#define ROCKM_ERROR_FARM_SUBFOOTER   -303

/*****************************************************************/
/*                                                               */
/* Convert data comming from the collector in a format           */
/* suitable for further processing                               */
/*                                                               */
/* Do nothing if length==8                                       */
/*                                                               */
/* Collector format:                                             */
/*     unsigned int length (in bytes, including the length)      */
/*     unsigned int event_number                                 */
/*     data from the rockm without superheader and superfooter   */
/*                                                               */
/* New format:                                                   */
/*     unsigned int length (same as before)                      */
/*     unsigned int event_number  (same as before)               */
/*     array of all the slave words in the input data, with      */
/*                  the following format:                        */
/*                    5 bits: Chain_nr                           */
/*                    3 bits: Crate_addr                         */
/*                    4 bits: Slave_addr                         */
/*                    7 bits: Channel_addr                       */
/*               (1+12) bits: slave_data                         */
/*     last uint of the struct (length-4) contains length        */
/*          of the array                                         */
/*                                                               */
/* Returns :ROCKM_ERROR_FARM_OK in case of success            */
/*                                                               */
/*****************************************************************/

int rockm_farm_compact(unsigned int chain_nr,  /* Chain number, will be truncated to 5 bits (no check) */
		       unsigned int chan_mask, /* mask to be applied to the channel field */
		       unsigned int *data);    /* IN  : data comming from the collector
						  OUT : data in the new format */


/*****************************************************************/
/*                                                               */
/*          Convert between new format and the struct            */
/*                                                               */
/*****************************************************************/


#define ROCKM_FARM_CHAIN              27
#define ROCKM_FARM_CHAIN_mask         0x1f
#define ROCKM_FARM_CRATE              24
#define ROCKM_FARM_CRATE_mask         0x7
#define ROCKM_FARM_SLOT               20
#define ROCKM_FARM_SLOT_mask          0xf
#define ROCKM_FARM_CHAN               13
#define ROCKM_FARM_CHAN_mask          0x7f
#define ROCKM_FARM_RES                12
#define ROCKM_FARM_DATA               0
#define ROCKM_FARM_DATA_mask          0xfff


typedef struct
        {
	  unsigned char  chain;
	  unsigned char  crate;
	  unsigned char  slot;
	  unsigned char  chan;
	  unsigned char  res;
	  unsigned short data;
        } rockm_farm;

#define rockm_farm_raw2farm(/*unsigned int */ raw,     /*IN  */ \
			    /*rockm_farm*/ farm)/* OUT */ \
        {                                                             \
	  farm.chain = bits_get_bits_mask(raw,ROCKM_FARM_CHAIN,ROCKM_FARM_CHAIN_mask); \
	  farm.crate = bits_get_bits_mask(raw,ROCKM_FARM_CRATE,ROCKM_FARM_CRATE_mask); \
	  farm.slot = bits_get_bits_mask(raw,ROCKM_FARM_SLOT,ROCKM_FARM_SLOT_mask);    \
	  farm.chan = bits_get_bits_mask(raw,ROCKM_FARM_CHAN,ROCKM_FARM_CHAN_mask);    \
	  farm.res = bits_get_bit(raw,ROCKM_FARM_RES);                                    \
	  farm.data = bits_get_bits_mask(raw,ROCKM_FARM_DATA,ROCKM_FARM_DATA_mask);    \
        }

#define rockm_farm_farm2raw(/*rockm_farm*/ farm) /* IN */ \
        (bits_pos_bits_mask(farm.chain,ROCKM_FARM_CHAIN,ROCKM_FARM_CHAIN_mask) | \
         bits_pos_bits_mask(farm.crate,ROCKM_FARM_CRATE,ROCKM_FARM_CRATE_mask) | \
         bits_pos_bits_mask(farm.slot,ROCKM_FARM_SLOT,ROCKM_FARM_SLOT_mask)    | \
         bits_pos_bits_mask(farm.chan,ROCKM_FARM_CHAN,ROCKM_FARM_CHAN_mask)    | \
	 bits_pos_bit(farm.res,ROCKM_FARM_RES)                                    | \
         bits_pos_bits_mask(farm.data,ROCKM_FARM_DATA,ROCKM_FARM_DATA_mask))

#endif /* ROCKMFARM_H */