From 61a939ef53c0dac88ad0f1ba674a66262b39af5c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 26 Apr 2019 16:53:23 +0200 Subject: [PATCH] ctb: removed setroi, instead using adcenablemask --- .../bin/ctbDetectorServer_developer | Bin 165616 -> 163660 bytes .../slsDetectorFunctionList.c | 163 ++++-------------- .../slsDetectorFunctionList.h | 6 +- .../slsDetectorServer_funcs.c | 82 +++++++-- .../slsDetectorServer_funcs.h | 2 + .../include/multiSlsDetector.h | 16 +- slsDetectorSoftware/include/slsDetector.h | 26 ++- slsDetectorSoftware/src/multiSlsDetector.cpp | 26 +++ slsDetectorSoftware/src/slsDetector.cpp | 148 ++++++++-------- .../src/slsDetectorCommand.cpp | 72 ++------ slsReceiverSoftware/include/GeneralData.h | 64 +++---- .../include/slsReceiverImplementation.h | 15 ++ .../include/slsReceiverTCPIPInterface.h | 3 + .../src/slsReceiverImplementation.cpp | 51 ++++-- .../src/slsReceiverTCPIPInterface.cpp | 34 ++++ slsSupportLib/include/sls_detector_defs.h | 2 + slsSupportLib/include/sls_detector_funcs.h | 6 + slsSupportLib/include/versionAPI.h | 2 +- 18 files changed, 385 insertions(+), 333 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 66a693c5907d7ceb225b24a587e7435aa3b1bf02..0f9c25ef483c1058e1ba23fb65fdd9356cda899a 100755 GIT binary patch delta 74197 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≀s_{cFwx9Z~qr zb#5?Dfg&ZQ@SkG7nPHYW=A-c5F56MK*dq^E;VcU8CkV`!i!Jn-zh|B?_cx+^cyG;& zbvD>yhkXt?;+PXERH+#lk)(k}nrKFW`>kZi(LpC&bkjpGnz-N3K;Dl*h8SjqQLZw^ zHLi1maS9YEF~u}9%reIUi#%YN71mg1i*0t;Wsm&69|s(A#4#sSs8Zw1(-shsq=817 zXr`46IXdX1i*9g8fQ_stg&(nnkZ|ctckLMWd+L$mK7{3SXQvCU|GGgdS&&>!}fn!(ehPB7>&Y5 z5lI?oq={w}d8EiAMIK$}2ICYcQer9!W8-4uV&h`tV&h`tV&h`X#hQyd>7v{Ik9+8) z58cJOiw7BEm=Q*~${5$sK&*jS1F;5T4fuZ|VSL`eG&9UH$2~p{&M;voPg(@}9qVRD*f`}vyG}1&fEwqv$M@JNHnzw0Qe$&iNGdIs?c1Gd1 z=ep>ohhF;VXMjP57-ob~t}@0ou5*KN3KS_Z#WXX_GRM6A|LuZ_MINxs3Tv#h!4})> zu*)9%9B{}H$DB~1N{urc6p$byNdt{E(M*^9zu8R>z4RHFqr-GR;}j@TVu~4NnPZ*> zrlauLIvZ@U%?`V0_?d>E9dO7I$5B}EcqMOvikTG)RXk9!V8w#f2%T0FG>}Bs)qqwy z=%Skzax{~nGYVgN{N;IC=A~s`_A){bee^S6|GykGF~o2b)^t?cW1mAbRMTm#N{w9( zIH3}Sr&e%k{HgJ$#-A#1y2t|a%rV1kRF^C=&jKZ;nT_&w$#oM2mRVtq85Wshjt6XU z$PwG@vdmu{VI!*hRX`K1bkjj+-j6PlG?Sx&Mq0>_Ad2cP7;v#bkrGo; zUA@QZjjgwQz47%{UT+=sohVY@OFx4QGs+m(8MltSiHkSzOIE?G!C8Z|R+LpRJB22) zI~uUUtmU)k%W5QBL?c<_vn#B#!4})BMRmCZ){`5=*xU@3%^gH_ZBbO$-lkyN5LVbW Xj}^2XdBDJSh1(5mSFqhHldE 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�}>A;9!TeXWT1r9vEBxx_b1w5kA68DIB~#<1CGbX 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 0) { - // clear roi - if (!n) { - FILE_LOG(logINFO, ("Clearing ROI\n")); - adcDisableMask = 0; - } - // set roi - else { - FILE_LOG(logINFO, ("Setting ROI:\n")); - adcDisableMask = 0xffffffff; - int iroi = 0; - // for every roi - for (iroi = 0; iroi < n; ++iroi) { - FILE_LOG(logINFO, ("\t%d: (%d, %d)\n", iroi, arg[iroi].xmin, arg[iroi].xmax)); - // swap if xmin > xmax - if (arg[iroi].xmin > arg[iroi].xmax) { - int temp = arg[iroi].xmin; - arg[iroi].xmin = arg[iroi].xmax; - arg[iroi].xmax = temp; - FILE_LOG(logINFORED, ("\tCorrected %d: (%d, %d)\n", iroi, arg[iroi].xmin, arg[iroi].xmax)); - } - int ich = 0; - // for the roi specified - for (ich = arg[iroi].xmin; ich <= arg[iroi].xmax; ++ich) { - // valid channel (disable) - if (ich >= 0 && ich < NCHAN_ANALOG) - adcDisableMask &= ~(1 << ich); + // get disable mask + mask ^= BIT_32_MSK; + bus_w(ADC_DISABLE_REG, mask); - FILE_LOG(logDEBUG1, ("%d: ich:%d adcDisableMask:0x%08x\n", - iroi, ich, adcDisableMask)); - } - } - } - FILE_LOG(logINFO, ("\tSetting adcDisableMask to 0x%08x\n", adcDisableMask)); - bus_w(addr, adcDisableMask); - } + // update databytes and allocate ram + return allocateRAM(); +} - // get roi - adcDisableMask = bus_r(addr); - FILE_LOG(logDEBUG1, ("Getting adcDisableMask: 0x%08x\n", adcDisableMask)); +uint32_t getADCEnableMask() { + uint32_t retval = bus_r(ADC_DISABLE_REG); - nROI = 0; - if (adcDisableMask) { - int ich = 0; - // loop through channels - for (ich = 0; ich < NCHAN_ANALOG; ++ich) { - // channel disabled - if ((~adcDisableMask) & (1 << ich)) { - // first channel - if (ich == 0) { - ++nROI; - rois[nROI - 1].xmin = ich; - rois[nROI - 1].xmax = ich; - rois[nROI - 1].ymin = -1; - rois[nROI - 1].ymax = -1; - } - // not first channel - else { - // previous channel enabled (so increase roi) - if ((adcDisableMask) & (1 << (ich - 1))) { - ++nROI; - // max roi level - if (nROI > MAX_ROIS) { - nROI = -1; - *ret = FAIL; - FILE_LOG(logERROR, ("Max ROI reached!\n")); - break; - } - rois[nROI - 1].xmin = ich; - rois[nROI - 1].ymin = -1; - rois[nROI - 1].ymax = -1; - } - // set max as current one each time - rois[nROI - 1].xmax = ich; - } - } - } - } - - // print - if (!nROI) { - 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, %d)\n", i, rois[i].xmin, rois[i].xmax)); - - } - } - - // validate and update databytes - if (n >= 0) { - // validate - 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")); - } - // update databytes (now that mask is up to date from fpga) and allocate ram - if (allocateRAM() == FAIL) { - *ret = FAIL; - nROI = -2; - } - } - - *retvalsize = nROI; - return rois; + // get enable mask + retval ^= BIT_32_MSK; + adcEnableMask = retval; + return retval; } @@ -2369,8 +2266,8 @@ void readSample(int ns) { int ich = 0; for (ich = 0; ich < NCHAN_ANALOG; ++ich) { - // if channel is in ROI - if ((1 << ich) & ~(adcDisableMask)) { + // if channel is in enable mask + if ((1 << ich) & (adcEnableMask)) { // unselect channel bus_w(addr, bus_r(addr) & ~(DUMMY_FIFO_CHNNL_SLCT_MSK)); diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index 8e870019b..1cbf5d67e 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -110,9 +110,13 @@ void resetPeripheral(); // parameters - dr, roi int setDynamicRange(int dr); -#if defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef GOTTHARDD ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret); #endif +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +int setADCEnableMask(uint32_t mask); +uint32_t getADCEnableMask(); +#endif // parameters - readout #if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(JUNGFRAUD) diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 2a6599a70..8fea08fa6 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -235,6 +235,8 @@ const char* getFunctionName(enum detFuncs func) { case F_DIGITAL_IO_DELAY: return "F_DIGITAL_IO_DELAY"; case F_COPY_DET_SERVER: return "F_COPY_DET_SERVER"; case F_REBOOT_CONTROLLER: return "F_REBOOT_CONTROLLER"; + case F_SET_ADC_ENABLE_MASK: return "F_SET_ADC_ENABLE_MASK"; + case F_GET_ADC_ENABLE_MASK: return "F_GET_ADC_ENABLE_MASK"; default: return "Unknown Function"; } @@ -312,6 +314,8 @@ void function_table() { flist[F_DIGITAL_IO_DELAY] = &digital_io_delay; flist[F_COPY_DET_SERVER] = ©_detector_server; flist[F_REBOOT_CONTROLLER] = &reboot_controller; + flist[F_SET_ADC_ENABLE_MASK] = &set_adc_enable_mask; + flist[F_GET_ADC_ENABLE_MASK] = &get_adc_enable_mask; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -1890,7 +1894,7 @@ int set_roi(int file_des) { } } -#if defined(JUNGFRAUD) || defined(EIGERD) +#ifndef GOTTHARDD functionNotImplemented(); #else // set & get @@ -2236,13 +2240,8 @@ int send_update(int file_des) { if (n < 0) return printSocketReadError(); #endif - // #samples, roi -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(GOTTHARDD) - i64 = setTimer(SAMPLES,GET_FLAG); - n = sendData(file_des,&i64,sizeof(i64),INT64); - if (n < 0) return printSocketReadError(); - // roi +#if defined(GOTTHARDD) ROI* retval = NULL; ROI arg[1]; int ret = OK, nretval = 0; @@ -2257,15 +2256,24 @@ int send_update(int file_des) { sendData(file_des, &retval[iloop].ymin, sizeof(int), INT32); sendData(file_des, &retval[iloop].ymax, sizeof(int), INT32); } +#endif + + // #samples, adcmask +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + i64 = setTimer(SAMPLES,GET_FLAG); + n = sendData(file_des,&i64,sizeof(i64),INT64); + if (n < 0) return printSocketReadError(); - + i32 = getADCEnableMask(); + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); #endif - if (lockStatus == 0) { - strcpy(lastClientIP,thisClientIP); - } + if (lockStatus == 0) { + strcpy(lastClientIP, thisClientIP); + } - return ret; + return ret; } @@ -3837,3 +3845,53 @@ int reboot_controller(int file_des) { return REBOOT; #endif } + + +int set_adc_enable_mask(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logDEBUG1, ("Seting ADC Enable Mask to %u\n", arg)); + +#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + ret = setADCEnableMask(arg); + if (ret == FAIL) { + sprintf(mess, "Could not set ADC Enable mask to 0x%x. Could not allocate ram\n", arg); + FILE_LOG(logERROR,(mess)); + } else { + uint32_t retval = getADCEnableMask(); + if (arg != retval) { + ret = FAIL; + sprintf(mess, "Could not set ADC Enable mask. Set 0x%x, but read 0x%x\n", arg, retval); + FILE_LOG(logERROR,(mess)); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + + +int get_adc_enable_mask(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t retval = -1; + + FILE_LOG(logDEBUG1, ("Getting ADC Enable Mask \n")); + +#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) + functionNotImplemented(); +#else + // get + retval = getADCEnableMask(); + FILE_LOG(logDEBUG1, ("ADC Enable Mask retval: %u\n", retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h index 840482d6b..25f55902b 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h @@ -97,4 +97,6 @@ int led(int); int digital_io_delay(int); int copy_detector_server(int); int reboot_controller(int); +int set_adc_enable_mask(int); +int get_adc_enable_mask(int); diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index d3be1f547..adb10688b 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -172,7 +172,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { /** * Decodes which detector and the corresponding channel numbers for it - * Mainly useful in a multi detector setROI (Gotthard, Mythen?) + * Mainly useful in a multi detector setROI (Gotthard) * @param offsetX channel number or total channel offset in x direction * @param offsetY channel number or total channel offset in y direction * @param channelX channel number from detector offset in x direction @@ -1291,6 +1291,20 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ const ROI *getROI(int &n, int detPos = -1); + /** + * Set ADC Enable Mask (CTB, Moench) + * @param mask ADC Enable mask + * @param detPos -1 for all detectors in list or specific detector position + */ + void setADCEnableMask(uint32_t mask, int detPos = -1); + + /** + * Get ADC Enable Mask (CTB, Moench) + * @param detPos -1 for all detectors in list or specific detector position + * @returns ADC Enable mask + */ + uint32_t getADCEnableMask(int detPos = -1); + /** * Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert * users diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 7326ad4d2..b8a13607c 100755 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -16,7 +16,7 @@ class multiSlsDetector; class ServerInterface; class MySocketTCP; -#define SLS_SHMVERSION 0x190412 +#define SLS_SHMVERSION 0x190426 #define NCHIPSMAX 10 #define NCHANSMAX 65536 #define NDACSMAX 16 @@ -97,7 +97,10 @@ struct sharedSlsDetector { /** list of rois */ slsDetectorDefs::ROI roiLimits[MAX_ROIS]; - /** readout flags */ + /** adc enable mask */ + uint32_t adcEnableMask; + + /** readout flags */ slsDetectorDefs::readOutFlags roFlags; /** detector settings (standard, fast, etc.) */ @@ -239,6 +242,7 @@ struct sharedSlsDetector { /** overwriteenable */ bool rxFileOverWrite; + }; class slsDetector : public virtual slsDetectorDefs{ @@ -1118,12 +1122,6 @@ class slsDetector : public virtual slsDetectorDefs{ */ int setCounterBit(int cb = -1); - /** - * send ROI to processor (moench only) - * @returns OK or FAIL - */ - int sendROIToProcessor(); - /** * Set ROI (Gotthard) * At the moment only one set allowed @@ -1155,6 +1153,18 @@ class slsDetector : public virtual slsDetectorDefs{ */ int sendROI(int n = -1, ROI roiLimits[] = nullptr); + /** + * Set ADC Enable Mask (CTB, Moench) + * @param mask ADC Enable mask + */ + void setADCEnableMask(uint32_t mask); + + /** + * Get ADC Enable Mask (CTB, Moench) + * @returns ADC Enable mask + */ + uint32_t getADCEnableMask(); + /** * Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert users * @param addr address of adc register diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index ca6d6d2f6..503a848df 100755 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -2448,6 +2448,32 @@ const slsDetectorDefs::ROI *multiSlsDetector::getROI(int &n, int detPos) { return retval; } +void multiSlsDetector::setADCEnableMask(uint32_t mask, int detPos) { + // single + if (detPos >= 0) { + detectors[detPos]->setADCEnableMask(mask); + } + + // multi + parallelCall(&slsDetector::setADCEnableMask, mask); +} + +uint32_t multiSlsDetector::getADCEnableMask(int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->getADCEnableMask(); + } + + // multi + auto r = parallelCall(&slsDetector::getADCEnableMask); + if (sls::allEqual(r)) { + return r.front(); + } + + // can't have different values + throw RuntimeError("Error: Different Values for function getADCEnableMask"); +} + int multiSlsDetector::writeAdcRegister(uint32_t addr, uint32_t val, int detPos) { // single if (detPos >= 0) { diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 129c3d5fe..6ccf6077f 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -231,6 +231,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) { } detector_shm()->nROI = 0; memset(detector_shm()->roiLimits, 0, MAX_ROIS * sizeof(ROI)); + detector_shm()->adcEnableMask = BIT32_MASK; detector_shm()->roFlags = NORMAL_READOUT; detector_shm()->currentSettings = UNINITIALIZED; detector_shm()->currentThresholdEV = -1; @@ -346,7 +347,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) { detector_shm()->gappixels * detector_shm()->nGappixels[Y]) * detector_shm()->dynamicRange / 8; - // update #nchans and databytes, as it depends on #samples, roi, + // update #nchans and databytes, as it depends on #samples, adcmask, // readoutflags (ctb only) if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { @@ -526,28 +527,29 @@ void slsDetector::updateTotalNumberOfChannels() { if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { - // default number of channels - detector_shm()->nChan[X] = 32; - - // if roi, recalculate #nchanX - if (detector_shm()->nROI > 0) { - detector_shm()->nChan[X] = 0; - for (int iroi = 0; iroi < detector_shm()->nROI; ++iroi) { - detector_shm()->nChan[X] += - (detector_shm()->roiLimits[iroi].xmax - - detector_shm()->roiLimits[iroi].xmin + 1); + int nchans = 0; + // calculate analog channels + uint32_t mask = detector_shm()->adcEnableMask; + if (mask == BIT32_MASK) { + nchans = 32; + } else { + nchans = 0; + for (int ich = 0; ich < 32; ++ich) { + if (mask & (1 << ich)) + ++nchans; } } - // add digital signals depending on readout flags + // calcualte digital channels if (detector_shm()->myDetectorType == CHIPTESTBOARD && (((detector_shm()->roFlags & DIGITAL_ONLY) != 0) || ((detector_shm()->roFlags & ANALOG_AND_DIGITAL) != 0))) { - detector_shm()->nChan[X] += 4; + nchans += 4; } + detector_shm()->nChan[X] = nchans; // recalculate derived parameters chans and databytes - detector_shm()->nChans = detector_shm()->nChan[X]; + detector_shm()->nChans = nchans; detector_shm()->dataBytes = detector_shm()->nChans * detector_shm()->nChips * (detector_shm()->dynamicRange / 8) * @@ -830,19 +832,8 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) { detector_shm()->roFlags = static_cast(i32); } - // samples - if (detector_shm()->myDetectorType == CHIPTESTBOARD || - detector_shm()->myDetectorType == MOENCH) { - n += client.receiveData(&i64, sizeof(i64)); - if (i64 >= 0) { - detector_shm()->timerValue[SAMPLES] = i64; - } - } - // roi - if (detector_shm()->myDetectorType == CHIPTESTBOARD || - detector_shm()->myDetectorType == MOENCH || - detector_shm()->myDetectorType == GOTTHARD) { + if (detector_shm()->myDetectorType == GOTTHARD) { n += client.receiveData(&i32, sizeof(i32)); detector_shm()->nROI = i32; for (int i = 0; i < detector_shm()->nROI; ++i) { @@ -855,13 +846,25 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) { n += client.receiveData(&i32, sizeof(i32)); detector_shm()->roiLimits[i].xmax = i32; } - // moench (send to processor) - if (detector_shm()->myDetectorType == MOENCH) { - sendROIToProcessor(); - } } - // update #nchans and databytes, as it depends on #samples, roi, + if (detector_shm()->myDetectorType == CHIPTESTBOARD || + detector_shm()->myDetectorType == MOENCH) { + // samples + n += client.receiveData(&i64, sizeof(i64)); + if (i64 >= 0) { + detector_shm()->timerValue[SAMPLES] = i64; + } + + // adcmask + uint32_t u32 = 0; + n += client.receiveData(&u32, sizeof(u32)); + detector_shm()->adcEnableMask = u32; + if (detector_shm()->myDetectorType == MOENCH) + setAdditionalJsonParameter("adcmask", std::to_string(u32)); + } + + // update #nchans and databytes, as it depends on #samples, adcmask, // readoutflags (ctb only) if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { @@ -1510,8 +1513,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { ret = sendToDetector(F_SET_TIMER, args, retval); FILE_LOG(logDEBUG1) << getTimerType(index) << ": " << retval; detector_shm()->timerValue[index] = retval; - // update #nchans and databytes, as it depends on #samples, roi, - // readoutflags (ctb only) + // update #nchans and databytes, as it depends on #samples, adcmask, + // readoutflags if (index == SAMPLES && (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH)) { @@ -1805,7 +1808,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { ret = sendToDetector(F_SET_READOUT_FLAGS, arg, retval); FILE_LOG(logDEBUG1) << "Readout flag: " << retval; detector_shm()->roFlags = retval; - // update #nchans and databytes, as it depends on #samples, roi, + // update #nchans and databytes, as it depends on #samples, adcmask, // readoutflags (ctb only) if (detector_shm()->myDetectorType == CHIPTESTBOARD) { updateTotalNumberOfChannels(); @@ -2063,11 +2066,13 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { setAdditionalJsonHeader(detector_shm()->rxAdditionalJsonHeader); enableDataStreamingFromReceiver( static_cast(enableDataStreamingFromReceiver(-1))); - if (detector_shm()->myDetectorType == GOTTHARD || - detector_shm()->myDetectorType == CHIPTESTBOARD || - detector_shm()->myDetectorType == MOENCH) { + if (detector_shm()->myDetectorType == GOTTHARD) { sendROI(-1, nullptr); } + if (detector_shm()->myDetectorType == CHIPTESTBOARD || + detector_shm()->myDetectorType == MOENCH) { + setADCEnableMask(detector_shm()->adcEnableMask); + } } } return std::string(detector_shm()->receiver_hostname); @@ -2654,49 +2659,16 @@ int slsDetector::setCounterBit(int cb) { return retval; } -int slsDetector::sendROIToProcessor() { - std::ostringstream os; - os << "[" << detector_shm()->roiLimits[0].xmin << ", " - << detector_shm()->roiLimits[0].xmax << ", " - << detector_shm()->roiLimits[0].ymin << ", " - << detector_shm()->roiLimits[0].ymax << "]"; - std::string sroi = os.str(); - std::string result = setAdditionalJsonParameter("roi", sroi); - if (result == sroi) - return OK; - return FAIL; -} - int slsDetector::setROI(int n, ROI roiLimits[]) { std::sort(roiLimits, roiLimits + n, [](ROI a, ROI b) { return a.xmin < b.xmin; }); - int ret = sendROI(n, roiLimits); - if (detector_shm()->myDetectorType == MOENCH) { - sendROIToProcessor(); - } - // update #nchans and databytes, as it depends on #samples, roi, - if (detector_shm()->myDetectorType == CHIPTESTBOARD || - detector_shm()->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); - } return ret; } const slsDetectorDefs::ROI *slsDetector::getROI(int &n) { sendROI(-1, nullptr); n = detector_shm()->nROI; - // moench - get json header(due to different clients, diff shm) (get roi is - // from detector: updated anyway) - if (detector_shm()->myDetectorType == MOENCH) { - getAdditionalJsonHeader(); - } - // update #nchans and databytes, as it depends on #samples, roi, - // readoutflags (ctb only) - if (detector_shm()->myDetectorType == CHIPTESTBOARD || - detector_shm()->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); - } return detector_shm()->roiLimits; } @@ -2806,6 +2778,42 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) { return ret; } +void slsDetector::setADCEnableMask(uint32_t mask) { + uint32_t arg = mask; + FILE_LOG(logDEBUG1) << "Setting ADC Enable mask to 0x" << std::hex << arg << std::dec; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + sendToDetector(F_SET_ADC_ENABLE_MASK, &arg, sizeof(arg), nullptr, 0); + detector_shm()->adcEnableMask = mask; + + // update #nchans and databytes, as it depends on #samples, adcmask, readoutflags + updateTotalNumberOfChannels(); + + // send to processor + if (detector_shm()->myDetectorType == MOENCH) + setAdditionalJsonParameter("adcmask", std::to_string(detector_shm()->adcEnableMask)); + + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + int fnum = F_RECEIVER_SET_ADC_MASK; + int retval = -1; + mask = detector_shm()->adcEnableMask; + FILE_LOG(logDEBUG1) + << "Setting ADC Enable mask to 0x" << std:: hex << mask << std::dec << " in receiver"; + sendToReceiver(fnum, &mask, sizeof(mask), &retval, sizeof(retval)); + } + } +} + +uint32_t slsDetector::getADCEnableMask() { + uint32_t retval = -1; + FILE_LOG(logDEBUG1) << "Getting ADC Enable mask"; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + sendToDetector(F_GET_ADC_ENABLE_MASK, nullptr, 0, &retval, sizeof(retval)); + detector_shm()->adcEnableMask = retval; + FILE_LOG(logDEBUG1) << "ADC Enable Mask: 0x" << std::hex << retval << std::dec; + } + return detector_shm()->adcEnableMask; +} + int slsDetector::writeAdcRegister(uint32_t addr, uint32_t val) { int fnum = F_WRITE_ADC_REG; int ret = FAIL; diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp index 33624588e..230e3b2fb 100755 --- a/slsDetectorSoftware/src/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp @@ -5554,74 +5554,22 @@ std::string slsDetectorCommand::cmdPattern(int narg, char *args[], int action, i os << std::hex << myDet->readRegister(123, detPos) << std::dec ; //0x7b } else if (cmd == "adcdisable") { - int nroi = 0; - ROI roiLimits[MAX_ROIS]; - if (action == PUT_ACTION) { - - if (sscanf(args[1], "%x", &addr)) + uint32_t adcEnableMask = 0; + if (sscanf(args[1], "%x", &adcEnableMask)) ; else return std::string("Could not scan adcdisable reg ") + std::string(args[1]); - - /******USE ROI?!?!?!?*********/ - // roiLimits[i].xmin;roiLimits[i].xmax;roiLimits[i].ymin;roiLimits[i].ymin;roiLimits[i].ymax - //int mask=1; - int ii = 0; - while (ii < 32) { - ++nroi; - roiLimits[nroi - 1].xmin = ii; - roiLimits[nroi - 1].ymin = 0; - roiLimits[nroi - 1].ymax = 0; - while ((addr & (1 << ii))) { - ++ii; - if (ii >= 32) - break; - } - if (ii >= 32) { - break; - std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl; - roiLimits[nroi - 1].xmax = 31; - break; - } - roiLimits[nroi - 1].xmin = ii; - while ((addr & (1 << ii)) == 0) { - ++ii; - if (ii >= 32) - break; - } - roiLimits[nroi - 1].xmax = ii - 1; - if (ii >= 32) { - std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl; - ++nroi; - break; - } - std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl; - } - std::cout << "********ROI " << nroi << std::endl; - myDet->setROI(nroi - 1, roiLimits, detPos); - // myDet->writeRegister(94,addr, detPos); - // myDet->writeRegister(120,addr, detPos); + + // get enable mask from enable mask + adcEnableMask ^= 0xFFFFFFFF; + myDet->setADCEnableMask(adcEnableMask, detPos); } - const ROI *aa = myDet->getROI(nroi, detPos); - - int reg = 0xffffffff; - if (nroi < 1) - reg = 0; - else { - for (int iroi = 0; iroi < nroi; ++iroi) { - std::cout << iroi << " xmin " << (aa + iroi)->xmin << " xmax " << (aa + iroi)->xmax << std::endl; - for (int ich = (aa + iroi)->xmin; ich <= (aa + iroi)->xmax; ++ich) { - reg &= ~(1 << ich); - } - } - } - os << std::hex << reg << std::dec ; - if (aa != NULL) - delete [] aa; - //os <<" "<< std::hex << myDet->readRegister(120, detPos) << std::dec ; - + uint32_t retval = myDet->getADCEnableMask(detPos); + // get disable mask + retval ^= 0xFFFFFFFF; + os << std::hex << retval << std::dec; } else diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index bafb9928c..5d184cd0a 100755 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -212,12 +212,12 @@ public: /** * Set databytes (ctb, moench) - * @param f readout flags - * @param r roi + * @param a adc enable mask * @param s number of samples * @param t tengiga enable + * @param f readout flags */ - virtual void setImageSize(std::vector r, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + virtual void setImageSize(uint32_t a, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { cprintf(RED,"setImageSize is a generic function that should be overloaded by a derived class\n"); }; @@ -584,26 +584,26 @@ public: headerWriteEnable = false; }; - /** - * Set databytes (ctb, moench) + /** + * Set databytes (ctb, moench) + * @param a adc enable mask + * @param s number of samples + * @param t tengiga enable * @param f readout flags - * @param r roi - * @param s number of samples - * @param t tengiga enable - */ - void setImageSize(std::vector r, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + */ + void setImageSize(uint32_t a, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { int nchans = 0; if (f != slsDetectorDefs::GET_READOUT_FLAGS) { // analog channels if (f == slsDetectorDefs::NORMAL_READOUT || f & slsDetectorDefs::ANALOG_AND_DIGITAL) { - nchans += NCHAN_ANALOG; - // if roi - if (r.size()) { - nchans = 0; - for (auto &roi : r) { - nchans += (roi.xmax - roi.xmin + 1); - } - } + if (a == BIT32_MASK) { + nchans = 32; + } else { + for (int ich = 0; ich < 32; ++ich) { + if (a & (1 << ich)) + ++nchans; + } + } } // digital channels if (f & slsDetectorDefs::DIGITAL_ONLY || f & slsDetectorDefs::ANALOG_AND_DIGITAL) { @@ -686,22 +686,22 @@ public: } - /** - * Set databytes (ctb, moench) + /** + * Set databytes (ctb, moench) + * @param a adc enable mask + * @param s number of samples + * @param t tengiga enable * @param f readout flags - * @param r roi - * @param s number of samples - * @param t tengiga enable - */ - void setImageSize(std::vector r, int s, bool t, - slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + */ + void setImageSize(uint32_t a, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { int nchans = 32; - // if roi - if (r.size()) { - nchans = 0; - for (auto &roi : r) { - nchans += abs(roi.xmax - roi.xmin) + 1; - } + if (a == BIT32_MASK) { + nchans = 32; + } else { + for (int ich = 0; ich < 32; ++ich) { + if (a & (1 << ich)) + ++nchans; + } } nPixelsX = nchans; diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h index 9eb8740ec..8b4c012b1 100755 --- a/slsReceiverSoftware/include/slsReceiverImplementation.h +++ b/slsReceiverSoftware/include/slsReceiverImplementation.h @@ -194,6 +194,12 @@ class slsReceiverImplementation: private virtual slsDetectorDefs { */ std::vector getROI() const; + /** + * Get ADC Enable Mask + * @return ADC Enable Mask + */ + uint32_t getADCEnableMask() const; + /** * Get the streaming frequency * @return 0 for timer, n for nth frame frequency @@ -474,6 +480,13 @@ class slsReceiverImplementation: private virtual slsDetectorDefs { */ int setROI(const std::vector new_roi); + /** + * Set ADC Enable Mask + * @param mask ADC Enable Mask + * @return OK or FAIL + */ + int setADCEnableMask(const uint32_t mask); + /** * Set the streaming frequency * @param freq 0 for timer, n for nth frame frequency @@ -855,6 +868,8 @@ private: //***acquisition parameters*** /* ROI */ std::vector roi; + /** ADC Enable Mask */ + uint32_t adcEnableMask; /** streaming frequency */ uint32_t streamingFrequency; /** Streaming timer when frequency is 0 */ diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index 6e87e6c27..f7e425d02 100755 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -282,6 +282,9 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { /** set readout flags */ int set_readout_flags(); + /** set adc mask */ + int set_adc_mask(); + /** detector type */ detectorType myDetectorType; diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index 0f9ed8ccd..efd67777c 100755 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -100,6 +100,7 @@ void slsReceiverImplementation::InitializeMembers() { //***acquisition parameters*** roi.clear(); + adcEnableMask = BIT32_MASK; streamingFrequency = 0; streamingTimerInMs = DEFAULT_STREAMING_TIMER_IN_MS; dataStreamEnable = false; @@ -289,6 +290,11 @@ std::vector slsReceiverImplementation::getROI() const{ return roi; } +uint32_t slsReceiverImplementation::getADCEnableMask() const{ + FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; + return adcEnableMask; +} + uint32_t slsReceiverImplementation::getStreamingFrequency() const{ FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; return streamingFrequency; @@ -463,7 +469,7 @@ int slsReceiverImplementation::setReadOutFlags(const readOutFlags f) { // side effects if (myDetectorType == CHIPTESTBOARD) { - generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); + generalData->setImageSize(adcEnableMask, numberOfSamples, tengigaEnable, readoutFlags); for (const auto& it : dataProcessor) it->SetPixelDimension(); if (SetupFifoStructure() == FAIL) @@ -749,7 +755,7 @@ int slsReceiverImplementation::setUDPSocketBufferSize(const int64_t s) { /***acquisition parameters***/ int slsReceiverImplementation::setROI(const std::vector new_roi) { bool change = false; - if (roi.size() != new_roi.size()) + if (roi.size() != new_roi.size()) change = true; else { for (size_t i = 0; i != new_roi.size(); ++i) { @@ -770,13 +776,6 @@ int slsReceiverImplementation::setROI(const std::vector ne generalData->SetROI(new_roi); framesPerFile = generalData->maxFramesPerFile; break; - case MOENCH: - generalData->setImageSize(roi, numberOfSamples, tengigaEnable); - break; - case CHIPTESTBOARD: - generalData->setImageSize(roi, numberOfSamples, tengigaEnable, - readoutFlags); - break; default: break; } @@ -806,6 +805,32 @@ int slsReceiverImplementation::setROI(const std::vector ne return OK; } +int slsReceiverImplementation::setADCEnableMask(uint32_t mask) { + if (adcEnableMask != mask) { + adcEnableMask = mask; + + switch (myDetectorType) { + case MOENCH: + generalData->setImageSize(mask, numberOfSamples, tengigaEnable); + break; + case CHIPTESTBOARD: + generalData->setImageSize(mask, numberOfSamples, tengigaEnable, readoutFlags); + break; + default: + break; + } + + for (const auto& it : dataProcessor) + it->SetPixelDimension(); + if (SetupFifoStructure() == FAIL) + return FAIL; + } + + FILE_LOG(logINFO) << "ADC Enable Mask: 0x" << std::hex << adcEnableMask << std::dec; + FILE_LOG (logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); + return OK; +} + int slsReceiverImplementation::setStreamingFrequency(const uint32_t freq) { if (streamingFrequency != freq) { @@ -921,9 +946,9 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) { numberOfSamples = i; if(myDetectorType == MOENCH) { - generalData->setImageSize(roi, numberOfSamples, tengigaEnable); + generalData->setImageSize(adcEnableMask, numberOfSamples, tengigaEnable); } else if(myDetectorType == CHIPTESTBOARD) { - generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); + generalData->setImageSize(adcEnableMask, numberOfSamples, tengigaEnable, readoutFlags); } for (const auto& it : dataProcessor) it->SetPixelDimension(); @@ -962,10 +987,10 @@ int slsReceiverImplementation::setTenGigaEnable(const bool b) { generalData->SetTenGigaEnable(b,dynamicRange); break; case MOENCH: - generalData->setImageSize(roi, numberOfSamples, tengigaEnable); + generalData->setImageSize(adcEnableMask, numberOfSamples, tengigaEnable); break; case CHIPTESTBOARD: - generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); + generalData->setImageSize(adcEnableMask, numberOfSamples, tengigaEnable, readoutFlags); break; default: break; diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index d025ce737..a7c9c2059 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -227,6 +227,7 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_RECEIVER_PADDING_ENABLE] = &slsReceiverTCPIPInterface::set_padding_enable; flist[F_RECEIVER_DEACTIVATED_PADDING_ENABLE] = &slsReceiverTCPIPInterface::set_deactivated_receiver_padding_enable; flist[F_RECEIVER_SET_READOUT_FLAGS] = &slsReceiverTCPIPInterface::set_readout_flags; + flist[F_RECEIVER_SET_ADC_MASK] = &slsReceiverTCPIPInterface::set_adc_mask; for (int i = NUM_DET_FUNCTIONS + 1; i < NUM_REC_FUNCTIONS ; i++) { FILE_LOG(logDEBUG1) << "function fnum: " << i << " (" << @@ -2034,3 +2035,36 @@ int slsReceiverTCPIPInterface::set_readout_flags() { } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); } + + + +int slsReceiverTCPIPInterface::set_adc_mask() { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = -1; + uint32_t retval = -1; + + // get args, return if socket crashed, ret is fail if receiver is not null + if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg), true, receiver) == FAIL) + return FAIL; + + // base object not null + else if (ret == OK) { + // set + // verify if receiver is unlocked and idle + if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { + FILE_LOG(logDEBUG1) << "Setting ADC enable mask: " << arg; + receiver->setADCEnableMask(arg); + } + + // get + retval = receiver->getADCEnableMask(); + if (ret == OK && retval != arg) { + ret = FAIL; + sprintf(mess, "Could not ADC enable mask. Set 0x%x, but read 0x%x\n", arg, retval); + FILE_LOG(logERROR) << mess; + } + FILE_LOG(logDEBUG1) << "ADC enable mask retval: " << retval; + } + return interface->Server_SendResult(false, ret, &retval, sizeof(retval), mess); +} \ No newline at end of file diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index e98796e60..61d64ac66 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -23,6 +23,8 @@ #endif #include "ansi.h" +#define BIT32_MASK 0xFFFFFFFF + /** default ports */ #define DEFAULT_PORTNO 1952 #define DEFAULT_UDP_PORTNO 50001 diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index 95ed11727..b5820c268 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -81,6 +81,8 @@ enum detFuncs{ F_DIGITAL_IO_DELAY, /** < digital IO delay */ F_COPY_DET_SERVER, /** < copy detector server & respawn */ F_REBOOT_CONTROLLER, /** < reboot detector controller (blackfin/ powerpc) */ + F_SET_ADC_ENABLE_MASK, /** < setting ADC enable mask */ + F_GET_ADC_ENABLE_MASK, /** < setting ADC enable mask */ NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 128, /**< detector function should not exceed this (detector server should not compile anyway) */ @@ -133,6 +135,7 @@ enum detFuncs{ F_RECEIVER_PADDING_ENABLE, /** < partial frames padding enable */ F_RECEIVER_DEACTIVATED_PADDING_ENABLE, /** < deactivated receiver padding enable */ F_RECEIVER_SET_READOUT_FLAGS, /**< set/get receiver readout flags */ + F_RECEIVER_SET_ADC_MASK, /**< set adc mask */ NUM_REC_FUNCTIONS }; @@ -210,6 +213,8 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_DIGITAL_IO_DELAY: return "F_DIGITAL_IO_DELAY"; case F_COPY_DET_SERVER: return "F_COPY_DET_SERVER"; case F_REBOOT_CONTROLLER: return "F_REBOOT_CONTROLLER"; + case F_SET_ADC_ENABLE_MASK: return "F_SET_ADC_ENABLE_MASK"; + case F_GET_ADC_ENABLE_MASK: return "F_GET_ADC_ENABLE_MASK"; case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START"; @@ -263,6 +268,7 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_RECEIVER_PADDING_ENABLE: return "F_RECEIVER_PADDING_ENABLE"; case F_RECEIVER_DEACTIVATED_PADDING_ENABLE: return "F_RECEIVER_DEACTIVATED_PADDING_ENABLE"; case F_RECEIVER_SET_READOUT_FLAGS: return "F_RECEIVER_SET_READOUT_FLAGS"; + case F_RECEIVER_SET_ADC_MASK: return "F_RECEIVER_SET_ADC_MASK"; case NUM_REC_FUNCTIONS: return "NUM_REC_FUNCTIONS"; default: return "Unknown Function"; } diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 4057ba425..460a69960 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,4 +7,4 @@ #define APIRECEIVER 0x190405 #define APIGUI 0x190405 #define APIEIGER 0x190418 -#define APICTB 0x190423 +#define APICTB 0x190426