mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-24 15:20:02 +02:00
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:
parent
6adeca51ed
commit
bc61fd4883
@ -39,7 +39,9 @@ int ram_size=0;
|
||||
int64_t totalTime=1;
|
||||
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;
|
||||
@ -282,14 +284,14 @@ int cleanFifo(){
|
||||
}
|
||||
|
||||
|
||||
int setDAQRegister(int adcval)
|
||||
int setDAQRegister()
|
||||
{
|
||||
u_int32_t addr, reg, val;
|
||||
addr=DAQ_REG;
|
||||
|
||||
//depended on adcval
|
||||
int packetlength=0x7f;
|
||||
if(adcval==-1) packetlength=0x13f;
|
||||
if(!ROI_flag) packetlength=0x13f;
|
||||
|
||||
//depended on pcb rev
|
||||
int tokenTiming = TOKEN_TIMING_REV2;
|
||||
@ -1190,57 +1192,50 @@ int initConfGain(int isettings,int val,int imod){
|
||||
|
||||
|
||||
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){
|
||||
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|=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);
|
||||
bus_w(CHIP_OF_INTRST_REG,reg);
|
||||
}
|
||||
|
||||
#ifdef DDEBUG
|
||||
printf("Chip of Intrst Reg:%x\n",bus_r(CHIP_OF_INTRST_REG));
|
||||
#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 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
|
||||
int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int udpport){
|
||||
|
||||
|
||||
#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);
|
||||
|
||||
#ifdef DDEBUG
|
||||
printf("***Configuring MAC*** adc=%d\n",adc);
|
||||
printf("***Configuring MAC*** \n");
|
||||
#endif
|
||||
|
||||
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;
|
||||
|
||||
|
||||
|
||||
return adcConfigured;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ u_int32_t bus_r(u_int32_t offset);
|
||||
|
||||
int setPhaseShiftOnce();
|
||||
int cleanFifo();
|
||||
int setDAQRegister(int adcval);
|
||||
int setDAQRegister();
|
||||
|
||||
u_int32_t putout(char *s, 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 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();
|
||||
|
||||
|
||||
|
@ -41,6 +41,8 @@ int *detectorDacs=NULL;
|
||||
int *detectorAdcs=NULL;
|
||||
//int numberOfProbes;
|
||||
|
||||
ROI rois[MAX_ROIS];
|
||||
int nROI=0;
|
||||
|
||||
|
||||
int initDetector() {
|
||||
@ -2577,4 +2579,71 @@ int calibration_chip(int num, int *v, int *dacs) {
|
||||
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
|
||||
|
||||
|
||||
|
@ -166,6 +166,9 @@ int calibration_sensor(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
|
||||
|
@ -280,6 +280,7 @@
|
||||
#define ACTIVE_ADC_MASK 0x0000001f
|
||||
|
||||
|
||||
|
||||
/**ADC SYNC CLEAN FIFO*/
|
||||
#define ADCSYNC_CLEAN_FIFO_BITS 0x300000
|
||||
|
||||
|
@ -22,6 +22,8 @@
|
||||
#define NTRIMBITS 6
|
||||
#define NCOUNTBITS 24
|
||||
|
||||
#define NCHIPS_PER_ADC 2
|
||||
|
||||
//#define TRIM_DR ((2**NTRIMBITS)-1)
|
||||
//#define COUNT_DR ((2**NCOUNTBITS)-1)
|
||||
#define TRIM_DR (((int)pow(2,NTRIMBITS))-1)
|
||||
@ -38,6 +40,12 @@
|
||||
#define TOKEN_TIMING_REV1 0x1f16
|
||||
#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
|
||||
#define DEBUGOUT
|
||||
#endif
|
||||
|
@ -49,19 +49,9 @@ int init_detector( int b) {
|
||||
printf("This is a GOTTHARD detector with %d chips per module\n", NCHIP);
|
||||
#else
|
||||
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
|
||||
|
||||
*/
|
||||
if (res<0) { printf("Could not map memory\n");
|
||||
if (mapCSP0()==FAIL) { printf("Could not map memory\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -77,9 +67,7 @@ int init_detector( int b) {
|
||||
setPhaseShiftOnce();
|
||||
|
||||
prepareADC();
|
||||
setDAQRegister(-1);
|
||||
cleanFifo();
|
||||
setADC(-1);
|
||||
setADC(-1); //already does setdaqreg and clean fifo
|
||||
printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG));
|
||||
int reg = (NCHAN*NCHIP)<<CHANNEL_OFFSET;
|
||||
reg&=CHANNEL_MASK;
|
||||
@ -198,10 +186,11 @@ int function_table() {
|
||||
|
||||
int M_nofunc(int file_des){
|
||||
|
||||
int retval=FAIL;
|
||||
int ret=FAIL;
|
||||
sprintf(mess,"Unrecognized Function\n");
|
||||
printf(mess);
|
||||
sendDataOnly(file_des,&retval,sizeof(retval));
|
||||
|
||||
sendDataOnly(file_des,&ret,sizeof(ret));
|
||||
sendDataOnly(file_des,mess,sizeof(mess));
|
||||
return GOODBYE;
|
||||
}
|
||||
@ -2249,8 +2238,68 @@ int set_dynamic_range(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) {
|
||||
@ -2494,7 +2543,6 @@ int configure_mac(int file_des) {
|
||||
long long int idetectormacadd;
|
||||
int udpport;
|
||||
int detipad;
|
||||
int adc=-1;
|
||||
int retval=-100;
|
||||
|
||||
sprintf(mess,"Can't configure MAC\n");
|
||||
@ -2528,11 +2576,6 @@ int configure_mac(int file_des) {
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
n = receiveDataOnly(file_des,&adc,sizeof(adc));
|
||||
if (n < 0) {
|
||||
sprintf(mess,"Error reading from socket\n");
|
||||
ret=FAIL;
|
||||
}
|
||||
|
||||
|
||||
if (imod>=getNModBoard())
|
||||
@ -2541,7 +2584,7 @@ int configure_mac(int file_des) {
|
||||
imod=ALLMOD;
|
||||
|
||||
//#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
|
||||
#ifdef MCB_FUNCS
|
||||
if (ret==OK){
|
||||
@ -2552,7 +2595,7 @@ int configure_mac(int file_des) {
|
||||
}
|
||||
|
||||
if(ret==OK)
|
||||
configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,adc,udpport);
|
||||
configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport);
|
||||
retval=getAdcConfigured();
|
||||
}
|
||||
#endif
|
||||
@ -2845,7 +2888,7 @@ int start_receiver(int file_des) {
|
||||
/* execute action if the arguments correctly arrived*/
|
||||
#ifdef MCB_FUNCS
|
||||
if (lockStatus==1 && differentClients==1){//necessary???
|
||||
sprintf(mess,"Receiver locked by %s\n", lastClientIP);
|
||||
sprintf(mess,"Detector locked by %s\n", lastClientIP);
|
||||
ret=FAIL;
|
||||
}
|
||||
else
|
||||
@ -2881,7 +2924,7 @@ int stop_receiver(int file_des) {
|
||||
/* execute action if the arguments correctly arrived*/
|
||||
#ifdef MCB_FUNCS
|
||||
if (lockStatus==1 && differentClients==1){//necessary???
|
||||
sprintf(mess,"Receiver locked by %s\n", lastClientIP);
|
||||
sprintf(mess,"Detector locked by %s\n", lastClientIP);
|
||||
ret=FAIL;
|
||||
}
|
||||
else
|
||||
@ -2946,3 +2989,5 @@ int calibrate_pedestal(int file_des){
|
||||
/*return ok/fail*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -93,4 +93,6 @@ int stop_receiver(int);
|
||||
|
||||
int calibrate_pedestal(int);
|
||||
|
||||
int set_roi(int);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user