From 0cb7d62ad56074c678b9e7114c6da0687b935e84 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 12:57:14 +0100 Subject: [PATCH 1/9] throw startacq callback exception --- slsReceiverSoftware/CMakeLists.txt | 2 +- slsReceiverSoftware/src/ReceiverApp2.cpp | 166 +++++++++++++++++++++++ 2 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 slsReceiverSoftware/src/ReceiverApp2.cpp diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index ab08c243d..ce6284edd 100755 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -86,7 +86,7 @@ endif() add_executable(slsReceiver - src/ReceiverApp.cpp) + src/ReceiverApp2.cpp) set_target_properties(slsReceiver PROPERTIES diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp new file mode 100644 index 000000000..75ef4f749 --- /dev/null +++ b/slsReceiverSoftware/src/ReceiverApp2.cpp @@ -0,0 +1,166 @@ +#include + +#include //SIGINT +#include +#include +#include +#include + +sem_t semaphore; + +void sigInterruptHandler(int p) { sem_post(&semaphore); } + +/** + * Start Acquisition Call back + * slsReceiver writes data if file write enabled. + * Users get data to write using call back if registerCallBackRawDataReady is + * registered. + * @param filepath file path + * @param filename file name + * @param fileindex file index + * @param datasize data size in bytes + * @param p pointer to object + * \returns ignored + */ +int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, + uint32_t datasize, void *p) { + std::cout << "#### StartAcq: filepath:" << filepath + << " filename:" << filename << " fileindex:" << fileindex + << " datasize:" << datasize << " ####"; + + throw std::runtime_error("start acquisition call back error"); + return 0; +} + +/** + * Acquisition Finished Call back + * @param frames Number of frames caught + * @param p pointer to object + */ +void AcquisitionFinished(uint64_t frames, void *p) { + std::cout << "#### AcquisitionFinished: frames:" << frames << " ####"; +} + +/** + * Get Receiver Data Call back and prints the header for each image call back. + * @param metadata sls_receiver_header metadata + * @param datapointer pointer to data + * @param datasize data size in bytes. + * @param p pointer to object + */ +void GetData(char *metadata, char *datapointer, uint32_t datasize, void *p) { + slsDetectorDefs::sls_receiver_header *header = + (slsDetectorDefs::sls_receiver_header *)metadata; + slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; + + std::cout << "#### " << detectorHeader.row << " GetData: ####\n" + << "frameNumber: " << detectorHeader.frameNumber + << "\t\texpLength: " << detectorHeader.expLength + << "\t\tpacketNumber: " << detectorHeader.packetNumber + << "\t\tbunchId: " << detectorHeader.bunchId + << "\t\ttimestamp: " << detectorHeader.timestamp + << "\t\tmodId: " << detectorHeader.modId + << "\t\trow: " << detectorHeader.row + << "\t\tcolumn: " << detectorHeader.column + << "\t\treserved: " << detectorHeader.reserved + << "\t\tdebug: " << detectorHeader.debug + << "\t\troundRNumber: " << detectorHeader.roundRNumber + << "\t\tdetType: " << detectorHeader.detType << "\t\tversion: " + << detectorHeader.version + //<< "\t\tpacketsMask: " << header->packetsMask.to_string() + << "\t\tfirstbytedata: " << std::hex << "0x" + << ((uint8_t)(*((uint8_t *)(datapointer)))) + << "\t\tdatsize: " << datasize << "\n\n"; +} + +/** + * Get Receiver Data Call back (modified) and prints headers for each image call + * back. + * @param metadata sls_receiver_header metadata + * @param datapointer pointer to data + * @param revDatasize new data size in bytes after the callback. + * This will be the size written/streamed. (only smaller value is allowed). + * @param p pointer to object + */ +void GetData(char *metadata, char *datapointer, uint32_t &revDatasize, + void *p) { + slsDetectorDefs::sls_receiver_header *header = + (slsDetectorDefs::sls_receiver_header *)metadata; + slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; + + std::cout << "#### " << detectorHeader.row << " GetData: ####\n" + << "frameNumber: " << detectorHeader.frameNumber + << "\t\texpLength: " << detectorHeader.expLength + << "\t\tpacketNumber: " << detectorHeader.packetNumber + << "\t\tbunchId: " << detectorHeader.bunchId + << "\t\ttimestamp: " << detectorHeader.timestamp + << "\t\tmodId: " << detectorHeader.modId + << "\t\trow: " << detectorHeader.row + << "\t\tcolumn: " << detectorHeader.column + << "\t\treserved: " << detectorHeader.reserved + << "\t\tdebug: " << detectorHeader.debug + << "\t\troundRNumber: " << detectorHeader.roundRNumber + << "\t\tdetType: " << detectorHeader.detType << "\t\tversion: " + << detectorHeader.version + //<< "\t\tpacketsMask: " << header->packetsMask.to_string() + << "\t\tfirstbytedata: " << std::hex << "0x" + << ((uint8_t)(*((uint8_t *)(datapointer)))) + << "\t\tdatsize: " << revDatasize << "\n\n"; + + // if data is modified, eg ROI and size is reduced + revDatasize = 26000; +} + +int main(int argc, char *argv[]) { + + sem_init(&semaphore, 1, 0); + + std::cout << "Created [ Tid: " << syscall(SYS_gettid) << " ]"; + + // Catch signal SIGINT to close files and call destructors properly + struct sigaction sa; + sa.sa_flags = 0; // no flags + sa.sa_handler = sigInterruptHandler; // handler function + sigemptyset(&sa.sa_mask); // dont block additional signals during invocation + // of handler + if (sigaction(SIGINT, &sa, nullptr) == -1) { + std::cout << "Could not set handler function for SIGINT"; + } + + // if socket crash, ignores SISPIPE, prevents global signal handler + // subsequent read/write to socket gives error - must handle locally + struct sigaction asa; + asa.sa_flags = 0; // no flags + asa.sa_handler = SIG_IGN; // handler function + sigemptyset(&asa.sa_mask); // dont block additional signals during + // invocation of handler + if (sigaction(SIGPIPE, &asa, nullptr) == -1) { + std::cout << "Could not set handler function for SIGPIPE"; + } + + try { + sls::Receiver r(argc, argv); + + // register call backs + /** - Call back for start acquisition */ + std::cout << "Registering StartAcq()"; + r.registerCallBackStartAcquisition(StartAcq, nullptr); + + /** - Call back for acquisition finished */ + std::cout << "Registering AcquisitionFinished()"; + r.registerCallBackAcquisitionFinished(AcquisitionFinished, nullptr); + + /* - Call back for raw data */ + std::cout << "Registering GetData()"; + r.registerCallBackRawDataReady(GetData, nullptr); + + std::cout << "[ Press \'Ctrl+c\' to exit ]"; + sem_wait(&semaphore); + sem_destroy(&semaphore); + } catch (...) { + // pass + } + std::cout << "Exiting [ Tid: " << syscall(SYS_gettid) << " ]"; + std::cout << "Exiting Receiver"; + return 0; +} From f19bc8880a174558293d9dd4e4f11ebeda310abe Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 13:34:51 +0100 Subject: [PATCH 2/9] handling start acq call back exception --- slsReceiverSoftware/src/Implementation.cpp | 13 +++++++++---- slsReceiverSoftware/src/ReceiverApp2.cpp | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 711576688..d1a880b3f 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -497,10 +497,15 @@ void Implementation::startReceiver() { // callbacks if (startAcquisitionCallBack) { - startAcquisitionCallBack(filePath, fileName, fileIndex, - (generalData->imageSize) + - (generalData->fifoBufferHeaderSize), - pStartAcquisition); + try { + startAcquisitionCallBack(filePath, fileName, fileIndex, + (generalData->imageSize) + + (generalData->fifoBufferHeaderSize), + pStartAcquisition); + } catch (const std::exception &e) { + throw sls::RuntimeError("Start Acquisition Callback Error: " + + std::string(e.what())); + } if (rawDataReadyCallBack != nullptr) { LOG(logINFO) << "Data Write has been defined externally"; } diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp index 75ef4f749..8b3e10327 100644 --- a/slsReceiverSoftware/src/ReceiverApp2.cpp +++ b/slsReceiverSoftware/src/ReceiverApp2.cpp @@ -28,7 +28,8 @@ int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, << " filename:" << filename << " fileindex:" << fileindex << " datasize:" << datasize << " ####"; - throw std::runtime_error("start acquisition call back error"); + throw std::runtime_error( + "Throwing exception from start acquisition call back"); return 0; } From a36a294515ad847be3d876b79527b0270efb7ed9 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 13:38:22 +0100 Subject: [PATCH 3/9] handling acquisition finished callback exception --- slsReceiverSoftware/src/Implementation.cpp | 13 ++++++++++--- slsReceiverSoftware/src/ReceiverApp2.cpp | 7 +++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index d1a880b3f..54ef2eafb 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -599,9 +599,16 @@ void Implementation::stopReceiver() { LOG(logINFORED) << "Deactivated Receiver"; } // callback - if (acquisitionFinishedCallBack) - acquisitionFinishedCallBack((tot / numThreads), - pAcquisitionFinished); + if (acquisitionFinishedCallBack) { + try { + acquisitionFinishedCallBack((tot / numThreads), + pAcquisitionFinished); + } catch (const std::exception &e) { + throw sls::RuntimeError( + "Acquisition Finished Callback Error: " + + std::string(e.what())); + } + } } // change status diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp index 8b3e10327..908e13c66 100644 --- a/slsReceiverSoftware/src/ReceiverApp2.cpp +++ b/slsReceiverSoftware/src/ReceiverApp2.cpp @@ -28,8 +28,8 @@ int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, << " filename:" << filename << " fileindex:" << fileindex << " datasize:" << datasize << " ####"; - throw std::runtime_error( - "Throwing exception from start acquisition call back"); + /*throw std::runtime_error( + "Throwing exception from start acquisition call back");*/ return 0; } @@ -40,6 +40,9 @@ int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, */ void AcquisitionFinished(uint64_t frames, void *p) { std::cout << "#### AcquisitionFinished: frames:" << frames << " ####"; + + throw std::runtime_error( + "Throwing exception from acquisition finished call back"); } /** From 918f3f3fde05f15c0473484bb6078d5de1ee01f2 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 13:53:54 +0100 Subject: [PATCH 4/9] handling get data rxr callback exceptions --- slsReceiverSoftware/src/DataProcessor.cpp | 70 +++++++++++++---------- slsReceiverSoftware/src/ReceiverApp2.cpp | 8 ++- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index db0992dfb..173bdffbf 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -24,18 +24,18 @@ const std::string DataProcessor::TypeName = "DataProcessor"; DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo *f, fileFormat *ftype, bool fwenable, bool *mfwenable, - bool *dsEnable, uint32_t *freq, - uint32_t *timer, uint32_t *sfnum, bool *fp, - bool *act, bool *depaden, bool *sm, - std::vector *cdl, int *cdo, int *cad) + bool *dsEnable, uint32_t *freq, uint32_t *timer, + uint32_t *sfnum, bool *fp, bool *act, + bool *depaden, bool *sm, std::vector *cdl, + int *cdo, int *cad) : ThreadObject(ind, TypeName), fifo(f), myDetectorType(dtype), dataStreamEnable(dsEnable), fileFormatType(ftype), fileWriteEnable(fwenable), masterFileWriteEnable(mfwenable), streamingFrequency(freq), streamingTimerInMs(timer), streamingStartFnum(sfnum), activated(act), - deactivatedPaddingEnable(depaden), silentMode(sm), - framePadding(fp), ctbDbitList(cdl), ctbDbitOffset(cdo), - ctbAnalogDataBytes(cad), firstStreamerFrame(false) { + deactivatedPaddingEnable(depaden), silentMode(sm), framePadding(fp), + ctbDbitList(cdl), ctbDbitOffset(cdo), ctbAnalogDataBytes(cad), + firstStreamerFrame(false) { LOG(logDEBUG) << "DataProcessor " << ind << " created"; memset((void *)&timerBegin, 0, sizeof(timespec)); } @@ -185,12 +185,17 @@ void DataProcessor::ThreadExecution() { return; } - uint64_t fnum = ProcessAnImage(buffer); - + uint64_t fnum = 0; + try { + fnum = ProcessAnImage(buffer); + } catch (const std::exception &e) { + fifo->FreeAddress(buffer); + return; + } // stream (if time/freq to stream) or free if (*dataStreamEnable && SendToStreamer()) { - // if first frame to stream, add frame index to fifo header (might not - // be the first) + // if first frame to stream, add frame index to fifo header (might + // not be the first) if (firstStreamerFrame) { firstStreamerFrame = false; (*((uint32_t *)(buffer + FIFO_DATASIZE_NUMBYTES))) = @@ -256,22 +261,27 @@ uint64_t DataProcessor::ProcessAnImage(char *buf) { RearrangeDbitData(buf); } - // normal call back - if (rawDataReadyCallBack != nullptr) { - rawDataReadyCallBack((char *)rheader, - buf + FIFO_HEADER_NUMBYTES + - sizeof(sls_receiver_header), - (uint32_t)(*((uint32_t *)buf)), pRawDataReady); - } + try { + // normal call back + if (rawDataReadyCallBack != nullptr) { + rawDataReadyCallBack((char *)rheader, + buf + FIFO_HEADER_NUMBYTES + + sizeof(sls_receiver_header), + (uint32_t)(*((uint32_t *)buf)), pRawDataReady); + } - // call back with modified size - else if (rawDataModifyReadyCallBack != nullptr) { - auto revsize = (uint32_t)(*((uint32_t *)buf)); - rawDataModifyReadyCallBack((char *)rheader, - buf + FIFO_HEADER_NUMBYTES + - sizeof(sls_receiver_header), - revsize, pRawDataReady); - (*((uint32_t *)buf)) = revsize; + // call back with modified size + else if (rawDataModifyReadyCallBack != nullptr) { + auto revsize = (uint32_t)(*((uint32_t *)buf)); + rawDataModifyReadyCallBack((char *)rheader, + buf + FIFO_HEADER_NUMBYTES + + sizeof(sls_receiver_header), + revsize, pRawDataReady); + (*((uint32_t *)buf)) = revsize; + } + } catch (const std::exception &e) { + throw sls::RuntimeError("Get Data Callback Error: " + + std::string(e.what())); } // write to file @@ -284,8 +294,8 @@ uint64_t DataProcessor::ProcessAnImage(char *buf) { // from previous call back fnum - firstIndex, nump); } catch (const sls::RuntimeError &e) { - ; // ignore write exception for now (TODO: send error message via - // stopReceiver tcp) + ; // ignore write exception for now (TODO: send error message + // via stopReceiver tcp) } } return fnum; @@ -385,8 +395,8 @@ void DataProcessor::PadMissingPackets(char *buf) { // missing packet switch (myDetectorType) { - // for gotthard, 1st packet: 4 bytes fnum, CACA + - // CACA, 639*2 bytes data + // for gotthard, 1st packet: 4 bytes fnum, CACA + CACA, 639*2 bytes + // data // 2nd packet: 4 bytes fnum, previous 1*2 bytes data + // 640*2 bytes data !! case GOTTHARD: diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp index 908e13c66..252d2f12b 100644 --- a/slsReceiverSoftware/src/ReceiverApp2.cpp +++ b/slsReceiverSoftware/src/ReceiverApp2.cpp @@ -41,8 +41,8 @@ int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, void AcquisitionFinished(uint64_t frames, void *p) { std::cout << "#### AcquisitionFinished: frames:" << frames << " ####"; - throw std::runtime_error( - "Throwing exception from acquisition finished call back"); + /*throw std::runtime_error( + "Throwing exception from acquisition finished call back");*/ } /** @@ -75,6 +75,10 @@ void GetData(char *metadata, char *datapointer, uint32_t datasize, void *p) { << "\t\tfirstbytedata: " << std::hex << "0x" << ((uint8_t)(*((uint8_t *)(datapointer)))) << "\t\tdatsize: " << datasize << "\n\n"; + + if (detectorHeader.frameNumber % 2 == 0) { + throw std::runtime_error("Throwing exception from Get Data call back"); + } } /** From 146d605d19ee9e06355ef7bc31561603a8fc050f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 14:01:53 +0100 Subject: [PATCH 5/9] gui callback exception caught --- slsDetectorGui/src/qDrawPlot.cpp | 2 +- slsDetectorSoftware/src/DetectorImpl.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 2f6cbcfc2..386c09892 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -1,8 +1,8 @@ #include "qDrawPlot.h" #include "SlsQt1DPlot.h" #include "SlsQt2DPlot.h" -#include "sls/detectorData.h" #include "qCloneWidget.h" +#include "sls/detectorData.h" #include "sls/ToString.h" #include "sls/detectorData.h" diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index f9c4b33e2..5c5e029bc 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -660,11 +660,14 @@ void DetectorImpl::readFrameFromReceiver() { nDetActualPixelsX, nDetActualPixelsY, callbackImage, imagesize, dynamicRange, currentFileIndex, completeImage); - - dataReady( - thisData, currentFrameIndex, - ((dynamicRange == 32 && eiger) ? currentSubFrameIndex : -1), - pCallbackArg); + try { + dataReady( + thisData, currentFrameIndex, + ((dynamicRange == 32 && eiger) ? currentSubFrameIndex : -1), + pCallbackArg); + } catch (const std::exception &e) { + LOG(logERROR) << "Exception caught from callback: " << e.what(); + } delete thisData; } } From 5c71dd72461f0c322ee677a8b45535c6d34c78ba Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 15:28:39 +0100 Subject: [PATCH 6/9] handling acquisitionfinished callback --- slsReceiverSoftware/src/Implementation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 54ef2eafb..3c00add2e 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -604,6 +604,10 @@ void Implementation::stopReceiver() { acquisitionFinishedCallBack((tot / numThreads), pAcquisitionFinished); } catch (const std::exception &e) { + // change status + status = IDLE; + LOG(logINFO) << "Receiver Stopped"; + LOG(logINFO) << "Status: " << sls::ToString(status); throw sls::RuntimeError( "Acquisition Finished Callback Error: " + std::string(e.what())); From 40f6eb8edeb61989cdf47cd044a57d8aed2d8dde Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 17 Nov 2020 15:33:09 +0100 Subject: [PATCH 7/9] WIP --- slsDetectorSoftware/src/CmdLineApp.cpp | 6 +++--- slsDetectorSoftware/src/DetectorImpl.cpp | 4 ++++ slsReceiverSoftware/src/ReceiverApp2.cpp | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/slsDetectorSoftware/src/CmdLineApp.cpp b/slsDetectorSoftware/src/CmdLineApp.cpp index ad289097b..bf010971e 100644 --- a/slsDetectorSoftware/src/CmdLineApp.cpp +++ b/slsDetectorSoftware/src/CmdLineApp.cpp @@ -64,13 +64,13 @@ int main(int argc, char *argv[]) { } try { - // How big should this try block be? sls::Detector det(parser.multi_id()); sls::CmdProxy proxy(&det); proxy.Call(parser.command(), parser.arguments(), parser.detector_id(), action); } catch (const sls::RuntimeError &e) { - // OK to catch and do nothing since this will print the error message - // and command line app will anyway exit + exit(EXIT_FAILURE); } + + exit(EXIT_SUCCESS); } \ No newline at end of file diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 5c5e029bc..daa81f997 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1126,6 +1126,10 @@ int DetectorImpl::acquire() { (end.tv_nsec - begin.tv_nsec) / 1000000000.0) << " seconds"; } catch (...) { + if (dataProcessingThread.joinable()){ + setJoinThreadFlag(true); + dataProcessingThread.join(); + } setAcquiringFlag(false); throw; } diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp index 252d2f12b..0371fb368 100644 --- a/slsReceiverSoftware/src/ReceiverApp2.cpp +++ b/slsReceiverSoftware/src/ReceiverApp2.cpp @@ -28,8 +28,8 @@ int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, << " filename:" << filename << " fileindex:" << fileindex << " datasize:" << datasize << " ####"; - /*throw std::runtime_error( - "Throwing exception from start acquisition call back");*/ + // throw std::runtime_error( + // "Throwing exception from start acquisition call back"); return 0; } From ddf43dbd24b19002be3633e8fb43e0368a637499 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 16:12:30 +0100 Subject: [PATCH 8/9] fix for Eiger firmware sending bad packets of size 8 bytes when doing a stop --- slsSupportLib/src/UdpRxSocket.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/slsSupportLib/src/UdpRxSocket.cpp b/slsSupportLib/src/UdpRxSocket.cpp index 0d9d3c694..90ebf284d 100644 --- a/slsSupportLib/src/UdpRxSocket.cpp +++ b/slsSupportLib/src/UdpRxSocket.cpp @@ -70,6 +70,12 @@ ssize_t UdpRxSocket::ReceiveDataOnly(char *dst) noexcept { LOG(logWARNING) << "Got header pkg"; r = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); } + // temporary workaround for Eiger firmware (stop sends bad packets of size 8 + // bytes) + if (r == 8) { + LOG(logWARNING) << "Ignoring bad packet of size 8 bytes"; + r = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); + } return r; } From a534271affdec31e5392a2643890c9b86f318ed7 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 17 Nov 2020 16:21:39 +0100 Subject: [PATCH 9/9] back to normal receiver --- slsReceiverSoftware/CMakeLists.txt | 2 +- slsReceiverSoftware/src/ReceiverApp2.cpp | 174 ----------------------- 2 files changed, 1 insertion(+), 175 deletions(-) delete mode 100644 slsReceiverSoftware/src/ReceiverApp2.cpp diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index ce6284edd..ab08c243d 100755 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -86,7 +86,7 @@ endif() add_executable(slsReceiver - src/ReceiverApp2.cpp) + src/ReceiverApp.cpp) set_target_properties(slsReceiver PROPERTIES diff --git a/slsReceiverSoftware/src/ReceiverApp2.cpp b/slsReceiverSoftware/src/ReceiverApp2.cpp deleted file mode 100644 index 0371fb368..000000000 --- a/slsReceiverSoftware/src/ReceiverApp2.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include - -#include //SIGINT -#include -#include -#include -#include - -sem_t semaphore; - -void sigInterruptHandler(int p) { sem_post(&semaphore); } - -/** - * Start Acquisition Call back - * slsReceiver writes data if file write enabled. - * Users get data to write using call back if registerCallBackRawDataReady is - * registered. - * @param filepath file path - * @param filename file name - * @param fileindex file index - * @param datasize data size in bytes - * @param p pointer to object - * \returns ignored - */ -int StartAcq(std::string filepath, std::string filename, uint64_t fileindex, - uint32_t datasize, void *p) { - std::cout << "#### StartAcq: filepath:" << filepath - << " filename:" << filename << " fileindex:" << fileindex - << " datasize:" << datasize << " ####"; - - // throw std::runtime_error( - // "Throwing exception from start acquisition call back"); - return 0; -} - -/** - * Acquisition Finished Call back - * @param frames Number of frames caught - * @param p pointer to object - */ -void AcquisitionFinished(uint64_t frames, void *p) { - std::cout << "#### AcquisitionFinished: frames:" << frames << " ####"; - - /*throw std::runtime_error( - "Throwing exception from acquisition finished call back");*/ -} - -/** - * Get Receiver Data Call back and prints the header for each image call back. - * @param metadata sls_receiver_header metadata - * @param datapointer pointer to data - * @param datasize data size in bytes. - * @param p pointer to object - */ -void GetData(char *metadata, char *datapointer, uint32_t datasize, void *p) { - slsDetectorDefs::sls_receiver_header *header = - (slsDetectorDefs::sls_receiver_header *)metadata; - slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; - - std::cout << "#### " << detectorHeader.row << " GetData: ####\n" - << "frameNumber: " << detectorHeader.frameNumber - << "\t\texpLength: " << detectorHeader.expLength - << "\t\tpacketNumber: " << detectorHeader.packetNumber - << "\t\tbunchId: " << detectorHeader.bunchId - << "\t\ttimestamp: " << detectorHeader.timestamp - << "\t\tmodId: " << detectorHeader.modId - << "\t\trow: " << detectorHeader.row - << "\t\tcolumn: " << detectorHeader.column - << "\t\treserved: " << detectorHeader.reserved - << "\t\tdebug: " << detectorHeader.debug - << "\t\troundRNumber: " << detectorHeader.roundRNumber - << "\t\tdetType: " << detectorHeader.detType << "\t\tversion: " - << detectorHeader.version - //<< "\t\tpacketsMask: " << header->packetsMask.to_string() - << "\t\tfirstbytedata: " << std::hex << "0x" - << ((uint8_t)(*((uint8_t *)(datapointer)))) - << "\t\tdatsize: " << datasize << "\n\n"; - - if (detectorHeader.frameNumber % 2 == 0) { - throw std::runtime_error("Throwing exception from Get Data call back"); - } -} - -/** - * Get Receiver Data Call back (modified) and prints headers for each image call - * back. - * @param metadata sls_receiver_header metadata - * @param datapointer pointer to data - * @param revDatasize new data size in bytes after the callback. - * This will be the size written/streamed. (only smaller value is allowed). - * @param p pointer to object - */ -void GetData(char *metadata, char *datapointer, uint32_t &revDatasize, - void *p) { - slsDetectorDefs::sls_receiver_header *header = - (slsDetectorDefs::sls_receiver_header *)metadata; - slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; - - std::cout << "#### " << detectorHeader.row << " GetData: ####\n" - << "frameNumber: " << detectorHeader.frameNumber - << "\t\texpLength: " << detectorHeader.expLength - << "\t\tpacketNumber: " << detectorHeader.packetNumber - << "\t\tbunchId: " << detectorHeader.bunchId - << "\t\ttimestamp: " << detectorHeader.timestamp - << "\t\tmodId: " << detectorHeader.modId - << "\t\trow: " << detectorHeader.row - << "\t\tcolumn: " << detectorHeader.column - << "\t\treserved: " << detectorHeader.reserved - << "\t\tdebug: " << detectorHeader.debug - << "\t\troundRNumber: " << detectorHeader.roundRNumber - << "\t\tdetType: " << detectorHeader.detType << "\t\tversion: " - << detectorHeader.version - //<< "\t\tpacketsMask: " << header->packetsMask.to_string() - << "\t\tfirstbytedata: " << std::hex << "0x" - << ((uint8_t)(*((uint8_t *)(datapointer)))) - << "\t\tdatsize: " << revDatasize << "\n\n"; - - // if data is modified, eg ROI and size is reduced - revDatasize = 26000; -} - -int main(int argc, char *argv[]) { - - sem_init(&semaphore, 1, 0); - - std::cout << "Created [ Tid: " << syscall(SYS_gettid) << " ]"; - - // Catch signal SIGINT to close files and call destructors properly - struct sigaction sa; - sa.sa_flags = 0; // no flags - sa.sa_handler = sigInterruptHandler; // handler function - sigemptyset(&sa.sa_mask); // dont block additional signals during invocation - // of handler - if (sigaction(SIGINT, &sa, nullptr) == -1) { - std::cout << "Could not set handler function for SIGINT"; - } - - // if socket crash, ignores SISPIPE, prevents global signal handler - // subsequent read/write to socket gives error - must handle locally - struct sigaction asa; - asa.sa_flags = 0; // no flags - asa.sa_handler = SIG_IGN; // handler function - sigemptyset(&asa.sa_mask); // dont block additional signals during - // invocation of handler - if (sigaction(SIGPIPE, &asa, nullptr) == -1) { - std::cout << "Could not set handler function for SIGPIPE"; - } - - try { - sls::Receiver r(argc, argv); - - // register call backs - /** - Call back for start acquisition */ - std::cout << "Registering StartAcq()"; - r.registerCallBackStartAcquisition(StartAcq, nullptr); - - /** - Call back for acquisition finished */ - std::cout << "Registering AcquisitionFinished()"; - r.registerCallBackAcquisitionFinished(AcquisitionFinished, nullptr); - - /* - Call back for raw data */ - std::cout << "Registering GetData()"; - r.registerCallBackRawDataReady(GetData, nullptr); - - std::cout << "[ Press \'Ctrl+c\' to exit ]"; - sem_wait(&semaphore); - sem_destroy(&semaphore); - } catch (...) { - // pass - } - std::cout << "Exiting [ Tid: " << syscall(SYS_gettid) << " ]"; - std::cout << "Exiting Receiver"; - return 0; -}