mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-17 15:27:13 +02:00
connect ismaster for eiger and gotthard1 and using ismaster to stop master last for eiger
This commit is contained in:
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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 !!!!!
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user