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 2246a6c17..76dd085d0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -65,6 +65,9 @@ removed unused function readDataFile/writeDataFile from file_utils.h changed api: datastream=>udp_datastream, set/getDatastream=>set/getUDPDatastream also implemetned for jungfrau, moench at receiver side (top/bottom) +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 40c48012e..647b77974 100644 --- a/python/src/detector.cpp +++ b/python/src/detector.cpp @@ -1099,6 +1099,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/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh index 8cfb78f9a..0b722d668 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 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_datastream 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 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_datastream 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 @@ -2312,6 +2312,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 374915850..fc4ce973e 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 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_datastream 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 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_datastream 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 @@ -2236,6 +2236,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 6df21ba62..cf634be6d 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 a0bf64de5..385cf4a43 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -9070,6 +9070,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 d1ca3ecc4..969320cf3 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1190,6 +1190,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 bd5628c74..64e233420 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -11059,6 +11059,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 16e45fc7b..75297d84e 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -268,6 +268,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); @@ -639,6 +640,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 60200240c..121b144d6 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -1654,6 +1654,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 d087801cb..0150a0ba0 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 1e2f55290..2a89b8961 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 0256adf94..f4db5c6cd 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 e2c9c150c..9e33d9abb 100644 --- a/slsDetectorSoftware/src/inferAction.cpp +++ b/slsDetectorSoftware/src/inferAction.cpp @@ -2923,6 +2923,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 56e65e100..1e3c4f3c3 100644 --- a/slsDetectorSoftware/src/inferAction.h +++ b/slsDetectorSoftware/src/inferAction.h @@ -219,6 +219,7 @@ class InferAction { int rx_start(); int rx_status(); int rx_stop(); + int rx_streamdummyheader(); int rx_tcpport(); int rx_threads(); int rx_udpsocksize(); @@ -555,6 +556,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 3d7fdb9f8..b6e3253f9 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; @@ -1086,14 +1086,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 ca1230c13..07ba77a7d 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 3a3b5b45b..1c2649d66 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 4a1999396..88c9de797 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/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index 1678c3a8a..0b1b66ae6 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, @@ -789,7 +789,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";