diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 8d259d752..fd8a62b0a 100644 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -38,17 +38,11 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { * @param act pointer to activated * @param depaden pointer to deactivated padding enable * @param sm pointer to silent mode - * @param dataReadycb pointer to data ready call back function - * @param dataModifyReadycb pointer to data ready call back function with modified - * @param pDataReadycb pointer to arguments of data ready call back function. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ DataProcessor(int ind, detectorType dtype, Fifo* f, fileFormat* ftype, bool fwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - bool* fp, bool* act, bool* depaden, bool* sm, - void (*dataReadycb)(char*, char*, uint32_t, void*), - void (*dataModifyReadycb)(char*, char*, uint32_t &, void*), - void *pDataReadycb); + bool* fp, bool* act, bool* depaden, bool* sm); /** * Destructor @@ -203,6 +197,27 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { */ void SetPixelDimension(); + /** + * Call back for raw data + * args to raw data ready callback are + * sls_receiver_header frame metadata + * dataPointer is the pointer to the data + * dataSize in bytes is the size of the data in bytes. + */ + void registerCallBackRawDataReady(void (*func)(char* , + char*, uint32_t, void*),void *arg); + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * sls_receiver_header frame metadata + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. + * Can be modified to the new size to be written/streamed. (only smaller value). + */ + void registerCallBackRawDataModifyReady(void (*func)(char* , + char*, uint32_t &,void*),void *arg); + diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index e4e3051b1..252d69dad 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -26,10 +26,7 @@ DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo* f, fileFormat* ftype, bool fwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - bool* fp, bool* act, bool* depaden, bool* sm, - void (*dataReadycb)(char*, char*, uint32_t, void*), - void (*dataModifyReadycb)(char*, char*, uint32_t &, void*), - void *pDataReadycb) : + bool* fp, bool* act, bool* depaden, bool* sm) : ThreadObject(ind), runningFlag(0), @@ -56,10 +53,7 @@ DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo* f, firstMeasurementIndex(0), numTotalFramesCaught(0), numFramesCaught(0), - currentFrameIndex(0), - rawDataReadyCallBack(dataReadycb), - rawDataModifyReadyCallBack(dataModifyReadycb), - pRawDataReady(pDataReadycb) + currentFrameIndex(0) { if(ThreadObject::CreateThread() == FAIL) throw std::exception(); @@ -434,6 +428,19 @@ void DataProcessor::SetPixelDimension() { } } +void DataProcessor::registerCallBackRawDataReady(void (*func)(char* , + char*, uint32_t, void*),void *arg) { + rawDataReadyCallBack=func; + pRawDataReady=arg; +} + +void DataProcessor::registerCallBackRawDataModifyReady(void (*func)(char* , + char*, uint32_t&, void*),void *arg) { + rawDataModifyReadyCallBack=func; + pRawDataReady=arg; +} + + void DataProcessor::PadMissingPackets(char* buf) { FILE_LOG(logDEBUG) << index << ": Padding Missing Packets"; diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index f4ffb5162..0d212ed19 100644 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -946,8 +946,7 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) { dataProcessor.push_back(sls::make_unique(i, myDetectorType, fifo_ptr, &fileFormatType, fileWriteEnable, &dataStreamEnable, &gapPixelsEnable, &dynamicRange, &streamingFrequency, &streamingTimerInMs, - &framePadding, &activated, &deactivatedPaddingEnable, &silentMode, - rawDataReadyCallBack, rawDataModifyReadyCallBack, pRawDataReady)); + &framePadding, &activated, &deactivatedPaddingEnable, &silentMode)); } catch (...) { FILE_LOG(logERROR) << "Could not create listener/dataprocessor threads (index:" << i << ")"; @@ -1222,12 +1221,16 @@ void slsReceiverImplementation::registerCallBackRawDataReady(void (*func)(char* char*, uint32_t, void*),void *arg) { rawDataReadyCallBack=func; pRawDataReady=arg; + for (const auto& it : dataProcessor) + it->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); } void slsReceiverImplementation::registerCallBackRawDataModifyReady(void (*func)(char* , char*, uint32_t&, void*),void *arg) { rawDataModifyReadyCallBack=func; pRawDataReady=arg; + for (const auto& it : dataProcessor) + it->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); } diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 777550b07..88a68be5b 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -597,19 +597,21 @@ int slsReceiverTCPIPInterface::set_detector_type(){ if(ret == OK) { if(receiver == nullptr){ receiver = new slsReceiverImplementation(); - if(startAcquisitionCallBack) - receiver->registerCallBackStartAcquisition(startAcquisitionCallBack,pStartAcquisition); - if(acquisitionFinishedCallBack) - receiver->registerCallBackAcquisitionFinished(acquisitionFinishedCallBack,pAcquisitionFinished); - if(rawDataReadyCallBack) - receiver->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); - if(rawDataModifyReadyCallBack) - receiver->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); } myDetectorType = arg; ret = receiver->setDetectorType(myDetectorType); retval = myDetectorType; + // callbacks after (in setdetectortype, the object is reinitialized) + if(startAcquisitionCallBack) + receiver->registerCallBackStartAcquisition(startAcquisitionCallBack,pStartAcquisition); + if(acquisitionFinishedCallBack) + receiver->registerCallBackAcquisitionFinished(acquisitionFinishedCallBack,pAcquisitionFinished); + if(rawDataReadyCallBack) + receiver->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); + if(rawDataModifyReadyCallBack) + receiver->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); + // client has started updating receiver, update ip if (!lockStatus) strcpy(mySock->lastClientIP, mySock->thisClientIP);