first draft of disabling data port at the receiver side. Todo: master file and stream for gui to use

This commit is contained in:
2026-05-07 17:15:50 +02:00
parent 111d10cfa7
commit 4ef8a625ab
39 changed files with 557 additions and 448 deletions
+10 -3
View File
@@ -2423,11 +2423,18 @@ class Detector(CppDetectorApi):
@property
def datastream(self):
"""
datastream [left|right] [0, 1]
[Eiger] Enables or disables data streaming from left or/and right side of detector for 10GbE mode. 1 (enabled) by default.
datastream [LEFT|RIGHT|TOP|BOTTOM] [0, 1]
[Eiger] Enables or disables data streaming from left or/and right side of detector for 10GbE mode. 1 (enabled) by default. Options: LEFT, RIGHT.
[Jungfrau][Moench] Enables or disables data stream from top or/and bottom receiver. Can change only if numinterfaces is 2. 1 (enabled) by default. Options: TOP, BOTTOM.
Enum: portPosition
"""
result = {}
for port in [defs.LEFT, defs.RIGHT]:
if self.type in [detectorType.JUNGFRAU, detectorType.MOENCH]:
ports = [defs.TOP, defs.BOTTOM]
else:
ports = [defs.LEFT, defs.RIGHT]
for port in ports:
result[port] = element_if_equal(self.getDataStream(port))
return result
+1 -1
View File
@@ -39,7 +39,7 @@ class qDefs : public QWidget {
/**
* Empty Constructor
*/
qDefs(){};
qDefs() {};
static QFont GetDefaultFont() {
return QFont("Cantarell", 10, QFont::Normal);
@@ -7,11 +7,9 @@
#define MIN_REQRD_VRSN_T_RD_API 0x181130
#define REQRD_FRMWR_VRSN 0x260504
#define NUM_HARDWARE_VERSIONS (1)
#define HARDWARE_VERSION_NUMBERS \
{ 0x3f }
#define HARDWARE_VERSION_NAMES \
{ "5.1" }
#define NUM_HARDWARE_VERSIONS (1)
#define HARDWARE_VERSION_NUMBERS {0x3f}
#define HARDWARE_VERSION_NAMES {"5.1"}
#define LINKED_SERVER_NAME "ctbDetectorServer"
@@ -636,8 +636,8 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) {
<< ((7 - i) * 4); // upper
}
} // end column loop i
} // end supercolumn loop sc
} // end row loop
} // end supercolumn loop sc
} // end row loop
if (Feb_Control_activated) {
if (!Feb_Interface_WriteMemoryInLoops(Feb_Control_leftAddress,
@@ -654,7 +654,7 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) {
}
} // end row_set loop (groups of 16 rows)
} // end l_r loop
} // end l_r loop
memcpy(Feb_Control_last_downloaded_trimbits, trimbits,
Feb_Control_trimbit_size * sizeof(unsigned int));
@@ -7,8 +7,7 @@
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS {0x0, 0x1};
#define HARDWARE_VERSION_NAMES \
{ "FX70T", "FX30T" }
#define HARDWARE_VERSION_NAMES {"FX70T", "FX30T"}
#define REQUIRED_FIRMWARE_VERSION (32)
// virtual ones renamed for consistency
@@ -9,8 +9,7 @@
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS {0x0, 0x2};
#define HARDWARE_VERSION_NAMES \
{ "1.0", "1.2" }
#define HARDWARE_VERSION_NAMES {"1.0", "1.2"}
#define LINKED_SERVER_NAME "gotthard2DetectorServer"
@@ -8,11 +8,9 @@
#define REQRD_FRMWRE_VRSN_BOARD2 0x250209 // 1.0 pcb (version = 010)
#define REQRD_FRMWRE_VRSN 0x250208 // 2.0 pcb (version = 011)
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS \
{ 0x2, 0x3 }
#define HARDWARE_VERSION_NAMES \
{ "1.0", "2.0" }
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS {0x2, 0x3}
#define HARDWARE_VERSION_NAMES {"1.0", "2.0"}
#define ID_FILE "detid_jungfrau.txt"
#define LINKED_SERVER_NAME "jungfrauDetectorServer"
@@ -214,13 +212,11 @@ enum DACINDEX {
enum MASTERINDEX { MASTER_HARDWARE, OW_MASTER, OW_SLAVE };
#define MASTER_NAMES "hardware", "master", "slave"
#define NUMSETTINGS (2)
#define NSPECIALDACS (3)
#define SPECIALDACINDEX {J_VREF_PRECH, J_VREF_DS, J_VREF_COMP};
#define SPECIAL_DEFAULT_DYNAMIC_GAIN_VALS \
{ 1450, 480, 420 }
#define SPECIAL_DEFAULT_DYNAMICHG0_GAIN_VALS \
{ 1550, 450, 620 }
#define NUMSETTINGS (2)
#define NSPECIALDACS (3)
#define SPECIALDACINDEX {J_VREF_PRECH, J_VREF_DS, J_VREF_COMP};
#define SPECIAL_DEFAULT_DYNAMIC_GAIN_VALS {1450, 480, 420}
#define SPECIAL_DEFAULT_DYNAMICHG0_GAIN_VALS {1550, 450, 620}
enum NETWORKINDEX { TXN_FRAME, FLOWCTRL_10G };
enum CLKINDEX { RUN_CLK, ADC_CLK, DBIT_CLK, NUM_CLOCKS };
@@ -7,11 +7,9 @@
#define REQRD_FRMWRE_VRSN_BOARD2 0x444445 // 1.0 pcb (version = 010)
#define REQRD_FRMWRE_VRSN 0x231026 // 2.0 pcb (version = 011)
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS \
{ 0x2, 0x3 }
#define HARDWARE_VERSION_NAMES \
{ "1.0", "2.0" }
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS {0x2, 0x3}
#define HARDWARE_VERSION_NAMES {"1.0", "2.0"}
#define ID_FILE ("detid_moench.txt")
#define LINKED_SERVER_NAME "moenchDetectorServer"
@@ -9,8 +9,7 @@
#define NUM_HARDWARE_VERSIONS (2)
#define HARDWARE_VERSION_NUMBERS {0x0, 0x2};
#define HARDWARE_VERSION_NAMES \
{ "1.0", "1.2" }
#define HARDWARE_VERSION_NAMES {"1.0", "1.2"}
#define LINKED_SERVER_NAME "mythen3DetectorServer"
@@ -131,15 +130,12 @@ enum DACINDEX {
enum ADCINDEX { TEMP_FPGA };
#define NUMSETTINGS (3)
#define NSPECIALDACS (2)
#define SPECIALDACINDEX {M_VRPREAMP, M_VRSHAPER};
#define SPECIAL_DEFAULT_STANDARD_DAC_VALS \
{ 1100, 1280 }
#define SPECIAL_DEFAULT_FAST_DAC_VALS \
{ 300, 1500 }
#define SPECIAL_DEFAULT_HIGHGAIN_DAC_VALS \
{ 1300, 1100 }
#define NUMSETTINGS (3)
#define NSPECIALDACS (2)
#define SPECIALDACINDEX {M_VRPREAMP, M_VRSHAPER};
#define SPECIAL_DEFAULT_STANDARD_DAC_VALS {1100, 1280}
#define SPECIAL_DEFAULT_FAST_DAC_VALS {300, 1500}
#define SPECIAL_DEFAULT_HIGHGAIN_DAC_VALS {1300, 1100}
enum CLKINDEX { SYSTEM_C0, SYSTEM_C1, SYSTEM_C2, NUM_CLOCKS };
#define NUM_CLOCKS_TO_SET (1)
@@ -2382,7 +2382,7 @@ int get_exptime(int file_des) {
if (receiveData(file_des, &gateIndex, sizeof(gateIndex), INT32) < 0)
return printSocketReadError();
// get only
// get only
#ifdef MYTHEN3D
if (gateIndex < 0 || gateIndex > 2) {
ret = FAIL;
@@ -7018,7 +7018,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// bursts
// bursts
#ifdef GOTTHARD2D
i64 = getNumBursts();
#else
@@ -7028,7 +7028,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// additional storage cells
// additional storage cells
#if defined(JUNGFRAUD)
i32 = getNumAdditionalStorageCells();
#else
@@ -7038,7 +7038,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// analog samples
// analog samples
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
i32 = getNumAnalogSamples();
#else
@@ -7048,7 +7048,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// digital samples
// digital samples
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
i32 = getNumDigitalSamples();
#else
@@ -7058,7 +7058,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// exptime
// exptime
#ifdef MYTHEN3D
i64 = 0;
#elif defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
@@ -7087,7 +7087,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// sub exptime
// sub exptime
#ifdef EIGERD
i64 = getSubExpTime();
#else
@@ -7097,7 +7097,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// sub deadtime
// sub deadtime
#ifdef EIGERD
i64 = getSubDeadTime();
#else
@@ -7107,7 +7107,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// activate
// activate
#ifdef EIGERD
i32 = 0;
getActivate(&i32);
@@ -7118,7 +7118,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// data stream left
// data stream left
#ifdef EIGERD
i32 = 0;
getDataStream(LEFT, &i32);
@@ -7129,7 +7129,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// data stream right
// data stream right
#ifdef EIGERD
i32 = 0;
getDataStream(RIGHT, &i32);
@@ -7140,7 +7140,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// quad
// quad
#ifdef EIGERD
i32 = getQuad();
#else
@@ -7150,7 +7150,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// ReadNRows
// ReadNRows
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)
i32 = getReadNRows();
#else
@@ -7191,7 +7191,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// 10 gbe
// 10 gbe
#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MYTHEN3D)
i32 = enableTenGigabitEthernet(GET_FLAG);
#else
@@ -7201,7 +7201,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// readout mode
// readout mode
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
i32 = getReadoutMode();
#else
@@ -7211,7 +7211,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// adc mask
// adc mask
#if defined(CHIPTESTBOARDD)
u32 = getADCEnableMask();
#else
@@ -7221,7 +7221,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// 10g adc mask
// 10g adc mask
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
u32 = getADCEnableMask_10G();
#else
@@ -7231,7 +7231,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// counter mask
// counter mask
#ifdef MYTHEN3D
u32 = getCounterMask();
#else
@@ -7241,7 +7241,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// burst mode
// burst mode
#ifdef GOTTHARD2D
i32 = (int)getBurstMode();
#else
@@ -7251,7 +7251,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// exptime1
// exptime1
#ifdef MYTHEN3D
i64 = getExpTime(0);
#else
@@ -7261,7 +7261,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// exptime2
// exptime2
#ifdef MYTHEN3D
i64 = getExpTime(1);
#else
@@ -7271,7 +7271,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// exptime3
// exptime3
#ifdef MYTHEN3D
i64 = getExpTime(2);
#else
@@ -7281,7 +7281,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// gatedelay1
// gatedelay1
#ifdef MYTHEN3D
i64 = getGateDelay(0);
#else
@@ -7291,7 +7291,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// gatedelay2
// gatedelay2
#ifdef MYTHEN3D
i64 = getGateDelay(1);
#else
@@ -7301,7 +7301,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// gatedelay3
// gatedelay3
#ifdef MYTHEN3D
i64 = getGateDelay(2);
#else
@@ -7311,7 +7311,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// gates
// gates
#ifdef MYTHEN3D
i32 = getNumGates();
#else
@@ -7341,7 +7341,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// transceiver samples
// transceiver samples
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
i32 = getNumTransceiverSamples();
#else
@@ -7351,7 +7351,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// transceiver mask
// transceiver mask
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
u32 = getTransceiverEnableMask();
#else
@@ -7361,7 +7361,7 @@ int get_receiver_parameters(int file_des) {
if (n < 0)
return printSocketReadError();
// readout speed
// readout speed
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
ret = getReadoutSpeed(&i32);
if (ret == FAIL) {
+1 -1
View File
@@ -3611,7 +3611,7 @@ quad:
output: [ args.front() ]
datastream:
help: "[left|right] [0, 1]\n\t[Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. 1 (enabled) by default."
help: "[left|right|top|bottom] [0, 1]\n\t[Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. Options: left, right. 1 (enabled) by default.\n\t[Jungfrau][Moench] Enables or disables data stream from top or/and bottom side of receiver. Can change only if numinterfaces is 2. Options: top, bottom.1 (enabled) by default."
actions:
GET:
argc: 1
+16 -10
View File
@@ -897,6 +897,22 @@ class Detector {
*/
void setTransmissionDelay(int step);
/** [Eiger] Module Level disable. Options: LEFT, RIGHT
* [Jungfrau][Moench] Only Receiver level diable. Options: TOP, BOTTOM
*
*/
Result<bool> getDataStream(const defs::portPosition port,
Positions pos = {}) const;
/** [Eiger] enable or disable data streaming from left or right of detector
* for 10GbE. Default: enabled
* [Jungfrau][Moench] Enable/Disable data streaming from the top or bottom
* of receiver. Default: enabled. Disabling of any port works only if number
* of interfaces is 2.
*/
void setDataStream(const defs::portPosition port, const bool enable,
Positions pos = {});
///@}
/** @name Receiver Configuration */
@@ -1251,16 +1267,6 @@ class Detector {
* hardware required). */
void setQuad(const bool enable);
/** [Eiger] */
Result<bool> getDataStream(const defs::portPosition port,
Positions pos = {}) const;
/** [Eiger] enable or disable data streaming from left or right of detector
* for 10GbE. Default: enabled
*/
void setDataStream(const defs::portPosition port, const bool enable,
Positions pos = {});
/** [Eiger] Advanced */
Result<bool> getTop(Positions pos = {}) const;
+1 -1
View File
@@ -32,7 +32,7 @@ template <class T, class Allocator = std::allocator<T>> class Result {
public:
Result() = default;
Result(std::initializer_list<T> list) : vec(list){};
Result(std::initializer_list<T> list) : vec(list) {};
/** Custom constructor from integer type to Result<ns> or Result<bool> */
template <typename V, typename = typename std::enable_if<
@@ -17,12 +17,12 @@ class detectorData {
: progressIndex(progressIndex), fileName(fileName),
fileIndex(fileIndex), nx(nx), ny(ny), data(data),
databytes(databytes), dynamicRange(dynamicRange),
completeImage(completeImage){};
completeImage(completeImage) {};
/**
* data has to be deleted by caller
*/
~detectorData(){};
~detectorData() {};
int64_t getChannel(int i) {
int off = dynamicRange / 8;
+10 -10
View File
@@ -1317,6 +1317,16 @@ void Detector::setTransmissionDelay(int step) {
pimpl->setTransmissionDelay(step);
}
Result<bool> Detector::getDataStream(const defs::portPosition port,
Positions pos) const {
return pimpl->Parallel(&Module::getDataStream, pos, port);
}
void Detector::setDataStream(const defs::portPosition port, const bool enable,
Positions pos) {
pimpl->Parallel(&Module::setDataStream, pos, port, enable);
}
// Receiver
Result<bool> Detector::getUseReceiverFlag(Positions pos) const {
@@ -1746,16 +1756,6 @@ void Detector::setQuad(const bool enable) {
pimpl->Parallel(&Module::setQuad, {}, enable);
}
Result<bool> Detector::getDataStream(const defs::portPosition port,
Positions pos) const {
return pimpl->Parallel(&Module::getDataStream, pos, port);
}
void Detector::setDataStream(const defs::portPosition port, const bool enable,
Positions pos) {
pimpl->Parallel(&Module::setDataStream, pos, port, enable);
}
Result<bool> Detector::getTop(Positions pos) const {
return pimpl->Parallel(&Module::getTop, pos);
}
+27 -12
View File
@@ -1407,6 +1407,33 @@ void Module::setTransmissionDelayRight(int value) {
sendToDetector(F_SET_TRANSMISSION_DELAY_RIGHT, value, nullptr);
}
bool Module::getDataStream(const portPosition port) const {
// receiver only
if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) {
if (!shm()->useReceiverFlag) {
throw RuntimeError("No receiver to get datastream.");
}
return sendToReceiver<int>(F_RECEIVER_GET_UDP_DATASTREAM,
static_cast<int>(port));
} else
return sendToDetector<int>(F_GET_DATASTREAM, static_cast<int>(port));
}
void Module::setDataStream(const portPosition port, const bool enable) {
int args[]{static_cast<int>(port), static_cast<int>(enable)};
if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) {
if (!shm()->useReceiverFlag) {
throw RuntimeError("No receiver to set datastream.");
}
sendToReceiver(F_RECEIVER_SET_UDP_DATASTREAM, args, nullptr);
} else {
sendToDetector(F_SET_DATASTREAM, args, nullptr);
if (shm()->useReceiverFlag) {
sendToReceiver(F_RECEIVER_SET_UDP_DATASTREAM, args, nullptr);
}
}
}
// Receiver Config
bool Module::getUseReceiverFlag() const { return shm()->useReceiverFlag; }
@@ -1948,18 +1975,6 @@ void Module::setQuad(const bool enable) {
}
}
bool Module::getDataStream(const portPosition port) const {
return sendToDetector<int>(F_GET_DATASTREAM, static_cast<int>(port));
}
void Module::setDataStream(const portPosition port, const bool enable) {
int args[]{static_cast<int>(port), static_cast<int>(enable)};
sendToDetector(F_SET_DATASTREAM, args, nullptr);
if (shm()->useReceiverFlag) {
sendToReceiver(F_RECEIVER_SET_DATASTREAM, args, nullptr);
}
}
bool Module::getTop() const {
return (static_cast<bool>(sendToDetector<int>(F_GET_TOP)));
}
+2 -2
View File
@@ -279,6 +279,8 @@ class Module : public virtual slsDetectorDefs {
void setTransmissionDelayLeft(int value);
int getTransmissionDelayRight() const;
void setTransmissionDelayRight(int value);
bool getDataStream(const portPosition port) const;
void setDataStream(const portPosition port, const bool enable);
/**************************************************
* *
@@ -388,8 +390,6 @@ class Module : public virtual slsDetectorDefs {
void pulseChip(int n_pulses = 0);
bool getQuad() const;
void setQuad(const bool enable);
bool getDataStream(const portPosition port) const;
void setDataStream(const portPosition port, const bool enable);
bool getTop() const;
void setTop(bool value);
@@ -589,46 +589,6 @@ TEST_CASE("quad", "[.detectorintegration]") {
}
}
TEST_CASE("datastream", "[.detectorintegration]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER) {
auto prev_val_left = det.getDataStream(defs::LEFT);
auto prev_val_right = det.getDataStream(defs::RIGHT);
// no "left" or "right"
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
{
std::ostringstream oss;
caller.call("datastream", {"left", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [left, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"right", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [right, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"left", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [left, 1]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"right", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [right, 1]\n");
}
for (int i = 0; i != det.size(); ++i) {
det.setDataStream(defs::LEFT, prev_val_left[i], {i});
det.setDataStream(defs::RIGHT, prev_val_right[i], {i});
}
} else {
REQUIRE_THROWS(caller.call("datastream", {}, -1, GET));
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
REQUIRE_THROWS(caller.call("datastream", {"left", "1"}, -1, PUT));
}
}
TEST_CASE("top", "[.detectorintegration]") {
Detector det;
Caller caller(&det);
@@ -3068,6 +3068,92 @@ TEST_CASE("txdelay", "[.detectorintegration]") {
}
}
TEST_CASE("datastream", "[.detectorintegration]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER) {
auto prev_val_left = det.getDataStream(defs::LEFT);
auto prev_val_right = det.getDataStream(defs::RIGHT);
// invalid args
REQUIRE_THROWS(caller.call("datastream", {"top", "1"}, -1, PUT));
REQUIRE_THROWS(caller.call("datastream", {"bottom", "1"}, -1, PUT));
// no "left" or "right" argument
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
{
std::ostringstream oss;
caller.call("datastream", {"left", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [left, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"right", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [right, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"left", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [left, 1]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"right", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [right, 1]\n");
}
for (int i = 0; i != det.size(); ++i) {
det.setDataStream(defs::LEFT, prev_val_left[i], {i});
det.setDataStream(defs::RIGHT, prev_val_right[i], {i});
}
} else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) {
// throw with 1 interface
if (det.getNumberofUDPInterfaces().squash() == 1) {
REQUIRE_THROWS(caller.call("datastream", {"top", "0"}, -1, PUT));
}
// 2 interfaces
else {
auto prev_val_top = det.getDataStream(defs::TOP);
auto prev_val_bottom = det.getDataStream(defs::BOTTOM);
// invalid args
REQUIRE_THROWS(caller.call("datastream", {"left", "1"}, -1, PUT));
REQUIRE_THROWS(caller.call("datastream", {"right", "1"}, -1, PUT));
// no "top" or "bottom" argument
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
{
std::ostringstream oss;
caller.call("datastream", {"top", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [top, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"bottom", "0"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [bottom, 0]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"top", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [top, 1]\n");
}
{
std::ostringstream oss;
caller.call("datastream", {"bottom", "1"}, -1, PUT, oss);
REQUIRE(oss.str() == "datastream [bottom, 1]\n");
}
for (int i = 0; i != det.size(); ++i) {
det.setDataStream(defs::TOP, prev_val_top[i], {i});
det.setDataStream(defs::BOTTOM, prev_val_bottom[i], {i});
}
}
} else {
REQUIRE_THROWS(caller.call("datastream", {}, -1, GET));
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
REQUIRE_THROWS(caller.call("datastream", {"left", "1"}, -1, PUT));
REQUIRE_THROWS(caller.call("datastream", {"top", "1"}, -1, PUT));
}
}
/* ZMQ Streaming Parameters (Receiver<->Client) */
TEST_CASE("zmqport", "[.detectorintegration]") {
+41 -12
View File
@@ -207,7 +207,7 @@ int ClientInterface::functionTable(){
flist[F_GET_RECEIVER_STREAMING_HWM] = &ClientInterface::get_streaming_hwm;
flist[F_SET_RECEIVER_STREAMING_HWM] = &ClientInterface::set_streaming_hwm;
flist[F_RECEIVER_SET_ALL_THRESHOLD] = &ClientInterface::set_all_threshold;
flist[F_RECEIVER_SET_DATASTREAM] = &ClientInterface::set_detector_datastream;
flist[F_RECEIVER_SET_UDP_DATASTREAM] = &ClientInterface::set_port_udp_datastream;
flist[F_GET_RECEIVER_ARPING] = &ClientInterface::get_arping;
flist[F_SET_RECEIVER_ARPING] = &ClientInterface::set_arping;
flist[F_RECEIVER_GET_RECEIVER_ROI] = &ClientInterface::get_receiver_roi;
@@ -221,6 +221,7 @@ int ClientInterface::functionTable(){
flist[F_SET_RECEIVER_DBIT_REORDER] = &ClientInterface::set_dbit_reorder;
flist[F_RECEIVER_GET_ROI_METADATA] = &ClientInterface::get_roi_metadata;
flist[F_SET_RECEIVER_READOUT_SPEED] = &ClientInterface::set_readout_speed;
flist[F_RECEIVER_GET_UDP_DATASTREAM] = &ClientInterface::get_port_udp_datastream;
for (int i = NUM_DET_FUNCTIONS + 1; i < NUM_REC_FUNCTIONS ; i++) {
LOG(logDEBUG1) << "function fnum: " << i << " (" <<
@@ -383,8 +384,8 @@ int ClientInterface::setup_receiver(Interface &socket) {
impl()->setSubPeriod(std::chrono::nanoseconds(arg.subExpTimeNs) +
std::chrono::nanoseconds(arg.subDeadTimeNs));
impl()->setActivate(static_cast<bool>(arg.activate));
impl()->setDetectorDataStream(LEFT, arg.dataStreamLeft);
impl()->setDetectorDataStream(RIGHT, arg.dataStreamRight);
impl()->setUDPDataStream(LEFT, arg.dataStreamLeft);
impl()->setUDPDataStream(RIGHT, arg.dataStreamRight);
impl()->setQuad(arg.quad == 0 ? false : true);
impl()->setThresholdEnergy(arg.thresholdEnergyeV[0]);
}
@@ -1653,27 +1654,55 @@ int ClientInterface::set_all_threshold(Interface &socket) {
return socket.Send(OK);
}
int ClientInterface::set_detector_datastream(Interface &socket) {
int args[2]{-1, -1};
socket.Receive(args);
portPosition port = static_cast<portPosition>(args[0]);
void ClientInterface::validate_port_position(const portPosition port) {
bool exists = false;
switch (port) {
case LEFT:
case RIGHT:
if (detType == EIGER) {
exists = true;
}
break;
case TOP:
case BOTTOM:
if (detType == JUNGFRAU || detType == MOENCH) {
exists = true;
}
break;
default:
throw RuntimeError("Invalid port type");
}
bool enable = static_cast<int>(args[1]);
LOG(logDEBUG1) << "Setting datastream (" << ToString(port) << ") to "
if (!exists) {
modeNotImplemented("Port type", port);
}
}
int ClientInterface::set_port_udp_datastream(Interface &socket) {
int args[2]{-1, -1};
socket.Receive(args);
portPosition port = static_cast<portPosition>(args[0]);
validate_port_position(port);
bool enable = static_cast<bool>(args[1]);
LOG(logDEBUG1) << "Setting udp datastream (" << ToString(port) << ") to "
<< ToString(enable);
if (detType != EIGER)
functionNotImplemented();
verifyIdle(socket);
impl()->setDetectorDataStream(port, enable);
if (detType != EIGER && detType != JUNGFRAU && detType != MOENCH)
functionNotImplemented();
impl()->setUDPDataStream(port, enable);
return socket.Send(OK);
}
int ClientInterface::get_port_udp_datastream(Interface &socket) {
auto arg = socket.Receive<int>();
portPosition port = static_cast<portPosition>(arg);
validate_port_position(port);
LOG(logDEBUG1) << "Getting udp datastream (" << ToString(port) << ")";
if (detType != EIGER && detType != JUNGFRAU && detType != MOENCH)
functionNotImplemented();
auto retval = static_cast<int>(impl()->getUDPDataStream(port));
return socket.sendResult(retval);
}
int ClientInterface::get_arping(Interface &socket) {
auto retval = static_cast<int>(impl()->getArping());
LOG(logDEBUG1) << "arping thread status:" << retval;
+3 -1
View File
@@ -154,7 +154,9 @@ class ClientInterface : private virtual slsDetectorDefs {
int get_streaming_hwm(ServerInterface &socket);
int set_streaming_hwm(ServerInterface &socket);
int set_all_threshold(ServerInterface &socket);
int set_detector_datastream(ServerInterface &socket);
void validate_port_position(const portPosition port);
int set_port_udp_datastream(ServerInterface &socket);
int get_port_udp_datastream(ServerInterface &socket);
int get_arping(ServerInterface &socket);
int set_arping(ServerInterface &socket);
int get_receiver_roi(ServerInterface &socket);
+2 -2
View File
@@ -153,14 +153,14 @@ void DataProcessor::CreateFirstFiles(const std::filesystem::path &filePath,
const uint64_t fileIndex,
const bool overWriteEnable,
const bool silentMode,
const bool detectorDataStream) {
const bool udpDataStream) {
if (dataFile == nullptr) {
throw RuntimeError("file object not contstructed");
}
CloseFiles();
// deactivated (half module/ single port or no roi), dont write file
if (!activated || !detectorDataStream || isOutsideRoi) {
if (!activated || !udpDataStream || isOutsideRoi) {
return;
}
+2 -2
View File
@@ -63,7 +63,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject {
void CreateFirstFiles(const std::filesystem::path &filePath,
const std::string &fileNamePrefix,
const uint64_t fileIndex, const bool overWriteEnable,
const bool silentMode, const bool detectorDataStream);
const bool silentMode, const bool udpDataStream);
#ifdef HDF5C
uint32_t GetFilesInAcquisition() const;
std::string CreateVirtualFile(const std::filesystem::path &filePath,
@@ -173,7 +173,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject {
uint32_t streamingTimerInMs;
uint32_t streamingStartFnum;
uint32_t currentFreqCount{0};
struct timespec timerbegin {};
struct timespec timerbegin{};
bool framePadding;
std::atomic<bool> startedFlag{false};
std::atomic<uint64_t> firstIndex{0};
+2 -2
View File
@@ -17,8 +17,8 @@ namespace sls {
class File : private virtual slsDetectorDefs {
public:
File(){};
virtual ~File(){};
File() {};
virtual ~File() {};
virtual fileFormat GetFileFormat() const = 0;
virtual void CloseFile() = 0;
+2 -2
View File
@@ -193,8 +193,8 @@ class GeneralData {
slsDetectorDefs::NO_DISCARD};
/* actual image size after ctboffset and ctbreorder */
uint32_t actualImageSize{0};
GeneralData(){};
virtual ~GeneralData(){};
GeneralData() {};
virtual ~GeneralData() {};
// Returns the pixel depth in byte, 4 bits being 0.5 byte
float GetPixelDepth() { return float(dynamicRange) / 8; }
+44 -29
View File
@@ -188,7 +188,7 @@ void Implementation::SetupListener(int i) {
listener[i]->SetEthernetInterface(eth[i]);
listener[i]->SetActivate(activated);
listener[i]->SetIsOutsideRoi(portRois[i].noRoi());
listener[i]->SetDetectorDatastream(detectorDataStream[i]);
listener[i]->SetUDPDatastream(udpDataStream[i]);
listener[i]->SetSilentMode(silentMode);
}
@@ -606,7 +606,7 @@ double Implementation::getProgress() const {
double progress = 0;
int index = 0;
for (const auto &it : listener) {
if (detectorDataStream[index] && it->GetStartedFlag()) {
if (udpDataStream[index] && it->GetStartedFlag()) {
progress += (it->GetListenedIndex() + 1) / totalFrames;
}
++index;
@@ -746,9 +746,9 @@ void Implementation::stopReceiver() {
std::string summary;
if (!activated) {
summary = "\n\tDeactivated Receiver";
} else if (!detectorDataStream[i]) {
summary = (i == 0 ? "\n\tDeactivated Left Port"
: "\n\tDeactivated Right Port");
} else if (!udpDataStream[i]) {
summary = "\n\tDeactivated " + ToString(udpDataStreamType[i]) +
" Port";
} else if (portRois[i].noRoi()) {
summary = "\n\tNo Roi on Port[" + std::to_string(i) + ']';
} else {
@@ -895,9 +895,9 @@ void Implementation::SetupWriter() {
std::string fileNamePrefix =
fileName + "_d" +
std::to_string(modulePos * generalData->numUDPInterfaces + i);
dataProcessor[i]->CreateFirstFiles(
filePath, fileNamePrefix, fileIndex, overwriteEnable,
silentMode, detectorDataStream[i]);
dataProcessor[i]->CreateFirstFiles(filePath, fileNamePrefix,
fileIndex, overwriteEnable,
silentMode, udpDataStream[i]);
}
} catch (const RuntimeError &e) {
shutDownUDPSockets();
@@ -1612,15 +1612,15 @@ void Implementation::setTenGigaEnable(const bool b) {
// datastream can be disabled/enabled only for Eiger 10GbE
if (generalData->detType == EIGER) {
if (!b) {
detectorDataStream[LEFT] = 1;
detectorDataStream[RIGHT] = 1;
udpDataStream[LEFT] = 1;
udpDataStream[RIGHT] = 1;
} else {
detectorDataStream[LEFT] = detectorDataStream10GbE[LEFT];
detectorDataStream[RIGHT] = detectorDataStream10GbE[RIGHT];
udpDataStream[LEFT] = udpDataStream10GbE[LEFT];
udpDataStream[RIGHT] = udpDataStream10GbE[RIGHT];
}
LOG(logDEBUG) << "Detector datastream updated [Left: "
<< ToString(detectorDataStream[LEFT])
<< ", Right: " << ToString(detectorDataStream[RIGHT])
<< ToString(udpDataStream[LEFT])
<< ", Right: " << ToString(udpDataStream[RIGHT])
<< "]";
}
}
@@ -1670,24 +1670,39 @@ void Implementation::setActivate(bool enable) {
LOG(logINFO) << "Activation: " << (activated ? "enabled" : "disabled");
}
bool Implementation::getDetectorDataStream(const portPosition port) const {
int index = (port == LEFT ? 0 : 1);
return detectorDataStream[index];
bool Implementation::getUDPDataStream(const portPosition port) const {
int index = 0;
if (port == BOTTOM || port == RIGHT)
index = 1;
return udpDataStream[index];
}
void Implementation::setDetectorDataStream(const portPosition port,
const bool enable) {
int index = (port == LEFT ? 0 : 1);
detectorDataStream10GbE[index] = enable;
LOG(logINFO) << "Detector 10GbE datastream (" << ToString(port)
<< " Port): " << ToString(detectorDataStream10GbE[index]);
// update datastream for 10g
if (generalData->tengigaEnable) {
detectorDataStream[index] = detectorDataStream10GbE[index];
LOG(logDEBUG) << "Detector datastream updated ["
<< (index == 0 ? "Left" : "Right")
<< "] : " << ToString(detectorDataStream[index]);
void Implementation::setUDPDataStream(const portPosition port,
const bool enable) {
int index = 0;
if (port == BOTTOM || port == RIGHT)
index = 1;
udpDataStreamType[index] = port;
// jungfrau and moench: straightforward
if (generalData->detType != EIGER) {
udpDataStream[index] = enable;
LOG(logINFO) << "Detector datastream (" << ToString(port)
<< " Port): " << ToString(udpDataStream[index]);
}
// eiger: data stream can be disabled/enabled only for 10GbE
else {
udpDataStream10GbE[index] = enable;
LOG(logINFO) << "Detector 10GbE datastream (" << ToString(port)
<< " Port): " << ToString(udpDataStream10GbE[index]);
// update datastream for 10g
if (generalData->tengigaEnable) {
udpDataStream[index] = udpDataStream10GbE[index];
LOG(logDEBUG) << "Detector datastream updated (" << ToString(port)
<< " Port): " << ToString(udpDataStream[index]);
}
}
for (size_t i = 0; i != listener.size(); ++i)
listener[i]->SetUDPDatastream(udpDataStream[i]);
}
int Implementation::getReadNRows() const { return readNRows; }
+9 -8
View File
@@ -225,12 +225,11 @@ class Implementation : private virtual slsDetectorDefs {
/** [Eiger] If deactivated, receiver will create dummy data if deactivated
* padding is enabled (as it will receive nothing from detector) */
void setActivate(const bool enable);
bool getDetectorDataStream(const portPosition port) const;
/** [Eiger] If datastream is disabled, receiver will create dummy data if
* deactivated
* padding for that port is enabled (as it will receive nothing from
* detector) */
void setDetectorDataStream(const portPosition port, const bool enable);
bool getUDPDataStream(const portPosition port) const;
/** [Jungfrau][Moench] deactivated at receiver level only
* [Eiger] deactivated at module level
*/
void setUDPDataStream(const portPosition port, const bool enable);
int getReadNRows() const;
/* [Eiger][Jungfrau][Moench] */
void setReadNRows(const int value);
@@ -366,8 +365,10 @@ class Implementation : private virtual slsDetectorDefs {
bool flipRows{false};
bool quadEnable{false};
bool activated{true};
std::array<bool, 2> detectorDataStream = {{true, true}};
std::array<bool, 2> detectorDataStream10GbE = {{true, true}};
std::array<bool, 2> udpDataStream = {{true, true}};
std::array<portPosition, 2> udpDataStreamType = {{LEFT, RIGHT}};
// only for Eiger to remember (10Gbe selectable)
std::array<bool, 2> udpDataStream10GbE = {{true, true}};
int readNRows{0};
int thresholdEnergyeV{-1};
std::array<int, 3> thresholdAllEnergyeV = {{-1, -1, -1}};
+5 -5
View File
@@ -85,17 +85,17 @@ void Listener::SetEthernetInterface(const std::string e) {
void Listener::SetActivate(bool enable) {
activated = enable;
disabledPort = (!activated || !detectorDataStream || isOutsideRoi);
disabledPort = (!activated || !udpDataStream || isOutsideRoi);
}
void Listener::SetDetectorDatastream(bool enable) {
detectorDataStream = enable;
disabledPort = (!activated || !detectorDataStream || isOutsideRoi);
void Listener::SetUDPDatastream(bool enable) {
udpDataStream = enable;
disabledPort = (!activated || !udpDataStream || isOutsideRoi);
}
void Listener::SetIsOutsideRoi(bool enable) {
isOutsideRoi = enable;
disabledPort = (!activated || !detectorDataStream || isOutsideRoi);
disabledPort = (!activated || !udpDataStream || isOutsideRoi);
}
void Listener::SetSilentMode(bool enable) { silentMode = enable; }
+2 -2
View File
@@ -42,7 +42,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject {
void SetUdpPortNumber(const uint16_t portNumber);
void SetEthernetInterface(const std::string e);
void SetActivate(bool enable);
void SetDetectorDatastream(bool enable);
void SetUDPDatastream(bool enable);
void SetIsOutsideRoi(bool enable);
void SetSilentMode(bool enable);
@@ -115,7 +115,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject {
uint16_t udpPortNumber{0};
std::string eth;
bool activated{false};
bool detectorDataStream{true};
bool udpDataStream{true};
bool isOutsideRoi{false};
bool silentMode;
bool disabledPort{false};
@@ -47,8 +47,8 @@ class GeneralDataTest : public GeneralData {
// dummy DataProcessor class for testing
class DataProcessorTest : public DataProcessor {
public:
DataProcessorTest() : DataProcessor(0){};
~DataProcessorTest(){};
DataProcessorTest() : DataProcessor(0) {};
~DataProcessorTest() {};
void ArrangeDbitData(size_t &size, char *data) {
DataProcessor::ArrangeDbitData(size, data);
}
+7 -7
View File
@@ -21,29 +21,29 @@ class ClientSocket : public DataSocket {
private:
void readReply(int &ret, void *retval, size_t retval_size);
struct sockaddr_in serverAddr {};
struct sockaddr_in serverAddr{};
std::string socketType;
};
class ReceiverSocket : public ClientSocket {
public:
ReceiverSocket(const std::string &hostname, uint16_t port_number)
: ClientSocket("Receiver", hostname, port_number){};
ReceiverSocket(struct sockaddr_in addr) : ClientSocket("Receiver", addr){};
: ClientSocket("Receiver", hostname, port_number) {};
ReceiverSocket(struct sockaddr_in addr) : ClientSocket("Receiver", addr) {};
};
class DetectorSocket : public ClientSocket {
public:
DetectorSocket(const std::string &hostname, uint16_t port_number)
: ClientSocket("Detector", hostname, port_number){};
DetectorSocket(struct sockaddr_in addr) : ClientSocket("Detector", addr){};
: ClientSocket("Detector", hostname, port_number) {};
DetectorSocket(struct sockaddr_in addr) : ClientSocket("Detector", addr) {};
};
class GuiSocket : public ClientSocket {
public:
GuiSocket(const std::string &hostname, uint16_t port_number)
: ClientSocket("Gui", hostname, port_number){};
GuiSocket(struct sockaddr_in addr) : ClientSocket("Gui", addr){};
: ClientSocket("Gui", hostname, port_number) {};
GuiSocket(struct sockaddr_in addr) : ClientSocket("Gui", addr) {};
};
}; // namespace sls
+1 -1
View File
@@ -33,5 +33,5 @@ class Timer {
std::string name_;
};
}; // namespace sls
}; // namespace sls
#endif // TIMER_H
+1 -1
View File
@@ -42,7 +42,7 @@ class Logger {
public:
Logger() = default;
explicit Logger(TLogLevel level) : level(level){};
explicit Logger(TLogLevel level) : level(level) {};
~Logger() {
// output in the destructor to allow for << syntax
os << RESET << '\n';
@@ -137,7 +137,7 @@ class slsDetectorDefs {
int x{0};
int y{0};
xy() = default;
xy(int x, int y) : x(x), y(y){};
xy(int x, int y) : x(x), y(y) {};
constexpr bool operator==(const xy &other) const {
return ((x == other.x) && (y == other.y));
}
@@ -223,7 +223,7 @@ class slsDetectorDefs {
struct Hz {
int value{0};
explicit Hz(int v) : value(v){};
explicit Hz(int v) : value(v) {};
constexpr bool operator==(const Hz &other) const {
return (value == other.value);
}
@@ -252,9 +252,9 @@ class slsDetectorDefs {
int ymin{-1};
int ymax{-1};
ROI() = default;
ROI(int xmin, int xmax) : xmin(xmin), xmax(xmax){};
ROI(int xmin, int xmax) : xmin(xmin), xmax(xmax) {};
ROI(int xmin, int xmax, int ymin, int ymax)
: xmin(xmin), xmax(xmax), ymin(ymin), ymax(ymax){};
: xmin(xmin), xmax(xmax), ymin(ymin), ymax(ymax) {};
constexpr int width() const { return (xmax - xmin + 1); }
constexpr int height() const { return (ymax - ymin + 1); }
constexpr std::array<int, 4> getIntArray() const {
@@ -409,7 +409,7 @@ enum detFuncs {
F_GET_RECEIVER_STREAMING_HWM,
F_SET_RECEIVER_STREAMING_HWM,
F_RECEIVER_SET_ALL_THRESHOLD,
F_RECEIVER_SET_DATASTREAM,
F_RECEIVER_SET_UDP_DATASTREAM,
F_GET_RECEIVER_ARPING,
F_SET_RECEIVER_ARPING,
F_RECEIVER_GET_RECEIVER_ROI,
@@ -423,6 +423,7 @@ enum detFuncs {
F_SET_RECEIVER_DBIT_REORDER,
F_RECEIVER_GET_ROI_METADATA,
F_SET_RECEIVER_READOUT_SPEED,
F_RECEIVER_GET_UDP_DATASTREAM,
NUM_REC_FUNCTIONS
};
@@ -828,7 +829,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_GET_RECEIVER_STREAMING_HWM: return "F_GET_RECEIVER_STREAMING_HWM";
case F_SET_RECEIVER_STREAMING_HWM: return "F_SET_RECEIVER_STREAMING_HWM";
case F_RECEIVER_SET_ALL_THRESHOLD: return "F_RECEIVER_SET_ALL_THRESHOLD";
case F_RECEIVER_SET_DATASTREAM: return "F_RECEIVER_SET_DATASTREAM";
case F_RECEIVER_SET_UDP_DATASTREAM: return "F_RECEIVER_SET_UDP_DATASTREAM";
case F_GET_RECEIVER_ARPING: return "F_GET_RECEIVER_ARPING";
case F_SET_RECEIVER_ARPING: return "F_SET_RECEIVER_ARPING";
case F_RECEIVER_GET_RECEIVER_ROI: return "F_RECEIVER_GET_RECEIVER_ROI";
@@ -842,6 +843,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_SET_RECEIVER_DBIT_REORDER: return "F_SET_RECEIVER_DBIT_REORDER";
case F_RECEIVER_GET_ROI_METADATA: return "F_RECEIVER_GET_ROI_METADATA";
case F_SET_RECEIVER_READOUT_SPEED: return "F_SET_RECEIVER_READOUT_SPEED";
case F_RECEIVER_GET_UDP_DATASTREAM: return "F_RECEIVER_GET_UDP_DATASTREAM";
case NUM_REC_FUNCTIONS: return "NUM_REC_FUNCTIONS";
default: return "Unknown Function";
+1 -1
View File
@@ -18,7 +18,7 @@ namespace sls {
UdpRxSocket::UdpRxSocket(uint16_t port, ssize_t packet_size,
const char *hostname, int kernel_buffer_size)
: packet_size_(packet_size) {
struct addrinfo hints {};
struct addrinfo hints{};
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+1 -1
View File
@@ -531,7 +531,7 @@ void ZmqSocket::PrintError() {
// Nested class to do RAII handling of socket descriptors
ZmqSocket::mySocketDescriptors::mySocketDescriptors(bool server)
: server(server), contextDescriptor(nullptr), socketDescriptor(nullptr){};
: server(server), contextDescriptor(nullptr), socketDescriptor(nullptr) {};
ZmqSocket::mySocketDescriptors::~mySocketDescriptors() {
Disconnect();
Close();
+212 -212
View File
@@ -71,244 +71,244 @@ namespace sls {
a += b; \
};
/*
* Implemented from RFC1321 The MD5 Message-Digest Algorithm
*/
/*
* Implemented from RFC1321 The MD5 Message-Digest Algorithm
*/
#define INIT_DATA_A (unsigned long)0x67452301L
#define INIT_DATA_B (unsigned long)0xefcdab89L
#define INIT_DATA_C (unsigned long)0x98badcfeL
#define INIT_DATA_D (unsigned long)0x10325476L
int MD5_Init_SLS(MD5_CTX *c) {
memset(c, 0, sizeof(*c));
c->A = INIT_DATA_A;
c->B = INIT_DATA_B;
c->C = INIT_DATA_C;
c->D = INIT_DATA_D;
return 1;
}
int MD5_Init_SLS(MD5_CTX * c) {
memset(c, 0, sizeof(*c));
c->A = INIT_DATA_A;
c->B = INIT_DATA_B;
c->C = INIT_DATA_C;
c->D = INIT_DATA_D;
return 1;
}
void md5_block_data_order(MD5_CTX *c, const void *data_, size_t num) {
const unsigned char *data = data_;
register unsigned MD32_REG_T A, B, C, D, l;
/* See comment in crypto/sha/sha_local.h for details. */
unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, XX8, XX9, XX10,
XX11, XX12, XX13, XX14, XX15;
void md5_block_data_order(MD5_CTX * c, const void *data_, size_t num) {
const unsigned char *data = data_;
register unsigned MD32_REG_T A, B, C, D, l;
/* See comment in crypto/sha/sha_local.h for details. */
unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, XX8, XX9,
XX10, XX11, XX12, XX13, XX14, XX15;
#define X(i) XX##i
A = c->A;
B = c->B;
C = c->C;
D = c->D;
A = c->A;
B = c->B;
C = c->C;
D = c->D;
for (; num--;) {
(void)HOST_c2l(data, l);
X(0) = l;
(void)HOST_c2l(data, l);
X(1) = l;
/* Round 0 */
R0(A, B, C, D, X(0), 7, 0xd76aa478L);
(void)HOST_c2l(data, l);
X(2) = l;
R0(D, A, B, C, X(1), 12, 0xe8c7b756L);
(void)HOST_c2l(data, l);
X(3) = l;
R0(C, D, A, B, X(2), 17, 0x242070dbL);
(void)HOST_c2l(data, l);
X(4) = l;
R0(B, C, D, A, X(3), 22, 0xc1bdceeeL);
(void)HOST_c2l(data, l);
X(5) = l;
R0(A, B, C, D, X(4), 7, 0xf57c0fafL);
(void)HOST_c2l(data, l);
X(6) = l;
R0(D, A, B, C, X(5), 12, 0x4787c62aL);
(void)HOST_c2l(data, l);
X(7) = l;
R0(C, D, A, B, X(6), 17, 0xa8304613L);
(void)HOST_c2l(data, l);
X(8) = l;
R0(B, C, D, A, X(7), 22, 0xfd469501L);
(void)HOST_c2l(data, l);
X(9) = l;
R0(A, B, C, D, X(8), 7, 0x698098d8L);
(void)HOST_c2l(data, l);
X(10) = l;
R0(D, A, B, C, X(9), 12, 0x8b44f7afL);
(void)HOST_c2l(data, l);
X(11) = l;
R0(C, D, A, B, X(10), 17, 0xffff5bb1L);
(void)HOST_c2l(data, l);
X(12) = l;
R0(B, C, D, A, X(11), 22, 0x895cd7beL);
(void)HOST_c2l(data, l);
X(13) = l;
R0(A, B, C, D, X(12), 7, 0x6b901122L);
(void)HOST_c2l(data, l);
X(14) = l;
R0(D, A, B, C, X(13), 12, 0xfd987193L);
(void)HOST_c2l(data, l);
X(15) = l;
R0(C, D, A, B, X(14), 17, 0xa679438eL);
R0(B, C, D, A, X(15), 22, 0x49b40821L);
/* Round 1 */
R1(A, B, C, D, X(1), 5, 0xf61e2562L);
R1(D, A, B, C, X(6), 9, 0xc040b340L);
R1(C, D, A, B, X(11), 14, 0x265e5a51L);
R1(B, C, D, A, X(0), 20, 0xe9b6c7aaL);
R1(A, B, C, D, X(5), 5, 0xd62f105dL);
R1(D, A, B, C, X(10), 9, 0x02441453L);
R1(C, D, A, B, X(15), 14, 0xd8a1e681L);
R1(B, C, D, A, X(4), 20, 0xe7d3fbc8L);
R1(A, B, C, D, X(9), 5, 0x21e1cde6L);
R1(D, A, B, C, X(14), 9, 0xc33707d6L);
R1(C, D, A, B, X(3), 14, 0xf4d50d87L);
R1(B, C, D, A, X(8), 20, 0x455a14edL);
R1(A, B, C, D, X(13), 5, 0xa9e3e905L);
R1(D, A, B, C, X(2), 9, 0xfcefa3f8L);
R1(C, D, A, B, X(7), 14, 0x676f02d9L);
R1(B, C, D, A, X(12), 20, 0x8d2a4c8aL);
/* Round 2 */
R2(A, B, C, D, X(5), 4, 0xfffa3942L);
R2(D, A, B, C, X(8), 11, 0x8771f681L);
R2(C, D, A, B, X(11), 16, 0x6d9d6122L);
R2(B, C, D, A, X(14), 23, 0xfde5380cL);
R2(A, B, C, D, X(1), 4, 0xa4beea44L);
R2(D, A, B, C, X(4), 11, 0x4bdecfa9L);
R2(C, D, A, B, X(7), 16, 0xf6bb4b60L);
R2(B, C, D, A, X(10), 23, 0xbebfbc70L);
R2(A, B, C, D, X(13), 4, 0x289b7ec6L);
R2(D, A, B, C, X(0), 11, 0xeaa127faL);
R2(C, D, A, B, X(3), 16, 0xd4ef3085L);
R2(B, C, D, A, X(6), 23, 0x04881d05L);
R2(A, B, C, D, X(9), 4, 0xd9d4d039L);
R2(D, A, B, C, X(12), 11, 0xe6db99e5L);
R2(C, D, A, B, X(15), 16, 0x1fa27cf8L);
R2(B, C, D, A, X(2), 23, 0xc4ac5665L);
/* Round 3 */
R3(A, B, C, D, X(0), 6, 0xf4292244L);
R3(D, A, B, C, X(7), 10, 0x432aff97L);
R3(C, D, A, B, X(14), 15, 0xab9423a7L);
R3(B, C, D, A, X(5), 21, 0xfc93a039L);
R3(A, B, C, D, X(12), 6, 0x655b59c3L);
R3(D, A, B, C, X(3), 10, 0x8f0ccc92L);
R3(C, D, A, B, X(10), 15, 0xffeff47dL);
R3(B, C, D, A, X(1), 21, 0x85845dd1L);
R3(A, B, C, D, X(8), 6, 0x6fa87e4fL);
R3(D, A, B, C, X(15), 10, 0xfe2ce6e0L);
R3(C, D, A, B, X(6), 15, 0xa3014314L);
R3(B, C, D, A, X(13), 21, 0x4e0811a1L);
R3(A, B, C, D, X(4), 6, 0xf7537e82L);
R3(D, A, B, C, X(11), 10, 0xbd3af235L);
R3(C, D, A, B, X(2), 15, 0x2ad7d2bbL);
R3(B, C, D, A, X(9), 21, 0xeb86d391L);
for (; num--;) {
(void)HOST_c2l(data, l);
X(0) = l;
(void)HOST_c2l(data, l);
X(1) = l;
/* Round 0 */
R0(A, B, C, D, X(0), 7, 0xd76aa478L);
(void)HOST_c2l(data, l);
X(2) = l;
R0(D, A, B, C, X(1), 12, 0xe8c7b756L);
(void)HOST_c2l(data, l);
X(3) = l;
R0(C, D, A, B, X(2), 17, 0x242070dbL);
(void)HOST_c2l(data, l);
X(4) = l;
R0(B, C, D, A, X(3), 22, 0xc1bdceeeL);
(void)HOST_c2l(data, l);
X(5) = l;
R0(A, B, C, D, X(4), 7, 0xf57c0fafL);
(void)HOST_c2l(data, l);
X(6) = l;
R0(D, A, B, C, X(5), 12, 0x4787c62aL);
(void)HOST_c2l(data, l);
X(7) = l;
R0(C, D, A, B, X(6), 17, 0xa8304613L);
(void)HOST_c2l(data, l);
X(8) = l;
R0(B, C, D, A, X(7), 22, 0xfd469501L);
(void)HOST_c2l(data, l);
X(9) = l;
R0(A, B, C, D, X(8), 7, 0x698098d8L);
(void)HOST_c2l(data, l);
X(10) = l;
R0(D, A, B, C, X(9), 12, 0x8b44f7afL);
(void)HOST_c2l(data, l);
X(11) = l;
R0(C, D, A, B, X(10), 17, 0xffff5bb1L);
(void)HOST_c2l(data, l);
X(12) = l;
R0(B, C, D, A, X(11), 22, 0x895cd7beL);
(void)HOST_c2l(data, l);
X(13) = l;
R0(A, B, C, D, X(12), 7, 0x6b901122L);
(void)HOST_c2l(data, l);
X(14) = l;
R0(D, A, B, C, X(13), 12, 0xfd987193L);
(void)HOST_c2l(data, l);
X(15) = l;
R0(C, D, A, B, X(14), 17, 0xa679438eL);
R0(B, C, D, A, X(15), 22, 0x49b40821L);
/* Round 1 */
R1(A, B, C, D, X(1), 5, 0xf61e2562L);
R1(D, A, B, C, X(6), 9, 0xc040b340L);
R1(C, D, A, B, X(11), 14, 0x265e5a51L);
R1(B, C, D, A, X(0), 20, 0xe9b6c7aaL);
R1(A, B, C, D, X(5), 5, 0xd62f105dL);
R1(D, A, B, C, X(10), 9, 0x02441453L);
R1(C, D, A, B, X(15), 14, 0xd8a1e681L);
R1(B, C, D, A, X(4), 20, 0xe7d3fbc8L);
R1(A, B, C, D, X(9), 5, 0x21e1cde6L);
R1(D, A, B, C, X(14), 9, 0xc33707d6L);
R1(C, D, A, B, X(3), 14, 0xf4d50d87L);
R1(B, C, D, A, X(8), 20, 0x455a14edL);
R1(A, B, C, D, X(13), 5, 0xa9e3e905L);
R1(D, A, B, C, X(2), 9, 0xfcefa3f8L);
R1(C, D, A, B, X(7), 14, 0x676f02d9L);
R1(B, C, D, A, X(12), 20, 0x8d2a4c8aL);
/* Round 2 */
R2(A, B, C, D, X(5), 4, 0xfffa3942L);
R2(D, A, B, C, X(8), 11, 0x8771f681L);
R2(C, D, A, B, X(11), 16, 0x6d9d6122L);
R2(B, C, D, A, X(14), 23, 0xfde5380cL);
R2(A, B, C, D, X(1), 4, 0xa4beea44L);
R2(D, A, B, C, X(4), 11, 0x4bdecfa9L);
R2(C, D, A, B, X(7), 16, 0xf6bb4b60L);
R2(B, C, D, A, X(10), 23, 0xbebfbc70L);
R2(A, B, C, D, X(13), 4, 0x289b7ec6L);
R2(D, A, B, C, X(0), 11, 0xeaa127faL);
R2(C, D, A, B, X(3), 16, 0xd4ef3085L);
R2(B, C, D, A, X(6), 23, 0x04881d05L);
R2(A, B, C, D, X(9), 4, 0xd9d4d039L);
R2(D, A, B, C, X(12), 11, 0xe6db99e5L);
R2(C, D, A, B, X(15), 16, 0x1fa27cf8L);
R2(B, C, D, A, X(2), 23, 0xc4ac5665L);
/* Round 3 */
R3(A, B, C, D, X(0), 6, 0xf4292244L);
R3(D, A, B, C, X(7), 10, 0x432aff97L);
R3(C, D, A, B, X(14), 15, 0xab9423a7L);
R3(B, C, D, A, X(5), 21, 0xfc93a039L);
R3(A, B, C, D, X(12), 6, 0x655b59c3L);
R3(D, A, B, C, X(3), 10, 0x8f0ccc92L);
R3(C, D, A, B, X(10), 15, 0xffeff47dL);
R3(B, C, D, A, X(1), 21, 0x85845dd1L);
R3(A, B, C, D, X(8), 6, 0x6fa87e4fL);
R3(D, A, B, C, X(15), 10, 0xfe2ce6e0L);
R3(C, D, A, B, X(6), 15, 0xa3014314L);
R3(B, C, D, A, X(13), 21, 0x4e0811a1L);
R3(A, B, C, D, X(4), 6, 0xf7537e82L);
R3(D, A, B, C, X(11), 10, 0xbd3af235L);
R3(C, D, A, B, X(2), 15, 0x2ad7d2bbL);
R3(B, C, D, A, X(9), 21, 0xeb86d391L);
A = c->A += A;
B = c->B += B;
C = c->C += C;
D = c->D += D;
}
}
/**
* Modification 2021 Paul Scherrer Institut
* from md32_common.h
*/
int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) {
const unsigned char *data = data_;
unsigned char *p;
HASH_LONG l;
size_t n;
if (len == 0)
return 1;
l = (c->Nl + (((HASH_LONG)len) << 3)) & 0xffffffffUL;
if (l < c->Nl) /* overflow */
c->Nh++;
c->Nh += (HASH_LONG)(len >> 29); /* might cause compiler warning on
* 16-bit */
c->Nl = l;
n = c->num;
if (n != 0) {
p = (unsigned char *)c->data;
if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
memcpy(p + n, data, HASH_CBLOCK - n);
HASH_BLOCK_DATA_ORDER(c, p, 1);
n = HASH_CBLOCK - n;
data += n;
len -= n;
c->num = 0;
/*
* We use memset rather than OPENSSL_cleanse() here deliberately.
* Using OPENSSL_cleanse() here could be a performance issue. It
* will get properly cleansed on finalisation so this isn't a
* security problem.
*/
memset(p, 0, HASH_CBLOCK); /* keep it zeroed */
} else {
memcpy(p + n, data, len);
c->num += (unsigned int)len;
return 1;
A = c->A += A;
B = c->B += B;
C = c->C += C;
D = c->D += D;
}
}
n = len / HASH_CBLOCK;
if (n > 0) {
HASH_BLOCK_DATA_ORDER(c, data, n);
n *= HASH_CBLOCK;
data += n;
len -= n;
/**
* Modification 2021 Paul Scherrer Institut
* from md32_common.h
*/
int HASH_UPDATE(HASH_CTX * c, const void *data_, size_t len) {
const unsigned char *data = data_;
unsigned char *p;
HASH_LONG l;
size_t n;
if (len == 0)
return 1;
l = (c->Nl + (((HASH_LONG)len) << 3)) & 0xffffffffUL;
if (l < c->Nl) /* overflow */
c->Nh++;
c->Nh += (HASH_LONG)(len >> 29); /* might cause compiler warning on
* 16-bit */
c->Nl = l;
n = c->num;
if (n != 0) {
p = (unsigned char *)c->data;
if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
memcpy(p + n, data, HASH_CBLOCK - n);
HASH_BLOCK_DATA_ORDER(c, p, 1);
n = HASH_CBLOCK - n;
data += n;
len -= n;
c->num = 0;
/*
* We use memset rather than OPENSSL_cleanse() here
* deliberately. Using OPENSSL_cleanse() here could be a
* performance issue. It will get properly cleansed on
* finalisation so this isn't a security problem.
*/
memset(p, 0, HASH_CBLOCK); /* keep it zeroed */
} else {
memcpy(p + n, data, len);
c->num += (unsigned int)len;
return 1;
}
}
n = len / HASH_CBLOCK;
if (n > 0) {
HASH_BLOCK_DATA_ORDER(c, data, n);
n *= HASH_CBLOCK;
data += n;
len -= n;
}
if (len != 0) {
p = (unsigned char *)c->data;
c->num = (unsigned int)len;
memcpy(p, data, len);
}
return 1;
}
if (len != 0) {
p = (unsigned char *)c->data;
c->num = (unsigned int)len;
memcpy(p, data, len);
}
return 1;
}
/**
* Modification 2021 Paul Scherrer Institut
* from md32_common.h
*/
int HASH_FINAL(unsigned char *md, HASH_CTX *c) {
unsigned char *p = (unsigned char *)c->data;
size_t n = c->num;
/**
* Modification 2021 Paul Scherrer Institut
* from md32_common.h
*/
int HASH_FINAL(unsigned char *md, HASH_CTX *c) {
unsigned char *p = (unsigned char *)c->data;
size_t n = c->num;
p[n] = 0x80; /* there is always room for one */
n++;
p[n] = 0x80; /* there is always room for one */
n++;
if (n > (HASH_CBLOCK - 8)) {
memset(p + n, 0, HASH_CBLOCK - n);
n = 0;
HASH_BLOCK_DATA_ORDER(c, p, 1);
}
memset(p + n, 0, HASH_CBLOCK - 8 - n);
if (n > (HASH_CBLOCK - 8)) {
memset(p + n, 0, HASH_CBLOCK - n);
n = 0;
HASH_BLOCK_DATA_ORDER(c, p, 1);
}
memset(p + n, 0, HASH_CBLOCK - 8 - n);
p += HASH_CBLOCK - 8;
p += HASH_CBLOCK - 8;
#if defined(DATA_ORDER_IS_BIG_ENDIAN)
(void)HOST_l2c(c->Nh, p);
(void)HOST_l2c(c->Nl, p);
(void)HOST_l2c(c->Nh, p);
(void)HOST_l2c(c->Nl, p);
#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
(void)HOST_l2c(c->Nl, p);
(void)HOST_l2c(c->Nh, p);
#endif
p -= HASH_CBLOCK;
HASH_BLOCK_DATA_ORDER(c, p, 1);
c->num = 0;
// OPENSSL_cleanse(p, HASH_CBLOCK);
// Erik: Since we don't do encryption secure cleaning is not needed
memset(p, 0, HASH_CBLOCK);
p -= HASH_CBLOCK;
HASH_BLOCK_DATA_ORDER(c, p, 1);
c->num = 0;
// OPENSSL_cleanse(p, HASH_CBLOCK);
// Erik: Since we don't do encryption secure cleaning is not needed
memset(p, 0, HASH_CBLOCK);
HASH_MAKE_STRING(c, md);
HASH_MAKE_STRING(c, md);
return 1;
}
return 1;
}
#ifdef __cplusplus
} // namespace sls
+1 -1
View File
@@ -225,7 +225,7 @@ void validatePortRange(uint16_t startPort, int numPorts) {
void setupSignalHandler(int signal, void (*handler)(int)) {
// Catch signal SIGINT to close files and call destructors properly
struct sigaction sa {};
struct sigaction sa{};
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask); // dont block additional signals
sa.sa_flags = 0;