mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-01-16 08:09:21 +01:00
gotthard fixed roi only xmin and xmax.remove updateoffsets
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -37,8 +37,7 @@ int digitalTestBit = 0;
|
||||
|
||||
// roi configuration
|
||||
int adcConfigured = -1;
|
||||
ROI rois[MAX_ROIS];
|
||||
int nROI = 0;
|
||||
ROI rois;
|
||||
int ipPacketSize = 0;
|
||||
int udpPacketSize = 0;
|
||||
|
||||
@@ -397,7 +396,9 @@ void setupDetector() {
|
||||
bus_w(TEMP_SPI_OUT_REG, 0x0);
|
||||
|
||||
// roi, gbit readout
|
||||
setROIADC(-1); // set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
|
||||
rois.xmin = -1;
|
||||
rois.xmax = -1;
|
||||
setROI(rois);// set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
|
||||
setGbitReadout();
|
||||
|
||||
// master, slave (25um)
|
||||
@@ -726,95 +727,49 @@ int setDynamicRange(int dr){
|
||||
return DYNAMIC_RANGE;
|
||||
}
|
||||
|
||||
ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret) {
|
||||
int setROI(ROI arg) {
|
||||
|
||||
// set ROI
|
||||
if(n >= 0){
|
||||
// print
|
||||
if (!n) {
|
||||
FILE_LOG(logINFO, ("Clearing ROI\n"));
|
||||
} else {
|
||||
FILE_LOG(logINFO, ("Setting ROI:\n"));
|
||||
int i = 0;
|
||||
for (i = 0; i < n; ++i) {
|
||||
FILE_LOG(logINFO, ("\t(%d, %d)\n", arg[i].xmin, arg[i].xmax));
|
||||
}
|
||||
int adc = -1;
|
||||
if (arg.xmin == -1) {
|
||||
FILE_LOG(logINFO, ("Clearing ROI\n"));
|
||||
rois.xmin = -1;
|
||||
rois.xmax = -1;
|
||||
} else {
|
||||
FILE_LOG(logINFO, ("Setting ROI:(%d, %d)\n", arg.xmin, arg.xmax));
|
||||
// validation
|
||||
// xmin divisible by 256 and less than 1280
|
||||
if (((arg.xmin % NCHAN_PER_ADC) != 0) || (arg.xmin >= (NCHAN * NCHIP))) {
|
||||
FILE_LOG(logERROR, ("Could not set roi. xmin is invalid\n"));
|
||||
return FAIL;
|
||||
}
|
||||
// only one ROI allowed per module
|
||||
if (n > 1) {
|
||||
FILE_LOG(logERROR, ("\tCannot set more than 1 ROI per module\n"));
|
||||
*ret = FAIL;
|
||||
*retvalsize = nROI;
|
||||
return rois;
|
||||
// xmax must be 255 more than xmin
|
||||
if (arg.xmax != (arg.xmin + NCHAN_PER_ADC - 1)) {
|
||||
FILE_LOG(logERROR, ("Could not set roi. xmax is invalid\n"));
|
||||
return FAIL;
|
||||
}
|
||||
rois.xmin = arg.xmin;
|
||||
rois.xmax = arg.xmax;
|
||||
adc = arg.xmin / NCHAN_PER_ADC;
|
||||
}
|
||||
FILE_LOG(logINFO, ("\tAdc to be configured: %d\n", adc));
|
||||
FILE_LOG(logINFO, ("\tROI to be configured: (%d, %d)\n",
|
||||
(adc == -1) ? 0 : (rois.xmin),
|
||||
(adc == -1) ? (NCHIP * NCHAN - 1) : (rois.xmax)));
|
||||
|
||||
//clear all rois
|
||||
nROI = 0;
|
||||
//set adc of interest
|
||||
setROIADC(adc);
|
||||
return OK;
|
||||
}
|
||||
|
||||
// find adc number and recorrect channel limits
|
||||
int adc = -1;
|
||||
if (n) {
|
||||
// all channels
|
||||
if ((arg[0].xmin <= 0) && (arg[0].xmax >= NCHIP * NCHAN))
|
||||
adc = -1;
|
||||
// single adc
|
||||
else {
|
||||
//adc = mid value/numchans
|
||||
adc = ((((arg[0].xmax) + (arg[0].xmin))/2) / (NCHAN * NCHIPS_PER_ADC));
|
||||
// incorrect adc
|
||||
if((adc < 0) || (adc > 4)) {
|
||||
FILE_LOG(logERROR, ("\tadc value greater than 5. deleting roi\n"));
|
||||
adc = -1;
|
||||
}
|
||||
// recorrect roi values
|
||||
else {
|
||||
rois[0].xmin = adc * (NCHAN * NCHIPS_PER_ADC);
|
||||
rois[0].xmax = (adc + 1) * (NCHAN * NCHIPS_PER_ADC) - 1;
|
||||
rois[0].ymin = -1;
|
||||
rois[0].ymax = -1;
|
||||
nROI = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (adc == -1)
|
||||
nROI = 0;
|
||||
|
||||
FILE_LOG(logINFO, ("\tAdc to be configured: %d\n", adc));
|
||||
FILE_LOG(logINFO, ("\tROI to be configured: (%d, %d)\n",
|
||||
(adc == -1) ? 0 : (rois[0].xmin),
|
||||
(adc == -1) ? (NCHIP * NCHAN - 1) : (rois[0].xmax)));
|
||||
|
||||
// could not set roi
|
||||
if((n != 0) && ((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;
|
||||
FILE_LOG(logERROR, ("\tCould not set given ROI\n"));
|
||||
}
|
||||
if(n != nROI) {
|
||||
*ret = FAIL;
|
||||
FILE_LOG(logERROR, ("\tCould not set or clear ROIs\n"));
|
||||
}
|
||||
|
||||
//set adc of interest
|
||||
setROIADC(adc);
|
||||
} else FILE_LOG(logINFO, ("Getting ROI:\n"));
|
||||
ROI getROI() {
|
||||
FILE_LOG(logINFO, ("Getting ROI:\n"));
|
||||
|
||||
// print
|
||||
if (!nROI) {
|
||||
if (rois.xmin == -1) {
|
||||
FILE_LOG(logINFO, ("\tROI: None\n"));
|
||||
} else {
|
||||
FILE_LOG(logINFO, ("ROI:\n"));
|
||||
int i = 0;
|
||||
for (i = 0; i < nROI; ++i) {
|
||||
FILE_LOG(logINFO, ("\t(%d, %d)\n", rois[i].xmin, rois[i].xmax));
|
||||
|
||||
}
|
||||
FILE_LOG(logINFO, ("ROI: (%d,%d)\n", rois.xmin, rois.xmax));
|
||||
}
|
||||
|
||||
*retvalsize = nROI;
|
||||
return rois;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ enum DACINDEX {VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN
|
||||
#define NCHIP (10)
|
||||
#define NDAC (8)
|
||||
#define NCHIPS_PER_ADC (2)
|
||||
#define NCHAN_PER_ADC (256)
|
||||
#define DYNAMIC_RANGE (16)
|
||||
#define NUM_BITS_PER_PIXEL (DYNAMIC_RANGE / 8)
|
||||
#define DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
|
||||
|
||||
@@ -114,7 +114,8 @@ void resetPeripheral();
|
||||
// parameters - dr, roi
|
||||
int setDynamicRange(int dr);
|
||||
#ifdef GOTTHARDD
|
||||
ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret);
|
||||
int setROI(ROI arg);
|
||||
ROI getROI();
|
||||
#endif
|
||||
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
|
||||
int setADCEnableMask(uint32_t mask);
|
||||
|
||||
@@ -189,6 +189,7 @@ const char* getFunctionName(enum detFuncs func) {
|
||||
case F_SET_DYNAMIC_RANGE: return "F_SET_DYNAMIC_RANGE";
|
||||
case F_SET_READOUT_FLAGS: return "F_SET_READOUT_FLAGS";
|
||||
case F_SET_ROI: return "F_SET_ROI";
|
||||
case F_GET_ROI: return "F_GET_ROI";
|
||||
case F_SET_SPEED: return "F_SET_SPEED";
|
||||
case F_EXIT_SERVER: return "F_EXIT_SERVER";
|
||||
case F_LOCK_SERVER: return "F_LOCK_SERVER";
|
||||
@@ -279,6 +280,7 @@ void function_table() {
|
||||
flist[F_SET_DYNAMIC_RANGE] = &set_dynamic_range;
|
||||
flist[F_SET_READOUT_FLAGS] = &set_readout_flags;
|
||||
flist[F_SET_ROI] = &set_roi;
|
||||
flist[F_GET_ROI] = &get_roi;
|
||||
flist[F_SET_SPEED] = &set_speed;
|
||||
flist[F_EXIT_SERVER] = &exit_server;
|
||||
flist[F_LOCK_SERVER] = &lock_server;
|
||||
@@ -1896,76 +1898,49 @@ int set_readout_flags(int file_des) {
|
||||
int set_roi(int file_des) {
|
||||
ret = OK;
|
||||
memset(mess, 0, sizeof(mess));
|
||||
int narg = -1;
|
||||
ROI arg[MAX_ROIS];
|
||||
int nretval = -1;
|
||||
ROI* retval = NULL;
|
||||
ROI arg;
|
||||
|
||||
// receive number of ROIs
|
||||
if (receiveData(file_des, &narg, sizeof(narg), INT32) < 0)
|
||||
// receive ROI
|
||||
if (receiveData(file_des, &arg.xmin, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
// receive ROIs
|
||||
{
|
||||
int iloop = 0;
|
||||
for (iloop = 0; iloop < narg; ++iloop) {
|
||||
if (receiveData(file_des, &arg[iloop].xmin, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
if (receiveData(file_des, &arg[iloop].xmax, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
if (receiveData(file_des, &arg[iloop].ymin, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
if (receiveData(file_des, &arg[iloop].ymax, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
}
|
||||
}
|
||||
FILE_LOG(logDEBUG1, ("Set ROI (narg:%d)\n", narg));
|
||||
{
|
||||
int iloop = 0;
|
||||
for (iloop = 0; iloop < narg; ++iloop) {
|
||||
FILE_LOG(logDEBUG1, ("%d: %d\t%d\t%d\t%d\n",
|
||||
arg[iloop].xmin, arg[iloop].xmax, arg[iloop].ymin, arg[iloop].ymax));
|
||||
}
|
||||
}
|
||||
if (receiveData(file_des, &arg.xmax, sizeof(int), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
FILE_LOG(logDEBUG1, ("Set ROI: [%d, %d]\n", arg.xmin, arg.xmax));
|
||||
|
||||
#ifndef GOTTHARDD
|
||||
functionNotImplemented();
|
||||
#else
|
||||
// set & get
|
||||
if ((narg == GET_READOUT_FLAGS) || (Server_VerifyLock() == OK)) {
|
||||
if (myDetectorType == GOTTHARD && narg > 1) {
|
||||
ret = FAIL;
|
||||
strcpy(mess,"Can not set more than one ROI per module.\n");
|
||||
FILE_LOG(logERROR,(mess));
|
||||
} else {
|
||||
retval = setROI(narg, arg, &nretval, &ret);
|
||||
if (ret == FAIL) {
|
||||
if (nretval == -1) // chip test board
|
||||
sprintf(mess,"Could not set ROI. Max ROI level (100) reached!\n");
|
||||
else if (nretval == -2)
|
||||
sprintf(mess, "Could not set ROI. Could not allocate RAM\n");
|
||||
else
|
||||
sprintf(mess,"Could not set all roi. "
|
||||
"Set %d rois, but read %d rois\n", narg, nretval);
|
||||
FILE_LOG(logERROR,(mess));
|
||||
}
|
||||
FILE_LOG(logDEBUG1, ("nRois: %d\n", nretval));
|
||||
}
|
||||
// only set
|
||||
if (Server_VerifyLock() == OK) {
|
||||
ret = setROI(arg);
|
||||
if (ret == FAIL) {
|
||||
sprintf(mess, "Could not set ROI. Invalid xmin or xmax\n");
|
||||
FILE_LOG(logERROR,(mess));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
|
||||
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
int get_roi(int file_des) {
|
||||
ret = OK;
|
||||
memset(mess, 0, sizeof(mess));
|
||||
ROI retval;
|
||||
|
||||
#ifndef GOTTHARDD
|
||||
functionNotImplemented();
|
||||
#else
|
||||
// only get
|
||||
retval = getROI();
|
||||
FILE_LOG(logDEBUG1, ("nRois: (%d, %d)\n", retval.xmin, retval.xmax));
|
||||
#endif
|
||||
|
||||
Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
|
||||
if (ret != FAIL) {
|
||||
//retvalsize could be swapped during sendData
|
||||
int nretval1 = nretval;
|
||||
sendData(file_des, &nretval1, sizeof(nretval1), INT32);
|
||||
int iloop = 0;
|
||||
for(iloop = 0; iloop < nretval; ++iloop) {
|
||||
sendData(file_des, &retval[iloop].xmin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].xmax, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].ymin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].ymax, sizeof(int), INT32);
|
||||
}
|
||||
sendData(file_des, &retval.xmin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval.xmax, sizeof(int), INT32);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -1973,7 +1948,6 @@ int set_roi(int file_des) {
|
||||
|
||||
|
||||
|
||||
|
||||
int set_speed(int file_des) {
|
||||
ret = OK;
|
||||
memset(mess, 0, sizeof(mess));
|
||||
@@ -2284,20 +2258,9 @@ int send_update(int file_des) {
|
||||
|
||||
// roi
|
||||
#if defined(GOTTHARDD)
|
||||
ROI* retval = NULL;
|
||||
ROI arg[1];
|
||||
int ret = OK, nretval = 0;
|
||||
retval = setROI(-1, arg, &nretval, &ret);
|
||||
//retvalsize could be swapped during sendData
|
||||
int nretval1 = nretval;
|
||||
sendData(file_des, &nretval1, sizeof(nretval1), INT32);
|
||||
int iloop = 0;
|
||||
for(iloop = 0; iloop < nretval; ++iloop) {
|
||||
sendData(file_des, &retval[iloop].xmin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].xmax, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].ymin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval[iloop].ymax, sizeof(int), INT32);
|
||||
}
|
||||
ROI retval = getROI();
|
||||
sendData(file_des, &retval.xmin, sizeof(int), INT32);
|
||||
sendData(file_des, &retval.xmax, sizeof(int), INT32);
|
||||
#endif
|
||||
|
||||
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
|
||||
|
||||
@@ -49,6 +49,7 @@ int get_time_left(int);
|
||||
int set_dynamic_range(int);
|
||||
int set_readout_flags(int);
|
||||
int set_roi(int);
|
||||
int get_roi(int);
|
||||
int set_speed(int);
|
||||
int exit_server(int);
|
||||
int lock_server(int);
|
||||
|
||||
Reference in New Issue
Block a user