Merge branch 'developer' into dev/ctb/display_counter_images
Build on RHEL9 docker image / build (push) Successful in 3m50s
Build on RHEL8 docker image / build (push) Successful in 5m16s
Run Simulator Tests on local RHEL9 / build (push) Successful in 18m15s
Run Simulator Tests on local RHEL8 / build (push) Successful in 21m52s

This commit is contained in:
2026-06-10 16:36:19 +02:00
committed by GitHub
25 changed files with 188 additions and 69 deletions
+1 -1
View File
@@ -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
+3
View File
@@ -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
==========================================
+4
View File
@@ -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<sls::ns>(Detector::*)(sls::Positions) const) &
Detector::getSubExptime,
-1
View File
@@ -620,7 +620,6 @@ void qDrawPlot::StartAcquisition() {
"qDrawPlot::StartAcquisition");
}
QtConcurrent::run(this, &qDrawPlot::AcquireThread);
LOG(logDEBUG) << "End of Starting Acquisition in qDrawPlot";
@@ -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
@@ -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
@@ -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."
@@ -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:
@@ -1162,6 +1162,7 @@ class Detector {
*/
void setRxZmqHwm(const int limit);
void streamRxDummyHeader(Positions pos = {}) const;
///@}
/** @name Eiger Specific */
+39
View File
@@ -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<int>{det_id});
os << "successful" << '\n';
}
}
return os.str();
}
std::string Caller::rx_tcpport(int action) {
std::ostringstream os;
+2
View File
@@ -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},
+4
View File
@@ -1636,6 +1636,10 @@ void Detector::setRxZmqHwm(const int limit) {
}
}
void Detector::streamRxDummyHeader(Positions pos) const {
pimpl->Parallel(&Module::streamRxDummyHeader, pos);
}
// Eiger Specific
Result<ns> Detector::getSubExptime(Positions pos) const {
+1 -1
View File
@@ -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));
}
}
+3 -3
View File
@@ -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() {
+1 -1
View File
@@ -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;
+12
View File
@@ -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) {
+2
View File
@@ -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},
+4 -4
View File
@@ -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);
}
+1 -1
View File
@@ -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);
+51 -39
View File
@@ -8,7 +8,6 @@
#include "DataStreamer.h"
#include "Fifo.h"
#include "GeneralData.h"
#include "sls/ZmqSocket.h"
#include "sls/sls_detector_exceptions.h"
#include <cerrno>
@@ -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<int>(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<std::mutex> 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<int>(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<std::mutex> 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()));
}
}
+6 -6
View File
@@ -10,6 +10,7 @@
*/
#include "ThreadObject.h"
#include "sls/ZmqSocket.h"
#include "sls/network_utils.h"
#include <map>
@@ -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<std::string, std::string> &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};
+11 -6
View File
@@ -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);
}
}
}
+1 -1
View File
@@ -104,7 +104,7 @@ class Implementation : private virtual slsDetectorDefs {
void stopReceiver();
void startReadout();
void shutDownUDPSockets();
void restreamStop();
void streamRxDummyHeader();
/**************************************************
* *
-1
View File
@@ -11,7 +11,6 @@
namespace sls {
std::vector<char> readBinaryFile(const std::string &fname,
const std::string &errorPrefix);
@@ -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";