connect ismaster for eiger and gotthard1 and using ismaster to stop master last for eiger

This commit is contained in:
2021-06-09 17:40:05 +02:00
parent 4de8234478
commit bdc3a5f3d9
7 changed files with 53 additions and 21 deletions

View File

@ -46,7 +46,6 @@ int on_dst = 0;
int dst_requested[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, int dst_requested[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
enum masterFlags masterMode = IS_SLAVE;
int top = 0; int top = 0;
int master = 0; int master = 0;
int normal = 0; int normal = 0;
@ -1413,6 +1412,8 @@ int setHighVoltage(int val) {
/* parameters - timing, extsig */ /* parameters - timing, extsig */
int isMaster() { return master; }
void setTiming(enum timingMode arg) { void setTiming(enum timingMode arg) {
int ret = 0; int ret = 0;
switch (arg) { switch (arg) {

View File

@ -1201,6 +1201,8 @@ int setHighVoltage(int val) {
/* parameters - timing, extsig */ /* parameters - timing, extsig */
int isMaster() { return (masterflags == IS_MASTER ? 1 : 0); }
void setTiming(enum timingMode arg) { void setTiming(enum timingMode arg) {
u_int32_t addr = EXT_SIGNAL_REG; u_int32_t addr = EXT_SIGNAL_REG;
switch (arg) { switch (arg) {

View File

@ -1393,12 +1393,13 @@ int setHighVoltage(int val) {
return highvoltage; return highvoltage;
} }
/* parameters - timing */
int isMaster() { int isMaster() {
return !((bus_r(SYSTEM_STATUS_REG) & SYSTEM_STATUS_SLV_BRD_DTCT_MSK) >> return !((bus_r(SYSTEM_STATUS_REG) & SYSTEM_STATUS_SLV_BRD_DTCT_MSK) >>
SYSTEM_STATUS_SLV_BRD_DTCT_OFST); SYSTEM_STATUS_SLV_BRD_DTCT_OFST);
} }
/* parameters - timing */
void setTiming(enum timingMode arg) { void setTiming(enum timingMode arg) {
if (!isMaster() && arg == AUTO_TIMING) if (!isMaster() && arg == AUTO_TIMING)

View File

@ -350,6 +350,9 @@ int getADC(enum ADCINDEX ind);
int setHighVoltage(int val); int setHighVoltage(int val);
// parameters - timing, extsig // parameters - timing, extsig
#if defined(MYTHEN3D) || defined(EIGERD) || defined(GOTTHARDD)
int isMaster();
#endif
#ifdef GOTTHARD2D #ifdef GOTTHARD2D
void updatingRegisters(); void updatingRegisters();
#endif #endif
@ -357,7 +360,6 @@ void setTiming(enum timingMode arg);
enum timingMode getTiming(); enum timingMode getTiming();
#ifdef MYTHEN3D #ifdef MYTHEN3D
void setInitialExtSignals(); void setInitialExtSignals();
int isMaster();
int setGainCaps(int caps); int setGainCaps(int caps);
int getGainCaps(); int getGainCaps();
int setChipStatusRegister(int csr); int setChipStatusRegister(int csr);

View File

@ -8381,7 +8381,7 @@ int get_master(int file_des) {
LOG(logDEBUG1, ("Getting master\n")); LOG(logDEBUG1, ("Getting master\n"));
#ifndef MYTHEN3D #if !defined(MYTHEN3D) && !defined(EIGERD) && !defined(GOTTHARDD)
functionNotImplemented(); functionNotImplemented();
#else #else
retval = isMaster(); retval = isMaster();

View File

@ -488,12 +488,14 @@ class Detector {
void stopReceiver(); void stopReceiver();
/** Non blocking: start detector acquisition. Status changes to RUNNING or /** Non blocking: start detector acquisition. Status changes to RUNNING or
* WAITING and automatically returns to idle at the end of acquisition. */ * WAITING and automatically returns to idle at the end of acquisition.
[Mythen3] Master starts acquisition first */
void startDetector(); void startDetector();
/** [Mythen3] Non blocking: start detector readout of counters in chip. /** [Mythen3] Non blocking: start detector readout of counters in chip.
* Status changes to TRANSMITTING and automatically returns to idle at the * Status changes to TRANSMITTING and automatically returns to idle at the
* end of readout. */ * end of readout.
[Eiger] Master stops acquisition last */
void startDetectorReadout(); void startDetectorReadout();
/** Non blocking: Abort detector acquisition. Status changes to IDLE or /** Non blocking: Abort detector acquisition. Status changes to IDLE or
@ -1308,6 +1310,7 @@ class Detector {
* (internal gating). Gate index: 0-2, -1 for all */ * (internal gating). Gate index: 0-2, -1 for all */
Result<std::array<ns, 3>> getGateDelayForAllGates(Positions pos = {}) const; Result<std::array<ns, 3>> getGateDelayForAllGates(Positions pos = {}) const;
/** [Eiger][Mythen3][Gotthard1] **/
Result<bool> getMaster(Positions pos = {}) const; Result<bool> getMaster(Positions pos = {}) const;
// TODO! check if we really want to expose this !!!!! // TODO! check if we really want to expose this !!!!!

View File

@ -675,29 +675,51 @@ void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
void Detector::startDetector() { void Detector::startDetector() {
auto detector_type = getDetectorType().squash(); auto detector_type = getDetectorType().squash();
if (detector_type == defs::MYTHEN3 && size() > 1){ if (detector_type == defs::MYTHEN3 && size() > 1) {
auto is_master = getMaster(); auto is_master = getMaster();
std::vector<int> master; int masterPosition = 0;
std::vector<int> slaves; std::vector<int> slaves;
for(int i=0; i<size(); ++i){ for (int i = 0; i < size(); ++i) {
if (is_master[i]) if (is_master[i])
master.push_back(i); masterPosition = i;
else else
slaves.push_back(i); slaves.push_back(i);
} }
pimpl->Parallel(&Module::startAcquisition, slaves); pimpl->Parallel(&Module::startAcquisition, slaves);
pimpl->Parallel(&Module::startAcquisition, master); pimpl->Parallel(&Module::startAcquisition, {masterPosition});
}else{ } else {
pimpl->Parallel(&Module::startAcquisition, {}); pimpl->Parallel(&Module::startAcquisition, {});
} }
} }
void Detector::startDetectorReadout() { void Detector::startDetectorReadout() {
pimpl->Parallel(&Module::startReadout, {}); pimpl->Parallel(&Module::startReadout, {});
} }
void Detector::stopDetector(Positions pos) { pimpl->Parallel(&Module::stopAcquisition, pos); } void Detector::stopDetector(Positions pos) {
auto detector_type = getDetectorType().squash();
if (detector_type == defs::EIGER && size() > 1) {
auto is_master = getMaster();
int masterPosition = -1;
std::vector<int> slaves;
for (int i = 0; i < size(); ++i) {
if (!pos.empty() && pos[0] != -1 &&
std::find(pos.begin(), pos.end(), i) != pos.end()) {
continue;
}
if (is_master[i])
masterPosition = i;
else
slaves.push_back(i);
}
pimpl->Parallel(&Module::stopAcquisition, slaves);
if (masterPosition != -1) {
pimpl->Parallel(&Module::stopAcquisition, {masterPosition});
}
} else {
pimpl->Parallel(&Module::stopAcquisition, pos);
}
}
Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const { Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const {
return pimpl->Parallel(&Module::getRunStatus, pos); return pimpl->Parallel(&Module::getRunStatus, pos);
@ -733,8 +755,10 @@ Result<defs::scanParameters> Detector::getScan(Positions pos) const {
} }
void Detector::setScan(const defs::scanParameters t) { void Detector::setScan(const defs::scanParameters t) {
if(getDetectorType().squash() == defs::MYTHEN3 && size()>1 && t.enable != 0){ if (getDetectorType().squash() == defs::MYTHEN3 && size() > 1 &&
throw DetectorError("Scan is only allowed for single module Mythen 3 because of synchronization"); t.enable != 0) {
throw DetectorError("Scan is only allowed for single module Mythen 3 "
"because of synchronization");
} }
pimpl->Parallel(&Module::setScan, {}, t); pimpl->Parallel(&Module::setScan, {}, t);
} }
@ -1611,23 +1635,22 @@ Detector::getGateDelayForAllGates(Positions pos) const {
return pimpl->Parallel(&Module::getGateDelayForAllGates, pos); return pimpl->Parallel(&Module::getGateDelayForAllGates, pos);
} }
Result<bool> Detector::getMaster(Positions pos) const{ Result<bool> Detector::getMaster(Positions pos) const {
return pimpl->Parallel(&Module::isMaster, pos); return pimpl->Parallel(&Module::isMaster, pos);
} }
Result<int> Detector::getChipStatusRegister(Positions pos) const{ Result<int> Detector::getChipStatusRegister(Positions pos) const {
return pimpl->Parallel(&Module::getChipStatusRegister, pos); return pimpl->Parallel(&Module::getChipStatusRegister, pos);
} }
void Detector::setGainCaps(int caps, Positions pos){ void Detector::setGainCaps(int caps, Positions pos) {
return pimpl->Parallel(&Module::setGainCaps, pos, caps); return pimpl->Parallel(&Module::setGainCaps, pos, caps);
} }
Result<int> Detector::getGainCaps(Positions pos){ Result<int> Detector::getGainCaps(Positions pos) {
return pimpl->Parallel(&Module::getGainCaps, pos); return pimpl->Parallel(&Module::getGainCaps, pos);
} }
// CTB/ Moench Specific // CTB/ Moench Specific
Result<int> Detector::getNumberOfAnalogSamples(Positions pos) const { Result<int> Detector::getNumberOfAnalogSamples(Positions pos) const {