diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 0acd09c6f..2cbc75afd 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -556,35 +556,40 @@ void setupDetector() { } int allocateRAM() { - int oldDataBytes = dataBytes; - updateDataBytes(); + int oldDataBytes = dataBytes; + updateDataBytes(); - // update only if change in databytes - if (dataBytes == oldDataBytes) { - FILE_LOG(logDEBUG1, ("RAM of size %d already allocated. Nothing to be done.\n", dataBytes)); - return OK; - } - // Zero databytes - if (dataBytes <= 0) { - FILE_LOG(logERROR, ("Can not allocate RAM for 0 bytes (databytes: 0).\n")); - return FAIL; - } - // clear RAM - if (ramValues) { - free(ramValues); - ramValues = 0; - } - // allocate RAM - ramValues = malloc(dataBytes); - // cannot malloc - if (ramValues == NULL) { - FILE_LOG(logERROR, ("Can not allocate RAM for even 1 frame. " - "Probably cause: Memory Leak.\n")); - return FAIL; - } + // only allcoate RAM for 1 giga udp (if 10G, return) + if (enableTenGigabitEthernet(-1)) + return OK; - FILE_LOG(logINFO, ("\tRAM allocated to %d bytes\n", dataBytes)); - return OK; + + // update only if change in databytes + if (dataBytes == oldDataBytes) { + FILE_LOG(logDEBUG1, ("RAM of size %d already allocated. Nothing to be done.\n", dataBytes)); + return OK; + } + // Zero databytes + if (dataBytes <= 0) { + FILE_LOG(logERROR, ("Can not allocate RAM for 0 bytes (databytes: 0).\n")); + return FAIL; + } + // clear RAM + if (ramValues) { + free(ramValues); + ramValues = 0; + } + // allocate RAM + ramValues = malloc(dataBytes); + // cannot malloc + if (ramValues == NULL) { + FILE_LOG(logERROR, ("Can not allocate RAM for even 1 frame. " + "Probably cause: Memory Leak.\n")); + return FAIL; + } + + FILE_LOG(logINFO, ("\tRAM allocated to %d bytes\n", dataBytes)); + return OK; } void updateDataBytes() { @@ -1510,6 +1515,9 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t FILE_LOG(logINFOBLUE, ("Configuring MAC\n")); // 1 giga udp if (!enableTenGigabitEthernet(-1)) { + // if it was in 10G mode, it was not allocating RAM + if (allocateRAM() == FAIL) + return -1; char cDestIp[MAX_STR_LENGTH]; memset(cDestIp, 0, MAX_STR_LENGTH); sprintf(cDestIp, "%d.%d.%d.%d", (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); diff --git a/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h b/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h index 82e6b30e4..72dcd27e4 100755 --- a/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h +++ b/slsDetectorServers/slsDetectorServer/UDPPacketHeaderGenerator.h @@ -22,7 +22,6 @@ extern int nframes; extern char* ramValues; #define UDP_PACKET_HEADER_VERSION (0x1) -#define UDP_PACKET_DATA_BYTES (1344) uint32_t udpPacketNumber = 0; diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs_UDP.h b/slsDetectorServers/slsDetectorServer/communication_funcs_UDP.h index 7b5b328c6..c983eb18e 100755 --- a/slsDetectorServers/slsDetectorServer/communication_funcs_UDP.h +++ b/slsDetectorServers/slsDetectorServer/communication_funcs_UDP.h @@ -62,6 +62,7 @@ int setUDPDestinationDetails(const char* ip, unsigned short int port) { } int createUDPSocket() { + FILE_LOG(logDEBUG2, ("Creating UDP Socket\n")); if (!strlen(udpDestinationIp)) { FILE_LOG(logERROR, ("No destination UDP ip specified.\n")); return FAIL; @@ -107,10 +108,9 @@ int sendUDPPacket(const char* buf, int length) { } void closeUDPSocket() { - close(udpSockfd); - udpSockfd = -1; - if (udpServerAddrInfo) { - freeaddrinfo(udpServerAddrInfo); - udpServerAddrInfo = 0; + if (udpSockfd != -1) { + FILE_LOG(logINFO, ("Udp client socket closed\n")); + close(udpSockfd); + udpSockfd = -1; } } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 323d26e99..6335c8666 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -2272,10 +2272,21 @@ int configure_mac(int file_des) { #endif ret = configureMAC(dstIp, dstMac, srcMac, srcIp, dstPort, dstPort2); +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + if (ret != OK) { + if (ret == FAIL) + sprintf(mess,"Could not configure mac because of incorrect udp 1G destination IP and port\n"); + else if (ret == -1) + sprintf(mess, "Could not allocate RAM\n"); + FILE_LOG(logERROR,(mess)); + } +#else if (ret == FAIL) { sprintf(mess,"Configure Mac failed\n"); FILE_LOG(logERROR,(mess)); - } else { + } +#endif + else { FILE_LOG(logINFO, ("\tConfigure MAC successful\n")); } #if defined(EIGERD) || defined (JUNGFRAUD) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index b90f99dea..e61b8d97e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -2245,6 +2245,31 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { if (ret == FORCE_UPDATE) { ret = updateDetector(); } + + // sending to receiver + if (ret != FAIL) { + fnum = F_RECEIVER_SET_READOUT_FLAGS; + ret = FAIL; + arg = thisDetector->roFlags; + retval = (readOutFlags) -1; + FILE_LOG(logDEBUG1) << "Setting receiver readout flags to " << arg; + + if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); + + // handle ret + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (COULD_NOT_SET_READOUT_FLAGS)); + } else { + FILE_LOG(logDEBUG1) << "Receiver readout flag: " << retval; + } + } + if (ret == FORCE_UPDATE) { + ret = updateReceiver(); + } + } + return thisDetector->roFlags; } @@ -2425,15 +2450,17 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) { setDynamicRange(thisDetector->dynamicRange); if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); - enableTenGigabitEthernet(thisDetector->tenGigaEnable); } if (thisDetector->myDetectorType == EIGER) { setFlippedData(X, -1); activate(-1); setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable); - enableTenGigabitEthernet(thisDetector->tenGigaEnable); enableGapPixels(thisDetector->gappixels); } + if (thisDetector->myDetectorType == EIGER || thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { + enableTenGigabitEthernet(thisDetector->tenGigaEnable); + setReadOutFlags(thisDetector->roFlags); + } setReceiverSilentMode(thisDetector->receiver_silentMode); // data streaming setReceiverStreamingFrequency(thisDetector->receiver_read_freq); diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 97d4c9c2f..beec6c3d0 100644 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -182,9 +182,8 @@ public: /** * Setting packets per frame changes member variables * @param ns number of samples - * @param nroich number of channels in roi */ - virtual void setNumberofSamples(const uint64_t ns, uint32_t nroich) { + virtual void setNumberofSamples(const uint64_t ns) { FILE_LOG(logERROR) << "This is a generic function that should be overloaded by a derived class"; }; @@ -207,6 +206,17 @@ public: return false; }; + /** + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable + */ + virtual void setImageSize(slsDetectorDefs::readOutFlags f, std::vector i, int s, bool t) { + cprintf(RED,"This is a generic function that should be overloaded by a derived class\n"); + }; + /** * Print all variables */ @@ -242,9 +252,9 @@ public: class GotthardData : public GeneralData { private: - const static int nChip = 10; - const static int nChan = 128; - const static int nChipsPerAdc = 2; + const int nChip = 10; + const int nChan = 128; + const int nChipsPerAdc = 2; public: /** Constructor */ @@ -511,20 +521,26 @@ class JungfrauData : public GeneralData { class ChipTestBoardData : public GeneralData { - - public: +private: + /** Number of analog channels */ + const int NCHAN_ANALOG = 32; + /** Number of digital channels */ + const int NCHAN_DIGITAL = 4; + /** Number of bytes per pixel */ + const int NUM_BYTES_PER_PIXEL = 2; +public: /** Constructor */ ChipTestBoardData(){ myDetectorType = slsDetectorDefs::CHIPTESTBOARD; - nPixelsX = 36; - nPixelsY = 1; + nPixelsX = 36; // total number of channels + nPixelsY = 1; // numberofsamples headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - dataSize = 0; // to be calculatedd + dataSize = UDP_PACKET_DATA_BYTES; packetSize = headerSizeinPacket + dataSize; packetsPerFrame = 0; // to be calculated - imageSize = nPixelsX * nPixelsY * 2; + imageSize = 0; // to be calculated maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); defaultFifoDepth = 2500; @@ -532,27 +548,43 @@ class ChipTestBoardData : public GeneralData { }; /** - * Setting packets per frame changes member variables - * @param ns number of samples - * @param nroich number of channels in roi + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable */ - void setNumberofSamples(const uint64_t ns, uint32_t nroich) { - packetsPerFrame = ceil(double(2 * (nroich ? nroich : 32) * ns) / dataSize); - nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */ - imageSize = nPixelsX * nPixelsY * 2; - }; + void setImageSize(slsDetectorDefs::readOutFlags f, std::vector i, int s, bool t) { + int nchans = 0; + if (f & slsDetectorDefs::NORMAL_READOUT || f & slsDetectorDefs::ANALOG_AND_DIGITAL) { + nchans += NCHAN_ANALOG; - /** - * Setting ten giga enable changes member variables - * @param tgEnable true if 10GbE is enabled, else false - * @param dr dynamic range - */ - void SetTenGigaEnable(bool tgEnable, int dr) { - dataSize = (tgEnable ? 4096 : 1024); - packetSize = headerSizeinPacket + dataSize; - packetsPerFrame = (tgEnable ? 4 : 16) * dr; - imageSize = dataSize*packetsPerFrame; - }; + // if roi + if (i.size()) { + nchans = abs(i[0].xmax - i[0].xmin); + } + } + if (f & slsDetectorDefs::DIGITAL_ONLY || f & slsDetectorDefs::ANALOG_AND_DIGITAL) + nchans += NCHAN_DIGITAL; + + nPixelsX = nchans; + nPixelsY = s; + // 10G + if (t) { + // fixed values + dataSize = 0; // FIXME: fix when firmware written + packetSize = headerSizeinPacket + dataSize; + packetsPerFrame = 0; // FIXME: fix when firmware written + imageSize = dataSize*packetsPerFrame; // FIXME: OR fix when firmware written + } + // 1g udp (via fifo readout) + else { + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + imageSize = nchans * NUM_BYTES_PER_PIXEL * s; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + } + } }; @@ -572,10 +604,8 @@ private: public: - - /** Bytes Per Adc */ - const static uint32_t bytesPerAdc = 2; + const uint32_t bytesPerAdc = 2; /** Constructor */ MoenchData(){ @@ -615,10 +645,9 @@ private: /** * Setting packets per frame changes member variables * @param ns number of samples - * @param nroich number of channels in roi */ - void setNumberofSamples(const uint64_t ns, uint32_t nroich) { - packetsPerFrame = ceil(double(2 * (nroich ? nroich : 32) * ns) / dataSize); + 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; }; diff --git a/slsReceiverSoftware/include/Listener.h b/slsReceiverSoftware/include/Listener.h index 971f88614..d06379b5b 100644 --- a/slsReceiverSoftware/include/Listener.h +++ b/slsReceiverSoftware/include/Listener.h @@ -112,7 +112,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { * Set GeneralData pointer to the one given * @param g address of GeneralData (Detector Data) pointer */ - void SetGeneralData(GeneralData*& g); + void SetGeneralData(GeneralData* g); /** * Set thread priority diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h index 642dc3026..48da9cc0a 100644 --- a/slsReceiverSoftware/include/slsReceiverImplementation.h +++ b/slsReceiverSoftware/include/slsReceiverImplementation.h @@ -73,6 +73,12 @@ class slsReceiverImplementation: private virtual slsDetectorDefs { */ bool getGapPixelsEnable() const; + /** + * Get readout flags (Eiger, chiptestboard, moench) + * @return readout flags + */ + readOutFlags getReadOutFlags() const; + //***file parameters*** /** @@ -342,6 +348,13 @@ class slsReceiverImplementation: private virtual slsDetectorDefs { */ int setGapPixelsEnable(const bool b); + /** + * Set readout flags (eiger, chiptestboard, moench) + * @param f readout flag + * @return OK or FAIL + */ + int setReadOutFlags(const readOutFlags f); + //***file parameters*** /** @@ -765,12 +778,12 @@ private: int flippedData[2]; /** gap pixels enable */ bool gapPixelsEnable; + /** readout flags*/ + readOutFlags readoutFlags; //*** receiver parameters *** /** Number of Threads */ int numThreads; - /** Number of channels in roi for jungfrauctb */ - uint32_t nroichannels; /** Maximum Number of Listening Threads/ UDP Ports */ const static int MAX_NUMBER_OF_LISTENING_THREADS = 2; /** Receiver Status */ diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index fc091c5e7..6e87e6c27 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -19,6 +19,8 @@ class slsReceiverImplementation; */ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { + private: + enum numberMode {DEC, HEX}; public: @@ -120,7 +122,7 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { /** validate and set error */ template - void validate(T arg, T retval, std::string modename, bool hex); + void validate(T arg, T retval, std::string modename, numberMode hex); /** Unrecognized Function */ int M_nofunc(); @@ -277,6 +279,9 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { /** set deactivated receiver padding enable */ int set_deactivated_receiver_padding_enable(); + /** set readout flags */ + int set_readout_flags(); + /** detector type */ detectorType myDetectorType; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 67c3bcb03..4469cb305 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -172,7 +172,7 @@ void Listener::RecordFirstIndices(uint64_t fnum) { } -void Listener::SetGeneralData(GeneralData*& g) { +void Listener::SetGeneralData(GeneralData* g) { generalData = g; generalData->Print(); } @@ -467,6 +467,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { memcpy(buf + fifohsize + dsize - 2, carryOverPacket + hsize, dsize+2); break; case CHIPTESTBOARD: + case MOENCH: if (pnum == (pperFrame-1)) memcpy(buf + fifohsize + (pnum * dsize), carryOverPacket + hsize, corrected_dsize); else @@ -479,7 +480,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { carryOverFlag = false; ++numpackets; //number of packets in this image (each time its copied to buf) - new_header->packetsMask[pnum] = 1; + new_header->packetsMask[((pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS)] = 1; //writer header if(isHeaderEmpty) { @@ -612,6 +613,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { memcpy(buf + fifohsize + (pnum * dsize) - 2, listeningPacket + hsize, dsize+2); break; case CHIPTESTBOARD: + case MOENCH: if (pnum == (pperFrame-1)) memcpy(buf + fifohsize + (pnum * dsize), listeningPacket + hsize, corrected_dsize); else @@ -622,7 +624,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { break; } ++numpackets; //number of packets in this image (each time its copied to buf) - new_header->packetsMask[pnum] = 1; + new_header->packetsMask[((pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS)] = 1; if(isHeaderEmpty) { // -------------------------- new header ---------------------------------------------------------------------- diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index 1aae6e77c..afcbdf381 100644 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -69,10 +69,10 @@ void slsReceiverImplementation::InitializeMembers() { flippedData[0] = 0; flippedData[1] = 0; gapPixelsEnable = false; + readoutFlags = NORMAL_READOUT; //*** receiver parameters *** numThreads = 1; - nroichannels = 0; status = IDLE; activated = true; deactivatedPaddingEnable = true; @@ -151,6 +151,12 @@ bool slsReceiverImplementation::getGapPixelsEnable() const { return gapPixelsEnable; } +slsDetectorDefs::readOutFlags slsReceiverImplementation::getReadOutFlags() const { + FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; + return readoutFlags; +} + + /***file parameters***/ slsDetectorDefs::fileFormat slsReceiverImplementation::getFileFormat() const{ FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; @@ -436,6 +442,46 @@ int slsReceiverImplementation::setGapPixelsEnable(const bool b) { } +int slsReceiverImplementation::setReadOutFlags(const readOutFlags f) { + if (readoutFlags != f) { + readoutFlags = f; + + // side effects + generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); + for (const auto& it : dataProcessor) + it->SetPixelDimension(); + if (SetupFifoStructure() == FAIL) + return FAIL; + } + std::string flag; + if (f == NORMAL_READOUT) + flag = "none"; + else if (f & STORE_IN_RAM) + flag.append("storeinram "); + if (f & TOT_MODE) + flag.append("tot "); + if (f & CONTINOUS_RO) + flag.append("continous "); + if (f & PARALLEL) + flag.append("parallel "); + if (f & NONPARALLEL) + flag.append("nonparallel "); + if (f & SAFE) + flag.append("safe "); + if (f & DIGITAL_ONLY) + flag.append("digital "); + if (f & ANALOG_AND_DIGITAL) + flag.append("analog_digital "); + if (f & SHOW_OVERFLOW) + flag.append("overflow "); + if (f & NOOVERFLOW) + flag.append("nooverflow "); + + FILE_LOG(logINFO) << "ReadoutFlags: " << flag; + return OK; +} + + void slsReceiverImplementation::setFileFormat(const fileFormat f) { switch(f) { #ifdef HDF5C @@ -568,12 +614,6 @@ int slsReceiverImplementation::setUDPSocketBufferSize(const uint32_t s) { /***acquisition parameters***/ int slsReceiverImplementation::setROI(const std::vector i) { - if (myDetectorType != GOTTHARD) { - FILE_LOG(logERROR) << "Can not set ROI for this detector"; - return FAIL; - } - - bool change = false; if (roi.size() != i.size()) change = true; @@ -594,17 +634,24 @@ int slsReceiverImplementation::setROI(const std::vector i) roi = i; - generalData->SetROI(i); - framesPerFile = generalData->maxFramesPerFile; + switch(myDetectorType) { + case GOTTHARD: + generalData->SetROI(i); + framesPerFile = generalData->maxFramesPerFile; + break; + case MOENCH: + generalData->SetROI(i); + break; + case CHIPTESTBOARD: + generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); + break; + default: + break; + } + for (const auto& it : dataProcessor) + it->SetPixelDimension(); if (SetupFifoStructure() == FAIL) return FAIL; - - for (const auto& it : listener) - it->SetGeneralData(generalData); - for (const auto& it : dataProcessor) - it->SetGeneralData(generalData); - for (const auto& it : dataStreamer) - it->SetGeneralData(generalData); } @@ -700,7 +747,6 @@ int slsReceiverImplementation::setAcquisitionPeriod(const uint64_t i) { acquisitionPeriod = i; FILE_LOG(logINFO) << "Acquisition Period: " << (double)acquisitionPeriod/(1E9) << "s"; - //overrridden child classes might return FAIL return OK; } @@ -710,7 +756,6 @@ int slsReceiverImplementation::setAcquisitionTime(const uint64_t i) { acquisitionTime = i; FILE_LOG(logINFO) << "Acquisition Time: " << (double)acquisitionTime/(1E9) << "s"; - //overrridden child classes might return FAIL return OK; } @@ -734,7 +779,6 @@ int slsReceiverImplementation::setNumberOfFrames(const uint64_t i) { numberOfFrames = i; FILE_LOG(logINFO) << "Number of Frames: " << numberOfFrames; - //overrridden child classes might return FAIL return OK; } @@ -743,7 +787,18 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) { if (numberOfSamples != i) { numberOfSamples = i; - generalData->setNumberofSamples(i, nroichannels); + 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 (SetupFifoStructure() == FAIL) return FAIL; } @@ -832,8 +887,9 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) { switch(myDetectorType) { case GOTTHARD: case EIGER: - case CHIPTESTBOARD: case JUNGFRAU: + case CHIPTESTBOARD: + case MOENCH: FILE_LOG(logINFO) << " ***** " << detectorTypeToString(d) << " Receiver *****"; break; default: diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index abfa3ae16..f55188ae8 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -228,6 +228,7 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_RECEIVER_DISCARD_POLICY] = &slsReceiverTCPIPInterface::set_discard_policy; 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; for (int i = NUM_DET_FUNCTIONS + 1; i < NUM_REC_FUNCTIONS ; i++) { FILE_LOG(logDEBUG1) << "function fnum: " << i << " (" << @@ -286,7 +287,7 @@ void slsReceiverTCPIPInterface::modeNotImplemented(std::string modename, int mod } template -void slsReceiverTCPIPInterface::validate(T arg, T retval, std::string modename, bool hex) { +void slsReceiverTCPIPInterface::validate(T arg, T retval, std::string modename, numberMode hex) { if (ret == OK && arg != -1 && retval != arg) { ret = FAIL; if (hex) @@ -584,6 +585,7 @@ int slsReceiverTCPIPInterface::set_detector_type(){ case GOTTHARD: case EIGER: case CHIPTESTBOARD: + case MOENCH: case JUNGFRAU: break; default: @@ -617,7 +619,7 @@ int slsReceiverTCPIPInterface::set_detector_type(){ } //get retval = myDetectorType; - validate((int)arg, (int)retval, std::string("set detector type"), 0); + validate((int)arg, (int)retval, std::string("set detector type"), DEC); return interface->Server_SendResult(false, ret, &retval, sizeof(retval), mess); } @@ -684,8 +686,7 @@ int slsReceiverTCPIPInterface::set_roi() { arg[iloop].ymax << ")"; } - // only for gotthard - if (myDetectorType != GOTTHARD) + if (myDetectorType == EIGER || myDetectorType == JUNGFRAU) functionNotImplemented(); // base object not null @@ -805,7 +806,7 @@ int slsReceiverTCPIPInterface::set_timer() { receiver->setSubPeriod(index[1] + receiver->getSubExpTime()); break; case SAMPLES: - if (myDetectorType != CHIPTESTBOARD) { + if (myDetectorType != CHIPTESTBOARD && myDetectorType != MOENCH) { modeNotImplemented("(Samples) Timer index", (int)index[0]); break; } @@ -837,7 +838,7 @@ int slsReceiverTCPIPInterface::set_timer() { retval=(receiver->getSubPeriod() - receiver->getSubExpTime()); break; case SAMPLES: - if (myDetectorType != CHIPTESTBOARD) { + if (myDetectorType != CHIPTESTBOARD && myDetectorType != MOENCH) { ret = FAIL; sprintf(mess,"This timer mode (%lld) does not exist for this receiver type\n", (long long int)index[0]); FILE_LOG(logERROR) << "Warning: " << mess; @@ -849,7 +850,7 @@ int slsReceiverTCPIPInterface::set_timer() { modeNotImplemented("Timer index", (int)index[0]); break; } - validate((int)index[1], (int)retval, std::string("set timer"), 0); + validate((int)index[1], (int)retval, std::string("set timer"), DEC); FILE_LOG(logDEBUG1) << slsDetectorDefs::getTimerType((timerIndex)(index[0])) << ":" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -904,7 +905,7 @@ int slsReceiverTCPIPInterface::set_dynamic_range() { } // get retval = receiver->getDynamicRange(); - validate(dr, retval, std::string("set dynamic range"), 0); + validate(dr, retval, std::string("set dynamic range"), DEC); FILE_LOG(logDEBUG1) << "dynamic range: " << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -938,7 +939,7 @@ int slsReceiverTCPIPInterface::set_streaming_frequency() { } // get retval = receiver->getStreamingFrequency(); - validate(index, retval, std::string("set streaming frequency"), 0); + validate(index, retval, std::string("set streaming frequency"), DEC); } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); } @@ -1112,7 +1113,7 @@ int slsReceiverTCPIPInterface::set_file_index() { } // get retval=receiver->getFileIndex(); - validate(index, retval, std::string("set file index"), 0); + validate(index, retval, std::string("set file index"), DEC); FILE_LOG(logDEBUG1) << "file index:" << retval; } return interface->Server_SendResult(true, ret, &retval,sizeof(retval), mess); @@ -1199,7 +1200,7 @@ int slsReceiverTCPIPInterface::enable_file_write(){ } // get retval = receiver->getFileWriteEnable(); - validate(enable, retval, std::string("set file write enable"), 0); + validate(enable, retval, std::string("set file write enable"), DEC); FILE_LOG(logDEBUG1) << "file write enable:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1229,7 +1230,7 @@ int slsReceiverTCPIPInterface::enable_overwrite() { } // get retval = receiver->getOverwriteEnable(); - validate(index, retval, std::string("set file overwrite enable"), 0); + validate(index, retval, std::string("set file overwrite enable"), DEC); FILE_LOG(logDEBUG1) << "file overwrite enable:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1262,7 +1263,7 @@ int slsReceiverTCPIPInterface::enable_tengiga() { } // get retval = receiver->getTenGigaEnable(); - validate(val, retval, std::string("set 10GbE"), 0); + validate(val, retval, std::string("set 10GbE"), DEC); FILE_LOG(logDEBUG1) << "10Gbe:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1296,7 +1297,7 @@ int slsReceiverTCPIPInterface::set_fifo_depth() { } // get retval = receiver->getFifoDepth(); - validate(value, retval, std::string("set fifo depth"), 0); + validate(value, retval, std::string("set fifo depth"), DEC); FILE_LOG(logDEBUG1) << "fifo depth:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1329,7 +1330,7 @@ int slsReceiverTCPIPInterface::set_activate() { } // get retval = (int)receiver->getActivate(); - validate(enable, retval, std::string("set activate"), 0); + validate(enable, retval, std::string("set activate"), DEC); FILE_LOG(logDEBUG1) << "Activate: " << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1359,7 +1360,7 @@ int slsReceiverTCPIPInterface::set_data_stream_enable(){ } // get retval = receiver->getDataStreamEnable(); - validate(index, retval, std::string("set data stream enable"), 0); + validate(index, retval, std::string("set data stream enable"), DEC); FILE_LOG(logDEBUG1) << "data streaming enable:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1389,7 +1390,7 @@ int slsReceiverTCPIPInterface::set_streaming_timer(){ } // get retval=receiver->getStreamingTimer(); - validate(index, retval, std::string("set data stream timer"), 0); + validate(index, retval, std::string("set data stream timer"), DEC); FILE_LOG(logDEBUG1) << "Streaming timer:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1422,7 +1423,7 @@ int slsReceiverTCPIPInterface::set_flipped_data(){ } // get retval=receiver->getFlippedData(args[0]); - validate(args[1], retval, std::string("set flipped data"), 0); + validate(args[1], retval, std::string("set flipped data"), DEC); FILE_LOG(logDEBUG1) << "Flipped Data:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1452,7 +1453,7 @@ int slsReceiverTCPIPInterface::set_file_format() { } // get retval = receiver->getFileFormat(); - validate(f, retval, std::string("set file format"), 0); + validate(f, retval, std::string("set file format"), DEC); FILE_LOG(logDEBUG1) << "File Format: " << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1482,7 +1483,7 @@ int slsReceiverTCPIPInterface::set_detector_posid() { } // get retval = receiver->getDetectorPositionId(); - validate(arg, retval, std::string("set detector position id"), 0); + validate(arg, retval, std::string("set detector position id"), DEC); FILE_LOG(logDEBUG1) << "Position Id:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1547,7 +1548,7 @@ int slsReceiverTCPIPInterface::set_streaming_port() { } // get retval = receiver->getStreamingPort(); - validate(port, retval, std::string("set streaming port"), 0); + validate(port, retval, std::string("set streaming port"), DEC); FILE_LOG(logDEBUG1) << "streaming port:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1604,7 +1605,7 @@ int slsReceiverTCPIPInterface::set_silent_mode() { } // get retval = (int)receiver->getSilentMode(); - validate(value, retval, std::string("set silent mode"), 0); + validate(value, retval, std::string("set silent mode"), DEC); FILE_LOG(logDEBUG1) << "silent mode:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1637,7 +1638,7 @@ int slsReceiverTCPIPInterface::enable_gap_pixels() { } // get retval = receiver->getGapPixelsEnable(); - validate(enable, retval, std::string("set gap pixels enable"), 0); + validate(enable, retval, std::string("set gap pixels enable"), DEC); FILE_LOG(logDEBUG1) << "Gap Pixels Enable: " << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1748,7 +1749,7 @@ int slsReceiverTCPIPInterface::set_udp_socket_buffer_size() { } // get retval = receiver->getUDPSocketBufferSize(); - validate(index, retval, std::string("set udp socket buffer size (No CAP_NET_ADMIN privileges?)"), 0); + validate(index, retval, std::string("set udp socket buffer size (No CAP_NET_ADMIN privileges?)"), DEC); FILE_LOG(logDEBUG1) << "UDP Socket Buffer Size:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1795,7 +1796,7 @@ int slsReceiverTCPIPInterface::set_frames_per_file() { } // get retval = receiver->getFramesPerFile(); - validate(index, retval, std::string("set frames per file"), 0); + validate(index, retval, std::string("set frames per file"), DEC); FILE_LOG(logDEBUG1) << "frames per file:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1865,7 +1866,7 @@ int slsReceiverTCPIPInterface::set_discard_policy() { } // get retval = receiver->getFrameDiscardPolicy(); - validate(index, retval, std::string("set discard policy"), 0); + validate(index, retval, std::string("set discard policy"), DEC); FILE_LOG(logDEBUG1) << "frame discard policy:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1896,7 +1897,7 @@ int slsReceiverTCPIPInterface::set_padding_enable() { } // get retval = (int)receiver->getFramePaddingEnable(); - validate(index, retval, std::string("set frame padding enable"), 0); + validate(index, retval, std::string("set frame padding enable"), DEC); FILE_LOG(logDEBUG1) << "Frame Padding Enable:" << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); @@ -1929,8 +1930,40 @@ int slsReceiverTCPIPInterface::set_deactivated_receiver_padding_enable() { } // get retval = (int)receiver->getDeactivatedPadding(); - validate(enable, retval, std::string("set deactivated padding enable"), 0); + validate(enable, retval, std::string("set deactivated padding enable"), DEC); FILE_LOG(logDEBUG1) << "Deactivated Padding Enable: " << retval; } return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); } + + +int slsReceiverTCPIPInterface::set_readout_flags() { + ret = OK; + memset(mess, 0, sizeof(mess)); + readOutFlags arg = GET_READOUT_FLAGS; + readOutFlags retval = GET_READOUT_FLAGS; + + // 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; + + if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD) + functionNotImplemented(); + + // base object not null + else if (ret == OK) { + // set + if (arg >= 0) { + // verify if receiver is unlocked and idle + if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { + FILE_LOG(logDEBUG1) << "Setting readout flag: " << arg; + ret = receiver->setReadOutFlags(arg); + } + } + // get + retval = receiver->getReadOutFlags(); + validate((int)arg, (int)(retval & arg), std::string("set readout flags"), HEX); + FILE_LOG(logDEBUG1) << "Readout flags: " << retval; + } + return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); +} diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index 50062c781..45ebcdd75 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -36,6 +36,9 @@ typedef int int32_t; #define SLS_DETECTOR_HEADER_VERSION 0x2 #define SLS_DETECTOR_JSON_HEADER_VERSION 0x3 +// ctb/ moench 1g udp (read from fifo) +#define UDP_PACKET_DATA_BYTES (1344) + /** maximum rois */ #define MAX_ROIS 100 diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index f73fa01a8..5b88f7fbc 100644 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -119,6 +119,7 @@ enum detFuncs{ F_RECEIVER_DISCARD_POLICY, /** < frames discard policy */ 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 */ NUM_REC_FUNCTIONS }; @@ -235,6 +236,7 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_RECEIVER_DISCARD_POLICY: return "F_RECEIVER_DISCARD_POLICY"; 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 NUM_REC_FUNCTIONS: return "NUM_REC_FUNCTIONS"; default: return "Unknown Function"; }