moved setDetectorSpecific parameters to constructor of detectorParameters

This commit is contained in:
Erik Frojdh 2019-04-16 12:15:31 +02:00
parent dd6bb85230
commit c7169f3c36
3 changed files with 139 additions and 127 deletions

View File

@ -23,14 +23,73 @@ class MySocketTCP;
* parameter list that has to be initialized depending on the detector type * parameter list that has to be initialized depending on the detector type
*/ */
struct detParameters { struct detParameters {
int nChanX; int nChanX{0};
int nChanY; int nChanY{0};
int nChipX; int nChipX{0};
int nChipY; int nChipY{0};
int nDacs; int nDacs{0};
int dynamicRange; int dynamicRange{0};
int nGappixelsX; int nGappixelsX{0};
int nGappixelsY; int nGappixelsY{0};
detParameters(){}
detParameters(slsDetectorDefs::detectorType type){
switch (type) {
case slsDetectorDefs::detectorType::GOTTHARD:
nChanX = 128;
nChanY = 1;
nChipX = 10;
nChipY = 1;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::JUNGFRAU:
nChanX = 256;
nChanY = 256;
nChipX = 4;
nChipY = 2;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::CHIPTESTBOARD:
nChanX = 36;
nChanY = 1;
nChipX = 1;
nChipY = 1;
nDacs = 24;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::MOENCH:
nChanX = 32;
nChanY = 1;
nChipX = 1;
nChipY = 1;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::EIGER:
nChanX = 256;
nChanY = 256;
nChipX = 4;
nChipY = 1;
nDacs = 16;
dynamicRange = 16;
nGappixelsX = 6;
nGappixelsY = 1;
break;
default:
throw sls::RuntimeError("Unknown detector type! " +
slsDetectorDefs::detectorTypeToString(type));
}
}
}; };
/** /**
@ -1747,13 +1806,6 @@ class slsDetector : public virtual slsDetectorDefs{
*/ */
void initSharedMemory(detectorType type, int multi_id, bool verify = true); void initSharedMemory(detectorType type, int multi_id, bool verify = true);
/**
* Sets detector parameters depending detector type
* @param type detector type
* @param list structure of parameters to initialize depending on detector type
*/
void setDetectorSpecificParameters(detectorType type, detParameters &list);
/** /**
* Initialize detector structure to defaults * Initialize detector structure to defaults
* Called when new shared memory is created * Called when new shared memory is created

View File

@ -98,7 +98,7 @@ int slsDetector::checkDetectorVersionCompatibility() {
auto client = DetectorSocket(detector_shm()->hostname, auto client = DetectorSocket(detector_shm()->hostname,
detector_shm()->controlPort); detector_shm()->controlPort);
ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0);
auto stop = auto stop =
DetectorSocket(detector_shm()->hostname, detector_shm()->stopPort); DetectorSocket(detector_shm()->hostname, detector_shm()->stopPort);
@ -225,64 +225,6 @@ void slsDetector::initSharedMemory(detectorType type, int multi_id,
} }
} }
void slsDetector::setDetectorSpecificParameters(detectorType type,
detParameters &list) {
switch (type) {
case GOTTHARD:
list.nChanX = 128;
list.nChanY = 1;
list.nChipX = 10;
list.nChipY = 1;
list.nDacs = 8;
list.dynamicRange = 16;
list.nGappixelsX = 0;
list.nGappixelsY = 0;
break;
case JUNGFRAU:
list.nChanX = 256;
list.nChanY = 256;
list.nChipX = 4;
list.nChipY = 2;
list.nDacs = 8;
list.dynamicRange = 16;
list.nGappixelsX = 0;
list.nGappixelsY = 0;
break;
case CHIPTESTBOARD:
list.nChanX = 36;
list.nChanY = 1;
list.nChipX = 1;
list.nChipY = 1;
list.nDacs = 24;
list.dynamicRange = 16;
list.nGappixelsX = 0;
list.nGappixelsY = 0;
break;
case MOENCH:
list.nChanX = 32;
list.nChanY = 1;
list.nChipX = 1;
list.nChipY = 1;
list.nDacs = 8;
list.dynamicRange = 16;
list.nGappixelsX = 0;
list.nGappixelsY = 0;
break;
case EIGER:
list.nChanX = 256;
list.nChanY = 256;
list.nChipX = 4;
list.nChipY = 1;
list.nDacs = 16;
list.dynamicRange = 16;
list.nGappixelsX = 6;
list.nGappixelsY = 1;
break;
default:
throw RuntimeError("Unknown detector type! " +
slsDetectorDefs::detectorTypeToString(type));
}
}
void slsDetector::initializeDetectorStructure(detectorType type) { void slsDetector::initializeDetectorStructure(detectorType type) {
detector_shm()->shmversion = SLS_SHMVERSION; detector_shm()->shmversion = SLS_SHMVERSION;
@ -391,8 +333,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
detector_shm()->rxFileOverWrite = true; detector_shm()->rxFileOverWrite = true;
// get the detector parameters based on type // get the detector parameters based on type
detParameters parameters{}; detParameters parameters{type};
setDetectorSpecificParameters(type, parameters);
detector_shm()->nChan[X] = parameters.nChanX; detector_shm()->nChan[X] = parameters.nChanX;
detector_shm()->nChan[Y] = parameters.nChanY; detector_shm()->nChan[Y] = parameters.nChanY;
detector_shm()->nChip[X] = parameters.nChipX; detector_shm()->nChip[X] = parameters.nChipX;
@ -434,16 +375,11 @@ slsDetectorDefs::sls_detector_module *slsDetector::createModule() {
slsDetectorDefs::sls_detector_module * slsDetectorDefs::sls_detector_module *
slsDetector::createModule(detectorType type) { slsDetector::createModule(detectorType type) {
// get the detector parameters based on type // get the detector parameters based on type
detParameters parameters{}; detParameters parameters{type};
int nch = 0, nc = 0, nd = 0; int nch = parameters.nChanX * parameters.nChanY;
try { int nc = parameters.nChipX * parameters.nChipY;
setDetectorSpecificParameters(type, parameters); int nd = parameters.nDacs;
nch = parameters.nChanX * parameters.nChanY;
nc = parameters.nChipX * parameters.nChipY;
nd = parameters.nDacs;
} catch (...) {
return nullptr;
}
int *dacs = new int[nd]; int *dacs = new int[nd];
int *chanregs = new int[nch * nc]; int *chanregs = new int[nch * nc];
@ -1262,7 +1198,7 @@ int slsDetector::getThresholdEnergy() {
detector_shm()->currentThresholdEV = retval; detector_shm()->currentThresholdEV = retval;
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateDetector(); updateDetector();
} }
return detector_shm()->currentThresholdEV; return detector_shm()->currentThresholdEV;
} }
@ -1329,7 +1265,8 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV,
} }
// verify e_eV exists in trimEneregies[] // verify e_eV exists in trimEneregies[]
if ((detector_shm()->nTrimEn == 0) || (e_eV < detector_shm()->trimEnergies[0]) || if ((detector_shm()->nTrimEn == 0) ||
(e_eV < detector_shm()->trimEnergies[0]) ||
(e_eV > detector_shm()->trimEnergies[detector_shm()->nTrimEn - 1])) { (e_eV > detector_shm()->trimEnergies[detector_shm()->nTrimEn - 1])) {
throw RuntimeError("This energy " + std::to_string(e_eV) + throw RuntimeError("This energy " + std::to_string(e_eV) +
" not defined for this module!"); " not defined for this module!");
@ -1348,7 +1285,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV,
sls_detector_module *myMod = nullptr; sls_detector_module *myMod = nullptr;
// normal // normal
if (!interpolate) { if (interpolate == false) {
// find their directory names // find their directory names
std::ostringstream ostfn; std::ostringstream ostfn;
ostfn << detector_shm()->settingsDir << ssettings << "/" << e_eV << "eV" ostfn << detector_shm()->settingsDir << ssettings << "/" << e_eV << "eV"
@ -1360,16 +1297,13 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV,
// read the files // read the files
// myMod = createModule(); // readSettings also checks if create module // myMod = createModule(); // readSettings also checks if create module
// is null // is null
if (nullptr == readSettingsFile(settingsfname, myMod, tb)) { if (readSettingsFile(settingsfname, myMod, tb) == nullptr) {
if (myMod != nullptr) { if (myMod != nullptr) {
deleteModule(myMod); deleteModule(myMod);
} }
return FAIL; return FAIL;
} }
} }else{
// interpolate
else {
// find the trim values // find the trim values
int trim1 = -1, trim2 = -1; int trim1 = -1, trim2 = -1;
for (int i = 0; i < detector_shm()->nTrimEn; ++i) { for (int i = 0; i < detector_shm()->nTrimEn; ++i) {
@ -1853,7 +1787,6 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) {
case STORAGE_CELL_NUMBER: case STORAGE_CELL_NUMBER:
// send // send
fnum = F_SET_RECEIVER_TIMER; fnum = F_SET_RECEIVER_TIMER;
ret = FAIL;
args[1] = detector_shm() args[1] = detector_shm()
->timerValue[index]; // to the value given by detector ->timerValue[index]; // to the value given by detector
retval = -1; retval = -1;
@ -1926,7 +1859,7 @@ int slsDetector::setSpeed(speedVariable sp, int value, int mode) {
FILE_LOG(logDEBUG1) << "Speed index " << sp << ": " << retval; FILE_LOG(logDEBUG1) << "Speed index " << sp << ": " << retval;
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateDetector(); updateDetector();
} }
return retval; return retval;
} }
@ -2140,7 +2073,7 @@ uint32_t slsDetector::writeRegister(uint32_t addr, uint32_t val) {
<< std::hex << retval << std::dec; << std::hex << retval << std::dec;
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateDetector(); updateDetector();
} }
return retval; return retval;
} }
@ -2372,13 +2305,13 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
break; break;
} }
setReceiverSilentMode(static_cast<int>(detector_shm()->receiver_silentMode)); setReceiverSilentMode(
static_cast<int>(detector_shm()->receiver_silentMode));
// data streaming // data streaming
setReceiverStreamingFrequency(detector_shm()->receiver_read_freq); setReceiverStreamingFrequency(detector_shm()->receiver_read_freq);
setReceiverStreamingPort(getReceiverStreamingPort()); setReceiverStreamingPort(getReceiverStreamingPort());
setReceiverStreamingIP(getReceiverStreamingIP()); setReceiverStreamingIP(getReceiverStreamingIP());
setAdditionalJsonHeader( setAdditionalJsonHeader(detector_shm()->rxAdditionalJsonHeader);
detector_shm()->rxAdditionalJsonHeader);
enableDataStreamingFromReceiver( enableDataStreamingFromReceiver(
static_cast<int>(enableDataStreamingFromReceiver(-1))); static_cast<int>(enableDataStreamingFromReceiver(-1)));
if (detector_shm()->myDetectorType == GOTTHARD || if (detector_shm()->myDetectorType == GOTTHARD ||
@ -2594,7 +2527,8 @@ void slsDetector::setReceiverStreamingIP(std::string sourceIP) {
{ {
struct addrinfo *result; struct addrinfo *result;
// on failure to convert to a valid ip // on failure to convert to a valid ip
if (sls::ConvertHostnameToInternetAddress(sourceIP.c_str(), &result) != 0) { if (sls::ConvertHostnameToInternetAddress(sourceIP.c_str(), &result) !=
0) {
throw RuntimeError("Could not convert rx_zmqip into a valid IP" + throw RuntimeError("Could not convert rx_zmqip into a valid IP" +
sourceIP); sourceIP);
} }
@ -2673,10 +2607,8 @@ slsDetector::setAdditionalJsonHeader(const std::string &jsonheader) {
ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals,
sizeof(retvals)); sizeof(retvals));
FILE_LOG(logDEBUG1) << "Additional json header: " << retvals; FILE_LOG(logDEBUG1) << "Additional json header: " << retvals;
memset(detector_shm()->rxAdditionalJsonHeader, 0, memset(detector_shm()->rxAdditionalJsonHeader, 0, MAX_STR_LENGTH);
MAX_STR_LENGTH); sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader, retvals);
sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader,
retvals);
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateCachedReceiverVariables(); updateCachedReceiverVariables();
@ -2696,10 +2628,8 @@ std::string slsDetector::getAdditionalJsonHeader() {
ret = receiver.sendCommandThenRead(fnum, nullptr, 0, retvals, ret = receiver.sendCommandThenRead(fnum, nullptr, 0, retvals,
sizeof(retvals)); sizeof(retvals));
FILE_LOG(logDEBUG1) << "Additional json header: " << retvals; FILE_LOG(logDEBUG1) << "Additional json header: " << retvals;
memset(detector_shm()->rxAdditionalJsonHeader, 0, memset(detector_shm()->rxAdditionalJsonHeader, 0, MAX_STR_LENGTH);
MAX_STR_LENGTH); sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader, retvals);
sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader,
retvals);
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateCachedReceiverVariables(); updateCachedReceiverVariables();
@ -2710,7 +2640,8 @@ std::string slsDetector::getAdditionalJsonHeader() {
std::string slsDetector::setAdditionalJsonParameter(const std::string &key, std::string slsDetector::setAdditionalJsonParameter(const std::string &key,
const std::string &value) { const std::string &value) {
if (key.empty() || value.empty()) { if (key.empty() || value.empty()) {
throw RuntimeError("Could not set additional json header parameter as the key or " throw RuntimeError(
"Could not set additional json header parameter as the key or "
"value is empty"); "value is empty");
} }
@ -2984,7 +2915,8 @@ int slsDetector::writeCounterBlockFile(const std::string &fname, int startACQ) {
int nChan = getTotalNumberOfChannels(); int nChan = getTotalNumberOfChannels();
int16_t retvals[nChan]; int16_t retvals[nChan];
FILE_LOG(logDEBUG1) << "Reading Counter to " << fname FILE_LOG(logDEBUG1) << "Reading Counter to " << fname
<< (startACQ !=0 ? " and Restarting Acquisition" : "\n"); << (startACQ != 0 ? " and Restarting Acquisition"
: "\n");
ret = getCounterBlock(retvals, startACQ); ret = getCounterBlock(retvals, startACQ);
if (ret != FAIL) { if (ret != FAIL) {
@ -3573,9 +3505,10 @@ int slsDetector::programFPGA(std::vector<char> buffer) {
while (count > 0) { while (count > 0) {
usleep(1 * 1000 * 1000); usleep(1 * 1000 * 1000);
--count; --count;
printf( printf("%d%%\r", static_cast<int>(
"%d%%\r", (static_cast<double>(ERASE_TIME - count) /
static_cast<int>((static_cast<double>(ERASE_TIME - count) / ERASE_TIME) * 100)); ERASE_TIME) *
100));
std::cout << std::flush; std::cout << std::flush;
} }
printf("\n"); printf("\n");
@ -3605,9 +3538,10 @@ int slsDetector::programFPGA(std::vector<char> buffer) {
currentPointer += unitprogramsize; currentPointer += unitprogramsize;
// print progress // print progress
printf( printf("%d%%\r", static_cast<int>((static_cast<double>(
"%d%%\r", totalsize - filesize) /
static_cast<int>((static_cast<double>(totalsize - filesize) / totalsize) * 100)); totalsize) *
100));
std::cout << std::flush; std::cout << std::flush;
} else { } else {
printf("\n"); printf("\n");
@ -3727,7 +3661,8 @@ int slsDetector::getChanRegs(double *retval) {
// the original array has 0 initialized // the original array has 0 initialized
if (myMod->chanregs != nullptr) { if (myMod->chanregs != nullptr) {
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
retval[i] = static_cast<double>(myMod->chanregs[i] & TRIMBITMASK); retval[i] =
static_cast<double>(myMod->chanregs[i] & TRIMBITMASK);
} }
} }
deleteModule(myMod); deleteModule(myMod);
@ -3989,7 +3924,8 @@ int slsDetector::updateCachedReceiverVariables() const {
FILE_LOG(logDEBUG1) << "Sending update client to receiver server"; FILE_LOG(logDEBUG1) << "Sending update client to receiver server";
if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) {
auto receiver = sls::ClientSocket("Receiver", detector_shm()->receiver_hostname, auto receiver =
sls::ClientSocket("Receiver", detector_shm()->receiver_hostname,
detector_shm()->receiverTCPPort); detector_shm()->receiverTCPPort);
ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0);
if (ret == FAIL) { if (ret == FAIL) {
@ -4060,8 +3996,7 @@ int slsDetector::updateCachedReceiverVariables() const {
// additional json header // additional json header
n += receiver.receiveData(cstring, sizeof(cstring)); n += receiver.receiveData(cstring, sizeof(cstring));
sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader, sls::strcpy_safe(detector_shm()->rxAdditionalJsonHeader, cstring);
cstring);
// receiver streaming enable // receiver streaming enable
n += receiver.receiveData(&i32, sizeof(i32)); n += receiver.receiveData(&i32, sizeof(i32));
@ -4073,8 +4008,7 @@ int slsDetector::updateCachedReceiverVariables() const {
// deactivated padding enable // deactivated padding enable
n += receiver.receiveData(&i32, sizeof(i32)); n += receiver.receiveData(&i32, sizeof(i32));
detector_shm()->rxPadDeactivatedModules = detector_shm()->rxPadDeactivatedModules = static_cast<bool>(i32);
static_cast<bool>(i32);
// silent mode // silent mode
n += receiver.receiveData(&i32, sizeof(i32)); n += receiver.receiveData(&i32, sizeof(i32));

View File

@ -7,7 +7,7 @@
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
using namespace sls;
TEST_CASE("Set and get trimen", "[detector]") { TEST_CASE("Set and get trimen", "[detector]") {
// Free shared memory to be sure that we start in a clean state // Free shared memory to be sure that we start in a clean state
@ -192,3 +192,29 @@ TEST_CASE("Padding and discard policy", "[detector][new]"){
d.freeSharedMemory(); d.freeSharedMemory();
} }
TEST_CASE("create detParamets struct", "[detector][new]"){
detParameters par;
CHECK(sizeof(par) == 32);
CHECK(par.nChanX == 0);
CHECK(par.nChanY == 0);
CHECK(par.nChipX == 0);
CHECK(par.nChipY == 0);
CHECK(par.nDacs == 0);
CHECK(par.dynamicRange == 0);
CHECK(par.nGappixelsX == 0);
CHECK(par.nGappixelsY == 0);
detParameters par2{slsDetectorDefs::detectorType::EIGER};
CHECK(sizeof(par2) == 32);
CHECK(par2.nChanX == 256);
CHECK(par2.nChanY == 256);
CHECK(par2.nChipX == 4);
CHECK(par2.nChipY == 1);
CHECK(par2.nDacs == 16);
CHECK(par2.dynamicRange == 16);
CHECK(par2.nGappixelsX == 6);
CHECK(par2.nGappixelsY == 1);
}