diff --git a/.github/workflows/conda_python.yaml b/.github/workflows/conda_python.yaml index 86c8b3907..18d18e62e 100644 --- a/.github/workflows/conda_python.yaml +++ b/.github/workflows/conda_python.yaml @@ -33,7 +33,7 @@ jobs: run: conda config --set anaconda_upload no - name: Build - run: conda-build conda-recipes/python-client --output-folder build_output + run: conda-build conda-recipes/python-client --output-folder build_output - name: Upload all Conda packages uses: actions/upload-artifact@v7 diff --git a/RELEASE.md b/RELEASE.md index 7213b631d..c67a67438 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -62,6 +62,9 @@ support for building rpms removed unused function readDataFile/writeDataFile from file_utils.h +added rx_streamdummyheader to send the zmq dummy header any time. Allows pre-configuring zmq processing before acq begins. + + 2 On-board Detector Server Compatibility ========================================== diff --git a/python/src/detector.cpp b/python/src/detector.cpp index ff14eaafa..482976edc 100644 --- a/python/src/detector.cpp +++ b/python/src/detector.cpp @@ -1083,6 +1083,10 @@ void init_det(py::module &m) { CppDetectorApi.def("setRxZmqHwm", (void (Detector::*)(const int)) & Detector::setRxZmqHwm, py::arg()); + CppDetectorApi.def("streamRxDummyHeader", + (void (Detector::*)(sls::Positions) const) & + Detector::streamRxDummyHeader, + py::arg() = Positions{}); CppDetectorApi.def("getSubExptime", (Result(Detector::*)(sls::Positions) const) & Detector::getSubExptime, diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 86d43dc66..54ffffbfd 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -620,7 +620,6 @@ void qDrawPlot::StartAcquisition() { "qDrawPlot::StartAcquisition"); } - QtConcurrent::run(this, &qDrawPlot::AcquireThread); LOG(logDEBUG) << "End of Starting Acquisition in qDrawPlot"; diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh index 433bd33d4..0fdd93044 100644 --- a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh @@ -80,7 +80,7 @@ _sd() { local IS_PATH=0 -local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " +local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " __acquire() { FCN_RETURN="" return 0 @@ -2329,6 +2329,10 @@ __rx_stop() { FCN_RETURN="" return 0 } +__rx_streamdummyheader() { +FCN_RETURN="" +return 0 +} __rx_tcpport() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh index 953f971d2..3da9f237e 100644 --- a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh @@ -4,7 +4,7 @@ _sd() { -local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " +local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " __acquire() { FCN_RETURN="" return 0 @@ -2253,6 +2253,10 @@ __rx_stop() { FCN_RETURN="" return 0 } +__rx_streamdummyheader() { +FCN_RETURN="" +return 0 +} __rx_tcpport() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index 9e069f830..03a59ede3 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -1698,6 +1698,13 @@ rx_stop: PUT: function: stopReceiver +rx_streamdummyheader: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tSends ZMQ dummy header. The detector related fields are not set, the receiver related fields are set." + actions: + PUT: + function: streamRxDummyHeader + readout: inherit_actions: EXECUTE_SET_COMMAND_NOID help: "\n\t[Mythen3] Starts detector readout. Status changes to TRANSMITTING and automatically returns to idle at the end of readout." diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml index c29c13bc5..f284c0a2e 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -9117,6 +9117,28 @@ rx_stop: \ data file (if file write enabled)." infer_action: true template: true +rx_streamdummyheader: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: streamRxDummyHeader + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: rx_streamdummyheader + function_alias: rx_streamdummyheader + help: "\n\tSends ZMQ dummy header. The detector related fields are not set, the\ + \ receiver related fields are set." + infer_action: true + template: true rx_tcpport: actions: GET: diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index d107370de..1203b41ad 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1162,6 +1162,7 @@ class Detector { */ void setRxZmqHwm(const int limit); + void streamRxDummyHeader(Positions pos = {}) const; ///@} /** @name Eiger Specific */ diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp index 1e72aba17..b2212d542 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -11131,6 +11131,45 @@ std::string Caller::rx_stop(int action) { return os.str(); } +std::string Caller::rx_streamdummyheader(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << R"V0G0N( + Sends ZMQ dummy header. The detector related fields are not set, the receiver related fields are set. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->streamRxDummyHeader(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + std::string Caller::rx_tcpport(int action) { std::ostringstream os; diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h index d35ffe569..5b5633297 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -269,6 +269,7 @@ class Caller { std::string rx_start(int action); std::string rx_status(int action); std::string rx_stop(int action); + std::string rx_streamdummyheader(int action); std::string rx_tcpport(int action); std::string rx_threads(int action); std::string rx_udpsocksize(int action); @@ -640,6 +641,7 @@ class Caller { {"rx_start", &Caller::rx_start}, {"rx_status", &Caller::rx_status}, {"rx_stop", &Caller::rx_stop}, + {"rx_streamdummyheader", &Caller::rx_streamdummyheader}, {"rx_tcpport", &Caller::rx_tcpport}, {"rx_threads", &Caller::rx_threads}, {"rx_udpsocksize", &Caller::rx_udpsocksize}, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 01e9f5a44..1b15819f6 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -1636,6 +1636,10 @@ void Detector::setRxZmqHwm(const int limit) { } } +void Detector::streamRxDummyHeader(Positions pos) const { + pimpl->Parallel(&Module::streamRxDummyHeader, pos); +} + // Eiger Specific Result Detector::getSubExptime(Positions pos) const { diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index b83e3a52e..101cf6939 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1151,7 +1151,7 @@ int DetectorImpl::acquire() { setJoinThreadFlag(true); } else if (receiver) { while (numZmqRunning != 0) { - Parallel(&Module::restreamStopFromReceiver, {}); + Parallel(&Module::streamRxDummyHeader, {}); std::this_thread::sleep_for(std::chrono::milliseconds(200)); } } diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 17fe8841b..ecf9a4db0 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -993,15 +993,15 @@ void Module::stopAcquisition() { try { if (shm()->useReceiverFlag && getReceiverStreaming()) { if (detStatus == IDLE && getReceiverStatus() == IDLE) { - restreamStopFromReceiver(); + streamRxDummyHeader(); } } } catch (...) { } } -void Module::restreamStopFromReceiver() { - sendToReceiver(F_RESTREAM_STOP_FROM_RECEIVER); +void Module::streamRxDummyHeader() { + sendToReceiver(F_STREAM_RX_DUMMY_HEADER_FROM_RECEIVER); } void Module::startAndReadAll() { diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index cf4672c93..55fd6c0b9 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -215,7 +215,7 @@ class Module : public virtual slsDetectorDefs { void startAcquisition(); void startReadout(); void stopAcquisition(); - void restreamStopFromReceiver(); + void streamRxDummyHeader(); void startAndReadAll(); runStatus getRunStatus() const; runStatus getReceiverStatus() const; diff --git a/slsDetectorSoftware/src/inferAction.cpp b/slsDetectorSoftware/src/inferAction.cpp index af2ff6396..d3c8cd23d 100644 --- a/slsDetectorSoftware/src/inferAction.cpp +++ b/slsDetectorSoftware/src/inferAction.cpp @@ -2939,6 +2939,18 @@ int InferAction::rx_stop() { } } +int InferAction::rx_streamdummyheader() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + int InferAction::rx_tcpport() { if (args.size() == 0) { diff --git a/slsDetectorSoftware/src/inferAction.h b/slsDetectorSoftware/src/inferAction.h index c3be8f075..6baa59d66 100644 --- a/slsDetectorSoftware/src/inferAction.h +++ b/slsDetectorSoftware/src/inferAction.h @@ -220,6 +220,7 @@ class InferAction { int rx_start(); int rx_status(); int rx_stop(); + int rx_streamdummyheader(); int rx_tcpport(); int rx_threads(); int rx_udpsocksize(); @@ -556,6 +557,7 @@ class InferAction { {"rx_start", &InferAction::rx_start}, {"rx_status", &InferAction::rx_status}, {"rx_stop", &InferAction::rx_stop}, + {"rx_streamdummyheader", &InferAction::rx_streamdummyheader}, {"rx_tcpport", &InferAction::rx_tcpport}, {"rx_threads", &InferAction::rx_threads}, {"rx_udpsocksize", &InferAction::rx_udpsocksize}, diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 0c08534a8..9ce6b22be 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -166,7 +166,7 @@ int ClientInterface::functionTable(){ flist[F_GET_RECEIVER_STREAMING_PORT] = &ClientInterface::get_streaming_port; flist[F_SET_RECEIVER_SILENT_MODE] = &ClientInterface::set_silent_mode; flist[F_GET_RECEIVER_SILENT_MODE] = &ClientInterface::get_silent_mode; - flist[F_RESTREAM_STOP_FROM_RECEIVER] = &ClientInterface::restream_stop; + flist[F_STREAM_RX_DUMMY_HEADER_FROM_RECEIVER] = &ClientInterface::stream_rx_dummy_header; flist[F_SET_ADDITIONAL_JSON_HEADER] = &ClientInterface::set_additional_json_header; flist[F_GET_ADDITIONAL_JSON_HEADER] = &ClientInterface::get_additional_json_header; flist[F_RECEIVER_UDP_SOCK_BUF_SIZE] = &ClientInterface::set_udp_socket_buffer_size; @@ -1082,14 +1082,14 @@ int ClientInterface::get_silent_mode(Interface &socket) { return socket.sendResult(retval); } -int ClientInterface::restream_stop(Interface &socket) { +int ClientInterface::stream_rx_dummy_header(Interface &socket) { verifyIdle(socket); if (!impl()->getDataStreamEnable()) { throw RuntimeError( - "Could not restream stop packet as data Streaming is disabled"); + "Could not stream rx dummy header as data Streaming is disabled"); } else { LOG(logDEBUG1) << "Restreaming stop"; - impl()->restreamStop(); + impl()->streamRxDummyHeader(); } return socket.Send(OK); } diff --git a/slsReceiverSoftware/src/ClientInterface.h b/slsReceiverSoftware/src/ClientInterface.h index f2dbaa764..0486367e2 100644 --- a/slsReceiverSoftware/src/ClientInterface.h +++ b/slsReceiverSoftware/src/ClientInterface.h @@ -111,7 +111,7 @@ class ClientInterface : private virtual slsDetectorDefs { int get_streaming_port(ServerInterface &socket); int set_silent_mode(ServerInterface &socket); int get_silent_mode(ServerInterface &socket); - int restream_stop(ServerInterface &socket); + int stream_rx_dummy_header(ServerInterface &socket); int set_additional_json_header(ServerInterface &socket); int get_additional_json_header(ServerInterface &socket); int set_udp_socket_buffer_size(ServerInterface &socket); diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 8a8e83833..7e2826f4a 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -8,7 +8,6 @@ #include "DataStreamer.h" #include "Fifo.h" #include "GeneralData.h" -#include "sls/ZmqSocket.h" #include "sls/sls_detector_exceptions.h" #include @@ -30,6 +29,10 @@ void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; } void DataStreamer::SetFileIndex(uint64_t value) { fileIndex = value; } +void DataStreamer::SetFileName(const std::string &fname) { + fileNametoStream = fname; +} + void DataStreamer::SetNumberofPorts(xy np) { numPorts = np; } void DataStreamer::SetFlipRows(bool fd) { @@ -62,11 +65,10 @@ void DataStreamer::SetPortROI(ROI roi) { } } -void DataStreamer::ResetParametersforNewAcquisition(const std::string &fname) { +void DataStreamer::ResetParametersforNewAcquisition() { StopRunning(); startedFlag = false; firstIndex = 0; - fileNametoStream = fname; } void DataStreamer::RecordFirstIndex(uint64_t fnum, size_t firstImageIndex) { @@ -152,8 +154,7 @@ void DataStreamer::ProcessAnImage(sls_detector_header header, size_t size, uint64_t fnum = header.frameNumber; LOG(logDEBUG1) << "DataStreamer " << index << ": fnum:" << fnum; - if (!SendDataHeader(header, size, generalData->nPixelsX, - generalData->nPixelsY)) { + if (!SendDataHeader(header, size)) { LOG(logERROR) << "Could not send zmq header for fnum " << fnum << " and streamer " << index; } @@ -164,34 +165,47 @@ void DataStreamer::ProcessAnImage(sls_detector_header header, size_t size, } } -int DataStreamer::SendDummyHeader() { +zmqHeader DataStreamer::prepareRxZmqHeader() { zmqHeader zHeader; - zHeader.data = false; zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; + + // parameters coming from the receiver + zHeader.dynamicRange = generalData->dynamicRange; + zHeader.fileIndex = fileIndex; + zHeader.flipRows = static_cast(flipRows); + zHeader.fname = fileNametoStream; + zHeader.imageSize = generalData->imageSize; + if (generalData->detType == GOTTHARD2 && index != 0) { + zHeader.imageSize = generalData->vetoImageSize; + } + zHeader.ndetx = numPorts.x; + zHeader.ndety = numPorts.y; + zHeader.npixelsx = generalData->nPixelsX; + zHeader.npixelsy = generalData->nPixelsY; + zHeader.quad = quadEnable; + + // update local copy only if it was updated (to prevent locking each time) + if (isAdditionalJsonUpdated) { + std::lock_guard lock(additionalJsonMutex); + localAdditionalJsonHeader = additionalJsonHeader; + isAdditionalJsonUpdated = false; + } + zHeader.addJsonHeader = localAdditionalJsonHeader; + zHeader.rx_roi = portRoi.getIntArray(); + return zHeader; +} + +int DataStreamer::SendDummyHeader() { + zmqHeader zHeader = prepareRxZmqHeader(); + zHeader.data = false; return zmqSocket->SendHeader(index, zHeader); } -int DataStreamer::SendDataHeader(sls_detector_header header, uint32_t size, - uint32_t nx, uint32_t ny) { - zmqHeader zHeader; +int DataStreamer::SendDataHeader(sls_detector_header header, uint32_t size) { + zmqHeader zHeader = prepareRxZmqHeader(); zHeader.data = true; - zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; - uint64_t frameIndex = header.frameNumber - firstIndex; - uint64_t acquisitionIndex = header.frameNumber; - - zHeader.dynamicRange = generalData->dynamicRange; - zHeader.fileIndex = fileIndex; - zHeader.ndetx = numPorts.x; - zHeader.ndety = numPorts.y; - zHeader.npixelsx = nx; - zHeader.npixelsy = ny; - zHeader.imageSize = size; - zHeader.acqIndex = acquisitionIndex; - zHeader.frameIndex = frameIndex; - zHeader.progress = - 100 * ((double)(frameIndex + 1) / (double)(nTotalFrames)); - zHeader.fname = fileNametoStream; + // parameter from detector header zHeader.frameNumber = header.frameNumber; zHeader.expLength = header.expLength; zHeader.packetNumber = header.packetNumber; @@ -205,26 +219,24 @@ int DataStreamer::SendDataHeader(sls_detector_header header, uint32_t size, zHeader.detSpec4 = header.detSpec4; zHeader.detType = header.detType; zHeader.version = header.version; - zHeader.flipRows = static_cast(flipRows); - zHeader.quad = quadEnable; + + // parameter derived from header and receiver + uint64_t acquisitionIndex = header.frameNumber; + uint64_t frameIndex = header.frameNumber - firstIndex; + zHeader.acqIndex = acquisitionIndex; zHeader.completeImage = (header.packetNumber < generalData->packetsPerFrame ? false : true); - - // update local copy only if it was updated (to prevent locking each time) - if (isAdditionalJsonUpdated) { - std::lock_guard lock(additionalJsonMutex); - localAdditionalJsonHeader = additionalJsonHeader; - isAdditionalJsonUpdated = false; - } - zHeader.addJsonHeader = localAdditionalJsonHeader; - zHeader.rx_roi = portRoi.getIntArray(); + zHeader.frameIndex = frameIndex; + zHeader.imageSize = size; + zHeader.progress = + 100 * ((double)(frameIndex + 1) / (double)(nTotalFrames)); return zmqSocket->SendHeader(index, zHeader); } -void DataStreamer::RestreamStop() { +void DataStreamer::StreamRxDummyHeader() { if (!SendDummyHeader()) { - throw RuntimeError("Could not restream Dummy Header via ZMQ for port " + + throw RuntimeError("Could not stream Dummy Header via ZMQ for port " + std::to_string(zmqSocket->GetPortNumber())); } } diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index d8eaaabcf..f2f8dd1f9 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -10,6 +10,7 @@ */ #include "ThreadObject.h" +#include "sls/ZmqSocket.h" #include "sls/network_utils.h" #include @@ -32,6 +33,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { void SetGeneralData(GeneralData *g); void SetFileIndex(uint64_t value); + void SetFileName(const std::string &fname); void SetNumberofPorts(xy np); void SetFlipRows(bool fd); void SetQuadEnable(bool value); @@ -40,7 +42,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { SetAdditionalJsonHeader(const std::map &json); void SetPortROI(ROI roi); - void ResetParametersforNewAcquisition(const std::string &fname); + void ResetParametersforNewAcquisition(); /** * Creates Zmq Sockets * (throws an exception if it couldnt create zmq sockets) @@ -49,7 +51,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { */ void CreateZmqSockets(uint16_t port, int hwm); void CloseZmqSocket(); - void RestreamStop(); + void StreamRxDummyHeader(); private: /** @@ -71,18 +73,16 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { */ void ProcessAnImage(sls_detector_header header, size_t size, char *data); + zmqHeader prepareRxZmqHeader(); int SendDummyHeader(); /** * Create and send Json Header * @param rheader header of image * @param size data size (could have been modified in call back) - * @param nx number of pixels in x dim - * @param ny number of pixels in y dim * @returns 0 if error, else 1 */ - int SendDataHeader(sls_detector_header header, uint32_t size = 0, - uint32_t nx = 0, uint32_t ny = 0); + int SendDataHeader(sls_detector_header header, uint32_t size = 0); static const std::string TypeName; const GeneralData *generalData{nullptr}; diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 292c5df29..41cd95a56 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -842,10 +842,13 @@ void Implementation::shutDownUDPSockets() { it->ShutDownUDPSocket(); } -void Implementation::restreamStop() { - for (const auto &it : dataStreamer) - it->RestreamStop(); - LOG(logINFO) << "Restreaming Dummy Header via ZMQ successful"; +void Implementation::streamRxDummyHeader() { + std::string fnametostream = (filePath / fileName).string(); + for (const auto &it : dataStreamer) { + it->SetFileName(fnametostream); + it->StreamRxDummyHeader(); + } + LOG(logINFO) << "Streaming Dummy Header via ZMQ successful"; } void Implementation::ResetParametersforNewAcquisition() { @@ -856,8 +859,10 @@ void Implementation::ResetParametersforNewAcquisition() { if (dataStreamEnable) { std::string fnametostream = (filePath / fileName).string(); - for (const auto &it : dataStreamer) - it->ResetParametersforNewAcquisition(fnametostream); + for (const auto &it : dataStreamer) { + it->ResetParametersforNewAcquisition(); + it->SetFileName(fnametostream); + } } } diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index 3680cb84e..87b631e79 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -104,7 +104,7 @@ class Implementation : private virtual slsDetectorDefs { void stopReceiver(); void startReadout(); void shutDownUDPSockets(); - void restreamStop(); + void streamRxDummyHeader(); /************************************************** * * diff --git a/slsSupportLib/include/sls/file_utils.h b/slsSupportLib/include/sls/file_utils.h index 81aa3d19b..cc3f61201 100644 --- a/slsSupportLib/include/sls/file_utils.h +++ b/slsSupportLib/include/sls/file_utils.h @@ -11,7 +11,6 @@ namespace sls { - std::vector readBinaryFile(const std::string &fname, const std::string &errorPrefix); diff --git a/slsSupportLib/include/sls/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index c2fd7eb82..56db44c78 100755 --- a/slsSupportLib/include/sls/sls_detector_funcs.h +++ b/slsSupportLib/include/sls/sls_detector_funcs.h @@ -367,7 +367,7 @@ enum detFuncs { F_GET_RECEIVER_STREAMING_SRC_IP, F_SET_RECEIVER_SILENT_MODE, F_GET_RECEIVER_SILENT_MODE, - F_RESTREAM_STOP_FROM_RECEIVER, + F_STREAM_RX_DUMMY_HEADER_FROM_RECEIVER, F_SET_ADDITIONAL_JSON_HEADER, F_GET_ADDITIONAL_JSON_HEADER, F_RECEIVER_UDP_SOCK_BUF_SIZE, @@ -786,7 +786,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_RECEIVER_STREAMING_SRC_IP: return "F_GET_RECEIVER_STREAMING_SRC_IP - obsolete"; case F_SET_RECEIVER_SILENT_MODE: return "F_SET_RECEIVER_SILENT_MODE"; case F_GET_RECEIVER_SILENT_MODE: return "F_GET_RECEIVER_SILENT_MODE"; - case F_RESTREAM_STOP_FROM_RECEIVER: return "F_RESTREAM_STOP_FROM_RECEIVER"; + case F_STREAM_RX_DUMMY_HEADER_FROM_RECEIVER: return "F_STREAM_RX_DUMMY_HEADER_FROM_RECEIVER"; case F_SET_ADDITIONAL_JSON_HEADER: return "F_SET_ADDITIONAL_JSON_HEADER"; case F_GET_ADDITIONAL_JSON_HEADER: return "F_GET_ADDITIONAL_JSON_HEADER"; case F_RECEIVER_UDP_SOCK_BUF_SIZE: return "F_RECEIVER_UDP_SOCK_BUF_SIZE";