From abc7a9bd2fafa59c953ccbc2a8d9282f570267c8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 6 Mar 2019 14:52:21 +0100 Subject: [PATCH] moench has only analog readout --- .../slsDetectorFunctionList.c | 58 +----------- .../slsDetectorFunctionList.h | 2 +- .../slsDetectorServer_funcs.c | 7 +- .../slsDetector/slsDetector.cpp | 60 ++++++++----- slsReceiverSoftware/include/GeneralData.h | 89 +++++++++++-------- .../src/slsReceiverImplementation.cpp | 41 +++++---- .../src/slsReceiverTCPIPInterface.cpp | 2 +- 7 files changed, 124 insertions(+), 135 deletions(-) diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 41f89ff6c..49af365cb 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -530,7 +530,9 @@ void setupDetector() { setTimer(FRAME_PERIOD, DEFAULT_PERIOD); setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY); setTiming(DEFAULT_TIMING_MODE); - setReadOutFlags(NORMAL_READOUT); + + // ensuring normal readout (only option for moench) + bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK)); // clear roi { @@ -819,60 +821,6 @@ int getSpeed(enum speedVariable ind) { } } -enum readOutFlags setReadOutFlags(enum readOutFlags val) { - enum readOutFlags retval = GET_READOUT_FLAGS; - uint32_t addr = CONFIG_REG; - - // set - if (val != GET_READOUT_FLAGS) { - switch(val) { - case NORMAL_READOUT: - FILE_LOG(logINFO, ("Setting Normal Readout\n")); - bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK)); - break; - case DIGITAL_ONLY: - FILE_LOG(logINFO, ("Setting Digital Only Readout\n")); - bus_w(addr, bus_r(addr) | CONFIG_DSBL_ANLG_OTPT_MSK | CONFIG_ENBLE_DGTL_OTPT_MSK); - break; - case ANALOG_AND_DIGITAL: - FILE_LOG(logINFO, ("Setting Analog & Digital Readout\n")); - bus_w(addr, (bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK)) | CONFIG_ENBLE_DGTL_OTPT_MSK); - break; - default: - FILE_LOG(logERROR, ("Cannot set unknown readout flag. 0x%x\n", val)); - return retval; - } - } - // get - uint32_t regval = bus_r(addr); - FILE_LOG(logDEBUG1, ("Config Reg: 0x%08x\n", regval)); - // this bit reads analog disable, so inverse - analogEnable = (((regval & CONFIG_DSBL_ANLG_OTPT_MSK) >> CONFIG_DSBL_ANLG_OTPT_OFST) ? 0 : 1); - digitalEnable = ((regval & CONFIG_ENBLE_DGTL_OTPT_MSK) >> CONFIG_ENBLE_DGTL_OTPT_OFST); - - if (analogEnable && digitalEnable) { - FILE_LOG(logDEBUG1, ("Getting readout: Analog & Digital\n")); - retval = ANALOG_AND_DIGITAL; - } else if (analogEnable && !digitalEnable) { - FILE_LOG(logDEBUG1, ("Getting readout: Normal\n")); - retval = NORMAL_READOUT; - } else if (!analogEnable && digitalEnable) { - FILE_LOG(logDEBUG1, ("Getting readout: Digital Only\n")); - retval = DIGITAL_ONLY; - } else { - FILE_LOG(logERROR, ("Read unknown readout (Both digital and analog are disabled). " - "Config reg: 0x%x\n", regval)); - return retval; - } - - // update databytes and allocate ram - if (allocateRAM() == FAIL) { - return -2; - } - - return retval; -} - /* parameters - timer */ diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index 5247847ad..fd55b8ec1 100644 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -120,7 +120,7 @@ void setSpeed(enum speedVariable ind, int val); int getSpeed(enum speedVariable ind); #endif -#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(EIGERD) || defined(CHIPTESTBOARDD) enum readOutFlags setReadOutFlags(enum readOutFlags val); #endif diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index e9ac42320..f14895eac 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -1797,7 +1797,7 @@ int set_readout_flags(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting readout flags to %d\n", arg)); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -1805,6 +1805,7 @@ int set_readout_flags(int file_des) { switch(arg) { case GET_READOUT_FLAGS: +#ifdef EIGERD case STORE_IN_RAM: case CONTINOUS_RO: case PARALLEL: @@ -1812,7 +1813,7 @@ int set_readout_flags(int file_des) { case SAFE: case SHOW_OVERFLOW: case NOOVERFLOW: -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#elif CHIPTESTBOARDD case NORMAL_READOUT: case DIGITAL_ONLY: case ANALOG_AND_DIGITAL: @@ -2178,7 +2179,7 @@ int send_update(int file_des) { n = sendData(file_des,&i64,sizeof(i64),INT64); if (n < 0) return printSocketReadError(); -#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(EIGERD) || defined(CHIPTESTBOARDD) i32 = setReadOutFlags(GET_READOUT_FLAGS); n = sendData(file_des,&i32,sizeof(i32),INT32); if (n < 0) return printSocketReadError(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index b0acce0ba..28b1d2a99 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1102,7 +1102,7 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) { // readout flags if (thisDetector->myDetectorType == EIGER || - thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { + thisDetector->myDetectorType == CHIPTESTBOARD) { n += client.receiveData(&i32, sizeof(i32)); thisDetector->roFlags = (readOutFlags)i32; } @@ -2449,28 +2449,46 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) { overwriteFile(thisDetector->receiver_overWriteEnable); setTimer(FRAME_PERIOD, thisDetector->timerValue[FRAME_PERIOD]); setTimer(FRAME_NUMBER, thisDetector->timerValue[FRAME_NUMBER]); - if (thisDetector->myDetectorType != CHIPTESTBOARD && thisDetector->myDetectorType != MOENCH) { + + // detector specific + switch(thisDetector->myDetectorType) { + case GOTTHARD: setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]); + + break; + case JUNGFRAU: + setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]); + + break; + + case EIGER: + setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]); + setTimer(SUBFRAME_ACQUISITION_TIME, thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); + setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]); + setDynamicRange(thisDetector->dynamicRange); + setFlippedData(X, -1); + activate(-1); + setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable); + enableGapPixels(thisDetector->gappixels); + enableTenGigabitEthernet(thisDetector->tenGigaEnable); + setReadOutFlags(GET_READOUT_FLAGS); + + break; + case CHIPTESTBOARD: + setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); + enableTenGigabitEthernet(thisDetector->tenGigaEnable); + setReadOutFlags(GET_READOUT_FLAGS); + + break; + case MOENCH: + setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); + enableTenGigabitEthernet(thisDetector->tenGigaEnable); + + break; + default: + break; } - if (thisDetector->myDetectorType == EIGER) { - setTimer(SUBFRAME_ACQUISITION_TIME, - thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); - setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]); - } - setDynamicRange(thisDetector->dynamicRange); - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); - } - if (thisDetector->myDetectorType == EIGER) { - setFlippedData(X, -1); - activate(-1); - setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable); - enableGapPixels(thisDetector->gappixels); - } - if (thisDetector->myDetectorType == EIGER || thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - enableTenGigabitEthernet(thisDetector->tenGigaEnable); - setReadOutFlags(GET_READOUT_FLAGS); - } + setReceiverSilentMode(thisDetector->receiver_silentMode); // data streaming setReceiverStreamingFrequency(thisDetector->receiver_read_freq); diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 4e7908d72..43574d7e9 100644 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -213,7 +213,7 @@ public: * @param s number of samples * @param t tengiga enable */ - virtual void setImageSize(slsDetectorDefs::readOutFlags f, std::vector i, int s, bool t) { + virtual void setImageSize(std::vector i, 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"); }; @@ -535,12 +535,13 @@ public: ChipTestBoardData(){ myDetectorType = slsDetectorDefs::CHIPTESTBOARD; nPixelsX = 36; // total number of channels - nPixelsY = 1; // numberofsamples + nPixelsY = 1; // number of samples headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = UDP_PACKET_DATA_BYTES; packetSize = headerSizeinPacket + dataSize; - packetsPerFrame = 0; // to be calculated - imageSize = 0; // to be calculated + //packetsPerFrame = 1; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); defaultFifoDepth = 2500; @@ -554,7 +555,7 @@ public: * @param s number of samples * @param t tengiga enable */ - void setImageSize(slsDetectorDefs::readOutFlags f, std::vector i, int s, bool t) { + void setImageSize(std::vector i, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { int nchans = 0; if (f != slsDetectorDefs::GET_READOUT_FLAGS) { // analog channels @@ -596,7 +597,12 @@ class MoenchData : public GeneralData { private: - /** Structure of an jungfrau ctb packet header */ + /** Number of analog channels */ + const int NCHAN_ANALOG = 32; + /** Number of bytes per pixel */ + const int NUM_BYTES_PER_PIXEL = 2; + + /** Structure of an jungfrau ctb packet header (10G Udp) */ typedef struct { unsigned char emptyHeader[6]; unsigned char reserved[4]; @@ -607,23 +613,22 @@ private: public: - /** Bytes Per Adc */ - const uint32_t bytesPerAdc = 2; - /** Constructor */ MoenchData(){ myDetectorType = slsDetectorDefs::MOENCH; - nPixelsX = 400; - nPixelsY = 400; - headerSizeinPacket = 22; - dataSize = 8192; + nPixelsX = 32; // total number of channels + nPixelsY = 1; // number of samples + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; packetSize = headerSizeinPacket + dataSize; - packetsPerFrame = 1; + //packetsPerFrame = 1; imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); frameIndexMask = 0xFFFFFF; maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); defaultFifoDepth = 2500; + standardheader = true; }; /** @@ -645,34 +650,42 @@ private: bunchId = (*((uint64_t*) header->bunchid)); } - /** - * Setting packets per frame changes member variables - * @param ns number of samples - */ - void setNumberofSamples(const uint64_t ns) { - packetsPerFrame = ceil(double(2 * 32 * ns) / dataSize); - nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */ - imageSize = nPixelsX * nPixelsY * 2; - }; /** - * Setting ten giga enable changes member variables - * @param tgEnable true if 10GbE is enabled, else false - * @param dr dynamic range + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable */ - void SetTenGigaEnable(bool tgEnable, int dr) { - dataSize = (tgEnable ? 4096 : 1024); - packetSize = headerSizeinPacket + dataSize; - packetsPerFrame = (tgEnable ? 4 : 16) * dr; - imageSize = dataSize*packetsPerFrame; - }; + void setImageSize(std::vector i, int s, bool t, + slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + int nchans = NCHAN_ANALOG; + // if roi + if (i.size()) { + nchans = abs(i[0].xmax - i[0].xmin); + } - /** - * Print all variables - */ - void Print(TLogLevel level = logDEBUG1) const { - GeneralData::Print(level); - FILE_LOG(logINFO) << "Bytes Per Adc: " << bytesPerAdc; + nPixelsX = nchans; + nPixelsY = s; + // 10G + if (t) { + headerSizeinPacket = 22; + dataSize = 8192; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)packetSize); + standardheader = false; + } + // 1g udp (via fifo readout) + else { + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + standardheader = true; + } } }; diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index 010ccf22a..a94faa196 100644 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -447,8 +447,8 @@ int slsReceiverImplementation::setReadOutFlags(const readOutFlags f) { readoutFlags = f; // side effects - if (myDetectorType == CHIPTESTBOARD || myDetectorType == MOENCH) { - generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); + if (myDetectorType == CHIPTESTBOARD) { + generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); for (const auto& it : dataProcessor) it->SetPixelDimension(); if (SetupFifoStructure() == FAIL) @@ -642,10 +642,10 @@ int slsReceiverImplementation::setROI(const std::vector i) framesPerFile = generalData->maxFramesPerFile; break; case MOENCH: - generalData->SetROI(i); + generalData->setImageSize(roi, numberOfSamples, tengigaEnable); break; case CHIPTESTBOARD: - generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); + generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); break; default: break; @@ -789,18 +789,13 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) { if (numberOfSamples != i) { numberOfSamples = i; - switch(myDetectorType) { - case MOENCH: - generalData->setNumberofSamples(i); - break; - case CHIPTESTBOARD: - generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); - for (const auto& it : dataProcessor) - it->SetPixelDimension(); - break; - default: - break; + if(myDetectorType == MOENCH) { + generalData->setImageSize(roi, numberOfSamples, tengigaEnable); + } else if(myDetectorType == CHIPTESTBOARD) { + generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); } + for (const auto& it : dataProcessor) + it->SetPixelDimension(); if (SetupFifoStructure() == FAIL) return FAIL; } @@ -811,6 +806,7 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) { int slsReceiverImplementation::setDynamicRange(const uint32_t i) { + // only eiger if (dynamicRange != i) { dynamicRange = i; generalData->SetDynamicRange(i,tengigaEnable); @@ -830,7 +826,20 @@ int slsReceiverImplementation::setTenGigaEnable(const bool b) { if (tengigaEnable != b) { tengigaEnable = b; //side effects - generalData->SetTenGigaEnable(b,dynamicRange); + switch(myDetectorType) { + case EIGER: + generalData->SetTenGigaEnable(b,dynamicRange); + break; + case MOENCH: + generalData->setImageSize(roi, numberOfSamples, tengigaEnable); + break; + case CHIPTESTBOARD: + generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags); + break; + default: + break; + } + if (SetupFifoStructure() == FAIL) return FAIL; } diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index cab135799..777550b07 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1947,7 +1947,7 @@ int slsReceiverTCPIPInterface::set_readout_flags() { if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg), true, receiver) == FAIL) return FAIL; - if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD) + if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD || myDetectorType == MOENCH) functionNotImplemented(); // base object not null