#include "Detector.h" #include "container_utils.h" #include "logger.h" #include "multiSlsDetector.h" #include "slsDetector.h" #include "sls_detector_defs.h" namespace sls { using defs = slsDetectorDefs; Detector::Detector(int shm_id) : pimpl(sls::make_unique(shm_id)) {} Detector::~Detector() = default; // Configuration void Detector::freeSharedMemory() { pimpl->freeSharedMemory(); } void Detector::loadConfig(const std::string &fname) { pimpl->readConfigurationFile(fname); } Result Detector::getHostname(Positions pos) const { return pimpl->Parallel(&slsDetector::getHostname, pos); } void Detector::setHostname(const std::vector &value) { pimpl->setHostname(value); } int Detector::getShmId() const { return pimpl->getMultiId(); } Result Detector::getFirmwareVersion(Positions pos) const { return pimpl->Parallel(&slsDetector::getId, pos, defs::DETECTOR_FIRMWARE_VERSION); } Result Detector::getDetectorServerVersion(Positions pos) const { return pimpl->Parallel(&slsDetector::getId, pos, defs::DETECTOR_SOFTWARE_VERSION); } Result Detector::getSerialNumber(Positions pos) const { return pimpl->Parallel(&slsDetector::getId, pos, defs::DETECTOR_SERIAL_NUMBER); } int64_t Detector::getClientVersion() const { return pimpl->getClientSoftwareVersion(); } Result Detector::getReceiverVersion(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverSoftwareVersion, pos); } Result Detector::getDetectorType(Positions pos) const { return pimpl->Parallel(&slsDetector::getDetectorTypeAsEnum, pos); } int Detector::size() const { return pimpl->size(); } defs::xy Detector::getModuleGeometry() const { return pimpl->getNumberOfDetectors(); } Result Detector::getModuleSize(Positions pos) const { return pimpl->Parallel(&slsDetector::getNumberOfChannels, pos); } defs::xy Detector::getDetectorSize() const { return pimpl->getNumberOfChannels(); } void Detector::setDetectorSize(const defs::xy value) { pimpl->setNumberOfChannels(value); } Result Detector::getSettings(Positions pos) const { return pimpl->Parallel(&slsDetector::getSettings, pos); } void Detector::setSettings(defs::detectorSettings value, Positions pos) { pimpl->Parallel(&slsDetector::setSettings, pos, value); } // Acquisition Parameters Result Detector::getNumberOfFrames() const { return pimpl->Parallel(&slsDetector::setTimer, {}, defs::FRAME_NUMBER, -1); } void Detector::setNumberOfFrames(int64_t value) { pimpl->Parallel(&slsDetector::setTimer, {}, defs::FRAME_NUMBER, value); } Result Detector::getNumberOfTriggers() const { return pimpl->Parallel(&slsDetector::setTimer, {}, defs::CYCLES_NUMBER, -1); } void Detector::setNumberOfTriggers(int64_t value) { pimpl->Parallel(&slsDetector::setTimer, {}, defs::CYCLES_NUMBER, value); } Result Detector::getExptime(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::ACQUISITION_TIME, -1); } void Detector::setExptime(ns t, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::ACQUISITION_TIME, t.count()); } Result Detector::getPeriod(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::FRAME_PERIOD, -1); } void Detector::setPeriod(ns t, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::FRAME_PERIOD, t.count()); } Result Detector::getDelayAfterTrigger(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::DELAY_AFTER_TRIGGER, -1); } void Detector::setDelayAfterTrigger(ns value, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::DELAY_AFTER_TRIGGER, value.count()); } Result Detector::getNumberOfFramesLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::FRAME_NUMBER); } Result Detector::getNumberOfTriggersLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::CYCLES_NUMBER); } Result Detector::getDelayAfterTriggerLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::DELAY_AFTER_TRIGGER); } Result Detector::getSpeed(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::CLOCK_DIVIDER, -1, 0); } void Detector::setSpeed(int value, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::CLOCK_DIVIDER, value, 0); } Result Detector::getADCPhase(bool inDeg, Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_PHASE, -1, inDeg); } void Detector::setADCPhase(int value, bool inDeg, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_PHASE, value, inDeg); } Result Detector::getMaxADCPhaseShift(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::MAX_ADC_PHASE_SHIFT, -1, 0); } Result Detector::getHighVoltage(Positions pos) const { return pimpl->Parallel(&slsDetector::setDAC, pos, -1, defs::HIGH_VOLTAGE, 0); } void Detector::setHighVoltage(int value, Positions pos) { pimpl->Parallel(&slsDetector::setDAC, pos, value, defs::HIGH_VOLTAGE, 0); } Result Detector::getTemperature(defs::dacIndex index, Positions pos) const { switch (index) { case defs::TEMPERATURE_ADC: case defs::TEMPERATURE_FPGA: case defs::TEMPERATURE_FPGAEXT: case defs::TEMPERATURE_10GE: case defs::TEMPERATURE_DCDC: case defs::TEMPERATURE_SODL: case defs::TEMPERATURE_SODR: case defs::TEMPERATURE_FPGA2: case defs::TEMPERATURE_FPGA3: case defs::SLOW_ADC_TEMP: break; default: throw RuntimeError("Unknown Temperature Index"); } auto res = pimpl->Parallel(&slsDetector::getADC, pos, index); switch (getDetectorType().squash()) { case defs::EIGER: case defs::JUNGFRAU: for (auto &it : res) { it /= 1000; } break; default: break; } return res; } Result Detector::getDAC(defs::dacIndex index, bool mV, Positions pos) const { return pimpl->Parallel(&slsDetector::setDAC, pos, -1, index, mV); } void Detector::setDAC(int value, defs::dacIndex index, bool mV, Positions pos) { pimpl->Parallel(&slsDetector::setDAC, pos, value, index, mV); } Result Detector::getTimingMode(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimingMode, pos, defs::GET_TIMING_MODE); } void Detector::setTimingMode(defs::timingMode value, Positions pos) { pimpl->Parallel(&slsDetector::setTimingMode, pos, value); } // Acquisition void Detector::acquire() { pimpl->acquire(); } void Detector::startAcquisition() { if (getUseReceiverFlag({}).squash()) pimpl->Parallel(&slsDetector::startReceiver, {}); pimpl->Parallel(&slsDetector::startAcquisition, {}); } void Detector::stopAcquisition() { pimpl->Parallel(&slsDetector::stopAcquisition, {}); if (getUseReceiverFlag({}).squash()) //TODO: problem for acquire() pimpl->Parallel(&slsDetector::stopReceiver, {}); } void Detector::clearAcquiringFlag() { pimpl->setAcquiringFlag(0); } Result Detector::getDetectorStatus(Positions pos) const{ return pimpl->Parallel(&slsDetector::getRunStatus, pos); } Result Detector::getReceiverStatus(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverStatus, pos); } Result Detector::getFramesCaught(Positions pos) const { return pimpl->Parallel(&slsDetector::getFramesCaughtByReceiver, pos); } Result Detector::getStartingFrameNumber(Positions pos) const { return pimpl->Parallel(&slsDetector::getStartingFrameNumber, pos); } void Detector::setStartingFrameNumber(uint64_t value, Positions pos) { pimpl->Parallel(&slsDetector::setStartingFrameNumber, pos, value); } void Detector::sendSoftwareTrigger(Positions pos) { pimpl->Parallel(&slsDetector::sendSoftwareTrigger, pos); } // Network Configuration (Detector<->Receiver) void Detector::configureMAC(Positions pos) { pimpl->Parallel(&slsDetector::configureMAC, pos); } Result Detector::getNumberofUDPInterfaces(Positions pos) const { return pimpl->Parallel(&slsDetector::getNumberofUDPInterfaces, pos); } void Detector::setNumberofUDPInterfaces(int n, Positions pos) { int previouslyClientStreaming = pimpl->enableDataStreamingToClient(); bool previouslyReceiverStreaming = true;//getRxZmqIP(pos).squash(false); //FIXME TODO pimpl->Parallel(&slsDetector::setNumberofUDPInterfaces, pos, n); // redo the zmq sockets if enabled if (previouslyClientStreaming != 0) { pimpl->enableDataStreamingToClient(0); pimpl->enableDataStreamingToClient(1); } if (previouslyReceiverStreaming) { setRxZmqDataStream(false, pos); setRxZmqDataStream(true, pos); } } Result Detector::getSelectedUDPInterface(Positions pos) const { return pimpl->Parallel(&slsDetector::getSelectedUDPInterface, pos); } void Detector::selectUDPInterface(int interface, Positions pos) { pimpl->Parallel(&slsDetector::selectUDPInterface, pos, interface); } Result Detector::getSourceUDPIP(Positions pos) const { return pimpl->Parallel(&slsDetector::getDetectorIP, pos); } void Detector::setSourceUDPIP(const std::string &ip, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorIP, pos, ip); } Result Detector::getSourceUDPIP2(Positions pos) const { return pimpl->Parallel(&slsDetector::getDetectorIP2, pos); } void Detector::setSourceUDPIP2(const std::string &ip, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorIP2, pos, ip); } Result Detector::getSourceUDPMAC(Positions pos) const { return pimpl->Parallel(&slsDetector::getDetectorMAC, pos); } void Detector::setSourceUDPMAC(const std::string &mac, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorMAC, pos, mac); } Result Detector::getSourceUDPMAC2(Positions pos) const { return pimpl->Parallel(&slsDetector::getDetectorMAC2, pos); } void Detector::setSourceUDPMAC2(const std::string &mac, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorMAC2, pos, mac); } Result Detector::getDestinationUDPIP(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPIP, pos); } void Detector::setDestinationUDPIP(const std::string &ip, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverUDPIP, pos, ip); } Result Detector::getDestinationUDPIP2(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPIP2, pos); } void Detector::setDestinationUDPIP2(const std::string &ip, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverUDPIP2, pos, ip); } Result Detector::getDestinationUDPMAC(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPMAC, pos); } void Detector::setDestinationUDPMAC(const std::string &mac, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverUDPMAC, pos, mac); } Result Detector::getDestinationUDPMAC2(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPMAC2, pos); } void Detector::setDestinationUDPMAC2(const std::string &mac, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverUDPMAC2, pos, mac); } Result Detector::getDestinationUDPPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPPort, pos); } void Detector::setDestinationUDPPort(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { pimpl->Parallel(&slsDetector::setReceiverUDPPort, {idet}, port_list[idet]); } } else { pimpl->Parallel(&slsDetector::setReceiverUDPPort, {module_id}, port); } } Result Detector::getDestinationUDPPort2(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPPort2, pos); } void Detector::setDestinationUDPPort2(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { pimpl->Parallel(&slsDetector::setReceiverUDPPort2, {idet}, port_list[idet]); } } else { pimpl->Parallel(&slsDetector::setReceiverUDPPort2, {module_id}, port ); } } Result Detector::printRxConfiguration(Positions pos) const { return pimpl->Parallel(&slsDetector::printReceiverConfiguration, pos); } Result Detector::getTenGiga(Positions pos) const { return pimpl->Parallel(&slsDetector::enableTenGigabitEthernet, pos, -1); } void Detector::setTenGiga(bool value, Positions pos) { pimpl->Parallel(&slsDetector::enableTenGigabitEthernet, pos, static_cast(value)); } Result Detector::getTenGigaGFlowControl(Positions pos) const { return pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::FLOW_CONTROL_10G, -1); } void Detector::setTenGigaGFlowControl(bool enable, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::FLOW_CONTROL_10G, static_cast(enable)); } Result Detector::getTransmissionDelayFrame(Positions pos) const { return pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_FRAME, -1); } void Detector::setTransmissionDelayFrame(int value, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_FRAME, value); } Result Detector::getTransmissionDelayLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_LEFT, -1); } void Detector::setTransmissionDelayLeft(int value, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_LEFT, value); } Result Detector::getTransmissionDelayRight(Positions pos) const { return pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_RIGHT, -1); } void Detector::setTransmissionDelayRight(int value, Positions pos) { pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, defs::DETECTOR_TXN_DELAY_RIGHT, value); } // Receiver Result Detector::getUseReceiverFlag(Positions pos) const { return pimpl->Parallel(&slsDetector::getUseReceiverFlag, pos); } Result Detector::getRxHostname(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverHostname, pos); } void Detector::setRxHostname(const std::string &receiver, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverHostname, pos, receiver); } Result Detector::getRxPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverPort, pos); } void Detector::setRxPort(int value, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverPort, pos, value); } Result Detector::getRxFifoDepth(Positions pos) const { return pimpl->Parallel(&slsDetector::setReceiverFifoDepth, pos, -1); } void Detector::setRxFifoDepth(int nframes, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverFifoDepth, pos, nframes); } Result Detector::getRxSilentMode(Positions pos) const { return pimpl->Parallel(&slsDetector::setReceiverSilentMode, pos, -1); } void Detector::setRxSilentMode(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverSilentMode, pos, static_cast(value)); } Result Detector::getRxFrameDiscardPolicy(Positions pos) const { return pimpl->Parallel(&slsDetector::setReceiverFramesDiscardPolicy, pos, defs::GET_FRAME_DISCARD_POLICY); } void Detector::setRxFrameDiscardPolicy(defs::frameDiscardPolicy f, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverFramesDiscardPolicy, pos, f); } Result Detector::getPartialFramesPadding(Positions pos) const { return pimpl->Parallel(&slsDetector::getPartialFramesPadding, pos); } void Detector::setPartialFramesPadding(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setPartialFramesPadding, pos, value); } Result Detector::getRxUDPSocketBufferSize(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverUDPSocketBufferSize, pos); } void Detector::setRxUDPSocketBufferSize(int64_t udpsockbufsize, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverUDPSocketBufferSize, pos, udpsockbufsize); } Result Detector::getRxRealUDPSocketBufferSize(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverRealUDPSocketBufferSize, pos); } Result Detector::getRxLock(Positions pos) { return pimpl->Parallel(&slsDetector::lockReceiver, pos, -1); } void Detector::setRxLock(bool value, Positions pos) { pimpl->Parallel(&slsDetector::lockReceiver, pos, static_cast(value)); } Result Detector::getRxLastClientIP(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverLastClientIP, pos); } // File Result Detector::getFileFormat(Positions pos) const { return pimpl->Parallel(&slsDetector::getFileFormat, pos); } void Detector::setFileFormat(defs::fileFormat f, Positions pos) { pimpl->Parallel(&slsDetector::setFileFormat, pos, f); } Result Detector::getFilePath(Positions pos) const { return pimpl->Parallel(&slsDetector::getFilePath, pos); } void Detector::setFilePath(const std::string &fpath, Positions pos) { pimpl->Parallel(&slsDetector::setFilePath, pos, fpath); } Result Detector::getFileNamePrefix(Positions pos) const { return pimpl->Parallel(&slsDetector::setFileName, pos, ""); } void Detector::setFileNamePrefix(const std::string &fname, Positions pos) { pimpl->Parallel(&slsDetector::setFileName, pos, fname); } Result Detector::getAcquisitonIndex(Positions pos) const { return pimpl->Parallel(&slsDetector::getFileIndex, pos); } void Detector::setAcquisitionIndex(int i, Positions pos) { pimpl->Parallel(&slsDetector::setFileIndex, pos, i); } Result Detector::getFileWrite(Positions pos) const { return pimpl->Parallel(&slsDetector::getFileWrite, pos); } void Detector::setFileWrite(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setFileWrite, pos, value); } void Detector::setMasterFileWrite(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setMasterFileWrite, pos, value); } Result Detector::getMasterFileWrite(Positions pos) const { return pimpl->Parallel(&slsDetector::getMasterFileWrite, pos); } Result Detector::getFileOverWrite(Positions pos) const { return pimpl->Parallel(&slsDetector::getFileOverWrite, pos); } void Detector::setFileOverWrite(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setFileOverWrite, pos, value); } Result Detector::getFramesPerFile(Positions pos) const { return pimpl->Parallel(&slsDetector::getFramesPerFile, pos); } void Detector::setFramesPerFile(int n, Positions pos) { pimpl->Parallel(&slsDetector::setFramesPerFile, pos, n); } // Zmq Streaming (Receiver<->Client) Result Detector::getRxZmqDataStream(Positions pos) const { return pimpl->Parallel(&slsDetector::enableDataStreamingFromReceiver, pos, -1); } void Detector::setRxZmqDataStream(bool enable, Positions pos) { pimpl->Parallel(&slsDetector::enableDataStreamingFromReceiver, pos, static_cast(enable)); } Result Detector::getRxZmqFrequency(Positions pos) const { return pimpl->Parallel(&slsDetector::setReceiverStreamingTimer, pos, -1); } void Detector::setRxZmqFrequency(int freq, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverStreamingFrequency, pos, freq); } Result Detector::getRxZmqTimer(Positions pos) const { return pimpl->Parallel(&slsDetector::setReceiverStreamingTimer, pos, -1); } void Detector::setRxZmqTimer(int time_in_ms, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverStreamingTimer, pos, time_in_ms); } Result Detector::getRxZmqPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverStreamingPort, pos); } void Detector::setRxZmqPort(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { pimpl->Parallel(&slsDetector::setReceiverStreamingPort, {idet}, port_list[idet]); } } else { pimpl->Parallel(&slsDetector::setReceiverStreamingPort, {module_id}, port); } } Result Detector::getRxZmqIP(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverStreamingIP, pos); } void Detector::setRxZmqIP(const std::string &ip, Positions pos) { bool previouslyReceiverStreaming = getRxZmqDataStream(pos).squash(false); // TODO! probably in one call pimpl->Parallel(&slsDetector::setReceiverStreamingIP, pos, ip); if (previouslyReceiverStreaming) { setRxZmqDataStream(false, pos); setRxZmqDataStream(true, pos); } } Result Detector::getClientZmqPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getClientStreamingPort, pos); } void Detector::setClientZmqPort(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { pimpl->Parallel(&slsDetector::setClientStreamingPort, {idet}, port_list[idet]); } } else { pimpl->Parallel(&slsDetector::setClientStreamingPort, {module_id}, port); } } Result Detector::getClientZmqIp(Positions pos) const { return pimpl->Parallel(&slsDetector::getClientStreamingIP, pos); } void Detector::setClientZmqIp(const std::string &ip, Positions pos) { int previouslyClientStreaming = pimpl->enableDataStreamingToClient(-1); // TODO! probably in one call ?? pimpl->Parallel(&slsDetector::setClientStreamingIP, pos, ip); if (previouslyClientStreaming != 0) { pimpl->enableDataStreamingToClient(0); pimpl->enableDataStreamingToClient(1); } } // Eiger Specific Result Detector::getDynamicRange(Positions pos) const { return pimpl->Parallel(&slsDetector::setDynamicRange, pos, -1); } void Detector::setDynamicRange(int value) { pimpl->setDynamicRange(value); } Result Detector::getSubExptime(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::SUBFRAME_ACQUISITION_TIME, -1); } void Detector::setSubExptime(ns t, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::SUBFRAME_ACQUISITION_TIME, t.count()); } Result Detector::getSubDeadTime(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::SUBFRAME_DEADTIME, -1); } void Detector::setSubDeadTime(ns value, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::SUBFRAME_DEADTIME, value.count()); } Result Detector::getThresholdEnergy(Positions pos) const { return pimpl->Parallel(&slsDetector::getThresholdEnergy, pos); } void Detector::setThresholdEnergy(int threshold_ev, defs::detectorSettings settings, bool trimbits, Positions pos) { pimpl->Parallel(&slsDetector::setThresholdEnergy, pos, threshold_ev, settings, static_cast(trimbits)); } Result Detector::getSettingsDir(Positions pos) const { return pimpl->Parallel(&slsDetector::getSettingsDir, pos); } void Detector::setSettingsDir(const std::string &value, Positions pos) { pimpl->Parallel(&slsDetector::setSettingsDir, pos, value); } void Detector::loadTrimbits(const std::string &value, Positions pos) { pimpl->Parallel(&slsDetector::loadSettingsFile, pos, value); } Result Detector::getRxAddGapPixels(Positions pos) const { return pimpl->Parallel(&slsDetector::enableGapPixels, pos, -1); } void Detector::setRxAddGapPixels(bool enable) { pimpl->setGapPixelsEnable(enable, {}); } Result Detector::getParallelMode(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::setReadOutFlags, pos, defs::GET_READOUT_FLAGS); Result booleanRes; for (unsigned int i = 0; i < res.size(); ++i) { booleanRes[i] = (res[i] & defs::PARALLEL) ? true : false; } return booleanRes; } void Detector::setParallelMode(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setReadOutFlags, pos, value ? defs::PARALLEL : defs::NONPARALLEL); } Result Detector::getOverFlowMode(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::setReadOutFlags, pos, defs::GET_READOUT_FLAGS); Result booleanRes; for (unsigned int i = 0; i < res.size(); ++i) { booleanRes[i] = (res[i] & defs::SHOW_OVERFLOW) ? true : false; } return booleanRes; } void Detector::setOverFlowMode(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setReadOutFlags, pos, value ? defs::SHOW_OVERFLOW : defs::NOOVERFLOW); } Result Detector::getBottom(Positions pos) const { return pimpl->Parallel(&slsDetector::getFlippedDataX, pos); } void Detector::setBottom(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setFlippedDataX, pos, static_cast(value)); } Result Detector::getAllTrimbits(Positions pos) const { return pimpl->Parallel(&slsDetector::setAllTrimbits, pos, -1); } void Detector::setAllTrimbits(int value, Positions pos) { pimpl->Parallel(&slsDetector::setAllTrimbits, pos, value); } Result> Detector::getTrimEnergies(Positions pos) const { return pimpl->Parallel(&slsDetector::getTrimEn, pos); } void Detector::setTrimEnergies(std::vector energies, Positions pos) { pimpl->Parallel(&slsDetector::setTrimEn, pos, energies); } Result Detector::getRateCorrection(Positions pos) const { return pimpl->Parallel(&slsDetector::getRateCorrection, pos); } void Detector::setRateCorrection(ns dead_time, Positions pos) { pimpl->Parallel(&slsDetector::setRateCorrection, pos, 0);//FIXME TODO dead_time); } Result Detector::getPartialReadout(Positions pos) const { return pimpl->Parallel(&slsDetector::getReadNLines, pos); } void Detector::setPartialReadout(const int lines, Positions pos) { pimpl->Parallel(&slsDetector::setReadNLines, pos, lines); } Result Detector::getInterruptSubframe(Positions pos) const { return pimpl->Parallel(&slsDetector::getInterruptSubframe, pos); } void Detector::setInterruptSubframe(const bool enable, Positions pos) { pimpl->Parallel(&slsDetector::setInterruptSubframe, pos, enable); } Result Detector::getMeasuredPeriod(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::MEASURED_PERIOD); } Result Detector::getMeasuredSubFramePeriod(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::MEASURED_SUBPERIOD); } Result Detector::getActive(Positions pos) const { return pimpl->Parallel(&slsDetector::activate, pos, -1); } void Detector::setActive(bool active, Positions pos) { pimpl->Parallel(&slsDetector::activate, pos, static_cast(active)); } Result Detector::getRxPadDeactivatedMode(Positions pos) const { return pimpl->Parallel(&slsDetector::setDeactivatedRxrPaddingMode, pos, -1); } void Detector::setRxPadDeactivatedMode(bool pad, Positions pos) { pimpl->Parallel(&slsDetector::setDeactivatedRxrPaddingMode, pos, static_cast(pad)); } Result Detector::getPartialReset(Positions pos) const { return pimpl->Parallel(&slsDetector::setCounterBit, pos, -1); } void Detector::setPartialReset(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setCounterBit, pos, !value); } void Detector::pulsePixel(int n,defs::xy pixel, Positions pos) { pimpl->Parallel(&slsDetector::pulsePixel, pos, n, pixel.x, pixel.y); } void Detector::pulsePixelNMove(int n, defs::xy pixel, Positions pos) { pimpl->Parallel(&slsDetector::pulsePixelNMove, pos, n, pixel.x, pixel.y); } void Detector::pulseChip(int n, Positions pos) { pimpl->Parallel(&slsDetector::pulseChip, pos, n); } Result Detector::getQuad(Positions pos) const { return pimpl->Parallel(&slsDetector::getQuad, pos); } void Detector::setQuad(const bool value) { pimpl->setQuad(value); } // Jungfrau Specific Result Detector::getThresholdTemperature(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::setThresholdTemperature, pos, -1); for (auto &it : res) { it /= 1000; } return res; } void Detector::setThresholdTemperature(int temp, Positions pos) { pimpl->Parallel(&slsDetector::setThresholdTemperature, pos, temp * 1000); } Result Detector::getTemperatureControl(Positions pos) const { return pimpl->Parallel(&slsDetector::setTemperatureControl, pos, -1); } void Detector::setTemperatureControl(bool enable, Positions pos) { pimpl->Parallel(&slsDetector::setTemperatureControl, pos, static_cast(enable)); } Result Detector::getTemperatureEvent(Positions pos) const { return pimpl->Parallel(&slsDetector::setTemperatureEvent, pos, -1); } void Detector::resetTemperatureEvent(Positions pos) { pimpl->Parallel(&slsDetector::setTemperatureEvent, pos, 0); } Result Detector::getPowerChip(Positions pos) const { return pimpl->Parallel(&slsDetector::powerChip, pos, -1); } void Detector::setPowerChip(bool on, Positions pos) { if (on && pimpl->size() > 3) { for (unsigned int i = 0; i != pimpl->size(); ++i) { pimpl->powerChip(static_cast(on), i); usleep(1000 * 1000); } } else { pimpl->Parallel(&slsDetector::powerChip, pos, static_cast(on)); } } Result Detector::getAutoCompDisable(Positions pos) const { return pimpl->Parallel(&slsDetector::setAutoComparatorDisableMode, pos, -1); } void Detector::setAutoCompDisable(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setAutoComparatorDisableMode, pos, static_cast(value)); } Result Detector::getNumberOfAdditionalStorageCells() const { return pimpl->Parallel(&slsDetector::setTimer, {}, defs::STORAGE_CELL_NUMBER, -1); } void Detector::setNumberOfAdditionalStorageCells(int64_t value) { pimpl->Parallel(&slsDetector::setTimer, {}, defs::STORAGE_CELL_NUMBER, value); } Result Detector::getStorageCellStart(Positions pos) const { return pimpl->Parallel(&slsDetector::setStoragecellStart, pos, -1); } void Detector::setStoragecellStart(int cell, Positions pos) { pimpl->Parallel(&slsDetector::setStoragecellStart, pos, cell); } Result Detector::getStorageCellDelay(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::STORAGE_CELL_DELAY, -1); } void Detector::setStorageCellDelay(ns value, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::STORAGE_CELL_DELAY, value.count()); } // Gotthard Specific Result Detector::getROI(Positions pos) const { return pimpl->Parallel(&slsDetector::getROI, pos); } void Detector::setROI(defs::ROI value, int moduleId) { if (moduleId < 0 && size() > 1) { throw RuntimeError("Cannot set ROI for all modules simultaneously"); } pimpl->Parallel(&slsDetector::setROI, {moduleId}, value); } Result Detector::getExptimeLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::ACQUISITION_TIME); } Result Detector::getPeriodLeft(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::FRAME_PERIOD); } Result Detector::getExternalSignalFlags(Positions pos) const { return pimpl->Parallel(&slsDetector::setExternalSignalFlags, pos, defs::GET_EXTERNAL_SIGNAL_FLAG); } void Detector::setExternalSignalFlags(defs::externalSignalFlag value, Positions pos) { pimpl->Parallel(&slsDetector::setExternalSignalFlags, pos, value); } void Detector::loadDarkImage(const std::string &fname, int module_id) { if (module_id == -1) { pimpl->loadImageToDetector(defs::DARK_IMAGE, fname, -1); } pimpl->Parallel(&slsDetector::loadImageToDetector, {module_id}, defs::DARK_IMAGE, fname); } void Detector::loadGainImage(const std::string &fname, int module_id) { if (module_id == -1) { pimpl->loadImageToDetector(defs::GAIN_IMAGE, fname, -1); } pimpl->Parallel(&slsDetector::loadImageToDetector, {module_id}, defs::GAIN_IMAGE, fname); } void Detector::getCounterMemoryBlock(const std::string &fname, bool startACQ, Positions pos) { if (pos.empty() || (pos.size() == 1 && pos[0] == -1)) { pimpl->writeCounterBlockFile(fname, static_cast(startACQ), -1); } if (pos.size() > 1) { throw RuntimeError( "Cannot load get counter memory block on a subset of modules"); } pimpl->Parallel(&slsDetector::writeCounterBlockFile, pos, fname, static_cast(startACQ)); } void Detector::resetCounterBlock(bool startACQ, Positions pos) { pimpl->Parallel(&slsDetector::resetCounterBlock, pos, static_cast(startACQ)); } Result Detector::getDigitalTestBit(Positions pos) { return pimpl->Parallel(&slsDetector::digitalTest, pos, defs::DIGITAL_BIT_TEST, -1); } Result Detector::setDigitalTestBit(int value, Positions pos) { return pimpl->Parallel(&slsDetector::digitalTest, pos, defs::DIGITAL_BIT_TEST, value); } // CTB Specific Result Detector::getNumberOfAnalogSamples(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::ANALOG_SAMPLES, -1); } void Detector::setNumberOfAnalogSamples(int64_t value, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::ANALOG_SAMPLES, value); } Result Detector::getNumberOfDigitalSamples(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimer, pos, defs::DIGITAL_SAMPLES, -1); } void Detector::setNumberOfDigitalSamples(int64_t value, Positions pos) { pimpl->Parallel(&slsDetector::setTimer, pos, defs::DIGITAL_SAMPLES, value); } Result Detector::getSignalType(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::setReadOutFlags, pos, defs::GET_READOUT_FLAGS); for (auto &it : res) { if (it & defs::ANALOG_AND_DIGITAL) { it = 2; } else if (it & defs::DIGITAL_ONLY) { it = 1; } else if (it == defs::NORMAL_READOUT) { it = 0; } else { throw RuntimeError("Unknown Signal Type"); } } return res; } void Detector::setSignalType(int value, Positions pos) { defs::readOutFlags flag; switch (value) { case 0: flag = defs::NORMAL_READOUT; break; case 1: flag = defs::DIGITAL_ONLY; break; case 2: flag = defs::ANALOG_AND_DIGITAL; break; default: throw RuntimeError("Unknown Signal Type"); } pimpl->Parallel(&slsDetector::setReadOutFlags, pos, flag); } Result Detector::getDBITPhase(bool inDeg, Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_PHASE, -1, inDeg); } void Detector::setDBITPhase(int value, bool inDeg, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_PHASE, value, inDeg); } Result Detector::getMaxDBITPhaseShift(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::MAX_DBIT_PHASE_SHIFT, -1, 0); } Result Detector::getADCClock(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_CLOCK, -1, 0); } void Detector::setADCClock(int value_in_MHz, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_CLOCK, value_in_MHz, 0); } Result Detector::getDBITClock(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_CLOCK, -1, 0); } void Detector::setDBITClock(int value_in_MHz, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_CLOCK, value_in_MHz, 0); } Result Detector::getRUNClock(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::CLOCK_DIVIDER, -1, 0); } void Detector::setRUNClock(int value_in_MHz, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::CLOCK_DIVIDER, value_in_MHz, 0); } Result Detector::getSYNCClock(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::SYNC_CLOCK, -1, 0); } Result Detector::getADCPipeline(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_PIPELINE, -1, 0); } void Detector::setADCPipeline(int value, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::ADC_PIPELINE, value, 0); } Result Detector::getDBITPipeline(Positions pos) const { return pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_PIPELINE, -1, 0); } void Detector::setDBITPipeline(int value, Positions pos) { pimpl->Parallel(&slsDetector::setSpeed, pos, defs::DBIT_PIPELINE, value, 0); } Result Detector::getVrefVoltage(bool mV, Positions pos) const { return pimpl->Parallel(&slsDetector::setDAC, pos, -1, defs::ADC_VPP, mV); } void Detector::setVrefVoltage(int value, bool mV, Positions pos) { pimpl->Parallel(&slsDetector::setDAC, pos, value, defs::ADC_VPP, mV); } Result Detector::getVoltage(defs::dacIndex index, Positions pos) const { switch (index) { case defs::V_LIMIT: case defs::V_POWER_A: case defs::V_POWER_B: case defs::V_POWER_C: case defs::V_POWER_D: case defs::V_POWER_IO: case defs::V_POWER_CHIP: break; default: throw RuntimeError("Unknown Voltage Index"); } return pimpl->Parallel(&slsDetector::setDAC, pos, -1, index, 1); } void Detector::setVoltage(int value, defs::dacIndex index, Positions pos) { switch (index) { case defs::V_LIMIT: case defs::V_POWER_A: case defs::V_POWER_B: case defs::V_POWER_C: case defs::V_POWER_D: case defs::V_POWER_IO: case defs::V_POWER_CHIP: break; default: throw RuntimeError("Unknown Voltage Index"); } pimpl->Parallel(&slsDetector::setDAC, pos, value, index, 1); } Result Detector::getMeasuredVoltage(defs::dacIndex index, Positions pos) const { switch (index) { case defs::V_POWER_A: case defs::V_POWER_B: case defs::V_POWER_C: case defs::V_POWER_D: case defs::V_POWER_IO: case defs::V_POWER_CHIP: break; default: throw RuntimeError("Unknown Voltage Index"); } return pimpl->Parallel(&slsDetector::getADC, pos, index); } Result Detector::getMeasuredCurrent(defs::dacIndex index, Positions pos) const { switch (index) { case defs::I_POWER_A: case defs::I_POWER_B: case defs::I_POWER_C: case defs::I_POWER_D: case defs::I_POWER_IO: break; default: throw RuntimeError("Unknown Current Index"); } return pimpl->Parallel(&slsDetector::getADC, pos, index); } Result Detector::getSlowADC(defs::dacIndex index, Positions pos) const { if (index < defs::SLOW_ADC0 || index > defs::SLOW_ADC7) { throw RuntimeError("Unknown Slow ADC Index"); } return pimpl->Parallel(&slsDetector::getADC, pos, index); } Result Detector::getADCEnableMask(Positions pos) const { return pimpl->Parallel(&slsDetector::getADCEnableMask, pos); } void Detector::setADCEnableMask(uint32_t mask, Positions pos) { pimpl->Parallel(&slsDetector::setADCEnableMask, pos, mask); } Result Detector::getADCInvert(Positions pos) const { return pimpl->Parallel(&slsDetector::getADCInvert, pos); } void Detector::setADCInvert(uint32_t value, Positions pos) { pimpl->Parallel(&slsDetector::setADCInvert, pos, value); } Result Detector::getExternalSamplingSource(Positions pos) const { return pimpl->Parallel(&slsDetector::getExternalSamplingSource, pos); } void Detector::setExternalSamplingSource(int value, Positions pos) { pimpl->Parallel(&slsDetector::setExternalSamplingSource, pos, value); } Result Detector::getExternalSampling(Positions pos) const { return pimpl->Parallel(&slsDetector::getExternalSampling, pos); } void Detector::setExternalSampling(bool value, Positions pos) { pimpl->Parallel(&slsDetector::setExternalSampling, pos, value); } Result> Detector::getRxDbitList(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverDbitList, pos); } void Detector::setRxDbitList(std::vector list, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverDbitList, pos, list); } Result Detector::getRxDbitOffset(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverDbitOffset, pos); } void Detector::setRxDbitOffset(int value, Positions pos) { pimpl->Parallel(&slsDetector::setReceiverDbitOffset, pos, value); } void Detector::setDigitalIODelay(uint64_t pinMask, int delay, Positions pos) { pimpl->Parallel(&slsDetector::setDigitalIODelay, pos, pinMask, delay); } Result Detector::getLEDEnable(Positions pos) const { return pimpl->Parallel(&slsDetector::setLEDEnable, pos, -1); } void Detector::setLEDEnable(bool enable, Positions pos) { pimpl->Parallel(&slsDetector::setLEDEnable, pos, static_cast(enable)); } // Pattern void Detector::setPattern(const std::string &fname, Positions pos) { pimpl->Parallel(&slsDetector::setPattern, pos, fname); } Result Detector::getPatternIOControl(Positions pos) const { return pimpl->Parallel(&slsDetector::setPatternIOControl, pos, -1); } void Detector::setPatternIOControl(uint64_t word, Positions pos) { pimpl->Parallel(&slsDetector::setPatternIOControl, pos, word); } Result Detector::getPatternClockControl(Positions pos) const { return pimpl->Parallel(&slsDetector::setPatternClockControl, pos, -1); } void Detector::setPatternClockControl(uint64_t word, Positions pos) { pimpl->Parallel(&slsDetector::setPatternClockControl, pos, word); } void Detector::setPatternWord(int addr, uint64_t word, Positions pos) { pimpl->Parallel(&slsDetector::setPatternWord, pos, addr, word); } Result> Detector::getPatternLoops(int level, Positions pos) const { return pimpl->Parallel(&slsDetector::setPatternLoops, pos, level, -1, -1, -1); } void Detector::setPatternLoops(int level, int start, int stop, int n, Positions pos) { pimpl->Parallel(&slsDetector::setPatternLoops, pos, level, start, stop, n); } Result Detector::getPatternWaitAddr(int level, Positions pos) const { return pimpl->Parallel(&slsDetector::setPatternWaitAddr, pos, level, -1); } void Detector::setPatternWaitAddr(int level, int addr, Positions pos) { pimpl->Parallel(&slsDetector::setPatternWaitAddr, pos, level, addr); } Result Detector::getPatternWaitTime(int level, Positions pos) const { return pimpl->Parallel(&slsDetector::setPatternWaitTime, pos, level, -1); } void Detector::setPatternWaitTime(int level, uint64_t t, Positions pos) { pimpl->Parallel(&slsDetector::setPatternWaitTime, pos, level, t); } Result Detector::getPatternMask(Positions pos) { return pimpl->Parallel(&slsDetector::getPatternMask, pos); } void Detector::setPatternMask(uint64_t mask, Positions pos) { pimpl->Parallel(&slsDetector::setPatternMask, pos, mask); } Result Detector::getPatternBitMask(Positions pos) const { return pimpl->Parallel(&slsDetector::getPatternBitMask, pos); } void Detector::setPatternBitMask(uint64_t mask, Positions pos) { pimpl->Parallel(&slsDetector::setPatternBitMask, pos, mask); } // Moench Result Detector::getAdditionalJsonHeader(Positions pos) const { return pimpl->Parallel(&slsDetector::getAdditionalJsonHeader, pos); } void Detector::setAdditionalJsonHeader(const std::string &jsonheader, Positions pos) { pimpl->Parallel(&slsDetector::setAdditionalJsonHeader, pos, jsonheader); } Result Detector::getAdditionalJsonParameter(const std::string &key, Positions pos) const { return pimpl->Parallel(&slsDetector::getAdditionalJsonParameter, pos, key); } void Detector::setAdditionalJsonParameter(const std::string &key, const std::string &value, Positions pos) { pimpl->Parallel(&slsDetector::setAdditionalJsonParameter, pos, key, value); } Result Detector::getDetectorMinMaxEnergyThreshold(const bool isEmax, Positions pos) const { auto res = pimpl->Parallel(&slsDetector::getAdditionalJsonParameter, pos, isEmax ? "emax" : "emin"); Result intResult; try { for (unsigned int i = 0; i < res.size(); ++i) { intResult[i] = stoi(res[i]); } } catch (...) { throw RuntimeError( "Cannot find or convert emin/emax string to integer"); } return intResult; } void Detector::setDetectorMinMaxEnergyThreshold(const bool isEmax, const int value, Positions pos) { pimpl->Parallel(&slsDetector::setAdditionalJsonParameter, pos, isEmax ? "emax" : "emin", std::to_string(value)); } Result Detector::getFrameMode(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::getAdditionalJsonParameter, pos, "frameMode"); Result intResult; try { for (unsigned int i = 0; i < res.size(); ++i) { intResult[i] = defs::getFrameModeType(res[i]); } } catch (...) { throw RuntimeError( "Cannot find or convert frameMode string to integer"); } return intResult; } void Detector::setFrameMode(defs::frameModeType value, Positions pos) { pimpl->Parallel(&slsDetector::setAdditionalJsonParameter, pos, "frameMode", defs::getFrameModeType(value)); } Result Detector::getDetectorMode(Positions pos) const { auto res = pimpl->Parallel(&slsDetector::getAdditionalJsonParameter, pos, "detectorMode"); Result intResult; try { for (unsigned int i = 0; i < res.size(); ++i) { intResult[i] = defs::getDetectorModeType(res[i]); } } catch (...) { throw RuntimeError( "Cannot find or convert detectorMode string to integer"); } return intResult; } void Detector::setDetectorMode(defs::detectorModeType value, Positions pos) { pimpl->Parallel(&slsDetector::setAdditionalJsonParameter, pos, "detectorMode", defs::getDetectorModeType(value)); } // Advanced void Detector::programFPGA(const std::string &fname, Positions pos) { FILE_LOG(logINFO) << "Updating Firmware. This can take awhile. Please be patient..."; std::vector buffer = pimpl->readPofFile(fname); pimpl->Parallel(&slsDetector::programFPGA, pos, buffer); } void Detector::resetFPGA(Positions pos) { pimpl->Parallel(&slsDetector::resetFPGA, pos); } void Detector::copyDetectorServer(const std::string &fname, const std::string &hostname, Positions pos) { pimpl->Parallel(&slsDetector::copyDetectorServer, pos, fname, hostname); rebootController(pos); } void Detector::rebootController(Positions pos) { pimpl->Parallel(&slsDetector::rebootController, pos); } void Detector::updateFirmwareAndServer(const std::string &sname, const std::string &hostname, const std::string &fname, Positions pos) { pimpl->Parallel(&slsDetector::copyDetectorServer, pos, fname, hostname); programFPGA(fname, pos); rebootController(pos); } Result Detector::readRegister(uint32_t addr, Positions pos) const { return pimpl->Parallel(&slsDetector::readRegister, pos, addr); } void Detector::writeRegister(uint32_t addr, uint32_t val, Positions pos) { pimpl->Parallel(&slsDetector::writeRegister, pos, addr, val); } void Detector::setBit(uint32_t addr, int bitnr, Positions pos) { pimpl->Parallel(&slsDetector::setBit, pos, addr, bitnr); } void Detector::clearBit(uint32_t addr, int bitnr, Positions pos) { pimpl->Parallel(&slsDetector::clearBit, pos, addr, bitnr); } Result Detector::executeFirmwareTest(Positions pos) { return pimpl->Parallel(&slsDetector::digitalTest, pos, defs::DETECTOR_FIRMWARE_TEST, -1); } Result Detector::executeBusTest(Positions pos) { return pimpl->Parallel(&slsDetector::digitalTest, pos, defs::DETECTOR_BUS_TEST, -1); } void Detector::writeAdcRegister(uint32_t addr, uint32_t value, Positions pos) { pimpl->Parallel(&slsDetector::writeAdcRegister, pos, addr, value); } // Insignificant Result Detector::getControlPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getControlPort, pos); } void Detector::setControlPort(int value, Positions pos) { pimpl->Parallel(&slsDetector::setControlPort, pos, value); } Result Detector::getStopPort(Positions pos) const { return pimpl->Parallel(&slsDetector::getStopPort, pos); } void Detector::setStopPort(int value, Positions pos) { pimpl->Parallel(&slsDetector::setStopPort, pos, value); } Result Detector::getDetectorLock(Positions pos) const { return pimpl->Parallel(&slsDetector::lockServer, pos, -1); } void Detector::setDetectorLock(bool lock, Positions pos) { pimpl->Parallel(&slsDetector::lockServer, pos, static_cast(lock)); } Result Detector::getLastClientIP(Positions pos) const { return pimpl->Parallel(&slsDetector::getLastClientIP, pos); } void Detector::execCommand(const std::string &value, Positions pos) { pimpl->Parallel(&slsDetector::execCommand, pos, value); } Result Detector::getNumberOfFramesFromStart(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::FRAMES_FROM_START); } Result Detector::getActualTime(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::ACTUAL_TIME); } Result Detector::getMeasurementTime(Positions pos) const { return pimpl->Parallel(&slsDetector::getTimeLeft, pos, defs::MEASUREMENT_TIME); } std::string Detector::getUserDetails() const { return pimpl->getUserDetails(); } Result Detector::getRxCurrentFrameIndex(Positions pos) const { return pimpl->Parallel(&slsDetector::getReceiverCurrentFrameIndex, pos); } std::vector Detector::getPortNumbers(int start_port) { int num_sockets_per_detector = 1; switch (getDetectorType({}).squash()) { case defs::EIGER: num_sockets_per_detector *= 2; break; case defs::JUNGFRAU: if(getNumberofUDPInterfaces({}).squash() == 2) { num_sockets_per_detector *= 2; } break; default: break; } std::vector res; for (int idet = 0; idet < size(); ++idet) { res.push_back(start_port + (idet * num_sockets_per_detector)); } return res; } } // namespace sls