Merge pull request #284 from slsdetectorgroup/j13flippeddatax

Jungfrau features: 13. flipped data x
This commit is contained in:
Dhanya Thattil
2021-08-06 19:15:09 +02:00
committed by GitHub
33 changed files with 282 additions and 119 deletions

View File

@@ -63,6 +63,7 @@ This document describes the differences between 5.2.0 and 5.1.0 releases.
getAutoCompDisable->getAutoComparatorDisable
setBottom->setFlipRows
3. Firmware Requirements
========================

View File

@@ -2242,7 +2242,9 @@ class Detector(CppDetectorApi):
"""[Gotthard2] Set filter resistor.
Note
----
Default is 0. Options: 0-3.
Advanced user command.
[Gotthard2] Default is 0. Options: 0-3.
[Jungfrau] Default is 1. Options: 0-1.
"""
return self.getFilter()
@@ -2250,6 +2252,21 @@ class Detector(CppDetectorApi):
def filter(self, value):
ut.set_using_dict(self.setFilter, value)
@property
@element
def filtercell(self):
"""
[Jungfrau] Set filter capacitor.
Note
----
[Jungfrau] Options: 0-12. Default: 0. Advanced user command.
"""
return self.getFilterCell()
@filtercell.setter
def filtercell(self, value):
ut.set_using_dict(self.setFilterCell, value)
@property
def maxclkphaseshift(self):
"""

View File

@@ -848,12 +848,13 @@ void init_det(py::module &m) {
(void (Detector::*)(bool, sls::Positions)) &
Detector::setOverFlowMode,
py::arg(), py::arg() = Positions{})
.def("getBottom",
.def("getFlipRows",
(Result<bool>(Detector::*)(sls::Positions) const) &
Detector::getBottom,
Detector::getFlipRows,
py::arg() = Positions{})
.def("setBottom",
(void (Detector::*)(bool, sls::Positions)) & Detector::setBottom,
.def("setFlipRows",
(void (Detector::*)(bool, sls::Positions)) &
Detector::setFlipRows,
py::arg(), py::arg() = Positions{})
.def("getRateCorrection",
(Result<sls::ns>(Detector::*)(sls::Positions) const) &
@@ -1103,6 +1104,13 @@ void init_det(py::module &m) {
.def("setFilter",
(void (Detector::*)(int, sls::Positions)) & Detector::setFilter,
py::arg(), py::arg() = Positions{})
.def("getFilterCell",
(Result<int>(Detector::*)(sls::Positions) const) &
Detector::getFilterCell,
py::arg() = Positions{})
.def("setFilterCell",
(void (Detector::*)(int, sls::Positions)) & Detector::setFilterCell,
py::arg(), py::arg() = Positions{})
.def("getCurrentSource",
(Result<bool>(Detector::*)(sls::Positions) const) &
Detector::getCurrentSource,

View File

@@ -190,7 +190,7 @@
#define CONFIG_TDMA_TIMESLOT_OFST (25) // 1ms
#define CONFIG_TDMA_TIMESLOT_MSK (0x0000001F << CONFIG_TDMA_TIMESLOT_OFST)
#define CONFIG_BOTTOM_INVERT_STREAM_OFST (30)
#define CONFIG_BOTTOM_INVERT_STREAM_MSK (0x0000001F << CONFIG_BOTTOM_INVERT_STREAM_OFST)
#define CONFIG_BOTTOM_INVERT_STREAM_MSK (0x00000001 << CONFIG_BOTTOM_INVERT_STREAM_OFST)
#define CONFIG_ETHRNT_FLW_CNTRL_OFST (31)
#define CONFIG_ETHRNT_FLW_CNTRL_MSK (0x00000001 << CONFIG_ETHRNT_FLW_CNTRL_OFST)

View File

@@ -474,6 +474,7 @@ void setupDetector() {
// temp threshold and reset event
setThresholdTemperature(DEFAULT_TMP_THRSHLD);
setTemperatureEvent(0);
setFlipRows(0);
}
int resetToDefaultDacs(int hardReset) {
@@ -2002,6 +2003,25 @@ void alignDeserializer() {
bus_r(ADC_DSRLZR_3_REG) & (~(ADC_DSRLZR_3_RFRSH_ALGNMNT_MSK)));
}
int getFlipRows() {
return ((bus_r(CONFIG_REG) & CONFIG_BOTTOM_INVERT_STREAM_MSK) >>
CONFIG_BOTTOM_INVERT_STREAM_OFST);
}
void setFlipRows(int arg) {
if (arg >= 0) {
if (arg == 0) {
LOG(logINFO, ("Switching off bottom row flipping\n"));
bus_w(CONFIG_REG,
bus_r(CONFIG_REG) & ~CONFIG_BOTTOM_INVERT_STREAM_MSK);
} else {
LOG(logINFO, ("Switching on bottom row flipping\n"));
bus_w(CONFIG_REG,
bus_r(CONFIG_REG) | CONFIG_BOTTOM_INVERT_STREAM_MSK);
}
}
}
int getTenGigaFlowControl() {
return ((bus_r(CONFIG_REG) & CONFIG_ETHRNT_FLW_CNTRL_MSK) >>
CONFIG_ETHRNT_FLW_CNTRL_OFST);

View File

@@ -460,6 +460,8 @@ int setThresholdTemperature(int val);
int setTemperatureControl(int val);
int setTemperatureEvent(int val);
void alignDeserializer();
int getFlipRows();
void setFlipRows(int arg);
// eiger specific - iodelay, pulse, rate, temp, activate, delay nw parameter
#elif EIGERD

View File

@@ -260,4 +260,6 @@ int set_default_dac(int);
int get_gain_mode(int);
int set_gain_mode(int);
int get_comp_disable_time(int);
int set_comp_disable_time(int);
int set_comp_disable_time(int);
int get_flip_rows(int);
int set_flip_rows(int);

View File

@@ -386,6 +386,8 @@ void function_table() {
flist[F_SET_GAIN_MODE] = &set_gain_mode;
flist[F_GET_COMP_DISABLE_TIME] = &get_comp_disable_time;
flist[F_SET_COMP_DISABLE_TIME] = &set_comp_disable_time;
flist[F_GET_FLIP_ROWS] = &get_flip_rows;
flist[F_SET_FLIP_ROWS] = &set_flip_rows;
// check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
@@ -8675,4 +8677,65 @@ int set_comp_disable_time(int file_des) {
}
#endif
return Server_SendResult(file_des, INT64, NULL, 0);
}
}
int get_flip_rows(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int retval = -1;
LOG(logDEBUG1, ("Getting flip rows\n"));
#ifndef JUNGFRAUD
functionNotImplemented();
#else
// get only
retval = getFlipRows();
LOG(logDEBUG1, ("flip rows retval: %u\n", retval));
#endif
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
}
int set_flip_rows(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
int arg = -1;
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
return printSocketReadError();
LOG(logINFO, ("Setting flip rows: %u\n", (int)arg));
#ifndef JUNGFRAUD
functionNotImplemented();
#else
// only set
if (Server_VerifyLock() == OK) {
if (arg != 0 && arg != 1) {
ret = FAIL;
sprintf(mess,
"Could not set flip rows. Invalid argument %d.\n",
arg);
LOG(logERROR, (mess));
}
// only for HW 2.0 (version = 3)
else if (isHardwareVersion2()) {
ret = FAIL;
strcpy(mess, "Could not set flip rows. Only available for "
"Hardware Board version 2.0.\n");
LOG(logERROR, (mess));
} else if (getNumberofUDPInterfaces() == 1) {
ret = FAIL;
strcpy(mess, "Could not set flip rows. Number of udp "
"interfaces is still 1.\n");
LOG(logERROR, (mess));
} else {
setFlipRows(arg);
int retval = getFlipRows();
LOG(logDEBUG1, ("flip rows retval: %u\n", retval));
validate(&ret, mess, arg, retval, "set flip rows", DEC);
}
}
#endif
return Server_SendResult(file_des, INT32, NULL, 0);
}

View File

@@ -172,6 +172,17 @@ class Detector {
*/
void setGapPixelsinCallback(const bool enable);
/** [Eiger][Jungfrau] */
Result<bool> getFlipRows(Positions pos = {}) const;
/** [Eiger] flips rows paramater sent to slsreceiver to stream as json
* parameter to flip rows in gui \n[Jungfrau] flips rows in the detector
* itself. For bottom module and number of interfaces must be set to 2.
* slsReceiver and slsDetectorGui does not handle.slsReceiver and
* slsDetectorGui does not handle
*/
void setFlipRows(bool value, Positions pos = {});
Result<bool> isVirtualDetectorServer(Positions pos = {}) const;
///@{
@@ -995,12 +1006,6 @@ class Detector {
/** [Eiger] Overflow in 32 bit mode. Default is disabled.*/
void setOverFlowMode(bool value, Positions pos = {});
/** [Eiger] */
Result<bool> getBottom(Positions pos = {}) const;
/** [Eiger] for client call back (gui) purposes to flip bottom image */
void setBottom(bool value, Positions pos = {});
/** [Eiger] deadtime in ns, 0 = disabled */
Result<ns> getRateCorrection(Positions pos = {}) const;

View File

@@ -584,6 +584,7 @@ class CmdProxy {
{"detsizechan", "detsize"},
{"trimdir", "settingspath"},
{"settingsdir", "settingspath"},
{"flippeddatax", "fliprows"},
/* acquisition parameters */
{"cycles", "triggers"},
@@ -769,6 +770,7 @@ class CmdProxy {
{"trimval", &CmdProxy::trimval},
{"trimen", &CmdProxy::TrimEnergies},
{"gappixels", &CmdProxy::GapPixels},
{"fliprows", &CmdProxy::fliprows},
/* acquisition parameters */
{"acquire", &CmdProxy::Acquire},
@@ -906,7 +908,6 @@ class CmdProxy {
{"subexptime", &CmdProxy::subexptime},
{"subdeadtime", &CmdProxy::subdeadtime},
{"overflow", &CmdProxy::overflow},
{"flippeddatax", &CmdProxy::flippeddatax},
{"ratecorr", &CmdProxy::RateCorrection},
{"readnlines", &CmdProxy::readnlines},
{"interruptsubframe", &CmdProxy::interruptsubframe},
@@ -1233,6 +1234,14 @@ class CmdProxy {
"[n_trimval]\n\t[Eiger][Mythen3] All trimbits set to this "
"value. Returns -1 if all trimbits are different values.");
INTEGER_COMMAND_VEC_ID(
fliprows, getFlipRows, setFlipRows, StringTo<int>,
"[0, 1]\n\t[Eiger] flips rows paramater sent to slsreceiver "
"to stream as json parameter to flip rows in gui \n\t[Jungfrau] flips "
"rows in the detector itself. For bottom module and number of "
"interfaces must be set to 2. slsReceiver and slsDetectorGui "
"does not handle.");
/* acquisition parameters */
INTEGER_COMMAND_SET_NOID_GET_ID(
@@ -1778,13 +1787,6 @@ class CmdProxy {
"[0, 1]\n\t[Eiger] Enable or disable show overflow flag in "
"32 bit mode. Default is disabled.");
INTEGER_COMMAND_VEC_ID(
flippeddatax, getBottom, setBottom, StringTo<int>,
"[0, 1]\n\t[Eiger] Top or Bottom Half of Eiger module. 1 is bottom, 0 "
"is top. Used to let Gui (via zmq from receiver) know to flip the "
"bottom image over the x axis. Files are not written without the flip "
"however.");
INTEGER_COMMAND_VEC_ID(
readnlines, getPartialReadout, setPartialReadout, StringTo<int>,
"[1 - 256]\n\t[Eiger] Number of rows to readout per half module "

View File

@@ -279,6 +279,14 @@ void Detector::setGapPixelsinCallback(bool enable) {
pimpl->setGapPixelsinCallback(enable);
}
Result<bool> Detector::getFlipRows(Positions pos) const {
return pimpl->Parallel(&Module::getFlipRows, pos);
}
void Detector::setFlipRows(bool value, Positions pos) {
pimpl->Parallel(&Module::setFlipRows, pos, value);
}
Result<bool> Detector::isVirtualDetectorServer(Positions pos) const {
return pimpl->Parallel(&Module::isVirtualDetectorServer, pos);
}
@@ -1304,14 +1312,6 @@ void Detector::setOverFlowMode(bool value, Positions pos) {
pimpl->Parallel(&Module::setOverFlowMode, pos, value);
}
Result<bool> Detector::getBottom(Positions pos) const {
return pimpl->Parallel(&Module::getFlippedDataX, pos);
}
void Detector::setBottom(bool value, Positions pos) {
pimpl->Parallel(&Module::setFlippedDataX, pos, value);
}
Result<ns> Detector::getRateCorrection(Positions pos) const {
return pimpl->Parallel(&Module::getRateCorrection, pos);
}
@@ -1513,6 +1513,14 @@ void Detector::setGainMode(const defs::gainMode mode, Positions pos) {
pimpl->Parallel(&Module::setGainMode, pos, mode);
}
Result<int> Detector::getFilterCell(Positions pos) const {
return pimpl->Parallel(&Module::getFilterCell, pos);
}
void Detector::setFilterCell(int cell, Positions pos) {
pimpl->Parallel(&Module::setFilterCell, pos, cell);
}
// Gotthard Specific
Result<defs::ROI> Detector::getROI(Positions pos) const {

View File

@@ -490,8 +490,7 @@ void DetectorImpl::readFrameFromReceiver() {
uint64_t currentAcquisitionIndex = -1, currentFrameIndex = -1,
currentFileIndex = -1;
double currentProgress = 0.00;
uint32_t currentSubFrameIndex = -1, coordX = -1, coordY = -1,
flippedDataX = -1;
uint32_t currentSubFrameIndex = -1, coordX = -1, coordY = -1, flipRows = -1;
while (numZmqRunning != 0) {
// reset data
@@ -571,7 +570,7 @@ void DetectorImpl::readFrameFromReceiver() {
if (eiger) {
coordY = (nY - 1) - coordY;
}
flippedDataX = zHeader.flippedDataX;
flipRows = zHeader.flipRows;
if (zHeader.completeImage == 0) {
completeImage = false;
}
@@ -585,7 +584,7 @@ void DetectorImpl::readFrameFromReceiver() {
<< "\n\tcurrentSubFrameIndex: " << currentSubFrameIndex
<< "\n\tcurrentProgress: " << currentProgress
<< "\n\tcoordX: " << coordX << "\n\tcoordY: " << coordY
<< "\n\tflippedDataX: " << flippedDataX
<< "\n\tflipRows: " << flipRows
<< "\n\tcompleteImage: " << completeImage;
}
@@ -609,7 +608,7 @@ void DetectorImpl::readFrameFromReceiver() {
<< "\n\tsingledetrowoffset: " << singledetrowoffset
<< "\n\trowoffset: " << rowoffset;
if (eiger && (flippedDataX != 0U)) {
if (eiger && (flipRows != 0U)) {
for (uint32_t i = 0; i < nPixelsY; ++i) {
memcpy((multiframe.get()) +
((yoffset + (nPixelsY - 1 - i)) *

View File

@@ -458,6 +458,21 @@ int Module::setTrimEn(const std::vector<int> &energies) {
return shm()->trimEnergies.size();
}
bool Module::getFlipRows() const {
if (shm()->myDetectorType == EIGER) {
return sendToReceiver<int>(F_GET_FLIP_ROWS_RECEIVER);
}
return sendToDetector<int>(F_GET_FLIP_ROWS);
}
void Module::setFlipRows(bool value) {
if (shm()->myDetectorType == EIGER) {
sendToReceiver<int>(F_SET_FLIP_ROWS_RECEIVER, static_cast<int>(value));
} else {
sendToDetector(F_SET_FLIP_ROWS, static_cast<int>(value), nullptr);
}
}
bool Module::isVirtualDetectorServer() const {
return sendToDetector<int>(F_IS_VIRTUAL);
}
@@ -1398,14 +1413,6 @@ void Module::setOverFlowMode(const bool enable) {
sendToDetector(F_SET_OVERFLOW_MODE, static_cast<int>(enable), nullptr);
}
bool Module::getFlippedDataX() const {
return sendToReceiver<int>(F_SET_FLIPPED_DATA_RECEIVER, GET_FLAG);
}
void Module::setFlippedDataX(bool value) {
sendToReceiver<int>(F_SET_FLIPPED_DATA_RECEIVER, static_cast<int>(value));
}
int64_t Module::getRateCorrection() const {
return sendToDetector<int64_t>(F_GET_RATE_CORRECT);
}

View File

@@ -114,6 +114,8 @@ class Module : public virtual slsDetectorDefs {
void setAllTrimbits(int val);
std::vector<int> getTrimEn() const;
int setTrimEn(const std::vector<int> &energies = {});
bool getFlipRows() const;
void setFlipRows(bool value);
bool isVirtualDetectorServer() const;
/**************************************************
@@ -323,8 +325,6 @@ class Module : public virtual slsDetectorDefs {
void setSubDeadTime(int64_t value);
bool getOverFlowMode() const;
void setOverFlowMode(const bool enable);
bool getFlippedDataX() const;
void setFlippedDataX(bool value);
int64_t getRateCorrection() const;
void setDefaultRateCorrection();
void setRateCorrection(int64_t t = 0);
@@ -373,7 +373,7 @@ class Module : public virtual slsDetectorDefs {
void setStorageCellDelay(int64_t value);
gainMode getGainMode() const;
void setGainMode(const gainMode mode);
/**************************************************
* *
* Gotthard Specific *

View File

@@ -340,27 +340,6 @@ TEST_CASE("overflow", "[.cmd]") {
}
}
TEST_CASE("flippeddatax", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER) {
auto previous = det.getBottom();
std::ostringstream oss1, oss2, oss3;
proxy.Call("flippeddatax", {"1"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "flippeddatax 1\n");
proxy.Call("flippeddatax", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "flippeddatax 1\n");
proxy.Call("flippeddatax", {"0"}, -1, PUT, oss3);
REQUIRE(oss3.str() == "flippeddatax 0\n");
for (int i = 0; i != det.size(); ++i) {
det.setBottom(previous[i], {i});
}
} else {
REQUIRE_THROWS(proxy.Call("flippeddatax", {}, -1, GET));
}
}
TEST_CASE("ratecorr", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);

View File

@@ -510,6 +510,34 @@ TEST_CASE("gappixels", "[.cmd]") {
}
}
TEST_CASE("fliprows", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) {
auto previous = det.getFlipRows();
auto previous_numudp = det.getNumberofUDPInterfaces();
if (det_type == defs::JUNGFRAU) {
det.setNumberofUDPInterfaces(2);
}
std::ostringstream oss1, oss2, oss3;
proxy.Call("fliprows", {"1"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "fliprows 1\n");
proxy.Call("fliprows", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "fliprows 1\n");
proxy.Call("fliprows", {"0"}, -1, PUT, oss3);
REQUIRE(oss3.str() == "fliprows 0\n");
for (int i = 0; i != det.size(); ++i) {
det.setFlipRows(previous[i], {i});
if (det_type == defs::JUNGFRAU) {
det.setNumberofUDPInterfaces(previous_numudp[i], {i});
}
}
} else {
REQUIRE_THROWS(proxy.Call("fliprows", {}, -1, GET));
}
}
/* acquisition parameters */
// acquire: not testing

View File

@@ -156,7 +156,8 @@ int ClientInterface::functionTable(){
flist[F_SET_RECEIVER_STREAMING] = &ClientInterface::set_streaming;
flist[F_GET_RECEIVER_STREAMING] = &ClientInterface::get_streaming;
flist[F_RECEIVER_STREAMING_TIMER] = &ClientInterface::set_streaming_timer;
flist[F_SET_FLIPPED_DATA_RECEIVER] = &ClientInterface::set_flipped_data;
flist[F_GET_FLIP_ROWS_RECEIVER] = &ClientInterface::get_flip_rows;
flist[F_SET_FLIP_ROWS_RECEIVER] = &ClientInterface::set_flip_rows;
flist[F_SET_RECEIVER_FILE_FORMAT] = &ClientInterface::set_file_format;
flist[F_GET_RECEIVER_FILE_FORMAT] = &ClientInterface::get_file_format;
flist[F_SET_RECEIVER_STREAMING_PORT] = &ClientInterface::set_streaming_port;
@@ -1020,21 +1021,33 @@ int ClientInterface::set_streaming_timer(Interface &socket) {
return socket.sendResult(retval);
}
int ClientInterface::set_flipped_data(Interface &socket) {
int ClientInterface::get_flip_rows(Interface &socket) {
if (myDetectorType != EIGER)
functionNotImplemented();
int retval = impl()->getFlipRows();
LOG(logDEBUG1) << "Flip rows:" << retval;
return socket.sendResult(retval);
}
int ClientInterface::set_flip_rows(Interface &socket) {
auto arg = socket.Receive<int>();
if (myDetectorType != EIGER)
functionNotImplemented();
if (arg >= 0) {
verifyIdle(socket);
LOG(logDEBUG1) << "Setting flipped data:" << arg;
impl()->setFlippedDataX(arg);
if (arg != 0 && arg != 1) {
throw RuntimeError("Could not set flip rows. Invalid argument: " +
std::to_string(arg));
}
int retval = impl()->getFlippedDataX();
validate(arg, retval, std::string("set flipped data"), DEC);
LOG(logDEBUG1) << "Flipped Data:" << retval;
return socket.sendResult(retval);
verifyIdle(socket);
LOG(logDEBUG1) << "Setting flip rows:" << arg;
impl()->setFlipRows(static_cast<bool>(arg));
int retval = impl()->getFlipRows();
validate(arg, retval, std::string("set flip rows"), DEC);
LOG(logDEBUG1) << "Flip rows:" << retval;
return socket.sendResult(retval);
}
int ClientInterface::set_file_format(Interface &socket) {

View File

@@ -107,7 +107,8 @@ class ClientInterface : private virtual slsDetectorDefs {
int set_streaming(sls::ServerInterface &socket);
int get_streaming(sls::ServerInterface &socket);
int set_streaming_timer(sls::ServerInterface &socket);
int set_flipped_data(sls::ServerInterface &socket);
int get_flip_rows(sls::ServerInterface &socket);
int set_flip_rows(sls::ServerInterface &socket);
int set_file_format(sls::ServerInterface &socket);
int get_file_format(sls::ServerInterface &socket);
int set_streaming_port(sls::ServerInterface &socket);

View File

@@ -15,9 +15,9 @@
const std::string DataStreamer::TypeName = "DataStreamer";
DataStreamer::DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi,
int fd, int *nm, bool *qe, uint64_t *tot)
bool fr, int *nm, bool *qe, uint64_t *tot)
: ThreadObject(ind, TypeName), fifo(f), dynamicRange(dr), roi(r),
fileIndex(fi), flippedDataX(fd), quadEnable(qe), totalNumFrames(tot) {
fileIndex(fi), flipRows(fr), quadEnable(qe), totalNumFrames(tot) {
numMods[0] = nm[0];
numMods[1] = nm[1];
@@ -65,7 +65,7 @@ void DataStreamer::SetNumberofModules(int *nm) {
numMods[1] = nm[1];
}
void DataStreamer::SetFlippedDataX(int fd) { flippedDataX = fd; }
void DataStreamer::SetFlipRows(bool fd) { flipRows = fd; }
void DataStreamer::SetAdditionalJsonHeader(
const std::map<std::string, std::string> &json) {
@@ -240,7 +240,7 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size,
zHeader.roundRNumber = header.roundRNumber;
zHeader.detType = header.detType;
zHeader.version = header.version;
zHeader.flippedDataX = flippedDataX;
zHeader.flipRows = static_cast<int>(flipRows);
zHeader.quad = *quadEnable;
zHeader.completeImage =
(header.packetNumber < generalData->packetsPerFrame ? false : true);

View File

@@ -30,12 +30,12 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
* @param dr pointer to dynamic range
* @param r roi
* @param fi pointer to file index
* @param fd flipped data enable for x dimension
* @param fr flip rows
* @param nm pointer to number of modules in each dimension
* @param qe pointer to quad Enable
* @param tot pointer to total number of frames
*/
DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, int fd,
DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, bool fr,
int *nm, bool *qe, uint64_t *tot);
/**
@@ -68,10 +68,10 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
void SetNumberofModules(int *nm);
/**
* Set Flipped data enable across x dimension
* @param fd data enable in x dimension
* Set Flipped rows
* @param fd flip rows enable
*/
void SetFlippedDataX(int fd);
void SetFlipRows(bool fd);
/**
* Set additional json header
@@ -165,8 +165,8 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
/** Pointer to file index */
uint64_t *fileIndex;
/** flipped data across x axis */
int flippedDataX;
/** flip rows */
bool flipRows;
/** additional json header */
std::map<std::string, std::string> additionalJsonHeader;

View File

@@ -893,15 +893,15 @@ void Implementation::setNumberofUDPInterfaces(const int n) {
// streamer threads
if (dataStreamEnable) {
try {
int fd = flippedDataX;
bool flip = flipRows;
int nm[2] = {numMods[0], numMods[1]};
if (quadEnable) {
fd = i;
flip = (i == 1 ? true : false);
nm[0] = 1;
nm[1] = 2;
}
dataStreamer.push_back(sls::make_unique<DataStreamer>(
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, fd,
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
(int *)nm, &quadEnable, &numberOfTotalFrames));
dataStreamer[i]->SetGeneralData(generalData);
dataStreamer[i]->CreateZmqSockets(
@@ -1022,15 +1022,15 @@ void Implementation::setDataStreamEnable(const bool enable) {
if (enable) {
for (int i = 0; i < numThreads; ++i) {
try {
int fd = flippedDataX;
bool flip = flipRows;
int nm[2] = {numMods[0], numMods[1]};
if (quadEnable) {
fd = i;
flip = (i == 1 ? true : false);
nm[0] = 1;
nm[1] = 2;
}
dataStreamer.push_back(sls::make_unique<DataStreamer>(
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, fd,
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
(int *)nm, &quadEnable, &numberOfTotalFrames));
dataStreamer[i]->SetGeneralData(generalData);
dataStreamer[i]->CreateZmqSockets(
@@ -1458,22 +1458,24 @@ void Implementation::setTenGigaEnable(const bool b) {
LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame);
}
int Implementation::getFlippedDataX() const { return flippedDataX; }
bool Implementation::getFlipRows() const { return flipRows; }
void Implementation::setFlippedDataX(int enable) {
flippedDataX = (enable == 0) ? 0 : 1;
void Implementation::setFlipRows(bool enable) {
flipRows = enable;
if (!quadEnable) {
for (const auto &it : dataStreamer) {
it->SetFlippedDataX(flippedDataX);
}
} else {
if (dataStreamer.size() == 2) {
dataStreamer[0]->SetFlippedDataX(0);
dataStreamer[1]->SetFlippedDataX(1);
it->SetFlipRows(flipRows);
}
}
LOG(logINFO) << "Flipped Data X: " << flippedDataX;
// quad
else {
if (dataStreamer.size() == 2) {
dataStreamer[0]->SetFlipRows(false);
dataStreamer[1]->SetFlipRows(true);
}
}
LOG(logINFO) << "Flip Rows: " << flipRows;
}
bool Implementation::getQuad() const { return quadEnable; }
@@ -1485,7 +1487,7 @@ void Implementation::setQuad(const bool b) {
if (!quadEnable) {
for (const auto &it : dataStreamer) {
it->SetNumberofModules(numMods);
it->SetFlippedDataX(flippedDataX);
it->SetFlipRows(flipRows);
}
} else {
int size[2] = {1, 2};
@@ -1493,8 +1495,8 @@ void Implementation::setQuad(const bool b) {
it->SetNumberofModules(size);
}
if (dataStreamer.size() == 2) {
dataStreamer[0]->SetFlippedDataX(0);
dataStreamer[1]->SetFlippedDataX(1);
dataStreamer[0]->SetFlipRows(false);
dataStreamer[1]->SetFlipRows(true);
}
}
}

View File

@@ -202,8 +202,8 @@ class Implementation : private virtual slsDetectorDefs {
bool getTenGigaEnable() const;
/* [Eiger][Ctb] */
void setTenGigaEnable(const bool b);
int getFlippedDataX() const;
void setFlippedDataX(int enable = -1);
bool getFlipRows() const;
void setFlipRows(bool enable);
bool getQuad() const;
/* [Eiger] */
void setQuad(const bool b);
@@ -347,7 +347,7 @@ class Implementation : private virtual slsDetectorDefs {
uint32_t dynamicRange{16};
ROI roi{};
bool tengigaEnable{false};
int flippedDataX{0};
bool flipRows{false};
bool quadEnable{false};
bool activated{true};
std::array<bool, 2> detectorDataStream = {{true, true}};

View File

@@ -58,8 +58,8 @@ struct zmqHeader {
uint16_t roundRNumber{0};
uint8_t detType{0};
uint8_t version{0};
/** if image should be flipped across x axis */
int flippedDataX{0};
/** if rows of image should be flipped */
int flipRows{0};
/** quad type (eiger hardware specific) */
uint32_t quad{0};
/** true if complete image, else missing packets */

View File

@@ -237,6 +237,8 @@ enum detFuncs {
F_SET_GAIN_MODE,
F_GET_COMP_DISABLE_TIME,
F_SET_COMP_DISABLE_TIME,
F_GET_FLIP_ROWS,
F_SET_FLIP_ROWS,
NUM_DET_FUNCTIONS,
RECEIVER_ENUM_START = 256, /**< detector function should not exceed this
@@ -287,7 +289,8 @@ enum detFuncs {
F_SET_RECEIVER_STREAMING,
F_GET_RECEIVER_STREAMING,
F_RECEIVER_STREAMING_TIMER,
F_SET_FLIPPED_DATA_RECEIVER,
F_GET_FLIP_ROWS_RECEIVER,
F_SET_FLIP_ROWS_RECEIVER,
F_SET_RECEIVER_FILE_FORMAT,
F_GET_RECEIVER_FILE_FORMAT,
F_SET_RECEIVER_STREAMING_PORT,
@@ -580,6 +583,8 @@ const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_SET_GAIN_MODE: return "F_SET_GAIN_MODE";
case F_GET_COMP_DISABLE_TIME: return "F_GET_COMP_DISABLE_TIME";
case F_SET_COMP_DISABLE_TIME: return "F_SET_COMP_DISABLE_TIME";
case F_GET_FLIP_ROWS: return "F_GET_FLIP_ROWS";
case F_SET_FLIP_ROWS: return "F_SET_FLIP_ROWS";
case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS";
case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START";
@@ -629,7 +634,8 @@ const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_SET_RECEIVER_STREAMING: return "F_SET_RECEIVER_STREAMING";
case F_GET_RECEIVER_STREAMING: return "F_GET_RECEIVER_STREAMING";
case F_RECEIVER_STREAMING_TIMER: return "F_RECEIVER_STREAMING_TIMER";
case F_SET_FLIPPED_DATA_RECEIVER: return "F_SET_FLIPPED_DATA_RECEIVER";
case F_GET_FLIP_ROWS_RECEIVER: return "F_GET_FLIP_ROWS_RECEIVER";
case F_SET_FLIP_ROWS_RECEIVER: return "F_SET_FLIP_ROWS_RECEIVER";
case F_SET_RECEIVER_FILE_FORMAT: return "F_SET_RECEIVER_FILE_FORMAT";
case F_GET_RECEIVER_FILE_FORMAT: return "F_GET_RECEIVER_FILE_FORMAT";
case F_SET_RECEIVER_STREAMING_PORT: return "F_SET_RECEIVER_STREAMING_PORT";

View File

@@ -3,10 +3,10 @@
#define APILIB 0x210225
#define APIRECEIVER 0x210225
#define APIGUI 0x210225
#define APIEIGER 0x210806
#define APICTB 0x210806
#define APIGOTTHARD 0x210806
#define APIGOTTHARD2 0x210806
#define APIJUNGFRAU 0x210806
#define APIMYTHEN3 0x210806
#define APIMOENCH 0x210806
#define APIEIGER 0x210806

View File

@@ -160,7 +160,7 @@ int ZmqSocket::SendHeader(int index, zmqHeader header) {
"\"version\":%u, "
// additional stuff
"\"flippedDataX\":%u, "
"\"flipRows\":%u, "
"\"quad\":%u"
; //"}\n";
@@ -177,7 +177,7 @@ int ZmqSocket::SendHeader(int index, zmqHeader header) {
header.detType, header.version,
// additional stuff
header.flippedDataX, header.quad);
header.flipRows, header.quad);
if (!header.addJsonHeader.empty()) {
strcat(header_buffer.get(), ", ");
@@ -303,7 +303,7 @@ int ZmqSocket::ParseHeader(const int index, int length, char *buff,
zHeader.detType = document["detType"].GetUint();
zHeader.version = document["version"].GetUint();
zHeader.flippedDataX = document["flippedDataX"].GetUint();
zHeader.flipRows = document["flipRows"].GetUint();
zHeader.quad = document["quad"].GetUint();
zHeader.completeImage = document["completeImage"].GetUint();