From 981b13494cae2ecb9baac5ababb1d53aa4a6f14d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 21 Jan 2020 18:16:27 +0100 Subject: [PATCH] mythen3: virtual server, connected timing mode, row and col in header, included pattern bit and mask --- .../mythen3DetectorServer/RegisterDefs.h | 43 +++++- .../bin/mythen3DetectorServer_developer | Bin 158944 -> 159072 bytes .../slsDetectorFunctionList.c | 139 ++++++++++++++++-- .../slsDetectorServer_defs.h | 6 +- .../include/slsDetectorFunctionList.h | 4 + .../src/slsDetectorServer_funcs.c | 8 +- slsDetectorSoftware/include/Detector.h | 30 ++-- slsDetectorSoftware/src/CmdProxy.cpp | 28 ++-- slsDetectorSoftware/src/CmdProxy.h | 4 +- slsDetectorSoftware/src/slsDetector.h | 20 +-- slsSupportLib/include/versionAPI.h | 2 +- 11 files changed, 219 insertions(+), 65 deletions(-) diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index c2c87312f..0a149f7a2 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -13,20 +13,30 @@ /* Base addresses 0x1806 0000 ---------------------------------------------*/ /* General purpose control and status registers */ -#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/ctrl/ctrl.vhd +#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF +// https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/ctrl/ctrl.vhd /* ASIC Control */ #define BASE_ASIC (0x0100) // 0x1806_0100 - 0x1806_010F + /* ASIC Digital Interface. Data recovery core */ -#define BASE_ADIF (0x0110) // 0x1806_0110 - 0x1806_011F https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/adif/adif_ctrl.vhd +#define BASE_ADIF (0x0110) // 0x1806_0110 - 0x1806_011F +// https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/adif/adif_ctrl.vhd /* Formatting of data core */ #define BASE_FMT (0x0120) // 0x1806_0120 - 0x1806_012F + +/* Packetizer */ +#define BASE_PKT (0x0140) // 0x1806_0140 - 0x1806_014F +// https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/pkt/pkt_ctrl.vhd + /* Pattern control and status registers */ -#define BASE_PATTERN_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/pattern_flow/pattern_flow_ctrl.vhd +#define BASE_PATTERN_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF +// https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/pattern_flow/pattern_flow_ctrl.vhd /* UDP datagram generator */ #define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF + /* Pattern RAM. Pattern table */ #define BASE_PATTERN_RAM (0x10000) // 0x1807_0000 - 0x1807_FFFF @@ -119,6 +129,30 @@ +/* Packetizer -------------------------------------------------------------*/ + +/* Packetizer Config Register */ +#define PKT_CONFIG_REG (0x00 * REG_OFFSET + BASE_PKT) + +#define PKT_CONFIG_NRXR_MAX_OFST (0) +#define PKT_CONFIG_NRXR_MAX_MSK (0x0000003F << PKT_CONFIG_NRXR_MAX_OFST) +#define PKT_CONFIG_RXR_START_ID_OFST (8) +#define PKT_CONFIG_RXR_START_ID_MSK (0x0000003F << PKT_CONFIG_RXR_START_ID_OFST) + +/* Module Coordinates Register */ +#define COORD_0_REG (0x02 * REG_OFFSET + BASE_PKT) +#define COORD_ROW_OFST (0) +#define COORD_ROW_MSK (0x0000FFFF << COORD_ROW_OFST) +#define COORD_COL_OFST (16) +#define COORD_COL_MSK (0x0000FFFF << COORD_COL_OFST) + +/* Module ID Register */ +#define COORD_1_REG (0x03 * REG_OFFSET + BASE_PKT) +#define COORD_RESERVED_OFST (0) +#define COORD_RESERVED_MSK (0x0000FFFF << COORD_RESERVED_OFST) +#define COORD_ID_OFST (16) // Not connected in firmware TODO +#define COORD_ID_MSK (0x0000FFFF << COORD_ID_OFST) // Not connected in firmware TODO + /* Pattern Control registers --------------------------------------------------*/ @@ -184,6 +218,9 @@ /* External Signal register */ #define EXT_SIGNAL_REG (0x30 * REG_OFFSET + BASE_PATTERN_CONTROL) +#define EXT_SIGNAL_OFST (0) +#define EXT_SIGNAL_MSK (0x00000001 << EXT_SIGNAL_OFST) + /* Trigger Delay 64 bit register */ #define SET_TRIGGER_DELAY_LSB_REG (0x32 * REG_OFFSET + BASE_PATTERN_CONTROL) #define SET_TRIGGER_DELAY_MSB_REG (0x33 * REG_OFFSET + BASE_PATTERN_CONTROL) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index b389ffb2592527735066e8853dfcf9fd35360826..5332cc9286a740696bcd830d190c6434a0576d4c 100755 GIT binary patch delta 41318 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 hM=MivrD)%s?Ihu<@Yr5>nvro_`+p{{d(if4=|# delta 39952 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 Pv&l$Fzip_checksum = checksum; } +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + + uint32_t addr = COORD_0_REG; + int value = 0; + int valueRead = 0; + int ret = OK; + + // row + value = detPos[X]; + bus_w(addr, (bus_r(addr) &~COORD_ROW_MSK) | ((value << COORD_ROW_OFST) & COORD_ROW_MSK)); + valueRead = ((bus_r(addr) & COORD_ROW_MSK) >> COORD_ROW_OFST); + if (valueRead != value) { + FILE_LOG(logERROR, ("Could not set row. Set %d, read %d\n", value, valueRead)); + ret = FAIL; + } + + // col + value = detPos[Y]; + bus_w(addr, (bus_r(addr) &~COORD_COL_MSK) | ((value << COORD_COL_OFST) & COORD_COL_MSK)); + valueRead = ((bus_r(addr) & COORD_COL_MSK) >> COORD_COL_OFST); + if (valueRead != value) { + FILE_LOG(logERROR, ("Could not set column. Set %d, read %d\n", value, valueRead)); + ret = FAIL; + } + + if (ret == OK) { + FILE_LOG(logINFO, ("\tPosition set to [%d, %d]\n", detPos[X], detPos[Y])); + } + + return ret; +} + +int* getDetectorPosition() { + return detPos; +} + /* pattern */ uint64_t readPatternWord(int addr) { @@ -1052,6 +1106,22 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { } } +void setPatternMask(uint64_t mask) { + set64BitReg(mask, PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG); +} + +uint64_t getPatternMask() { + return get64BitReg(PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG); +} + +void setPatternBitMask(uint64_t mask) { + set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); +} + +uint64_t getPatternBitMask() { + return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); +} + int checkDetectorType() { FILE_LOG(logINFO, ("Checking type of module\n")); FILE* fd = fopen(TYPE_FILE_NAME, "r"); @@ -1280,15 +1350,6 @@ int getClockDivider(enum CLKINDEX ind) { /* aquisition */ -int setDetectorPosition(int pos[]) { - memcpy(detPos, pos, sizeof(detPos)); - return OK; -} - -int* getDetectorPosition() { - return detPos; -} - int startStateMachine(){ #ifdef VIRTUAL // create udp socket @@ -1327,22 +1388,70 @@ void* start_timer(void* arg) { getNumTriggers() ); int64_t exp_ns = getExpTime(); + int numCounters = __builtin_popcount(getCounterMask()); + int dr = setDynamicRange(-1); + int imagesize = NCHAN_1_COUNTER * NCHIP * numCounters * + ((dr > 16) ? 4 : // 32 bit + ((dr > 8) ? 2 : // 16 bit + ((dr > 4) ? 0.5 : // 4 bit + 0.125))); // 1 bit + int datasize = imagesize / PACKETS_PER_FRAME; + int packetsize = datasize + sizeof(sls_detector_header); - int frameNr = 0; + // Generate data + char imageData[imagesize]; + memset(imageData, 0, imagesize); + { + int i = 0; + for (i = 0; i < imagesize; i += sizeof(uint8_t)) { + *((uint8_t*)(imageData + i)) = i; + } + } + + int frameNr = 1; // loop over number of frames - for(frameNr=0; frameNr!= numFrames; ++frameNr ) { + for (frameNr = 0; frameNr != numFrames; ++frameNr) { //check if virtual_stop is high if(virtual_stop == 1){ break; } + + int srcOffset = 0; + // sleep for exposure time struct timespec begin, end; clock_gettime(CLOCK_REALTIME, &begin); usleep(exp_ns / 1000); - clock_gettime(CLOCK_REALTIME, &end); + + // loop packet + { + int i = 0; + for(i = 0; i!=PACKETS_PER_FRAME; ++i) { + char packetData[packetsize]; + memset(packetData, 0, packetsize); + + // set header + sls_detector_header* header = (sls_detector_header*)(packetData); + header->frameNumber = frameNr + 1; + header->packetNumber = i; + header->modId = 0; + header->row = detPos[X]; + header->column = detPos[Y]; + header->detType = (uint16_t)myDetectorType; + header->version = SLS_DETECTOR_HEADER_VERSION - 1; + + // fill data + memcpy(packetData + sizeof(sls_detector_header), imageData + srcOffset, datasize); + srcOffset += datasize; + + sendUDPPacket(0, packetData, packetsize); + } + } + FILE_LOG(logINFO, ("Sent frame: %d\n", frameNr)); // calculate time left in period + clock_gettime(CLOCK_REALTIME, &end); int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); @@ -1458,7 +1567,7 @@ u_int32_t runBusy() { return virtual_status; #endif u_int32_t s = (bus_r(PAT_STATUS_REG) & PAT_STATUS_RUN_BUSY_MSK); - FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s)); + //FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s)); return s; } diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 4ec09e64f..01fdc5d99 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -8,7 +8,8 @@ /* Hardware Definitions */ #define NCOUNTERS (3) -#define MAX_COUNTER_MSK (0x7) +#define MAX_COUNTER_MSK (0x7) +#define NCHAN_1_COUNTER (128) #define NCHAN (128 * NCOUNTERS) #define NCHIP (10) #define NDAC (16) @@ -97,4 +98,5 @@ typedef struct udp_header_struct { uint16_t udp_checksum; uint16_t udp_destport; } udp_header; -#define UDP_IP_HEADER_LENGTH_BYTES (28) \ No newline at end of file +#define UDP_IP_HEADER_LENGTH_BYTES (28) +#define PACKETS_PER_FRAME (2) \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 1932dbe03..2429ca973 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -429,6 +429,10 @@ uint64_t writePatternWord(int addr, uint64_t word); int setPatternWaitAddress(int level, int addr); uint64_t setPatternWaitTime(int level, uint64_t t); void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop); +void setPatternMask(uint64_t mask); +uint64_t getPatternMask(); +void setPatternBitMask(uint64_t mask); +uint64_t getPatternBitMask(); int checkDetectorType(); int powerChip (int on); int setPhase(enum CLKINDEX ind, int val, int degrees); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index d494ffbb9..984daa0f1 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -3190,7 +3190,7 @@ int set_pattern_mask(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3211,7 +3211,7 @@ int get_pattern_mask(int file_des) { FILE_LOG(logDEBUG1, ("Get Pattern Mask\n")); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3231,7 +3231,7 @@ int set_pattern_bit_mask(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3252,7 +3252,7 @@ int get_pattern_bit_mask(int file_des){ FILE_LOG(logDEBUG1, ("Get Pattern Bit Mask\n")); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 4ee1e2dc2..3348c7dc8 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -1100,52 +1100,54 @@ class Detector { /** [CTB] */ void setPatternClockControl(uint64_t word, Positions pos = {}); - /** [CTB] same as executing */ + /** [CTB] same as executing + * [Mythen3] */ Result getPatternWord(int addr, Positions pos = {}); /** [CTB] Caution: If word is -1 reads the addr (same as - * executing the pattern) */ + * executing the pattern) + * [Mythen3] */ void setPatternWord(int addr, uint64_t word, Positions pos = {}); - /**[CTB] Options: level: -1 (complete pattern) and 0-2 levels + /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels * @returns array of start address and stop address */ Result> getPatternLoopAddresses(int level, Positions pos = {}) const; - /** [CTB] Options: level: -1 (complete pattern) and 0-2 levels */ + /** [CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopAddresses(int level, int start, int stop, Positions pos = {}); - /**[CTB] Options: level: -1 (complete pattern) and 0-2 levels + /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels * @returns number of loops */ Result getPatternLoopCycles(int level, Positions pos = {}) const; - /** [CTB] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ + /** [CTB][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopCycles(int level, int n, Positions pos = {}); - /* [CTB] */ + /* [CTB][Mythen3] */ Result getPatternWaitAddr(int level, Positions pos = {}) const; - /** [CTB] Options: level 0-2 */ + /** [CTB][Mythen3] Options: level 0-2 */ void setPatternWaitAddr(int level, int addr, Positions pos = {}); - /** [CTB] */ + /** [CTB][Mythen3] */ Result getPatternWaitTime(int level, Positions pos = {}) const; - /** [CTB] Options: level 0-2 */ + /** [CTB][Mythen3] Options: level 0-2 */ void setPatternWaitTime(int level, uint64_t t, Positions pos = {}); - /** [CTB] */ + /** [CTB][Mythen3] */ Result getPatternMask(Positions pos = {}); - /** [CTB] Sets the mask applied to every pattern to the selected bit mask */ + /** [CTB][Mythen3] Sets the mask applied to every pattern to the selected bit mask */ void setPatternMask(uint64_t mask, Positions pos = {}); - /** [CTB] */ + /** [CTB][Mythen3] */ Result getPatternBitMask(Positions pos = {}) const; - /** [CTB] Sets the bitmask that the mask will be applied to for every + /** [CTB][Mythen3] Sets the bitmask that the mask will be applied to for every * pattern */ void setPatternBitMask(uint64_t mask, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 452b66609..588a31375 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1475,7 +1475,7 @@ std::string CmdProxy::PatternWord(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[step or address] [64 bit mask]\n\t[Ctb] 64 bit pattern at " + os << "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at " "address of pattern memory." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1501,17 +1501,17 @@ std::string CmdProxy::PatternLoopAddresses(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patlimits") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of complete " + os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete " "pattern." << '\n'; } else if (cmd == "patloop0") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 0." + os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 0." << '\n'; } else if (cmd == "patloop1") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 1." + os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 1." << '\n'; } else if (cmd == "patloop2") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 2." + os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 2." << '\n'; } else { throw sls::RuntimeError( @@ -1556,11 +1556,11 @@ std::string CmdProxy::PatternLoopCycles(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patnloop0") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 0." << '\n'; + os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 0." << '\n'; } else if (cmd == "patnloop1") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 1." << '\n'; + os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 1." << '\n'; } else if (cmd == "patnloop2") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 2." << '\n'; + os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 2." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1601,11 +1601,11 @@ std::string CmdProxy::PatternWaitAddress(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwait0") { - os << "[addr] \n\t[Ctb] Wait 0 address." << '\n'; + os << "[addr] \n\t[Ctb][Mythen3] Wait 0 address." << '\n'; } else if (cmd == "patwait1") { - os << "[addr] \n\t[Ctb] Wait 1 address." << '\n'; + os << "[addr] \n\t[Ctb][Mythen3] Wait 1 address." << '\n'; } else if (cmd == "patwait2") { - os << "[addr] \n\t[Ctb] Wait 2 address." << '\n'; + os << "[addr] \n\t[Ctb][Mythen3] Wait 2 address." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1646,11 +1646,11 @@ std::string CmdProxy::PatternWaitTime(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwaittime0") { - os << "[n_clk] \n\t[Ctb] Wait 0 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Mythen3] Wait 0 time in clock cycles." << '\n'; } else if (cmd == "patwaittime1") { - os << "[n_clk] \n\t[Ctb] Wait 1 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Mythen3] Wait 1 time in clock cycles." << '\n'; } else if (cmd == "patwaittime2") { - os << "[n_clk] \n\t[Ctb] Wait 2 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Mythen3] Wait 2 time in clock cycles." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 199020ad2..239cfca64 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1651,10 +1651,10 @@ class CmdProxy { "[64 bit mask]\n\t[Ctb] 64 bit mask defining output clock enable."); INTEGER_COMMAND_HEX(patmask, getPatternMask, setPatternMask, stoulHex, - "[64 bit mask]\n\t[Ctb] 64 bit mask applied to every pattern. Only these bits for each pattern will be masked against."); + "[64 bit mask]\n\t[Ctb][Mythen3] 64 bit mask applied to every pattern. Only these bits for each pattern will be masked against."); INTEGER_COMMAND_HEX(patsetbit, getPatternBitMask, setPatternBitMask, stoulHex, - "[64 bit mask]\n\t[Ctb] 64 bit values applied to the selected patmask for every pattern."); + "[64 bit mask]\n\t[Ctb][Mythen3] 64 bit values applied to the selected patmask for every pattern."); /* Moench */ diff --git a/slsDetectorSoftware/src/slsDetector.h b/slsDetectorSoftware/src/slsDetector.h index df2edad33..02b765524 100755 --- a/slsDetectorSoftware/src/slsDetector.h +++ b/slsDetectorSoftware/src/slsDetector.h @@ -1753,16 +1753,16 @@ class slsDetector : public virtual slsDetectorDefs { uint64_t setPatternClockControl(uint64_t word = -1); /** - * Writes a pattern word (CTB/ Moench) + * Writes a pattern word (CTB/ Moench/ Mythen3) * @param addr address of the word * @param word 64bit word to be written, -1 reads the addr (same as - * executing the pattern) + * executing the pattern for ctb) * @returns actual value */ uint64_t setPatternWord(int addr, uint64_t word); /** - * Sets the pattern or loop limits (CTB/ Moench) + * Sets the pattern or loop limits (CTB/ Moench/ Mythen3) * @param level -1 complete pattern, 0,1,2, loop level * @param start start address for level 0-2, -1 gets * @param stop stop address for level 0-2, -1 gets @@ -1772,7 +1772,7 @@ class slsDetector : public virtual slsDetectorDefs { int stop = -1); /** - * Sets the pattern or loop limits (CTB/ Moench) + * Sets the pattern or loop limits (CTB/ Moench/ Mythen3) * @param level -1 complete pattern, 0,1,2, loop level * @param n number of loops for level 0-2, -1 gets * @returns number of loops @@ -1781,7 +1781,7 @@ class slsDetector : public virtual slsDetectorDefs { /** - * Sets the wait address (CTB/ Moench) + * Sets the wait address (CTB/ Moench/ Mythen3) * @param level 0,1,2, wait level * @param addr wait address, -1 gets * @returns actual value @@ -1789,7 +1789,7 @@ class slsDetector : public virtual slsDetectorDefs { int setPatternWaitAddr(int level, int addr = -1); /** - * Sets the wait time (CTB/ Moench) + * Sets the wait time (CTB/ Moench/ Mythen3) * @param level 0,1,2, wait level * @param t wait time, -1 gets * @returns actual value @@ -1797,27 +1797,27 @@ class slsDetector : public virtual slsDetectorDefs { uint64_t setPatternWaitTime(int level, uint64_t t = -1); /** - * Sets the mask applied to every pattern (CTB/ Moench) + * Sets the mask applied to every pattern (CTB/ Moench/ Mythen3) * @param mask mask to be applied */ void setPatternMask(uint64_t mask); /** - * Gets the mask applied to every pattern (CTB/ Moench) + * Gets the mask applied to every pattern (CTB/ Moench/ Mythen3) * @returns mask set */ uint64_t getPatternMask(); /** * Selects the bits that the mask will be applied to for every pattern (CTB/ - * Moench) + * Moench/ Mythen3) * @param mask mask to select bits */ void setPatternBitMask(uint64_t mask); /** * Gets the bits that the mask will be applied to for every pattern (CTB/ - * Moench) + * Moench/ Mythen3) * @returns mask of bits selected */ uint64_t getPatternBitMask(); diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 43809b2f1..f19d17165 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -8,5 +8,5 @@ #define APIGOTTHARD 0x191127 #define APIJUNGFRAU 0x191127 #define APICTB 0x191210 -#define APIMYTHEN3 0x200120 #define APIEIGER 0x200121 +#define APIMYTHEN3 0x200121