included setroi for multidet

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@463 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d 2013-02-21 15:53:07 +00:00
parent 6adeca51ed
commit bc61fd4883
8 changed files with 198 additions and 76 deletions

View File

@ -39,7 +39,9 @@ int ram_size=0;
int64_t totalTime=1; int64_t totalTime=1;
u_int32_t progressMask=0; u_int32_t progressMask=0;
int phase_shift=120; int phase_shift=DEFAULT_PHASE_SHIFT;
int ipPacketSize=DEFAULT_IP_PACKETSIZE;
int udpPacketSize=DEFAULT_UDP_PACKETSIZE;
int ififostart, ififostop, ififostep, ififo; int ififostart, ififostop, ififostep, ififo;
@ -282,14 +284,14 @@ int cleanFifo(){
} }
int setDAQRegister(int adcval) int setDAQRegister()
{ {
u_int32_t addr, reg, val; u_int32_t addr, reg, val;
addr=DAQ_REG; addr=DAQ_REG;
//depended on adcval //depended on adcval
int packetlength=0x7f; int packetlength=0x7f;
if(adcval==-1) packetlength=0x13f; if(!ROI_flag) packetlength=0x13f;
//depended on pcb rev //depended on pcb rev
int tokenTiming = TOKEN_TIMING_REV2; int tokenTiming = TOKEN_TIMING_REV2;
@ -1190,57 +1192,50 @@ int initConfGain(int isettings,int val,int imod){
int setADC(int adc){ int setADC(int adc){
int reg; int reg,nchips,mask;
if(adc==-1) ROI_flag=0;
else ROI_flag=1;
setDAQRegister();//token timing
cleanFifo();//adc sync
//all adc
if(adc==-1){ if(adc==-1){
reg = (NCHAN*NCHIP)<<CHANNEL_OFFSET; //set packet size
ipPacketSize= DEFAULT_IP_PACKETSIZE;
udpPacketSize=DEFAULT_UDP_PACKETSIZE;
//set channel mask
nchips = NCHIP;
mask = ACTIVE_ADC_MASK;
}
//1 adc
else{
ipPacketSize= ADC1_IP_PACKETSIZE;
udpPacketSize=ADC1_UDP_PACKETSIZE;
//set channel mask
nchips = NCHIPS_PER_ADC;
mask = 1<<adc;
}
//set channel mask
reg = (NCHAN*nchips)<<CHANNEL_OFFSET;
reg&=CHANNEL_MASK; reg&=CHANNEL_MASK;
reg|=ACTIVE_ADC_MASK;
bus_w(CHIP_OF_INTRST_REG,reg);
}else{
reg = (NCHAN*2)<<CHANNEL_OFFSET;
reg&=CHANNEL_MASK;
int mask =1<<adc;
reg|=(ACTIVE_ADC_MASK & mask); reg|=(ACTIVE_ADC_MASK & mask);
bus_w(CHIP_OF_INTRST_REG,reg); bus_w(CHIP_OF_INTRST_REG,reg);
}
#ifdef DDEBUG #ifdef DDEBUG
printf("Chip of Intrst Reg:%x\n",bus_r(CHIP_OF_INTRST_REG)); printf("Chip of Intrst Reg:%x\n",bus_r(CHIP_OF_INTRST_REG));
#endif #endif
adcConfigured = adc;
return adcConfigured;
} }
int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int adc,int udpport){ int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int udpport){
int udpPacketSize=0x050E;
int ipPacketSize=0x0522;
//update adc configured
adcConfigured = adc;
switch(adc){
case 0:
case 1:
case 2:
case 3:
case 4:
ROI_flag=1;
ipPacketSize= 256*2+14+20;
udpPacketSize=256*2+4+8+2;
break;
//for all adcs
default:
adc=-1;
adcConfigured=-1;
ROI_flag=0;
break;
}
setDAQRegister(adc);//token timing
cleanFifo();//adc sync
setADC(adc);//chip of interest
#ifdef DDEBUG #ifdef DDEBUG
@ -1263,7 +1258,7 @@ int configureMAC(int ipad,long long int macad,long long int detectormacad, int d
tse_conf_regs=(tse_conf*)(CSP0BASE+offset2*2); tse_conf_regs=(tse_conf*)(CSP0BASE+offset2*2);
#ifdef DDEBUG #ifdef DDEBUG
printf("***Configuring MAC*** adc=%d\n",adc); printf("***Configuring MAC*** \n");
#endif #endif
if(ival) if(ival)
@ -1423,7 +1418,6 @@ int configureMAC(int ipad,long long int macad,long long int detectormacad, int d
// if(val!=0x2820) return -1; // if(val!=0x2820) return -1;
return adcConfigured; return adcConfigured;
} }

View File

@ -30,7 +30,7 @@ u_int32_t bus_r(u_int32_t offset);
int setPhaseShiftOnce(); int setPhaseShiftOnce();
int cleanFifo(); int cleanFifo();
int setDAQRegister(int adcval); int setDAQRegister();
u_int32_t putout(char *s, int modnum); u_int32_t putout(char *s, int modnum);
u_int32_t readin(int modnum); u_int32_t readin(int modnum);
@ -66,7 +66,7 @@ int initHighVoltage(int val,int imod);
int initConfGain(int isettings,int val,int imod); int initConfGain(int isettings,int val,int imod);
int setADC(int adc); int setADC(int adc);
int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int adc,int udpport); int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int udpport);
int getAdcConfigured(); int getAdcConfigured();

View File

@ -41,6 +41,8 @@ int *detectorDacs=NULL;
int *detectorAdcs=NULL; int *detectorAdcs=NULL;
//int numberOfProbes; //int numberOfProbes;
ROI rois[MAX_ROIS];
int nROI=0;
int initDetector() { int initDetector() {
@ -2577,4 +2579,71 @@ int calibration_chip(int num, int *v, int *dacs) {
return OK; return OK;
} }
ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret){
int i,adc;
ROI temp;
if(n>=0){
//clear rois
for(i=0;i<MAX_ROIS;i++)
rois[i]=temp;
/*ideal way to set roi
for(i=0;i<n;i++)
rois[i]=arg[i];
nROI = n;
*/
if(n==0)
adc=-1;
else{
//if its for 1 adc or general
if ((arg[0].xmin==0) && (arg[0].xmax==NCHIP*NCHAN))
adc=-1;
else{
//adc = mid value/numchans also for only 1 roi
adc = ((((arg[0].xmax)+(arg[0].xmin))/2)/(NCHAN*NCHIPS_PER_ADC));
if((adc>=0) && (adc<=4));
else {
printf("warning:adc value greater than 5. deleting roi\n");
adc=-1;
}
}
}
//set rois for just 1 adc - take only 1st roi
if(adc!=-1){
rois[0].xmin=adc*(NCHAN*NCHIPS_PER_ADC);
rois[0].xmax=(adc+1)*(NCHAN*NCHIPS_PER_ADC);
rois[0].ymin=-1;
rois[0].ymax=-1;
nROI = 1;
}else
nROI = 0;
if((arg[0].xmin!=rois[0].xmin)||(arg[0].xmax!=rois[0].xmax)||(arg[0].ymin!=rois[0].ymin)||(arg[0].ymax!=rois[0].ymax))
*ret=FAIL;
if(n!=nROI)
*ret=FAIL;
//set adc of interest
setADC(adc);
}
//#ifdef VERBOSE
printf("Rois:\n");
for( i=0;i<nROI;i++)
printf("%d\t%d\t%d\t%d\n",rois[i].xmin,rois[i].xmax,rois[i].ymin,rois[i].ymax);
//#endif
*retvalsize = nROI;
return rois;
}
#endif #endif

View File

@ -166,6 +166,9 @@ int calibration_sensor(int num, int *values, int *dacs) ;
int calibration_chip(int num, int *values, int *dacs); int calibration_chip(int num, int *values, int *dacs);
ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret);
#endif #endif
#endif #endif

View File

@ -280,6 +280,7 @@
#define ACTIVE_ADC_MASK 0x0000001f #define ACTIVE_ADC_MASK 0x0000001f
/**ADC SYNC CLEAN FIFO*/ /**ADC SYNC CLEAN FIFO*/
#define ADCSYNC_CLEAN_FIFO_BITS 0x300000 #define ADCSYNC_CLEAN_FIFO_BITS 0x300000

View File

@ -22,6 +22,8 @@
#define NTRIMBITS 6 #define NTRIMBITS 6
#define NCOUNTBITS 24 #define NCOUNTBITS 24
#define NCHIPS_PER_ADC 2
//#define TRIM_DR ((2**NTRIMBITS)-1) //#define TRIM_DR ((2**NTRIMBITS)-1)
//#define COUNT_DR ((2**NCOUNTBITS)-1) //#define COUNT_DR ((2**NCOUNTBITS)-1)
#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) #define TRIM_DR (((int)pow(2,NTRIMBITS))-1)
@ -38,6 +40,12 @@
#define TOKEN_TIMING_REV1 0x1f16 #define TOKEN_TIMING_REV1 0x1f16
#define TOKEN_TIMING_REV2 0x1f0f #define TOKEN_TIMING_REV2 0x1f0f
#define DEFAULT_PHASE_SHIFT 120
#define DEFAULT_IP_PACKETSIZE 0x0522
#define DEFAULT_UDP_PACKETSIZE 0x050E
#define ADC1_IP_PACKETSIZE 256*2+14+20
#define ADC1_UDP_PACKETSIZE 256*2+4+8+2
#ifdef VIRTUAL #ifdef VIRTUAL
#define DEBUGOUT #define DEBUGOUT
#endif #endif

View File

@ -49,19 +49,9 @@ int init_detector( int b) {
printf("This is a GOTTHARD detector with %d chips per module\n", NCHIP); printf("This is a GOTTHARD detector with %d chips per module\n", NCHIP);
#else #else
printf("This is a PICASSO detector with %d chips per module\n", NCHIP); printf("This is a PICASSO detector with %d chips per module\n", NCHIP);
#endif
int res =mapCSP0();
/*
#ifndef VIRTUAL
system("bus -a 0xb0000000 -w 0xd0008");
#ifdef VERBOSE
printf("setting wait states \n");
system("bus -a 0xb0000000");
#endif
#endif #endif
*/ if (mapCSP0()==FAIL) { printf("Could not map memory\n");
if (res<0) { printf("Could not map memory\n");
exit(1); exit(1);
} }
@ -77,9 +67,7 @@ int init_detector( int b) {
setPhaseShiftOnce(); setPhaseShiftOnce();
prepareADC(); prepareADC();
setDAQRegister(-1); setADC(-1); //already does setdaqreg and clean fifo
cleanFifo();
setADC(-1);
printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG)); printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG));
int reg = (NCHAN*NCHIP)<<CHANNEL_OFFSET; int reg = (NCHAN*NCHIP)<<CHANNEL_OFFSET;
reg&=CHANNEL_MASK; reg&=CHANNEL_MASK;
@ -198,10 +186,11 @@ int function_table() {
int M_nofunc(int file_des){ int M_nofunc(int file_des){
int retval=FAIL; int ret=FAIL;
sprintf(mess,"Unrecognized Function\n"); sprintf(mess,"Unrecognized Function\n");
printf(mess); printf(mess);
sendDataOnly(file_des,&retval,sizeof(retval));
sendDataOnly(file_des,&ret,sizeof(ret));
sendDataOnly(file_des,mess,sizeof(mess)); sendDataOnly(file_des,mess,sizeof(mess));
return GOODBYE; return GOODBYE;
} }
@ -2249,8 +2238,68 @@ int set_dynamic_range(int file_des) {
int set_roi(int file_des) { int set_roi(int file_des) {
return FAIL; int i;
int ret=OK;
int nroi=-1;
int n=0;
int retvalsize=0;
ROI arg[MAX_ROIS];
ROI* retval=0;
strcpy(mess,"Could not set/get roi\n");
n = receiveDataOnly(file_des,&nroi,sizeof(nroi));
if (n < 0) {
sprintf(mess,"Error reading from socket\n");
ret=FAIL;
}
if(nroi!=-1){
n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI));
if (n != (nroi*sizeof(ROI))) {
sprintf(mess,"Received wrong number of bytes for ROI\n");
ret=FAIL;
}
//#ifdef VERBOSE
printf("Setting ROI to:");
for( i=0;i<nroi;i++)
printf("%d\t%d\t%d\t%d\n",arg[i].xmin,arg[i].xmax,arg[i].ymin,arg[i].ymax);
//#endif
}
/* execute action if the arguments correctly arrived*/
#ifdef MCB_FUNCS
if (lockStatus==1 && differentClients==1){//necessary???
sprintf(mess,"Detector locked by %s\n", lastClientIP);
ret=FAIL;
}
else{
retval=setROI(nroi,arg,&retvalsize,&ret);
if (ret==FAIL){
printf("mess:%s\n",mess);
sprintf(mess,"Could not set all roi, should have set %d rois, but only set %d rois\n",nroi,retvalsize);
}
}
#endif
if(ret==OK && differentClients){
printf("Force update\n");
ret=FORCE_UPDATE;
}
/* send answer */
n = sendDataOnly(file_des,&ret,sizeof(ret));
if(ret==FAIL)
n = sendDataOnly(file_des,mess,sizeof(mess));
else{
sendDataOnly(file_des,&retvalsize,sizeof(retvalsize));
sendDataOnly(file_des,retval,retvalsize*sizeof(ROI));
}
/*return ok/fail*/
return ret;
} }
int get_roi(int file_des) { int get_roi(int file_des) {
@ -2494,7 +2543,6 @@ int configure_mac(int file_des) {
long long int idetectormacadd; long long int idetectormacadd;
int udpport; int udpport;
int detipad; int detipad;
int adc=-1;
int retval=-100; int retval=-100;
sprintf(mess,"Can't configure MAC\n"); sprintf(mess,"Can't configure MAC\n");
@ -2528,11 +2576,6 @@ int configure_mac(int file_des) {
printf("\n"); printf("\n");
#endif #endif
n = receiveDataOnly(file_des,&adc,sizeof(adc));
if (n < 0) {
sprintf(mess,"Error reading from socket\n");
ret=FAIL;
}
if (imod>=getNModBoard()) if (imod>=getNModBoard())
@ -2541,7 +2584,7 @@ int configure_mac(int file_des) {
imod=ALLMOD; imod=ALLMOD;
//#ifdef VERBOSE //#ifdef VERBOSE
printf("Configuring MAC of module %d and adc %d at port %x\n", imod, adc,udpport); printf("Configuring MAC of module %d at port %x\n", imod, udpport);
//#endif //#endif
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
if (ret==OK){ if (ret==OK){
@ -2552,7 +2595,7 @@ int configure_mac(int file_des) {
} }
if(ret==OK) if(ret==OK)
configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,adc,udpport); configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport);
retval=getAdcConfigured(); retval=getAdcConfigured();
} }
#endif #endif
@ -2845,7 +2888,7 @@ int start_receiver(int file_des) {
/* execute action if the arguments correctly arrived*/ /* execute action if the arguments correctly arrived*/
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
if (lockStatus==1 && differentClients==1){//necessary??? if (lockStatus==1 && differentClients==1){//necessary???
sprintf(mess,"Receiver locked by %s\n", lastClientIP); sprintf(mess,"Detector locked by %s\n", lastClientIP);
ret=FAIL; ret=FAIL;
} }
else else
@ -2881,7 +2924,7 @@ int stop_receiver(int file_des) {
/* execute action if the arguments correctly arrived*/ /* execute action if the arguments correctly arrived*/
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
if (lockStatus==1 && differentClients==1){//necessary??? if (lockStatus==1 && differentClients==1){//necessary???
sprintf(mess,"Receiver locked by %s\n", lastClientIP); sprintf(mess,"Detector locked by %s\n", lastClientIP);
ret=FAIL; ret=FAIL;
} }
else else
@ -2946,3 +2989,5 @@ int calibrate_pedestal(int file_des){
/*return ok/fail*/ /*return ok/fail*/
return ret; return ret;
} }

View File

@ -93,4 +93,6 @@ int stop_receiver(int);
int calibrate_pedestal(int); int calibrate_pedestal(int);
int set_roi(int);
#endif #endif