fix merge

This commit is contained in:
Erik Frojdh
2019-04-26 17:06:59 +02:00
18 changed files with 371 additions and 289 deletions

View File

@ -172,7 +172,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
/**
* Decodes which detector and the corresponding channel numbers for it
* Mainly useful in a multi detector setROI (Gotthard, Mythen?)
* Mainly useful in a multi detector setROI (Gotthard)
* @param offsetX channel number or total channel offset in x direction
* @param offsetY channel number or total channel offset in y direction
* @param channelX channel number from detector offset in x direction
@ -1291,6 +1291,20 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
const ROI *getROI(int &n, int detPos = -1);
/**
* Set ADC Enable Mask (CTB, Moench)
* @param mask ADC Enable mask
* @param detPos -1 for all detectors in list or specific detector position
*/
void setADCEnableMask(uint32_t mask, int detPos = -1);
/**
* Get ADC Enable Mask (CTB, Moench)
* @param detPos -1 for all detectors in list or specific detector position
* @returns ADC Enable mask
*/
uint32_t getADCEnableMask(int detPos = -1);
/**
* Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert
* users

View File

@ -16,7 +16,7 @@ class multiSlsDetector;
class ServerInterface;
class MySocketTCP;
#define SLS_SHMVERSION 0x190412
#define SLS_SHMVERSION 0x190426
#define NCHIPSMAX 10
#define NCHANSMAX 65536
#define NDACSMAX 16
@ -97,7 +97,10 @@ struct sharedSlsDetector {
/** list of rois */
slsDetectorDefs::ROI roiLimits[MAX_ROIS];
/** readout flags */
/** adc enable mask */
uint32_t adcEnableMask;
/** readout flags */
slsDetectorDefs::readOutFlags roFlags;
/** detector settings (standard, fast, etc.) */
@ -239,6 +242,7 @@ struct sharedSlsDetector {
/** overwriteenable */
bool rxFileOverWrite;
};
class slsDetector : public virtual slsDetectorDefs{
@ -1141,12 +1145,6 @@ class slsDetector : public virtual slsDetectorDefs{
*/
int setCounterBit(int cb = -1);
/**
* send ROI to processor (moench only)
* @returns OK or FAIL
*/
int sendROIToProcessor();
/**
* Set ROI (Gotthard)
* At the moment only one set allowed
@ -1178,6 +1176,18 @@ class slsDetector : public virtual slsDetectorDefs{
*/
int sendROI(int n = -1, ROI roiLimits[] = nullptr);
/**
* Set ADC Enable Mask (CTB, Moench)
* @param mask ADC Enable mask
*/
void setADCEnableMask(uint32_t mask);
/**
* Get ADC Enable Mask (CTB, Moench)
* @returns ADC Enable mask
*/
uint32_t getADCEnableMask();
/**
* Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert users
* @param addr address of adc register

View File

@ -2448,6 +2448,32 @@ const slsDetectorDefs::ROI *multiSlsDetector::getROI(int &n, int detPos) {
return retval;
}
void multiSlsDetector::setADCEnableMask(uint32_t mask, int detPos) {
// single
if (detPos >= 0) {
detectors[detPos]->setADCEnableMask(mask);
}
// multi
parallelCall(&slsDetector::setADCEnableMask, mask);
}
uint32_t multiSlsDetector::getADCEnableMask(int detPos) {
// single
if (detPos >= 0) {
return detectors[detPos]->getADCEnableMask();
}
// multi
auto r = parallelCall(&slsDetector::getADCEnableMask);
if (sls::allEqual(r)) {
return r.front();
}
// can't have different values
throw RuntimeError("Error: Different Values for function getADCEnableMask");
}
int multiSlsDetector::writeAdcRegister(uint32_t addr, uint32_t val, int detPos) {
// single
if (detPos >= 0) {

View File

@ -484,15 +484,16 @@ void slsDetector::updateTotalNumberOfChannels() {
if (shm()->myDetectorType == CHIPTESTBOARD ||
shm()->myDetectorType == MOENCH) {
// default number of channels
shm()->nChan[X] = 32;
// if roi, recalculate #nchanX
if (shm()->nROI > 0) {
shm()->nChan[X] = 0;
for (int iroi = 0; iroi < shm()->nROI; ++iroi) {
shm()->nChan[X] += (shm()->roiLimits[iroi].xmax -
shm()->roiLimits[iroi].xmin + 1);
int nchans = 0;
// calculate analog channels
uint32_t mask = shm()->adcEnableMask;
if (mask == BIT32_MASK) {
nchans = 32;
} else {
nchans = 0;
for (int ich = 0; ich < 32; ++ich) {
if (mask & (1 << ich))
++nchans;
}
}
@ -502,6 +503,7 @@ void slsDetector::updateTotalNumberOfChannels() {
((shm()->roFlags & ANALOG_AND_DIGITAL) != 0))) {
shm()->nChan[X] += 4;
}
shm()->nChan[X] = nchans;
// recalculate derived parameters chans and databytes
shm()->nChans = shm()->nChan[X];
@ -786,10 +788,10 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) {
n += client.receiveData(&i32, sizeof(i32));
shm()->roiLimits[i].xmax = i32;
}
// moench (send to processor)
if (shm()->myDetectorType == MOENCH) {
sendROIToProcessor();
}
// // moench (send to processor)
// if (shm()->myDetectorType == MOENCH) {
// sendROIToProcessor();
// }
}
// update #nchans and databytes, as it depends on #samples, roi,
@ -2491,17 +2493,17 @@ int slsDetector::setCounterBit(int cb) {
return retval;
}
int slsDetector::sendROIToProcessor() {
std::ostringstream os;
os << "[" << shm()->roiLimits[0].xmin << ", " << shm()->roiLimits[0].xmax
<< ", " << shm()->roiLimits[0].ymin << ", " << shm()->roiLimits[0].ymax
<< "]";
std::string sroi = os.str();
std::string result = setAdditionalJsonParameter("roi", sroi);
if (result == sroi)
return OK;
return FAIL;
}
// int slsDetector::sendROIToProcessor() {
// std::ostringstream os;
// os << "[" << shm()->roiLimits[0].xmin << ", " << shm()->roiLimits[0].xmax
// << ", " << shm()->roiLimits[0].ymin << ", " << shm()->roiLimits[0].ymax
// << "]";
// std::string sroi = os.str();
// std::string result = setAdditionalJsonParameter("roi", sroi);
// if (result == sroi)
// return OK;
// return FAIL;
// }
int slsDetector::setROI(int n, ROI roiLimits[]) {
std::sort(roiLimits, roiLimits + n,
@ -2509,7 +2511,7 @@ int slsDetector::setROI(int n, ROI roiLimits[]) {
int ret = sendROI(n, roiLimits);
if (shm()->myDetectorType == MOENCH) {
sendROIToProcessor();
// sendROIToProcessor();
}
// update #nchans and databytes, as it depends on #samples, roi,
if (shm()->myDetectorType == CHIPTESTBOARD ||
@ -2639,6 +2641,42 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) {
return ret;
}
void slsDetector::setADCEnableMask(uint32_t mask) {
uint32_t arg = mask;
FILE_LOG(logDEBUG1) << "Setting ADC Enable mask to 0x" << std::hex << arg << std::dec;
if (shm()->onlineFlag == ONLINE_FLAG) {
sendToDetector(F_SET_ADC_ENABLE_MASK, &arg, sizeof(arg), nullptr, 0);
shm()->adcEnableMask = mask;
// update #nchans and databytes, as it depends on #samples, adcmask, readoutflags
updateTotalNumberOfChannels();
// send to processor
if (shm()->myDetectorType == MOENCH)
setAdditionalJsonParameter("adcmask", std::to_string(shm()->adcEnableMask));
if (shm()->rxOnlineFlag == ONLINE_FLAG) {
int fnum = F_RECEIVER_SET_ADC_MASK;
int retval = -1;
mask = shm()->adcEnableMask;
FILE_LOG(logDEBUG1)
<< "Setting ADC Enable mask to 0x" << std:: hex << mask << std::dec << " in receiver";
sendToReceiver(fnum, &mask, sizeof(mask), &retval, sizeof(retval));
}
}
}
uint32_t slsDetector::getADCEnableMask() {
uint32_t retval = -1;
FILE_LOG(logDEBUG1) << "Getting ADC Enable mask";
if (shm()->onlineFlag == ONLINE_FLAG) {
sendToDetector(F_GET_ADC_ENABLE_MASK, nullptr, 0, &retval, sizeof(retval));
shm()->adcEnableMask = retval;
FILE_LOG(logDEBUG1) << "ADC Enable Mask: 0x" << std::hex << retval << std::dec;
}
return shm()->adcEnableMask;
}
int slsDetector::writeAdcRegister(uint32_t addr, uint32_t val) {
uint32_t args[]{addr, val};
FILE_LOG(logDEBUG1) << "Writing to ADC register 0x" << std::hex << addr
@ -3974,4 +4012,4 @@ std::vector<std::string> slsDetector::getSettingsFileDacNames() {
"Unknown detector type - unknown format for settings file");
}
return {};
}
}

View File

@ -5554,74 +5554,22 @@ std::string slsDetectorCommand::cmdPattern(int narg, char *args[], int action, i
os << std::hex << myDet->readRegister(123, detPos) << std::dec ; //0x7b
} else if (cmd == "adcdisable") {
int nroi = 0;
ROI roiLimits[MAX_ROIS];
if (action == PUT_ACTION) {
if (sscanf(args[1], "%x", &addr))
uint32_t adcEnableMask = 0;
if (sscanf(args[1], "%x", &adcEnableMask))
;
else
return std::string("Could not scan adcdisable reg ") + std::string(args[1]);
/******USE ROI?!?!?!?*********/
// roiLimits[i].xmin;roiLimits[i].xmax;roiLimits[i].ymin;roiLimits[i].ymin;roiLimits[i].ymax
//int mask=1;
int ii = 0;
while (ii < 32) {
++nroi;
roiLimits[nroi - 1].xmin = ii;
roiLimits[nroi - 1].ymin = 0;
roiLimits[nroi - 1].ymax = 0;
while ((addr & (1 << ii))) {
++ii;
if (ii >= 32)
break;
}
if (ii >= 32) {
break;
std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl;
roiLimits[nroi - 1].xmax = 31;
break;
}
roiLimits[nroi - 1].xmin = ii;
while ((addr & (1 << ii)) == 0) {
++ii;
if (ii >= 32)
break;
}
roiLimits[nroi - 1].xmax = ii - 1;
if (ii >= 32) {
std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl;
++nroi;
break;
}
std::cout << "ROI " << nroi << " xmin " << roiLimits[nroi - 1].xmin << " xmax " << roiLimits[nroi - 1].xmax << std::endl;
}
std::cout << "********ROI " << nroi << std::endl;
myDet->setROI(nroi - 1, roiLimits, detPos);
// myDet->writeRegister(94,addr, detPos);
// myDet->writeRegister(120,addr, detPos);
// get enable mask from enable mask
adcEnableMask ^= 0xFFFFFFFF;
myDet->setADCEnableMask(adcEnableMask, detPos);
}
const ROI *aa = myDet->getROI(nroi, detPos);
int reg = 0xffffffff;
if (nroi < 1)
reg = 0;
else {
for (int iroi = 0; iroi < nroi; ++iroi) {
std::cout << iroi << " xmin " << (aa + iroi)->xmin << " xmax " << (aa + iroi)->xmax << std::endl;
for (int ich = (aa + iroi)->xmin; ich <= (aa + iroi)->xmax; ++ich) {
reg &= ~(1 << ich);
}
}
}
os << std::hex << reg << std::dec ;
if (aa != NULL)
delete [] aa;
//os <<" "<< std::hex << myDet->readRegister(120, detPos) << std::dec ;
uint32_t retval = myDet->getADCEnableMask(detPos);
// get disable mask
retval ^= 0xFFFFFFFF;
os << std::hex << retval << std::dec;
}
else