From 569c014d3c75be891b50e51e463bf34f7ecf2211 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 21 Sep 2020 11:23:46 +0200 Subject: [PATCH] WIP, doc --- python/slsdet/detector.py | 33 ++++++++++++++++++++++++++ slsDetectorSoftware/include/Detector.h | 29 ++++++++++++++-------- slsDetectorSoftware/src/CmdProxy.cpp | 19 +++++---------- slsDetectorSoftware/src/CmdProxy.h | 24 +++++++++++-------- slsDetectorSoftware/src/Detector.cpp | 5 +++- slsDetectorSoftware/src/Module.cpp | 16 +++++++++---- slsDetectorSoftware/src/Module.h | 5 ++-- 7 files changed, 91 insertions(+), 40 deletions(-) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 53f20f977..46e4c9f12 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1264,6 +1264,11 @@ class Detector(CppDetectorApi): @property @element def adcinvert(self): + """[Ctb][Moench][Jungfrau] ADC Inversion Mask. + Note + ----- + [Jungfrau][Moench] Inversions on top of the default mask. + """ return self.getADCInvert() @adcinvert.setter @@ -1831,6 +1836,7 @@ class Detector(CppDetectorApi): @property @element def bursts(self): + """[Gotthard2] Number of bursts per aquire. Only in auto timing mode and burst mode.""" return self.getNumberOfBursts() @bursts.setter @@ -1878,6 +1884,7 @@ class Detector(CppDetectorApi): @property @element def cdsgain(self): + """[Gotthard2] Enable or disable CDS gain. Default is disabled. """ return self.getCDSGain() @cdsgain.setter @@ -1888,6 +1895,11 @@ class Detector(CppDetectorApi): @property @element def burstmode(self): + """[Gotthard2] Burst mode of detector. Enum: burstMode + Note + ---- + BURST_INTERNAL (default), BURST_EXTERNAL, CONTINUOUS_INTERNAL, CONTINUOUS_EXTERNAL + """ return self.getBurstMode() @burstmode.setter @@ -1896,6 +1908,22 @@ class Detector(CppDetectorApi): @property def burstperiod(self): + """ + [Gotthard2] Period between 2 bursts. Only in burst mode and auto timing mode. + Note + ----- + :getter: always returns in seconds. To get in datetime.delta, use getBurstPeriod + + Example + ----------- + >>> d.burstperiod = 1.05 + >>> d.burstperiod = datetime.timedelta(minutes = 3, seconds = 1.23) + >>> d.burstperiod + 181.23 + >>> d.getBurstPeriod() + [datetime.timedelta(seconds=181, microseconds=230000)] + + """ return ut.reduce_time(self.getBurstPeriod()) @burstperiod.setter @@ -2031,6 +2059,7 @@ class Detector(CppDetectorApi): @property @element def adcenable(self): + """[Ctb][Moench] ADC Enable Mask for 1Gb. Enable for each 32 ADC channel.""" return self.getADCEnableMask() @adcenable.setter @@ -2040,6 +2069,10 @@ class Detector(CppDetectorApi): @property @element def adcenable10g(self): + """[Ctb][Moench] ADC Enable Mask for 10Gb mode for each 32 ADC channel. + Note + ----- + If any of a consecutive 4 bits are enabled, the complete 4 bits are enabled.""" return self.getTenGigaADCEnableMask() @adcenable10g.setter diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 5bf4f1cfd..220111138 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -432,8 +432,8 @@ class Detector { */ void acquire(); - /** If acquisition aborted, use this to clear before starting next - * acquisition */ + /** If acquisition aborted during blocking acquire, use this to clear + * acquiring flag in shared memory before starting next acquisition */ void clearAcquiringFlag(); /** Non Blocking: Start receiver listener and create data file if file write @@ -956,13 +956,14 @@ class Detector { /** [Eiger] */ Result getActive(Positions pos = {}) const; - /** [Eiger] */ + /** [Eiger] activated by default at hostname command. Deactivated does not + * send data or communicated with FEB or BEB */ void setActive(const bool active, Positions pos = {}); /** [Eiger] */ Result getRxPadDeactivatedMode(Positions pos = {}) const; - /** [Eiger] Pad deactivated modules in receiver */ + /** [Eiger] Pad deactivated modules in receiver. Enabled by default */ void setRxPadDeactivatedMode(bool pad, Positions pos = {}); /** [Eiger] Advanced */ @@ -1035,7 +1036,7 @@ class Detector { * automatically after 93.75% of exposure time (only for longer than * 100us).\n * Default is false or this mode disabled(comparator enabled throughout). - * true enables " "mode. 0 disables mode. + * true enables mode. 0 disables mode. */ void setAutoCompDisable(bool value, Positions pos = {}); @@ -1082,7 +1083,8 @@ class Detector { */ void setROI(defs::ROI value, int module_id); - /** [Gotthard] Clear ROI */ + /** [Gotthard] Clear ROI to all channels enabled. Default is all channels + * enabled. */ void clearROI(Positions pos = {}); /** [Gotthard] */ @@ -1106,7 +1108,8 @@ class Detector { /** [Gotthard2] only in burst mode and auto timing mode */ Result getBurstPeriod(Positions pos = {}) const; - /** [Gotthard2] only in burst mode and auto timing mode */ + /** [Gotthard2] Period between 2 bursts. Only in burst mode and auto timing + * mode */ void setBurstPeriod(ns value, Positions pos = {}); /** [Gotthard2] offset channel, increment channel */ @@ -1285,7 +1288,8 @@ class Detector { /** [CTB][Moench] */ Result getTenGigaADCEnableMask(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB][Moench] If any of a consecutive 4 bits are enabled, the " + "complete 4 bits are enabled */ void setTenGigaADCEnableMask(uint32_t mask, Positions pos = {}); ///@{ @@ -1545,12 +1549,16 @@ class Detector { /** Advanced user Function! */ void clearBit(uint32_t addr, int bitnr, Positions pos = {}); + /** Advanced user Function! */ + Result getBit(uint32_t addr, int bitnr, Positions pos = {}); + /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Advanced user * Function! */ void executeFirmwareTest(Positions pos = {}); /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Advanced user - * Function! */ + * Function! Writes different values in a R/W register and confirms the + * writes to check bus */ void executeBusTest(Positions pos = {}); /** [Gotthard][Jungfrau][CTB][Moench] Advanced user Function! not possible @@ -1567,7 +1575,8 @@ class Detector { /** [CTB][Moench][Jungfrau] Advanced user Function! */ Result getADCInvert(Positions pos = {}) const; - /** [CTB][Moench][Jungfrau] Advanced user Function! */ + /** [CTB][Moench][Jungfrau] Advanced user Function! \n + [Jungfrau] Inversions on top of default mask */ void setADCInvert(uint32_t value, Positions pos = {}); ///@{ diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 6cb26f3de..7cc7fa58d 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1584,7 +1584,7 @@ std::string CmdProxy::ClearROI(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "\n\t[Gotthard] Resets Region of interest in detector. All " - "channels enabled. Default is all channels." + "channels enabled. Default is all channels enabled." << '\n'; } else if (action == defs::GET_ACTION) { throw sls::RuntimeError("Cannot get"); @@ -2554,16 +2554,13 @@ std::string CmdProxy::BitOperations(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "setbit") { - os << "[address] [value\n\t[Moench] Minimum energy threshold (soft " - "setting) for processor." + os << "[reg address in hex] [bit index]\n\tSets bit in address." << '\n'; } else if (cmd == "clearbit") { - os << "[n_value]\n\t[Moench] Maximum energy threshold (soft " - "setting) for processor." + os << "[reg address in hex] [bit index]\n\tClears bit in address." << '\n'; } else if (cmd == "getbit") { - os << "[n_value]\n\t[Moench] Maximum energy threshold (soft " - "setting) for processor." + os << "[reg address in hex] [bit index]\n\tGets bit in address." << '\n'; } else { throw sls::RuntimeError( @@ -2587,12 +2584,8 @@ std::string CmdProxy::BitOperations(int action) { if (cmd == "setbit" || cmd == "clearbit") { throw sls::RuntimeError("Cannot get"); } - auto t = det->readRegister(addr, std::vector{det_id}); - Result result(t.size()); - for (unsigned int i = 0; i < t.size(); ++i) { - result[i] = ((t[i] >> bitnr) & 0x1); - } - os << OutString(result) << '\n'; + auto t = det->getBit(addr, bitnr, std::vector{det_id}); + os << OutString(t) << '\n'; } else if (action == defs::PUT_ACTION) { if (cmd == "getbit") { throw sls::RuntimeError("Cannot put"); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index cd66a3a2d..c987dcd8e 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1589,7 +1589,8 @@ class CmdProxy { DAC_COMMAND( adcvpp, getDAC, setDAC, defs::ADC_VPP, "[dac or mV value][(optional unit) mV] \n\t[Ctb][Moench] Vpp of " - "ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V."); + "ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V. " + "\n\tAdvanced User function! "); DAC_COMMAND(vb_ds, getDAC, setDAC, defs::VB_DS, "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for " @@ -1669,9 +1670,10 @@ class CmdProxy { /* acquisition */ - EXECUTE_SET_COMMAND_NOID(clearbusy, clearAcquiringFlag, - "\n\tClears Acquiring Flag for unexpected acquire " - "command terminations."); + EXECUTE_SET_COMMAND_NOID( + clearbusy, clearAcquiringFlag, + "\n\tIf acquisition aborted during acquire command, use this to clear " + "acquiring flag in shared memory before starting next acquisition"); EXECUTE_SET_COMMAND_NOID( rx_start, startReceiver, @@ -2107,9 +2109,10 @@ class CmdProxy { "timing mode and burst mode. Use timing command to set timing mode and " "burstmode command to set burst mode."); - TIME_COMMAND(burstperiod, getBurstPeriod, setBurstPeriod, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] Burst " - "period. Only in burst mode and auto timing mode."); + TIME_COMMAND( + burstperiod, getBurstPeriod, setBurstPeriod, + "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] " + "Period between 2 bursts. Only in burst mode and auto timing mode."); INTEGER_COMMAND_VEC_ID( cdsgain, getCDSGain, setCDSGain, StringTo, @@ -2171,13 +2174,13 @@ class CmdProxy { INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, StringTo, "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 1Gb " - "Mode for each 32 ADC channel."); + "Enable for each 32 ADC channel."); INTEGER_COMMAND_HEX( adcenable10g, getTenGigaADCEnableMask, setTenGigaADCEnableMask, StringTo, "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 10Gb mode for each 32 " - "ADC channel. However, if any of consecutive 4 bits are enabled, the " + "ADC channel. However, if any of a consecutive 4 bits are enabled, the " "complete 4 bits are enabled."); /* CTB Specific */ @@ -2321,7 +2324,8 @@ class CmdProxy { EXECUTE_SET_COMMAND( bustest, executeBusTest, "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Bus test, " - "ie. keeps writing and reading back different values in R/W register."); + "ie. Writes different values in a R/W register and confirms the " + "writes to check bus.\n\tAdvanced User function!"); INTEGER_COMMAND_HEX( adcinvert, getADCInvert, setADCInvert, StringTo, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 05815ef6c..c43d5aa0b 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -384,7 +384,6 @@ Result Detector::getClockFrequency(int clkIndex, Positions pos) { return pimpl->Parallel(&Module::getClockFrequency, pos, clkIndex); } - Result Detector::getClockPhase(int clkIndex, Positions pos) { return pimpl->Parallel(&Module::getClockPhase, pos, clkIndex, false); } @@ -1883,6 +1882,10 @@ void Detector::clearBit(uint32_t addr, int bitnr, Positions pos) { pimpl->Parallel(&Module::clearBit, pos, addr, bitnr); } +Result Detector::getBit(uint32_t addr, int bitnr, Positions pos) { + return pimpl->Parallel(&Module::getBit, pos, addr, bitnr); +} + void Detector::executeFirmwareTest(Positions pos) { pimpl->Parallel(&Module::executeFirmwareTest, pos); } diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index c383a61a2..128bc3d1d 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -2199,21 +2199,29 @@ uint32_t Module::writeRegister(uint32_t addr, uint32_t val) { return sendToDetectorStop(F_WRITE_REGISTER, args); } -uint32_t Module::setBit(uint32_t addr, int n) { +void Module::setBit(uint32_t addr, int n) { if (n < 0 || n > 31) { throw RuntimeError("Bit number " + std::to_string(n) + " out of Range"); } else { uint32_t val = readRegister(addr); - return writeRegister(addr, val | 1 << n); + writeRegister(addr, val | 1 << n); } } -uint32_t Module::clearBit(uint32_t addr, int n) { +void Module::clearBit(uint32_t addr, int n) { if (n < 0 || n > 31) { throw RuntimeError("Bit number " + std::to_string(n) + " out of Range"); } else { uint32_t val = readRegister(addr); - return writeRegister(addr, val & ~(1 << n)); + writeRegister(addr, val & ~(1 << n)); + } +} + +int Module::getBit(uint32_t addr, int n) { + if (n < 0 || n > 31) { + throw RuntimeError("Bit number " + std::to_string(n) + " out of Range"); + } else { + return ((readRegister(addr) >> n) & 0x1); } } diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 9d1dd28bd..4303ce1fe 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -497,8 +497,9 @@ class Module : public virtual slsDetectorDefs { void rebootController(); uint32_t readRegister(uint32_t addr) const; uint32_t writeRegister(uint32_t addr, uint32_t val); - uint32_t setBit(uint32_t addr, int n); - uint32_t clearBit(uint32_t addr, int n); + void setBit(uint32_t addr, int n); + void clearBit(uint32_t addr, int n); + int getBit(uint32_t addr, int n); void executeFirmwareTest(); void executeBusTest(); void writeAdcRegister(uint32_t addr, uint32_t val);