diff --git a/slsDetectorGui/forms/form_tab_settings.ui b/slsDetectorGui/forms/form_tab_settings.ui index 7f44f601a..2f20a5edb 100755 --- a/slsDetectorGui/forms/form_tab_settings.ui +++ b/slsDetectorGui/forms/form_tab_settings.ui @@ -32,8 +32,85 @@ Form - - + + + + false + + + + 50 + 16777215 + + + + 2 + + + true + + + + + + + false + + + + 50 + 16777215 + + + + 3 + + + true + + + + + + + false + + + + 140 + 25 + + + + + 140 + 16777215 + + + + + 1.67772e+07 + + + + + 65535 + + + + + 255 + + + + + 7 + + + + + + false @@ -69,8 +146,8 @@ - - + + false @@ -128,7 +205,7 @@ - + Qt::Vertical @@ -144,46 +221,7 @@ - - - - false - - - - 140 - 25 - - - - - 140 - 16777215 - - - - - 1.67772e+07 - - - - - 65535 - - - - - 255 - - - - - 7 - - - - - + true @@ -280,7 +318,139 @@ - + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + false + + + + 110 + 0 + + + + + 110 + 16777215 + + + + Threshold: + + + + + + + false + + + + 140 + 25 + + + + + 140 + 16777215 + + + + false + + + eV + + + -100000 + + + 100000 + + + 100 + + + -1 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + false + + + + 110 + 0 + + + + + 110 + 16777215 + + + + Counters: + + + + + + + false + + + + 50 + 16777215 + + + + 1 + + + true + + + + true @@ -424,97 +594,6 @@ - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - false - - - - 110 - 0 - - - - - 110 - 16777215 - - - - Threshold: - - - - - - - false - - - - 140 - 25 - - - - - 140 - 16777215 - - - - false - - - eV - - - -100000 - - - 100000 - - - 100 - - - -1 - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 20 - - - - @@ -523,7 +602,6 @@ spinThreshold2 spinThreshold3 btnSetThreshold - comboDynamicRange diff --git a/slsDetectorGui/include/qTabSettings.h b/slsDetectorGui/include/qTabSettings.h index 2effd00bb..52915747e 100644 --- a/slsDetectorGui/include/qTabSettings.h +++ b/slsDetectorGui/include/qTabSettings.h @@ -1,6 +1,7 @@ #pragma once #include "sls/Detector.h" #include "ui_form_tab_settings.h" +#include class qTabSettings : public QWidget, private Ui::TabSettingsObject { Q_OBJECT @@ -15,6 +16,7 @@ class qTabSettings : public QWidget, private Ui::TabSettingsObject { void SetDynamicRange(int index); void SetThresholdEnergy(int index); void SetThresholdEnergies(); + void SetCounterMask(); private: void SetupWidgetWindow(); @@ -25,8 +27,11 @@ class qTabSettings : public QWidget, private Ui::TabSettingsObject { void GetDynamicRange(); void GetThresholdEnergy(); void GetThresholdEnergies(); + void GetCounterMask(); sls::Detector *det; + std::vector counters; + enum { STANDARD, FAST, diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp index 504f80b71..84fd53de8 100644 --- a/slsDetectorGui/src/qTabSettings.cpp +++ b/slsDetectorGui/src/qTabSettings.cpp @@ -1,6 +1,7 @@ #include "qTabSettings.h" #include "qDefs.h" #include "sls/ToString.h" +#include "sls/bit_utils.h" #include qTabSettings::qTabSettings(QWidget *parent, sls::Detector *detector) @@ -14,10 +15,21 @@ qTabSettings::~qTabSettings() {} void qTabSettings::SetupWidgetWindow() { + counters = std::vector{chkCounter1, chkCounter2, chkCounter3}; + spinThreshold2->hide(); spinThreshold3->hide(); btnSetThreshold->hide(); btnSetThreshold->setEnabled(false); + lblCounter->hide(); + lblCounter->setEnabled(false); + chkCounter1->setEnabled(false); + chkCounter2->setEnabled(false); + chkCounter3->setEnabled(false); + chkCounter1->hide(); + chkCounter2->hide(); + chkCounter3->hide(); + // enabling according to det type slsDetectorDefs::detectorType detType = det->getDetectorType().squash(); if (detType == slsDetectorDefs::MYTHEN3) { @@ -32,6 +44,16 @@ void qTabSettings::SetupWidgetWindow() { spinThreshold3->setEnabled(true); btnSetThreshold->setEnabled(true); btnSetThreshold->show(); + + lblCounter->show(); + lblCounter->setEnabled(true); + chkCounter1->setEnabled(true); + chkCounter2->setEnabled(true); + chkCounter3->setEnabled(true); + chkCounter1->show(); + chkCounter2->show(); + chkCounter3->show(); + // disable dr QStandardItemModel *model = qobject_cast(comboDynamicRange->model()); @@ -153,6 +175,16 @@ void qTabSettings::Initialization() { else if (spinThreshold->isEnabled()) connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetThresholdEnergy(int))); + + // counters + if (lblCounter->isEnabled()) { + connect(chkCounter1, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + connect(chkCounter2, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + connect(chkCounter3, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + } } void qTabSettings::GetSettings() { @@ -269,7 +301,7 @@ void qTabSettings::GetThresholdEnergies() { spinThreshold3->setValue(retval[2]); } CATCH_DISPLAY("Could not get threshold energy.", - "qTabDataOutput::GetThresholdEnergies") + "qTabSettings::GetThresholdEnergies") connect(btnSetThreshold, SIGNAL(clicked()), this, SLOT(SetThresholdEnergies())); } @@ -284,7 +316,7 @@ void qTabSettings::GetThresholdEnergy() { spinThreshold->setValue(retval); } CATCH_DISPLAY("Could not get threshold energy.", - "qTabDataOutput::GetThresholdEnergy") + "qTabSettings::GetThresholdEnergy") connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetThresholdEnergy(int))); } @@ -317,6 +349,52 @@ void qTabSettings::SetThresholdEnergy(int index) { GetThresholdEnergy(); } +void qTabSettings::GetCounterMask() { + LOG(logDEBUG) << "Getting counter mask"; + disconnect(chkCounter1, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + disconnect(chkCounter2, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + disconnect(chkCounter3, SIGNAL(toggled(bool)), this, + SLOT(SetCounterMask())); + try { + auto retval = sls::getSetBits(det->getCounterMask().tsquash( + "Counter mask is inconsistent for all detectors.")); + // default to unchecked + for (auto p : counters) { + p->setChecked(false); + } + // if retval[i] = 2, chkCounter2 is checked + for (auto i : retval) { + if (i > 3) { + throw sls::RuntimeError( + std::string("Unknown counter index : ") + + std::to_string(static_cast(i))); + } + counters[i]->setChecked(true); + } + } + CATCH_DISPLAY("Could not get counter mask.", "qTabSettings::GetCounterMask") + connect(chkCounter1, SIGNAL(toggled(bool)), this, SLOT(SetCounterMask())); + connect(chkCounter2, SIGNAL(toggled(bool)), this, SLOT(SetCounterMask())); + connect(chkCounter3, SIGNAL(toggled(bool)), this, SLOT(SetCounterMask())); +} + +void qTabSettings::SetCounterMask() { + uint32_t mask = 0; + for (unsigned int i = 0; i < counters.size(); ++i) { + if (counters[i]->isChecked()) { + mask |= (1 << i); + } + } + LOG(logINFO) << "Setting counter mask to " << mask; + try { + det->setCounterMask(mask); + } + CATCH_HANDLE("Could not set counter mask.", "qTabSettings::SetCounterMask", + this, &qTabSettings::GetCounterMask) +} + void qTabSettings::Refresh() { LOG(logDEBUG) << "**Updating Settings Tab"; @@ -337,5 +415,9 @@ void qTabSettings::Refresh() { GetThresholdEnergy(); } + if (lblCounter->isEnabled()) { + GetCounterMask(); + } + LOG(logDEBUG) << "**Updated Settings Tab"; } diff --git a/slsDetectorServers/ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/ctbDetectorServer/CMakeLists.txt index d06ea78f7..b909f6ecb 100644 --- a/slsDetectorServers/ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/ctbDetectorServer/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable(ctbDetectorServer_virtual ../slsDetectorServer/src/MAX1932.c ../slsDetectorServer/src/programFpgaBlackfin.c ../slsDetectorServer/src/sharedMemory.c + ../slsDetectorServer/src/loadPattern.c ) include_directories( diff --git a/slsDetectorServers/ctbDetectorServer/Makefile b/slsDetectorServers/ctbDetectorServer/Makefile index 3d2260816..fd5df8565 100755 --- a/slsDetectorServers/ctbDetectorServer/Makefile +++ b/slsDetectorServers/ctbDetectorServer/Makefile @@ -13,7 +13,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 3b9ce2a98..511f2728d 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index bffdae970..f58030fbd 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -11,6 +11,7 @@ #include "UDPPacketHeaderGenerator.h" #include "common.h" #include "communication_funcs_UDP.h" +#include "loadPattern.h" #include #include @@ -42,7 +43,6 @@ char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; -uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; int64_t virtual_currentFrameNumber = 2; #endif @@ -478,7 +478,7 @@ void setupDetector() { ndSamples = 1; #ifdef VIRTUAL sharedMemory_setStatus(IDLE); - memset(virtual_pattern, 0, sizeof(virtual_pattern)); + initializePatternWord(); #endif ALTERA_PLL_ResetPLLAndReconfiguration(); @@ -969,7 +969,7 @@ int setExpTime(int64_t val) { } int64_t getExpTime() { - return setPatternWaitTime(0, -1) / (1E-3 * clkFrequency[RUN_CLK]); + return getPatternWaitTime(0) / (1E-3 * clkFrequency[RUN_CLK]); } int setPeriod(int64_t val) { @@ -1880,273 +1880,6 @@ int getPipeline(enum CLKINDEX ind) { ADC_OFFSET_ADC_PPLN_OFST); } -// patterns - -uint64_t writePatternIOControl(uint64_t word) { - if ((int64_t)word != -1) { - LOG(logINFO, - ("Setting Pattern I/O Control: 0x%llx\n", (long long int)word)); - set64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); - } - uint64_t retval = - get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); - LOG(logDEBUG1, (" I/O Control retval: 0x%llx\n", (long long int)retval)); - return retval; -} - -uint64_t readPatternWord(int addr) { - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); - uint32_t reg = PATTERN_CNTRL_REG; - - // overwrite with only addr - bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); - - // set read strobe - bus_w(reg, bus_r(reg) | PATTERN_CNTRL_RD_MSK); - - // unset read strobe - bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_RD_MSK)); - usleep(WAIT_TIME_PATTERN_READ); - - // read value - uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); - LOG(logDEBUG1, - (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int)retval)); -#ifdef VIRTUAL - retval = virtual_pattern[addr]; -#endif - return retval; -} - -uint64_t writePatternWord(int addr, uint64_t word) { - // get - if ((int64_t)word == -1) - return readPatternWord(addr); - - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, - (long long int)word)); - uint32_t reg = PATTERN_CNTRL_REG; - - // write word - set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG); - LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n", - get64BitReg(PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG))); - - // overwrite with only addr - bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); - - // set write strobe - bus_w(reg, bus_r(reg) | PATTERN_CNTRL_WR_MSK); - - // unset write strobe - bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_WR_MSK)); -#ifdef VIRTUAL - virtual_pattern[addr] = word; -#endif - - return word; - // return readPatternWord(addr); // will start executing the pattern -} - -int setPatternWaitAddress(int level, int addr) { - - // error (handled in tcp) - if (addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - uint32_t reg = 0; - uint32_t offset = 0; - uint32_t mask = 0; - - switch (level) { - case 0: - reg = PATTERN_WAIT_0_ADDR_REG; - offset = PATTERN_WAIT_0_ADDR_OFST; - mask = PATTERN_WAIT_0_ADDR_MSK; - break; - case 1: - reg = PATTERN_WAIT_1_ADDR_REG; - offset = PATTERN_WAIT_1_ADDR_OFST; - mask = PATTERN_WAIT_1_ADDR_MSK; - break; - case 2: - reg = PATTERN_WAIT_2_ADDR_REG; - offset = PATTERN_WAIT_2_ADDR_OFST; - mask = PATTERN_WAIT_2_ADDR_MSK; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if (addr >= 0) { - LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", - level, addr)); - bus_w(reg, ((addr << offset) & mask)); - } - - // get - uint32_t regval = ((bus_r(reg) & mask) >> offset); - LOG(logDEBUG1, - (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval)); - return regval; -} - -uint64_t setPatternWaitTime(int level, uint64_t t) { - uint32_t regl = 0; - uint32_t regm = 0; - - switch (level) { - case 0: - regl = PATTERN_WAIT_TIMER_0_LSB_REG; - regm = PATTERN_WAIT_TIMER_0_MSB_REG; - break; - case 1: - regl = PATTERN_WAIT_TIMER_1_LSB_REG; - regm = PATTERN_WAIT_TIMER_1_MSB_REG; - break; - case 2: - regl = PATTERN_WAIT_TIMER_2_LSB_REG; - regm = PATTERN_WAIT_TIMER_2_MSB_REG; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if ((int64_t)t >= 0) { - LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level, - (long long int)t)); - set64BitReg(t, regl, regm); - } - - // get - uint64_t regval = get64BitReg(regl, regm); - LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, - (long long int)regval)); - return regval; -} - -void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { - - // (checked at tcp) - if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, " - "stopaddr:0x%x) must be " - "less than 0x%x\n", - *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); - } - - uint32_t addr = 0; - uint32_t nLoopReg = 0; - uint32_t startOffset = 0; - uint32_t startMask = 0; - uint32_t stopOffset = 0; - uint32_t stopMask = 0; - - switch (level) { - case 0: - addr = PATTERN_LOOP_0_ADDR_REG; - nLoopReg = PATTERN_LOOP_0_ITERATION_REG; - startOffset = PATTERN_LOOP_0_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_0_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_0_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_0_ADDR_STP_MSK; - break; - case 1: - addr = PATTERN_LOOP_1_ADDR_REG; - nLoopReg = PATTERN_LOOP_1_ITERATION_REG; - startOffset = PATTERN_LOOP_1_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_1_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_1_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_1_ADDR_STP_MSK; - break; - case 2: - addr = PATTERN_LOOP_2_ADDR_REG; - nLoopReg = PATTERN_LOOP_2_ITERATION_REG; - startOffset = PATTERN_LOOP_2_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_2_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_2_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_2_ADDR_STP_MSK; - break; - case -1: - // complete pattern - addr = PATTERN_LIMIT_REG; - nLoopReg = -1; - startOffset = PATTERN_LIMIT_STRT_OFST; - startMask = PATTERN_LIMIT_STRT_MSK; - stopOffset = PATTERN_LIMIT_STP_OFST; - stopMask = PATTERN_LIMIT_STP_MSK; - break; - default: - // already checked at tcp interface - LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. " - "Should be between -1 and 2.\n", - level)); - *startAddr = 0; - *stopAddr = 0; - *nLoop = 0; - } - - // set iterations - if (level >= 0) { - // set iteration - if (*nLoop >= 0) { - LOG(logINFO, - ("Setting Pattern Loop (level:%d, nLoop:%d)\n", level, *nLoop)); - bus_w(nLoopReg, *nLoop); - } - *nLoop = bus_r(nLoopReg); - } - - // set - if (*startAddr >= 0 && *stopAddr >= 0) { - // writing start and stop addr - LOG(logINFO, - ("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", - level, *startAddr, *stopAddr)); - bus_w(addr, ((*startAddr << startOffset) & startMask) | - ((*stopAddr << stopOffset) & stopMask)); - LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr))); - } - - *startAddr = ((bus_r(addr) & startMask) >> startOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read " - "startAddr:0x%x)\n", - level, *startAddr)); - - *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read " - "stopAddr:0x%x)\n", - level, *stopAddr)); -} - int setLEDEnable(int enable) { uint32_t addr = CONFIG_REG; @@ -2189,22 +1922,6 @@ void setDigitalIODelay(uint64_t pinMask, int delay) { bus_w(addr, bus_r(addr) & (~OUTPUT_DELAY_0_OTPT_TRGGR_MSK)); } -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); -} - /* aquisition */ int startStateMachine() { diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 04a079dbf..1af1cb8c5 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer differ diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 45d4d18a1..77dc18af5 100755 Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index e16b7d31f..9a647d114 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer differ diff --git a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt index a5c224491..9c36d155b 100644 --- a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt @@ -13,7 +13,7 @@ add_executable(moenchDetectorServer_virtual ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/MAX1932.c ../slsDetectorServer/src/programFpgaBlackfin.c - ../slsDetectorServer/src/readDefaultPattern.c + ../slsDetectorServer/src/loadPattern.c ../slsDetectorServer/src/sharedMemory.c ) diff --git a/slsDetectorServers/moenchDetectorServer/Makefile b/slsDetectorServers/moenchDetectorServer/Makefile index a73300c7f..c7226f169 100755 --- a/slsDetectorServers/moenchDetectorServer/Makefile +++ b/slsDetectorServers/moenchDetectorServer/Makefile @@ -13,7 +13,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)readDefaultPattern.c $(main_src)/sharedMemory.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)loadPattern.c $(main_src)/sharedMemory.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index c477c334b..b74369e3e 100755 Binary files a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer and b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer differ diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 1ea6275ed..849e6b62c 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -9,6 +9,7 @@ #include "UDPPacketHeaderGenerator.h" #include "common.h" #include "communication_funcs_UDP.h" +#include "loadPattern.h" #include #include @@ -40,7 +41,6 @@ char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; -uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; int64_t virtual_currentFrameNumber = 2; #endif @@ -484,7 +484,7 @@ void setupDetector() { nSamples = 1; #ifdef VIRTUAL sharedMemory_setStatus(IDLE); - memset(virtual_pattern, 0, sizeof(virtual_pattern)); + initializePatternWord(); #endif ALTERA_PLL_ResetPLLAndReconfiguration(); @@ -551,7 +551,7 @@ void setupDetector() { } setPipeline(ADC_CLK, DEFAULT_PIPELINE); if (initError != FAIL) { - initError = loadDefaultPattern(DEFAULT_PATTERN_FILE, initErrorMessage); + initError = loadPatternFile(DEFAULT_PATTERN_FILE, initErrorMessage); } setSettings(DEFAULT_SETTINGS); @@ -818,7 +818,7 @@ int setExpTime(int64_t val) { } int64_t getExpTime() { - return setPatternWaitTime(0, -1) / (1E-3 * clkFrequency[RUN_CLK]); + return getPatternWaitTime(0) / (1E-3 * clkFrequency[RUN_CLK]); } int setPeriod(int64_t val) { @@ -1559,290 +1559,6 @@ int getPipeline(enum CLKINDEX ind) { ADC_OFFSET_ADC_PPLN_OFST); } -// patterns - -uint64_t writePatternIOControl(uint64_t word) { - if ((int64_t)word != -1) { - LOG(logINFO, - ("Setting Pattern I/O Control: 0x%llx\n", (long long int)word)); - set64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); - } - uint64_t retval = - get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); - LOG(logDEBUG1, (" I/O Control retval: 0x%llx\n", (long long int)retval)); - return retval; -} - -uint64_t readPatternWord(int addr) { - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); - uint32_t reg = PATTERN_CNTRL_REG; - - // overwrite with only addr - bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); - - // set read strobe - bus_w(reg, bus_r(reg) | PATTERN_CNTRL_RD_MSK); - - // unset read strobe - bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_RD_MSK)); - usleep(WAIT_TIME_PATTERN_READ); - - // read value - uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); - LOG(logDEBUG1, - (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int)retval)); -#ifdef VIRTUAL - retval = virtual_pattern[addr]; -#endif - return retval; -} - -uint64_t writePatternWord(int addr, uint64_t word) { - // get - if ((int64_t)word == -1) - return readPatternWord(addr); - - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, - (long long int)word)); - uint32_t reg = PATTERN_CNTRL_REG; - - // write word - set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG); - LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n", - get64BitReg(PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG))); - - // overwrite with only addr - bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); - - // set write strobe - bus_w(reg, bus_r(reg) | PATTERN_CNTRL_WR_MSK); - - // unset write strobe - bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_WR_MSK)); -#ifdef VIRTUAL - virtual_pattern[addr] = word; -#endif - return word; - // return readPatternWord(addr); // will start executing the pattern -} - -int setPatternWaitAddress(int level, int addr) { - - // error (handled in tcp) - if (addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - uint32_t reg = 0; - uint32_t offset = 0; - uint32_t mask = 0; - - switch (level) { - case 0: - reg = PATTERN_WAIT_0_ADDR_REG; - offset = PATTERN_WAIT_0_ADDR_OFST; - mask = PATTERN_WAIT_0_ADDR_MSK; - break; - case 1: - reg = PATTERN_WAIT_1_ADDR_REG; - offset = PATTERN_WAIT_1_ADDR_OFST; - mask = PATTERN_WAIT_1_ADDR_MSK; - break; - case 2: - reg = PATTERN_WAIT_2_ADDR_REG; - offset = PATTERN_WAIT_2_ADDR_OFST; - mask = PATTERN_WAIT_2_ADDR_MSK; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if (addr >= 0) { - LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", - level, addr)); - bus_w(reg, ((addr << offset) & mask)); - } - - // get - uint32_t regval = ((bus_r(reg) & mask) >> offset); - LOG(logDEBUG1, - (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval)); - return regval; -} - -uint64_t setPatternWaitTime(int level, uint64_t t) { - uint32_t regl = 0; - uint32_t regm = 0; - - switch (level) { - case 0: - regl = PATTERN_WAIT_TIMER_0_LSB_REG; - regm = PATTERN_WAIT_TIMER_0_MSB_REG; - break; - case 1: - regl = PATTERN_WAIT_TIMER_1_LSB_REG; - regm = PATTERN_WAIT_TIMER_1_MSB_REG; - break; - case 2: - regl = PATTERN_WAIT_TIMER_2_LSB_REG; - regm = PATTERN_WAIT_TIMER_2_MSB_REG; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if ((int64_t)t >= 0) { - LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level, - (long long int)t)); - set64BitReg(t, regl, regm); - } - - // get - uint64_t regval = get64BitReg(regl, regm); - LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, - (long long int)regval)); - return regval; -} - -void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { - - // (checked at tcp) - if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, " - "stopaddr:0x%x) must be " - "less than 0x%x\n", - *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); - } - - uint32_t addr = 0; - uint32_t nLoopReg = 0; - uint32_t startOffset = 0; - uint32_t startMask = 0; - uint32_t stopOffset = 0; - uint32_t stopMask = 0; - - switch (level) { - case 0: - addr = PATTERN_LOOP_0_ADDR_REG; - nLoopReg = PATTERN_LOOP_0_ITERATION_REG; - startOffset = PATTERN_LOOP_0_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_0_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_0_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_0_ADDR_STP_MSK; - break; - case 1: - addr = PATTERN_LOOP_1_ADDR_REG; - nLoopReg = PATTERN_LOOP_1_ITERATION_REG; - startOffset = PATTERN_LOOP_1_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_1_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_1_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_1_ADDR_STP_MSK; - break; - case 2: - addr = PATTERN_LOOP_2_ADDR_REG; - nLoopReg = PATTERN_LOOP_2_ITERATION_REG; - startOffset = PATTERN_LOOP_2_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_2_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_2_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_2_ADDR_STP_MSK; - break; - case -1: - // complete pattern - addr = PATTERN_LIMIT_REG; - nLoopReg = -1; - startOffset = PATTERN_LIMIT_STRT_OFST; - startMask = PATTERN_LIMIT_STRT_MSK; - stopOffset = PATTERN_LIMIT_STP_OFST; - stopMask = PATTERN_LIMIT_STP_MSK; - break; - default: - // already checked at tcp interface - LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. " - "Should be between -1 and 2.\n", - level)); - *startAddr = 0; - *stopAddr = 0; - *nLoop = 0; - } - - // set iterations - if (level >= 0) { - // set iteration - if (*nLoop >= 0) { - LOG(logINFO, - ("Setting Pattern Loop (level:%d, nLoop:%d)\n", level, *nLoop)); - bus_w(nLoopReg, *nLoop); - } - *nLoop = bus_r(nLoopReg); - } - - // set - if (*startAddr >= 0 && *stopAddr >= 0) { - // writing start and stop addr - LOG(logINFO, - ("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", - level, *startAddr, *stopAddr)); - bus_w(addr, ((*startAddr << startOffset) & startMask) | - ((*stopAddr << stopOffset) & stopMask)); - LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr))); - } - - *startAddr = ((bus_r(addr) & startMask) >> startOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read " - "startAddr:0x%x)\n", - level, *startAddr)); - - *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read " - "stopAddr:0x%x)\n", - level, *stopAddr)); -} - -void setPatternMask(uint64_t mask) { - LOG(logINFO, ("Setting pattern mask to 0x%llx\n", 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) { - LOG(logINFO, ("Setting pattern bit mask to 0x%llx\n", mask)); - set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); -} - -uint64_t getPatternBitMask() { - return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); -} - /* aquisition */ int startStateMachine() { diff --git a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt index 92c795bee..20476adfb 100644 --- a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt @@ -11,8 +11,7 @@ add_executable(mythen3DetectorServer_virtual ../slsDetectorServer/src/LTC2620_Driver.c ../slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c ../slsDetectorServer/src/programFpgaNios.c - ../slsDetectorServer/src/readDefaultPattern.c - ../slsDetectorServer/src/loadPattern.c + ../slsDetectorServer/src/loadPattern.c ../slsDetectorServer/src/sharedMemory.c ) diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile index abb2494c8..254fbd570 100755 --- a/slsDetectorServers/mythen3DetectorServer/Makefile +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -13,7 +13,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)/programFpgaNios.c $(main_src)readDefaultPattern.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c mythen3.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)/programFpgaNios.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c mythen3.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index f05d63bc2..4514f11e2 100755 Binary files a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer and b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer differ diff --git a/slsDetectorServers/mythen3DetectorServer/mythen3.c b/slsDetectorServers/mythen3DetectorServer/mythen3.c index 7ea679da1..64f4bdb11 100644 --- a/slsDetectorServers/mythen3DetectorServer/mythen3.c +++ b/slsDetectorServers/mythen3DetectorServer/mythen3.c @@ -1,7 +1,7 @@ +#include "mythen3.h" #include "clogger.h" #include "common.h" -#include "mythen3.h" #include "sls/ansi.h" #include "sls/sls_detector_defs.h" #include "slsDetectorServer_defs.h" @@ -22,353 +22,343 @@ typedef struct __attribute__((packed)) { } patternParameters; */ -int chipStatusRegister=0; +int chipStatusRegister = 0; int setBit(int ibit, int patword) { return patword |= (1 << ibit); } int clearBit(int ibit, int patword) { return patword &= ~(1 << ibit); } -extern enum TLogLevel trimmingPrint ; +int getChipStatusRegister() { return chipStatusRegister; } +int gainCapsToCsr(int caps) { + // Translates bit representation + int csr = 0; + if (!(caps & M3_C10pre)) + csr |= 1 << _CSR_C10pre; + if (caps & M3_C15sh) + csr |= 1 << CSR_C15sh; + if (caps & M3_C30sh) + csr |= 1 << CSR_C30sh; + if (caps & M3_C50sh) + csr |= 1 << CSR_C50sh; + if (caps & M3_C225ACsh) + csr |= 1 << CSR_C225ACsh; + if (!(caps & M3_C15pre)) + csr |= 1 << _CSR_C15pre; -int getChipStatusRegister(){ - return chipStatusRegister; + return csr; } -int gainCapsToCsr(int caps){ - //Translates bit representation - int csr = 0; - if (!(caps & M3_C10pre)) - csr |= 1 << _CSR_C10pre; - if (caps & M3_C15sh) - csr |= 1 << CSR_C15sh; - if (caps & M3_C30sh) - csr |= 1 << CSR_C30sh; - if (caps & M3_C50sh) - csr |= 1 << CSR_C50sh; - if (caps & M3_C225ACsh) - csr |= 1 << CSR_C225ACsh; - if (!(caps & M3_C15pre)) - csr |= 1 << _CSR_C15pre; +int csrToGainCaps(int csr) { + // Translates bit representation + int caps = 0; + if (!(csr & (1 << _CSR_C10pre))) + caps |= M3_C10pre; + if (csr & (1 << CSR_C15sh)) + caps |= M3_C15sh; + if (csr & (1 << CSR_C30sh)) + caps |= M3_C30sh; + if (csr & (1 << CSR_C50sh)) + caps |= M3_C50sh; + if (csr & (1 << CSR_C225ACsh)) + caps |= M3_C225ACsh; + if (!(csr & (1 << _CSR_C15pre))) + caps |= M3_C15pre; - return csr; -} - -int csrToGainCaps(int csr){ - //Translates bit representation - int caps = 0; - if (!(csr & (1 << _CSR_C10pre))) - caps |= M3_C10pre; - if (csr & (1 << CSR_C15sh)) - caps |= M3_C15sh; - if (csr & (1 << CSR_C30sh)) - caps |= M3_C30sh; - if (csr & (1 << CSR_C50sh)) - caps |= M3_C50sh; - if (csr & (1 << CSR_C225ACsh)) - caps |= M3_C225ACsh; - if (!(csr & (1 << _CSR_C15pre))) - caps |= M3_C15pre; - - return caps; + return caps; } patternParameters *setChipStatusRegisterPattern(int csr) { - int iaddr=0; - int nbits=18; - int error=0; - //int start=0, stop=MAX_PATTERN_LENGTH, loop=0; - int patword=0; - - patternParameters *pat = malloc(sizeof(patternParameters)); - memset(pat, 0, sizeof(patternParameters)); - - patword=setBit(SIGNAL_STATLOAD,patword); - for (int i=0; i<2; i++) - pat->word[iaddr++]=patword; - patword=setBit(SIGNAL_resStorage,patword); - patword=setBit(SIGNAL_resCounter,patword); - for (int i=0; i<8; i++) - pat->word[iaddr++]=patword; - patword=clearBit(SIGNAL_resStorage,patword); - patword=clearBit(SIGNAL_resCounter,patword); - for (int i=0; i<8; i++) - pat->word[iaddr++]=patword; - //#This version of the serializer pushes in the MSB first (compatible with the CSR bit numbering) - for (int ib=nbits-1; ib>=0; ib--) { - if (csr&(1<word[iaddr++]=patword; - patword=setBit(SIGNAL_CHSclk,patword); - pat->word[iaddr++]=patword; - patword=clearBit(SIGNAL_CHSclk,patword); - pat->word[iaddr++]=patword; - } + int iaddr = 0; + int nbits = 18; + int error = 0; + // int start=0, stop=MAX_PATTERN_LENGTH, loop=0; + int patword = 0; - patword=clearBit(SIGNAL_serialIN,patword); - for (int i=0; i<2; i++) - pat->word[iaddr++]=patword; - patword=setBit(SIGNAL_STO,patword); - for (int i=0; i<5; i++) - pat->word[iaddr++]=patword; - patword=clearBit(SIGNAL_STO,patword); - for (int i=0; i<5; i++) - pat->word[iaddr++]=patword; - patword=clearBit(SIGNAL_STATLOAD,patword); - for (int i=0; i<5; i++) - pat->word[iaddr++]=patword; + patternParameters *pat = malloc(sizeof(patternParameters)); + memset(pat, 0, sizeof(patternParameters)); - if (iaddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", - iaddr, MAX_PATTERN_LENGTH)); - error = 1; - } - // set pattern wait address - for (int i = 0; i <= 2; i++) - pat->wait[i]=MAX_PATTERN_LENGTH - 1; - // pattern loop - for (int i = 0; i <= 2; i++) { - //int stop = MAX_PATTERN_LENGTH - 1, nloop = 0; - pat->loop[i * 2 + 0]=MAX_PATTERN_LENGTH - 1; - pat->loop[i * 2 + 1]=MAX_PATTERN_LENGTH - 1; - pat->nloop[i]=0; - } - - // pattern limits - { - pat->limits[0]=0; - pat->limits[1]=iaddr; - } - - if (error != 0) { - free(pat); - return NULL; - } - chipStatusRegister=csr; - return pat; + patword = setBit(SIGNAL_STATLOAD, patword); + for (int i = 0; i < 2; i++) + pat->word[iaddr++] = patword; + patword = setBit(SIGNAL_resStorage, patword); + patword = setBit(SIGNAL_resCounter, patword); + for (int i = 0; i < 8; i++) + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_resStorage, patword); + patword = clearBit(SIGNAL_resCounter, patword); + for (int i = 0; i < 8; i++) + pat->word[iaddr++] = patword; + //#This version of the serializer pushes in the MSB first (compatible with + //the CSR bit numbering) + for (int ib = nbits - 1; ib >= 0; ib--) { + if (csr & (1 << ib)) + patword = setBit(SIGNAL_serialIN, patword); + else + patword = clearBit(SIGNAL_serialIN, patword); + for (int i = 0; i < 4; i++) + pat->word[iaddr++] = patword; + patword = setBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; + } + patword = clearBit(SIGNAL_serialIN, patword); + for (int i = 0; i < 2; i++) + pat->word[iaddr++] = patword; + patword = setBit(SIGNAL_STO, patword); + for (int i = 0; i < 5; i++) + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_STO, patword); + for (int i = 0; i < 5; i++) + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_STATLOAD, patword); + for (int i = 0; i < 5; i++) + pat->word[iaddr++] = patword; + + if (iaddr >= MAX_PATTERN_LENGTH) { + LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", iaddr, + MAX_PATTERN_LENGTH)); + error = 1; + } + // set pattern wait address + for (int i = 0; i <= 2; i++) + pat->wait[i] = MAX_PATTERN_LENGTH - 1; + // pattern loop + for (int i = 0; i <= 2; i++) { + // int stop = MAX_PATTERN_LENGTH - 1, nloop = 0; + pat->loop[i * 2 + 0] = MAX_PATTERN_LENGTH - 1; + pat->loop[i * 2 + 1] = MAX_PATTERN_LENGTH - 1; + pat->nloop[i] = 0; + } + + // pattern limits + { + pat->limits[0] = 0; + pat->limits[1] = iaddr; + } + + if (error != 0) { + free(pat); + return NULL; + } + chipStatusRegister = csr; + return pat; } patternParameters *setInterpolation(int mask) { - int csr; - if (mask) - csr=chipStatusRegister|(1<< CSR_interp); - else - csr=chipStatusRegister & ~(1<< CSR_interp); + int csr; + if (mask) + csr = chipStatusRegister | (1 << CSR_interp); + else + csr = chipStatusRegister & ~(1 << CSR_interp); - return setChipStatusRegisterPattern(csr); + return setChipStatusRegisterPattern(csr); } - - patternParameters *setPumpProbe(int mask) { - int csr; - if (mask) - csr=chipStatusRegister|(1<< CSR_pumprobe); - else - csr=chipStatusRegister & ~(1<< CSR_pumprobe); - - return setChipStatusRegisterPattern(csr); + int csr; + if (mask) + csr = chipStatusRegister | (1 << CSR_pumprobe); + else + csr = chipStatusRegister & ~(1 << CSR_pumprobe); + return setChipStatusRegisterPattern(csr); } patternParameters *setDigitalPulsing(int mask) { - int csr; - if (mask) - csr=chipStatusRegister|(1<< CSR_dpulse); - else - csr=chipStatusRegister & ~(1<< CSR_dpulse); + int csr; + if (mask) + csr = chipStatusRegister | (1 << CSR_dpulse); + else + csr = chipStatusRegister & ~(1 << CSR_dpulse); - return setChipStatusRegisterPattern(csr); - + return setChipStatusRegisterPattern(csr); } -patternParameters *setAnalogPulsing(int mask){ +patternParameters *setAnalogPulsing(int mask) { - int csr; - if (mask) - csr=chipStatusRegister|(1<< CSR_apulse); - else - csr=chipStatusRegister & ~(1<< CSR_apulse); + int csr; + if (mask) + csr = chipStatusRegister | (1 << CSR_apulse); + else + csr = chipStatusRegister & ~(1 << CSR_apulse); - return setChipStatusRegisterPattern(csr); - + return setChipStatusRegisterPattern(csr); } -patternParameters *setNegativePolarity(int mask){ +patternParameters *setNegativePolarity(int mask) { - int csr; - if (mask) - csr=chipStatusRegister|(1<< CSR_invpol); - else - csr=chipStatusRegister & ~(1<< CSR_invpol); + int csr; + if (mask) + csr = chipStatusRegister | (1 << CSR_invpol); + else + csr = chipStatusRegister & ~(1 << CSR_invpol); - return setChipStatusRegisterPattern(csr); - + return setChipStatusRegisterPattern(csr); } patternParameters *setChannelRegisterChip(int ichip, int *mask, int *trimbits) { - patternParameters *pat = malloc(sizeof(patternParameters)); - memset(pat, 0, sizeof(patternParameters)); - + patternParameters *pat = malloc(sizeof(patternParameters)); + memset(pat, 0, sizeof(patternParameters)); // validate - for (int ichan = ichip * NCHAN_1_COUNTER * NCOUNTERS; ichan < ichip * NCHAN_1_COUNTER * NCOUNTERS+NCHAN_1_COUNTER*NCOUNTERS; ichan++) { - if (trimbits[ichan]<0) { - LOG(logERROR, ("Trimbit value (%d) for channel %d is invalid - setting it to 0\n", - trimbits[ichan], ichan)); - trimbits[ichan]=0; + for (int ichan = ichip * NCHAN_1_COUNTER * NCOUNTERS; + ichan < + ichip * NCHAN_1_COUNTER * NCOUNTERS + NCHAN_1_COUNTER * NCOUNTERS; + ichan++) { + if (trimbits[ichan] < 0) { + LOG(logERROR, ("Trimbit value (%d) for channel %d is invalid - " + "setting it to 0\n", + trimbits[ichan], ichan)); + trimbits[ichan] = 0; + } + if (trimbits[ichan] > 63) { + LOG(logERROR, ("Trimbit value (%d) for channel %d is invalid - " + "settings it to 63\n", + trimbits[ichan], ichan)); + trimbits[ichan] = 63; + } } - if (trimbits[ichan] > 63) { - LOG(logERROR, ("Trimbit value (%d) for channel %d is invalid - settings it to 63\n", - trimbits[ichan], ichan)); - trimbits[ichan]=63; - } - } - LOG(logINFO, ("Trimbits validated\n")); - trimmingPrint = logDEBUG5; + LOG(logINFO, ("Trimbits validated\n")); - - // trimming - int error = 0; - uint64_t patword = 0; - int iaddr = 0; - - LOG(logDEBUG1, (" Chip %d\n", ichip)); - iaddr = 0; - patword = 0; - pat->word[iaddr++]=patword; - - // chip select - patword = setBit(SIGNAL_TBLoad_1 + ichip, patword); - pat->word[iaddr++]=patword; - - // reset trimbits - patword = setBit(SIGNAL_resStorage, patword); - patword = setBit(SIGNAL_resCounter, patword); - pat->word[iaddr++]=patword; - pat->word[iaddr++]=patword; - patword = clearBit(SIGNAL_resStorage, patword); - patword = clearBit(SIGNAL_resCounter, patword); - pat->word[iaddr++]=patword; - pat->word[iaddr++]=patword; - - // select first channel - patword = setBit(SIGNAL_CHSserialIN, patword); - pat->word[iaddr++]=patword; - // 1 clk pulse - patword = setBit(SIGNAL_CHSclk, patword); - pat->word[iaddr++]=patword; - patword = clearBit(SIGNAL_CHSclk, patword); - // clear 1st channel - pat->word[iaddr++]=patword; - patword = clearBit(SIGNAL_CHSserialIN, patword); - // 2 clk pulses - for (int i = 0; i < 2; i++) { + // trimming + int error = 0; + uint64_t patword = 0; + int iaddr = 0; + + LOG(logDEBUG1, (" Chip %d\n", ichip)); + iaddr = 0; + patword = 0; + pat->word[iaddr++] = patword; + + // chip select + patword = setBit(SIGNAL_TBLoad_1 + ichip, patword); + pat->word[iaddr++] = patword; + + // reset trimbits + patword = setBit(SIGNAL_resStorage, patword); + patword = setBit(SIGNAL_resCounter, patword); + pat->word[iaddr++] = patword; + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_resStorage, patword); + patword = clearBit(SIGNAL_resCounter, patword); + pat->word[iaddr++] = patword; + pat->word[iaddr++] = patword; + + // select first channel + patword = setBit(SIGNAL_CHSserialIN, patword); + pat->word[iaddr++] = patword; + // 1 clk pulse patword = setBit(SIGNAL_CHSclk, patword); - pat->word[iaddr++]=patword; + pat->word[iaddr++] = patword; patword = clearBit(SIGNAL_CHSclk, patword); - pat->word[iaddr++]=patword; - } - - // for each channel (all chips) - for (int ich = 0; ich < NCHAN_1_COUNTER; ich++) { - LOG(logDEBUG1, (" Chip %d, Channel %d\n", ichip, ich)); - int val = trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + - NCOUNTERS * ich] + - trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + - NCOUNTERS * ich + 1] * - 64 + - trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + - NCOUNTERS * ich + 2] * - 64 * 64; - - // push 6 0 bits - for (int i = 0; i < 3; i++) { - patword = clearBit(SIGNAL_serialIN, patword); - patword = clearBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; - patword = setBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; + // clear 1st channel + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_CHSserialIN, patword); + // 2 clk pulses + for (int i = 0; i < 2; i++) { + patword = setBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; } - - for (int i = 0; i < 3; i++) { - if (mask[i]) - patword = setBit(SIGNAL_serialIN, patword); - else - patword = clearBit(SIGNAL_serialIN, patword); - patword = clearBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; - patword = setBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; + + // for each channel (all chips) + for (int ich = 0; ich < NCHAN_1_COUNTER; ich++) { + LOG(logDEBUG1, (" Chip %d, Channel %d\n", ichip, ich)); + int val = + trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + NCOUNTERS * ich] + + trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + NCOUNTERS * ich + + 1] * + 64 + + trimbits[ichip * NCHAN_1_COUNTER * NCOUNTERS + NCOUNTERS * ich + + 2] * + 64 * 64; + + // push 6 0 bits + for (int i = 0; i < 3; i++) { + patword = clearBit(SIGNAL_serialIN, patword); + patword = clearBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + patword = setBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + } + + for (int i = 0; i < 3; i++) { + if (mask[i]) + patword = setBit(SIGNAL_serialIN, patword); + else + patword = clearBit(SIGNAL_serialIN, patword); + patword = clearBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + patword = setBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + } + + // deserialize + for (int i = 0; i < 18; i++) { + if (val & (1 << i)) { + patword = setBit(SIGNAL_serialIN, patword); + } else { + patword = clearBit(SIGNAL_serialIN, patword); + } + patword = clearBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + + patword = setBit(SIGNAL_clk, patword); + pat->word[iaddr++] = patword; + } + pat->word[iaddr++] = patword; + pat->word[iaddr++] = patword; + + // move to next channel + for (int i = 0; i < 3; i++) { + patword = setBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; + patword = clearBit(SIGNAL_CHSclk, patword); + pat->word[iaddr++] = patword; + } } - - // deserialize - for (int i = 0; i < 18; i++) { - if (val & (1 << i)) { - patword = setBit(SIGNAL_serialIN, patword); - } else { - patword = clearBit(SIGNAL_serialIN, patword); - } - patword = clearBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; - - patword = setBit(SIGNAL_clk, patword); - pat->word[iaddr++]=patword; + // chip unselect + patword = clearBit(SIGNAL_TBLoad_1 + ichip, patword); + pat->word[iaddr++] = patword; + + // last iaddr check + if (iaddr >= MAX_PATTERN_LENGTH) { + LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", iaddr, + MAX_PATTERN_LENGTH)); + error = 1; } - pat->word[iaddr++]=patword; - pat->word[iaddr++]=patword; - - // move to next channel - for (int i = 0; i < 3; i++) { - patword = setBit(SIGNAL_CHSclk, patword); - pat->word[iaddr++]=patword; - patword = clearBit(SIGNAL_CHSclk, patword); - pat->word[iaddr++]=patword; + + if (iaddr >= MAX_PATTERN_LENGTH) { + LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", iaddr, + MAX_PATTERN_LENGTH)); + error = 1; } - } - // chip unselect - patword = clearBit(SIGNAL_TBLoad_1 + ichip, patword); - pat->word[iaddr++]=patword; - - // last iaddr check - if (iaddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", - iaddr, MAX_PATTERN_LENGTH)); - error = 1; - } - - if (iaddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Addr 0x%x is past max_address_length 0x%x!\n", - iaddr, MAX_PATTERN_LENGTH)); - error = 1; - } - // set pattern wait address - for (int i = 0; i <= 2; i++) - pat->wait[i]=MAX_PATTERN_LENGTH - 1; - // pattern loop - for (int i = 0; i <= 2; i++) { - //int stop = MAX_PATTERN_LENGTH - 1, nloop = 0; - pat->loop[i * 2 + 0]=MAX_PATTERN_LENGTH - 1; - pat->loop[i * 2 + 1]=MAX_PATTERN_LENGTH - 1; - pat->nloop[i]=0; - } - - // pattern limits - { - pat->limits[0]=0; - pat->limits[1]=iaddr; - } - - trimmingPrint = logINFO; - if (error == 0) { - - LOG(logINFO, ("All trimbits have been loaded\n")); - } else { - free(pat); - return NULL; - } - return pat; + // set pattern wait address + for (int i = 0; i <= 2; i++) + pat->wait[i] = MAX_PATTERN_LENGTH - 1; + // pattern loop + for (int i = 0; i <= 2; i++) { + // int stop = MAX_PATTERN_LENGTH - 1, nloop = 0; + pat->loop[i * 2 + 0] = MAX_PATTERN_LENGTH - 1; + pat->loop[i * 2 + 1] = MAX_PATTERN_LENGTH - 1; + pat->nloop[i] = 0; + } + + // pattern limits + { + pat->limits[0] = 0; + pat->limits[1] = iaddr; + } + + if (error == 0) { + + LOG(logINFO, ("All trimbits have been loaded\n")); + } else { + free(pat); + return NULL; + } + return pat; } diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index aa7c0b88f..1f89d672b 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -1118,48 +1118,50 @@ int setModule(sls_detector_module myMod, char *mess) { int setTrimbits(int *trimbits) { LOG(logINFOBLUE, ("Setting trimbits\n")); + // remember previous run clock uint32_t prevRunClk = clkDivider[SYSTEM_C0]; - patternParameters *pat = NULL; - int error = 0; + // set to trimming clock if (setClockDivider(SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV) == FAIL) { LOG(logERROR, ("Could not start trimming. Could not set to trimming clock\n")); return FAIL; } - ///////////////////////////////////////////////////////////////// - for (int ichip = 0; ichip < NCHIP; ichip++) { - pat = setChannelRegisterChip(ichip, channelMask, - trimbits); // change here!!! - if (pat) { - error |= loadPattern(logDEBUG5, pat); - if (error == 0) + // for every chip + int error = 0; + char cmess[MAX_STR_LENGTH]; + for (int ichip = 0; ichip < NCHIP; ichip++) { + patternParameters *pat = setChannelRegisterChip( + ichip, channelMask, + trimbits); // change here!!! @who: Change what? + if (pat == NULL) { + error = 1; + } else { + memset(cmess, 0, MAX_STR_LENGTH); + error |= loadPattern(cmess, logDEBUG5, pat); + if (!error) startPattern(); free(pat); - } else - error = 1; + } } - ///////////////////////////////////////////////////////////////// + + // copy trimbits locally if (error == 0) { - // copy trimbits locally for (int ichan = 0; ichan < ((detectorModules)->nchan); ++ichan) { detectorChans[ichan] = trimbits[ichan]; } LOG(logINFO, ("All trimbits have been loaded\n")); } - trimmingPrint = logINFO; + // set back to previous clock if (setClockDivider(SYSTEM_C0, prevRunClk) == FAIL) { LOG(logERROR, ("Could not set to previous run clock after trimming\n")); return FAIL; } - if (error != 0) { - return FAIL; - } - return OK; + return (error ? FAIL : OK); } int setAllTrimbits(int val) { @@ -1746,273 +1748,6 @@ int enableTenGigabitEthernet(int val) { return oneG ? 0 : 1; } -/* pattern */ - -void startPattern() { - LOG(logINFOBLUE, ("Starting Pattern\n")); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_PATTERN_MSK); - usleep(1); - while (bus_r(PAT_STATUS_REG) & PAT_STATUS_RUN_BUSY_MSK) { - usleep(1); - } - LOG(logINFOBLUE, ("Pattern done\n")); -} - -uint64_t readPatternWord(int addr) { - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - LOG(logDEBUG1, (" Reading Pattern Word (addr:0x%x)\n", addr)); - uint32_t reg_lsb = - PATTERN_STEP0_LSB_REG + - addr * REG_OFFSET * 2; // the first word in RAM as base plus the - // offset of the word to write (addr) - uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; - - // read value - uint64_t retval = get64BitReg(reg_lsb, reg_msb); - LOG(logDEBUG1, - (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int)retval)); - - return retval; -} - -uint64_t writePatternWord(int addr, uint64_t word) { - - // get - if ((int64_t)word == -1) - return readPatternWord(addr); - - // error (handled in tcp) - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, - (long long int)word)); - - // write word - uint32_t reg_lsb = - PATTERN_STEP0_LSB_REG + - addr * REG_OFFSET * 2; // the first word in RAM as base plus the - // offset of the word to write (addr) - uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; - set64BitReg(word, reg_lsb, reg_msb); - - LOG(logDEBUG1, (" Wrote word. PatternIn Reg: 0x%llx\n", - get64BitReg(reg_lsb, reg_msb))); - return readPatternWord(addr); -} - -int setPatternWaitAddress(int level, int addr) { - // error (handled in tcp) - if (addr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. " - "Should be between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH)); - return -1; - } - - uint32_t reg = 0; - uint32_t offset = 0; - uint32_t mask = 0; - - switch (level) { - case 0: - reg = PATTERN_WAIT_0_ADDR_REG; - offset = PATTERN_WAIT_0_ADDR_OFST; - mask = PATTERN_WAIT_0_ADDR_MSK; - break; - case 1: - reg = PATTERN_WAIT_1_ADDR_REG; - offset = PATTERN_WAIT_1_ADDR_OFST; - mask = PATTERN_WAIT_1_ADDR_MSK; - break; - case 2: - reg = PATTERN_WAIT_2_ADDR_REG; - offset = PATTERN_WAIT_2_ADDR_OFST; - mask = PATTERN_WAIT_2_ADDR_MSK; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if (addr >= 0) { - LOG(trimmingPrint, - ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, - addr)); - bus_w(reg, ((addr << offset) & mask)); - } - - // get - uint32_t regval = ((bus_r(reg) & mask) >> offset); - LOG(logDEBUG1, - (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval)); - return regval; -} - -uint64_t setPatternWaitTime(int level, uint64_t t) { - uint32_t regl = 0; - uint32_t regm = 0; - - switch (level) { - case 0: - regl = PATTERN_WAIT_TIMER_0_LSB_REG; - regm = PATTERN_WAIT_TIMER_0_MSB_REG; - break; - case 1: - regl = PATTERN_WAIT_TIMER_1_LSB_REG; - regm = PATTERN_WAIT_TIMER_1_MSB_REG; - break; - case 2: - regl = PATTERN_WAIT_TIMER_2_LSB_REG; - regm = PATTERN_WAIT_TIMER_2_MSB_REG; - break; - default: - LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. " - "Should be between 0 and 2.\n", - level)); - return -1; - } - - // set - if ((int64_t)t >= 0) { - LOG(trimmingPrint, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", - level, (long long int)t)); - set64BitReg(t, regl, regm); - } - - // get - uint64_t regval = get64BitReg(regl, regm); - LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, - (long long int)regval)); - return regval; -} - -void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { - - // (checked at tcp) - if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) { - LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, " - "stopaddr:0x%x) must be " - "less than 0x%x\n", - *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); - *startAddr = -1; - *stopAddr = -1; - *nLoop = -1; - return; - } - - uint32_t addr = 0; - uint32_t nLoopReg = 0; - uint32_t startOffset = 0; - uint32_t startMask = 0; - uint32_t stopOffset = 0; - uint32_t stopMask = 0; - - switch (level) { - case 0: - addr = PATTERN_LOOP_0_ADDR_REG; - nLoopReg = PATTERN_LOOP_0_ITERATION_REG; - startOffset = PATTERN_LOOP_0_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_0_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_0_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_0_ADDR_STP_MSK; - break; - case 1: - addr = PATTERN_LOOP_1_ADDR_REG; - nLoopReg = PATTERN_LOOP_1_ITERATION_REG; - startOffset = PATTERN_LOOP_1_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_1_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_1_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_1_ADDR_STP_MSK; - break; - case 2: - addr = PATTERN_LOOP_2_ADDR_REG; - nLoopReg = PATTERN_LOOP_2_ITERATION_REG; - startOffset = PATTERN_LOOP_2_ADDR_STRT_OFST; - startMask = PATTERN_LOOP_2_ADDR_STRT_MSK; - stopOffset = PATTERN_LOOP_2_ADDR_STP_OFST; - stopMask = PATTERN_LOOP_2_ADDR_STP_MSK; - break; - case -1: - // complete pattern - addr = PATTERN_LIMIT_REG; - nLoopReg = -1; - startOffset = PATTERN_LIMIT_STRT_OFST; - startMask = PATTERN_LIMIT_STRT_MSK; - stopOffset = PATTERN_LIMIT_STP_OFST; - stopMask = PATTERN_LIMIT_STP_MSK; - break; - default: - // already checked at tcp interface - LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. " - "Should be between -1 and 2.\n", - level)); - *startAddr = 0; - *stopAddr = 0; - *nLoop = 0; - } - - // set iterations - if (level >= 0) { - // set iteration - if (*nLoop >= 0) { - LOG(trimmingPrint, - ("Setting Pattern Loop (level:%d, nLoop:%d)\n", level, *nLoop)); - bus_w(nLoopReg, *nLoop); - } - *nLoop = bus_r(nLoopReg); - } - - // set - if (*startAddr >= 0 && *stopAddr >= 0) { - // writing start and stop addr - LOG(trimmingPrint, ("Setting Pattern Loop (level:%d, startaddr:0x%x, " - "stopaddr:0x%x)\n", - level, *startAddr, *stopAddr)); - bus_w(addr, ((*startAddr << startOffset) & startMask) | - ((*stopAddr << stopOffset) & stopMask)); - } - - *startAddr = ((bus_r(addr) & startMask) >> startOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read " - "startAddr:0x%x)\n", - level, *startAddr)); - - *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); - LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read " - "stopAddr:0x%x)\n", - level, *stopAddr)); -} - -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() { #ifdef VIRTUAL return OK; @@ -2652,36 +2387,40 @@ int getNumberOfDACs() { return NDAC; } int getNumberOfChannelsPerChip() { return NCHAN; } int setChipStatusRegister(int csr) { - uint32_t prevRunClk = clkDivider[SYSTEM_C0]; - patternParameters *pat = NULL; - int error = 0; + // remember previous run clock + uint32_t prevRunClk = clkDivider[SYSTEM_C0]; + + // set to trimming clock if (setClockDivider(SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV) == FAIL) { LOG(logERROR, ("Could not set to trimming clock in order to change CSR\n")); return FAIL; } - pat = setChipStatusRegisterPattern(csr); - if (pat) { - error |= loadPattern(logDEBUG5, pat); - if (!error) - startPattern(); - free(pat); + int iret = OK; + char cmess[MAX_STR_LENGTH]; + patternParameters *pat = setChipStatusRegisterPattern(csr); + if (pat == NULL) { + iret = FAIL; } else { - error = 1; - } - - if (!error) { - LOG(logINFO, ("CSR is now: 0x%x\n", csr)); + memset(cmess, 0, MAX_STR_LENGTH); + iret = loadPattern(cmess, logDEBUG5, pat); + if (iret == OK) { + startPattern(); + LOG(logINFO, ("CSR is now: 0x%x\n", csr)); + } + free(pat); } + // set back to previous clock if (setClockDivider(SYSTEM_C0, prevRunClk) == FAIL) { LOG(logERROR, ("Could not set to previous run clock after changing CSR\n")); return FAIL; } - return OK; + + return iret; } int setGainCaps(int caps) { diff --git a/slsDetectorServers/slsDetectorServer/include/common.h b/slsDetectorServers/slsDetectorServer/include/common.h index 1f2ebbe42..cc7daf7e5 100644 --- a/slsDetectorServers/slsDetectorServer/include/common.h +++ b/slsDetectorServers/slsDetectorServer/include/common.h @@ -1,8 +1,11 @@ #pragma once +#include // int64_t #include #include +enum numberMode { DEC, HEX }; + /** * Convert a value from a range to a different range (eg voltage to dac or vice * versa) @@ -19,4 +22,9 @@ int ConvertToDifferentRange(int inputMin, int inputMax, int outputMin, int getAbsPath(char *buf, size_t bufSize, char *fname); -int GetTimeFromString(char *buf, time_t *result); \ No newline at end of file +int GetTimeFromString(char *buf, time_t *result); + +void validate(int *ret, char *mess, int arg, int retval, char *modename, + enum numberMode nummode); +void validate64(int *ret, char *mess, int64_t arg, int64_t retval, + char *modename, enum numberMode nummode); diff --git a/slsDetectorServers/slsDetectorServer/include/loadPattern.h b/slsDetectorServers/slsDetectorServer/include/loadPattern.h index aa81d9a49..d2e2e43ff 100644 --- a/slsDetectorServers/slsDetectorServer/include/loadPattern.h +++ b/slsDetectorServers/slsDetectorServer/include/loadPattern.h @@ -3,5 +3,57 @@ #include "Pattern.h" #include "clogger.h" -int loadPattern(enum TLogLevel printLevel, patternParameters *pat); +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef VIRTUAL +void initializePatternWord(); +#endif +uint64_t validate_readPatternIOControl(); +int validate_writePatternIOControl(char *message, uint64_t arg); +void writePatternIOControl(uint64_t word); +#endif + +int validate_readPatternWord(char *message, int addr, uint64_t *word); +uint64_t readPatternWord(int addr); +int validate_writePatternWord(char *message, int addr, uint64_t word); +void writePatternWord(int addr, uint64_t word); + +int validate_getPatternWaitAddresses(char *message, int level, int *addr); +int getPatternWaitAddress(int level); +int validate_setPatternWaitAddresses(char *message, int level, int addr); +void setPatternWaitAddress(int level, int addr); + +int validate_getPatternWaitTime(char *message, int level, uint64_t *waittime); +uint64_t getPatternWaitTime(int level); +int validate_setPatternWaitTime(char *message, int level, uint64_t waittime); +void setPatternWaitTime(int level, uint64_t t); + +int validate_getPatternLoopCycles(char *message, int level, int *numLoops); +int getPatternLoopCycles(int level); +int validate_setPatternLoopCycles(char *message, int level, int numLoops); +void setPatternLoopCycles(int level, int nLoop); + +void validate_getPatternLoopLimits(int *startAddr, int *stopAddr); +int validate_setPatternLoopLimits(char *message, int startAddr, int stopAddr); +void setPatternLoopLimits(int startAddr, int stopAddr); + +int validate_getPatternLoopAddresses(char *message, int level, int *startAddr, + int *stopAddr); +void getPatternLoopAddresses(int level, int *startAddr, int *stopAddr); +int validate_setPatternLoopAddresses(char *message, int level, int startAddr, + int stopAddr); +void setPatternLoopAddresses(int level, int startAddr, int stopAddr); + +void setPatternMask(uint64_t mask); +uint64_t getPatternMask(); +void setPatternBitMask(uint64_t mask); +uint64_t getPatternBitMask(); + +#ifdef MYTHEN3D +void startPattern(); +#endif + +int loadPattern(char *mess, enum TLogLevel printLevel, patternParameters *pat); +int getPattern(char *mess, patternParameters *pat); +int loadPatternFile(char *patFname, char *errMessage); + #endif diff --git a/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h b/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h deleted file mode 100644 index a4b1d9c03..000000000 --- a/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include - -int loadDefaultPattern(char *patFname, char *errMessage); - -int default_writePatternWord(char *line, uint32_t addr, uint64_t word); - -#ifndef MYTHEN3D -int default_writePatternIOControl(char *line, uint64_t arg); -#endif - -int default_setPatternLoopLimits(char *line, uint32_t startAddr, - uint32_t stopAddr); - -int default_setPatternLoopAddresses(char *line, int level, uint32_t startAddr, - uint32_t stopAddr); - -int default_setPatternLoopCycles(char *line, int level, int numLoops); - -int default_setPatternWaitAddresses(char *line, int level, uint32_t addr); - -int default_setPatternWaitTime(char *line, int level, uint64_t waittime); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index e7ea0db93..b8f3ab225 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -8,9 +8,6 @@ defined(MOENCHD) #include "AD9257.h" // commonServerFunctions.h, blackfin.h, ansi.h #endif -#if defined(MOENCHD) || defined(MYTHEN3D) -#include "readDefaultPattern.h" -#endif #if defined(MYTHEN3D) || defined(GOTTHARD2D) #include "programFpgaNios.h" @@ -428,22 +425,12 @@ int getFrequency(enum CLKINDEX ind); void configureSyncFrequency(enum CLKINDEX ind); void setPipeline(enum CLKINDEX ind, int val); int getPipeline(enum CLKINDEX ind); -// patterns -uint64_t writePatternIOControl(uint64_t word); -uint64_t readPatternWord(int addr); -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); +#endif + #ifdef CHIPTESTBOARDD int setLEDEnable(int enable); void setDigitalIODelay(uint64_t pinMask, int delay); #endif -void setPatternMask(uint64_t mask); -uint64_t getPatternMask(); -void setPatternBitMask(uint64_t mask); -uint64_t getPatternBitMask(); -#endif // jungfrau specific - powerchip, autocompdisable, clockdiv, asictimer, clock, // pll, flashing firmware @@ -491,16 +478,6 @@ int getActivate(int *retval); int setPhase(enum CLKINDEX ind, int val, int degrees); #elif MYTHEN3D -void startPattern(); -uint64_t readPatternWord(int addr); -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/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 6aa5b992d..ffa18b91f 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -1,8 +1,8 @@ #pragma once #include "clogger.h" +#include "common.h" #include "sls/sls_detector_defs.h" -enum numberMode { DEC, HEX }; #define GOODBYE (-200) #define REBOOT (-400) @@ -14,9 +14,6 @@ const char *getRetName(); void function_table(); void functionNotImplemented(); void modeNotImplemented(char *modename, int mode); -void validate(int arg, int retval, char *modename, enum numberMode nummode); -void validate64(int64_t arg, int64_t retval, char *modename, - enum numberMode nummode); int executeCommand(char *command, char *result, enum TLogLevel level); int M_nofunc(int); #if defined(MYTHEN3D) || defined(GOTTHARD2D) diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 8ab9dffe1..bb5dfbfbc 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -7,6 +7,9 @@ #include #include // readlink +extern int ret; +extern char mess[MAX_STR_LENGTH]; + int ConvertToDifferentRange(int inputMin, int inputMax, int outputMin, int outputMax, int inputValue, int *outputValue) { LOG(logDEBUG1, (" Input Value: %d (Input:(%d - %d), Output:(%d - %d))\n", @@ -69,4 +72,34 @@ int GetTimeFromString(char *buf, time_t *result) { } *result = mktime(&t); return OK; +} + +void validate(int *ret, char *mess, int arg, int retval, char *modename, + enum numberMode nummode) { + if (*ret == OK && arg != GET_FLAG && retval != arg) { + *ret = FAIL; + if (nummode == HEX) + sprintf(mess, "Could not %s. Set 0x%x, but read 0x%x\n", modename, + arg, retval); + else + sprintf(mess, "Could not %s. Set %d, but read %d\n", modename, arg, + retval); + LOG(logERROR, (mess)); + } +} + +void validate64(int *ret, char *mess, int64_t arg, int64_t retval, + char *modename, enum numberMode nummode) { + if (*ret == OK && arg != GET_FLAG && retval != arg) { + *ret = FAIL; + if (nummode == HEX) + sprintf(mess, "Could not %s. Set 0x%llx, but read 0x%llx\n", + modename, (long long unsigned int)arg, + (long long unsigned int)retval); + else + sprintf(mess, "Could not %s. Set %lld, but read %lld\n", modename, + (long long unsigned int)arg, + (long long unsigned int)retval); + LOG(logERROR, (mess)); + } } \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index f26a92570..0a360a10d 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -1,107 +1,975 @@ #include "loadPattern.h" -#include "clogger.h" +#include "RegisterDefs.h" #include "common.h" -#include "readDefaultPattern.h" #include "sls/ansi.h" -#include "sls/sls_detector_defs.h" #include "slsDetectorServer_defs.h" -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) -#include "Pattern.h" -#endif - #include #include -extern char initErrorMessage[MAX_STR_LENGTH]; +#ifdef MYTHEN3D extern enum TLogLevel trimmingPrint; +#endif + +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef VIRTUAL +uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; +#endif +#endif + +extern void bus_w(u_int32_t offset, u_int32_t data); +extern u_int32_t bus_r(u_int32_t offset); +extern int64_t get64BitReg(int aLSB, int aMSB); +extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); + +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef VIRTUAL +void initializePatternWord() { + memset(virtual_pattern, 0, sizeof(virtual_pattern)); +} +#endif + +uint64_t validate_readPatternIOControl() { + return get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); +} + +int validate_writePatternIOControl(char *message, uint64_t arg) { + writePatternIOControl(arg); + + // validate result + uint64_t retval = validate_readPatternIOControl(); + LOG(logDEBUG1, + ("Pattern IO Control retval: 0x%llx\n", (long long int)retval)); + int ret = OK; + validate64(&ret, message, arg, retval, "set pattern IO Control", HEX); + return ret; +} + +void writePatternIOControl(uint64_t word) { + LOG(logINFO, + ("Setting Pattern I/O Control: 0x%llx\n", (long long int)word)); + set64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); +} +#endif + +int validate_readPatternWord(char *message, int addr, uint64_t *word) { + // validate input + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + sprintf(message, + "Cannot read pattern word. Addr must be between 0 and 0x%x.\n", + MAX_PATTERN_LENGTH); + LOG(logERROR, (message)); + return FAIL; + } + + *word = readPatternWord(addr); + return OK; +} + +uint64_t readPatternWord(int addr) { +#ifdef MYTHEN3D + LOG(logDEBUG1, (" Reading Pattern Word (addr:0x%x)\n", addr)); + // the first word in RAM as base plus the offset of the word to write (addr) + uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; + uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; + return get64BitReg(reg_lsb, reg_msb); +#else + LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); + uint32_t reg = PATTERN_CNTRL_REG; + + // overwrite with only addr + bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); + + // set read strobe + bus_w(reg, bus_r(reg) | PATTERN_CNTRL_RD_MSK); + + // unset read strobe + bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_RD_MSK)); + usleep(WAIT_TIME_PATTERN_READ); + + // read value +#ifndef VIRTUAL + return get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); +#else + return virtual_pattern[addr]; +#endif +#endif +} + +int validate_writePatternWord(char *message, int addr, uint64_t word) { + // validate input + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + sprintf(message, + "Cannot set pattern word. Addr must be between 0 and 0x%x.\n", + MAX_PATTERN_LENGTH); + LOG(logERROR, (message)); + return FAIL; + } + + writePatternWord(addr, word); + + // validate result + int ret = OK; + // cannot validate for moench, ctb ( same as executing pattern word) +#ifdef MYTHEN3D + uint64_t retval = readPatternWord(addr); + LOG(logDEBUG1, ("Pattern word (addr:0x%x) retval: 0x%llx\n", addr, + (long long int)retval)); + char mode[128]; + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern word for addr 0x%x", addr); + validate64(&ret, message, word, retval, "set pattern word", HEX); +#endif + return ret; +} + +void writePatternWord(int addr, uint64_t word) { + LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, + (long long int)word)); #ifndef MYTHEN3D -extern uint64_t writePatternIOControl(uint64_t word); + uint32_t reg = PATTERN_CNTRL_REG; + + // write word + set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG); + + // overwrite with only addr + bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); + + // set write strobe + bus_w(reg, bus_r(reg) | PATTERN_CNTRL_WR_MSK); + + // unset write strobe + bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_WR_MSK)); +#ifdef VIRTUAL + virtual_pattern[addr] = word; #endif -extern uint64_t writePatternWord(int addr, uint64_t word); -extern int setPatternWaitAddress(int level, int addr); -extern uint64_t setPatternWaitTime(int level, uint64_t t); -extern void setPatternLoop(int level, int *startAddr, int *stopAddr, - int *nLoop); +// mythen +#else + // the first word in RAM as base plus the offset of the word to write (addr) + uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; + uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; + set64BitReg(word, reg_lsb, reg_msb); +#endif +} -int loadPattern(enum TLogLevel printLevel, patternParameters *pat) { - LOG(logINFOBLUE, ("Loading Pattern\n")); +int validate_getPatternWaitAddresses(char *message, int level, int *addr) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot get patwait address. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + *addr = getPatternWaitAddress(level); + return OK; +} + +int getPatternWaitAddress(int level) { + switch (level) { + case 0: + return ((bus_r(PATTERN_WAIT_0_ADDR_REG) & PATTERN_WAIT_0_ADDR_MSK) >> + PATTERN_WAIT_0_ADDR_OFST); + case 1: + return ((bus_r(PATTERN_WAIT_1_ADDR_REG) & PATTERN_WAIT_1_ADDR_MSK) >> + PATTERN_WAIT_1_ADDR_OFST); + case 2: + return ((bus_r(PATTERN_WAIT_2_ADDR_REG) & PATTERN_WAIT_2_ADDR_MSK) >> + PATTERN_WAIT_2_ADDR_OFST); + default: + return -1; + } +} + +int validate_setPatternWaitAddresses(char *message, int level, int addr) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot set patwait address. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + sprintf(message, + "Cannot set patwait address (level: %d). Addr must be between " + "0 and 0x%x.\n", + level, MAX_PATTERN_LENGTH); + LOG(logERROR, (message)); + return FAIL; + } + + setPatternWaitAddress(level, addr); + + // validate result + int retval = getPatternWaitAddress(level); + LOG(logDEBUG1, + ("Pattern wait address (level:%d) retval: 0x%x\n", level, retval)); int ret = OK; - trimmingPrint = printLevel; + char mode[128]; + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d wait address", level); + validate(&ret, message, addr, retval, mode, HEX); + return ret; +} +void setPatternWaitAddress(int level, int addr) { +#ifdef MYTHEN3D + LOG(trimmingPrint, +#else + LOG(logINFO, +#endif + ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr)); + switch (level) { + case 0: + bus_w(PATTERN_WAIT_0_ADDR_REG, + ((addr << PATTERN_WAIT_0_ADDR_OFST) & PATTERN_WAIT_0_ADDR_MSK)); + break; + case 1: + bus_w(PATTERN_WAIT_1_ADDR_REG, + ((addr << PATTERN_WAIT_1_ADDR_OFST) & PATTERN_WAIT_1_ADDR_MSK)); + break; + case 2: + bus_w(PATTERN_WAIT_2_ADDR_REG, + ((addr << PATTERN_WAIT_2_ADDR_OFST) & PATTERN_WAIT_2_ADDR_MSK)); + break; + default: + return; + } +} + +int validate_getPatternWaitTime(char *message, int level, uint64_t *waittime) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot get patwaittime. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + *waittime = getPatternWaitTime(level); + return OK; +} + +uint64_t getPatternWaitTime(int level) { + switch (level) { + case 0: + return get64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG, + PATTERN_WAIT_TIMER_0_MSB_REG); + case 1: + return get64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG, + PATTERN_WAIT_TIMER_1_MSB_REG); + case 2: + return get64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG, + PATTERN_WAIT_TIMER_2_MSB_REG); + default: + return -1; + } +} + +int validate_setPatternWaitTime(char *message, int level, uint64_t waittime) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot set patwaittime. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + + setPatternWaitTime(level, waittime); + + // validate result + uint64_t retval = getPatternWaitTime(level); + LOG(logDEBUG1, ("Pattern wait time (level:%d) retval: %d\n", level, + (long long int)retval)); + int ret = OK; + char mode[128]; + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d wait time", level); + validate64(&ret, message, waittime, retval, mode, DEC); + return ret; +} + +void setPatternWaitTime(int level, uint64_t t) { +#ifdef MYTHEN3D + LOG(trimmingPrint, +#else + LOG(logINFO, +#endif + ("Setting Pattern Wait Time (level:%d) :%lld\n", level, + (long long int)t)); + switch (level) { + case 0: + set64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG, + PATTERN_WAIT_TIMER_0_MSB_REG); + break; + case 1: + set64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG, + PATTERN_WAIT_TIMER_1_MSB_REG); + break; + case 2: + set64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG, + PATTERN_WAIT_TIMER_2_MSB_REG); + break; + default: + return; + } +} + +int validate_getPatternLoopCycles(char *message, int level, int *numLoops) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot get patnloop. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + *numLoops = getPatternLoopCycles(level); + return OK; +} + +int getPatternLoopCycles(int level) { + switch (level) { + case 0: + return bus_r(PATTERN_LOOP_0_ITERATION_REG); + case 1: + return bus_r(PATTERN_LOOP_1_ITERATION_REG); + case 2: + return bus_r(PATTERN_LOOP_2_ITERATION_REG); + default: + return -1; + } +} + +int validate_setPatternLoopCycles(char *message, int level, int numLoops) { + // validate input + if (level < 0 || level > 2) { + sprintf(message, + "Cannot set patnloop. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + if (numLoops < 0) { + sprintf(message, + "Cannot set patnloop. Iterations must be between > 0.\n"); + LOG(logERROR, (message)); + return FAIL; + } + + setPatternLoopCycles(level, numLoops); + + // validate result + int retval = getPatternLoopCycles(level); + int ret = OK; + char mode[128]; + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d num loops", level); + validate(&ret, message, numLoops, retval, mode, DEC); + return ret; +} + +void setPatternLoopCycles(int level, int nLoop) { +#ifdef MYTHEN3D + LOG(trimmingPrint, +#else + LOG(logINFO, +#endif + ("Setting Pattern Loop Cycles(level:%d, nLoop:%d)\n", level, nLoop)); + switch (level) { + case 0: + bus_w(PATTERN_LOOP_0_ITERATION_REG, nLoop); + break; + case 1: + bus_w(PATTERN_LOOP_1_ITERATION_REG, nLoop); + break; + case 2: + bus_w(PATTERN_LOOP_2_ITERATION_REG, nLoop); + break; + default: + return; + } +} + +void validate_getPatternLoopLimits(int *startAddr, int *stopAddr) { + *startAddr = ((bus_r(PATTERN_LIMIT_REG) & PATTERN_LIMIT_STRT_MSK) >> + PATTERN_LIMIT_STRT_OFST); + *stopAddr = ((bus_r(PATTERN_LIMIT_REG) & PATTERN_LIMIT_STP_MSK) >> + PATTERN_LIMIT_STP_OFST); +} + +int validate_setPatternLoopLimits(char *message, int startAddr, int stopAddr) { + // validate input + if (startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || stopAddr < 0 || + stopAddr >= MAX_PATTERN_LENGTH) { + sprintf(message, + "Cannot set patlimits from default " + "pattern file. Addr must be between 0 and 0x%x.\n", + MAX_PATTERN_LENGTH); + LOG(logERROR, (message)); + return FAIL; + } + + setPatternLoopLimits(startAddr, stopAddr); + + // validate result + int r_startAddr = -1, r_stopAddr = -1; + validate_getPatternLoopLimits(&r_startAddr, &r_stopAddr); + int ret = OK; + // start addr + validate(&ret, message, startAddr, r_startAddr, + "set pattern Limits start addr", HEX); + if (ret == FAIL) { + return FAIL; + } + // stop addr + validate(&ret, message, stopAddr, r_stopAddr, + "set pattern Limits stop addr", HEX); + return ret; +} + +void setPatternLoopLimits(int startAddr, int stopAddr) { +#ifdef MYTHEN3D + LOG(trimmingPrint, +#else + LOG(logINFO, +#endif + ("Setting Pattern Loop Limits(startaddr:0x%x, stopaddr:0x%x)\n", + startAddr, stopAddr)); + bus_w(PATTERN_LIMIT_REG, + ((startAddr << PATTERN_LIMIT_STRT_OFST) & PATTERN_LIMIT_STRT_MSK) | + ((stopAddr << PATTERN_LIMIT_STP_OFST) & PATTERN_LIMIT_STP_MSK)); +} + +int validate_getPatternLoopAddresses(char *message, int level, int *startAddr, + int *stopAddr) { + // validate input + if (level < 0 || level > 2) { + sprintf( + message, + "Cannot get patloop addresses. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + + getPatternLoopAddresses(level, startAddr, stopAddr); + return OK; +} + +void getPatternLoopAddresses(int level, int *startAddr, int *stopAddr) { + switch (level) { + case 0: + *startAddr = + ((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STRT_MSK) >> + PATTERN_LOOP_0_ADDR_STRT_OFST); + *stopAddr = + ((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STP_MSK) >> + PATTERN_LOOP_0_ADDR_STP_OFST); + break; + case 1: + *startAddr = + ((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STRT_MSK) >> + PATTERN_LOOP_1_ADDR_STRT_OFST); + *stopAddr = + ((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STP_MSK) >> + PATTERN_LOOP_1_ADDR_STP_OFST); + break; + case 2: + *startAddr = + ((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STRT_MSK) >> + PATTERN_LOOP_2_ADDR_STRT_OFST); + *stopAddr = + ((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STP_MSK) >> + PATTERN_LOOP_2_ADDR_STP_OFST); + break; + default: + return; + } +} + +int validate_setPatternLoopAddresses(char *message, int level, int startAddr, + int stopAddr) { + // validate input + if (level < 0 || level > 2) { + sprintf( + message, + "Cannot set patloop addresses. Level must be between 0 and 2.\n"); + LOG(logERROR, (message)); + return FAIL; + } + if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || + (int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) { + sprintf(message, + "Cannot set patloop addresses (level: %d). Addr must be " + "between 0 and " + "0x%x.\n", + level, MAX_PATTERN_LENGTH); + LOG(logERROR, (message)); + return FAIL; + } + + setPatternLoopAddresses(level, startAddr, stopAddr); + + // validate result + int r_startAddr = -1, r_stopAddr = -1; + getPatternLoopAddresses(level, &r_startAddr, &r_stopAddr); + int ret = OK; + char mode[128]; + // start addr + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d start addr", level); + validate(&ret, message, startAddr, r_startAddr, mode, HEX); + if (ret == FAIL) { + return FAIL; + } + // stop addr + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d stop addr", level); + validate(&ret, message, stopAddr, r_stopAddr, mode, HEX); + return ret; +} + +void setPatternLoopAddresses(int level, int startAddr, int stopAddr) { +#ifdef MYTHEN3D + LOG(trimmingPrint, +#else + LOG(logINFO, +#endif + ("Setting Pattern Loop Address (level:%d, startaddr:0x%x, " + "stopaddr:0x%x)\n", + level, startAddr, stopAddr)); + switch (level) { + case 0: + bus_w(PATTERN_LOOP_0_ADDR_REG, + ((startAddr << PATTERN_LOOP_0_ADDR_STRT_OFST) & + PATTERN_LOOP_0_ADDR_STRT_MSK) | + ((stopAddr << PATTERN_LOOP_0_ADDR_STP_OFST) & + PATTERN_LOOP_0_ADDR_STP_MSK)); + break; + case 1: + bus_w(PATTERN_LOOP_1_ADDR_REG, + ((startAddr << PATTERN_LOOP_1_ADDR_STRT_OFST) & + PATTERN_LOOP_1_ADDR_STRT_MSK) | + ((stopAddr << PATTERN_LOOP_1_ADDR_STP_OFST) & + PATTERN_LOOP_1_ADDR_STP_MSK)); + break; + case 2: + bus_w(PATTERN_LOOP_2_ADDR_REG, + ((startAddr << PATTERN_LOOP_2_ADDR_STRT_OFST) & + PATTERN_LOOP_2_ADDR_STRT_MSK) | + ((stopAddr << PATTERN_LOOP_2_ADDR_STP_OFST) & + PATTERN_LOOP_2_ADDR_STP_MSK)); + break; + default: + return; + } +} + +void setPatternMask(uint64_t mask) { + LOG(logINFO, ("Setting pattern mask to 0x%llx\n", 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) { + LOG(logINFO, ("Setting pattern bit mask to 0x%llx\n", mask)); + set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); +} + +uint64_t getPatternBitMask() { + return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); +} + +#ifdef MYTHEN3D +void startPattern() { + LOG(logINFOBLUE, ("Starting Pattern\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_PATTERN_MSK); + usleep(1); + while (bus_r(PAT_STATUS_REG) & PAT_STATUS_RUN_BUSY_MSK) { + usleep(1); + } + LOG(logINFOBLUE, ("Pattern done\n")); +} +#endif + +int loadPattern(char *message, enum TLogLevel printLevel, + patternParameters *pat) { + LOG(logINFOBLUE, ("Loading Pattern from structure\n")); + int ret = OK; +#ifdef MYTHEN3D + trimmingPrint = printLevel; +#endif + // words for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) { if ((i % 10 == 0) && pat->word[i] != 0) { LOG(logDEBUG5, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", i, (long long int)pat->word[i])); } - writePatternWord(i, pat->word[i]); + ret = validate_writePatternWord(message, i, pat->word[i]); + if (ret == FAIL) { + break; + } } + // iocontrol #ifndef MYTHEN3D if (ret == OK) { - uint64_t retval64 = writePatternIOControl(pat->ioctrl); - // validate64(pat->ioctrl, retval64, "set pattern IO Control", HEX); + ret = validate_writePatternIOControl(message, pat->ioctrl); } #endif + // limits if (ret == OK) { - int numLoops = -1; - int retval0 = pat->limits[0]; - int retval1 = pat->limits[1]; - setPatternLoop(-1, &retval0, &retval1, &numLoops); - // validate(pat->limits[0], retval0, - // "set pattern Limits start address", HEX); - // validate(pat->limits[1], retval1, - // "set pattern Limits start address", HEX); + ret = validate_setPatternLoopLimits(message, pat->limits[0], + pat->limits[1]); } - uint64_t retval64; + if (ret == OK) { for (int i = 0; i <= 2; ++i) { - char msg[128]; - int retval0 = -1, retval1 = -1, numLoops = -1; - - // patloop - retval0 = pat->loop[i * 2 + 0]; - retval1 = pat->loop[i * 2 + 1]; - numLoops = pat->nloop[i]; - setPatternLoop(i, &retval0, &retval1, &numLoops); - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d start address", i); - // validate(pat->loop[i * 2 + 0], retval0, msg, HEX); - if (ret == FAIL) { - break; - } - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d stop address", i); - // validate(pat->loop[i * 2 + 1], retval1, msg, HEX); - if (ret == FAIL) { - break; - } - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d num loops", i); - // validate(pat->nloop[i], numLoops, msg, HEX); - if (ret == FAIL) { - break; - } - // patwait - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d wait address", i); - retval0 = setPatternWaitAddress(i, pat->wait[i]); - // validate(pat->wait[i], retval0, msg, HEX); + // loop addr + ret = validate_setPatternLoopAddresses( + message, i, pat->loop[i * 2 + 0], pat->loop[i * 2 + 1]); if (ret == FAIL) { break; } - // patwaittime - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d wait time", i); - retval64 = setPatternWaitTime(i, pat->waittime[i]); - // validate64(pat->waittime[i], retval64, msg, HEX); - if (retval64 == FAIL) { + // num loops + ret = validate_setPatternLoopCycles(message, i, pat->nloop[i]); + if (ret == FAIL) { + break; + } + + // wait addr + ret = validate_setPatternWaitAddresses(message, i, pat->wait[i]); + if (ret == FAIL) { + break; + } + + // wait time + ret = validate_setPatternWaitTime(message, i, pat->waittime[i]); + if (ret == FAIL) { break; } } } +#ifdef MYTHEN3D trimmingPrint = logINFO; - +#endif return ret; } + +int getPattern(char *message, patternParameters *pat) { + LOG(logINFO, ("Getting Pattern into structure\n")); + + int ret = OK; + uint64_t retval64 = 0; + int retval1 = -1, retval2 = -1; + // words + for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) { + ret = validate_readPatternWord(message, i, &retval64); + if (ret == FAIL) { + break; + } + pat->word[i] = retval64; + } + // iocontrol +#ifndef MYTHEN3D + if (ret == OK) { + validate_readPatternIOControl(); + } +#endif + // limits + if (ret == OK) { + validate_getPatternLoopLimits(&retval1, &retval2); + pat->limits[0] = retval1; + pat->limits[1] = retval2; + } + if (ret == OK) { + for (int i = 0; i <= 2; ++i) { + // loop addr + ret = validate_getPatternLoopAddresses(message, i, &retval1, + &retval2); + if (ret == FAIL) { + break; + } + pat->loop[i * 2 + 0] = retval1; + pat->loop[i * 2 + 1] = retval2; + + // num loops + ret = validate_getPatternLoopCycles(message, i, &retval1); + if (ret == FAIL) { + break; + } + pat->nloop[i] = retval1; + + // wait addr + ret = validate_getPatternWaitAddresses(message, i, &retval1); + if (ret == FAIL) { + break; + } + pat->wait[i] = retval1; + + // wait time + ret = validate_getPatternWaitTime(message, i, &retval64); + if (ret == FAIL) { + break; + } + pat->waittime[i] = retval64; + } + } + return ret; +} + +int loadPatternFile(char *patFname, char *errMessage) { + char fname[128]; + if (getAbsPath(fname, 128, patFname) == FAIL) { + return FAIL; + } + + // open config file + FILE *fd = fopen(fname, "r"); + if (fd == NULL) { + sprintf(errMessage, "Could not open pattern file [%s].\n", patFname); + LOG(logERROR, ("%s\n\n", errMessage)); + return FAIL; + } + LOG(logINFOBLUE, ("Reading default pattern file %s\n", patFname)); + + // Initialization + const size_t LZ = 256; + char line[LZ]; + memset(line, 0, LZ); + char command[LZ]; + char temp[MAX_STR_LENGTH]; + memset(temp, 0, MAX_STR_LENGTH); + + // keep reading a line + while (fgets(line, LZ, fd)) { + + // ignore comments + if (line[0] == '#') { + LOG(logDEBUG1, ("Ignoring Comment\n")); + continue; + } + + // ignore empty lines + if (strlen(line) <= 1) { + LOG(logDEBUG1, ("Ignoring Empty line\n")); + continue; + } + + // removing leading spaces + if (line[0] == ' ' || line[0] == '\t') { + int len = strlen(line); + // find first valid character + int i = 0; + for (i = 0; i < len; ++i) { + if (line[i] != ' ' && line[i] != '\t') { + break; + } + } + // ignore the line full of spaces (last char \n) + if (i >= len - 1) { + LOG(logDEBUG1, ("Ignoring line full of spaces\n")); + continue; + } + // copying only valid char + char temp[LZ]; + memset(temp, 0, LZ); + memcpy(temp, line + i, strlen(line) - i); + memset(line, 0, LZ); + memcpy(line, temp, strlen(temp)); + LOG(logDEBUG1, ("Removing leading spaces.\n")); + } + + LOG(logDEBUG1, ("Command to process: (size:%d) %.*s\n", strlen(line), + strlen(line) - 1, line)); + memset(command, 0, LZ); + + // patword + if (!strncmp(line, "patword", strlen("patword"))) { + int addr = 0; + uint64_t word = 0; + + // cannot scan values +#ifdef VIRTUAL + if (sscanf(line, "%s 0x%x 0x%lx", command, &addr, &word) != 3) { +#else + if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) { +#endif + strcpy(temp, "Could not scan patword arguments.\n"); + break; + } + + if (validate_writePatternWord(temp, addr, word) == FAIL) { + break; + } + } + + // patioctrl +#ifndef MYTHEN3D + if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { + uint64_t arg = 0; + + // cannot scan values +#ifdef VIRTUAL + if (sscanf(line, "%s 0x%lx", command, &arg) != 2) { +#else + if (sscanf(line, "%s 0x%llx", command, &arg) != 2) { +#endif + strcpy(temp, "Could not scan patioctrl arguments.\n"); + break; + } + + if (validate_writePatternIOControl(temp, arg) == FAIL) { + break; + } + } +#endif + + // patlimits + if (!strncmp(line, "patlimits", strlen("patlimits"))) { + int startAddr = 0; + int stopAddr = 0; + + // cannot scan values + if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != + 3) { + strcpy(temp, "Could not scan patlimits arguments.\n"); + break; + } + + if (validate_setPatternLoopLimits(temp, startAddr, stopAddr) == + FAIL) { + break; + } + } + + // patloop + if ((!strncmp(line, "patloop0", strlen("patloop0"))) || + (!strncmp(line, "patloop1", strlen("patloop1"))) || + (!strncmp(line, "patloop2", strlen("patloop2")))) { + + // level + int level = -1; + if (!strncmp(line, "patloop0", strlen("patloop0"))) { + level = 0; + } else if (!strncmp(line, "patloop1", strlen("patloop1"))) { + level = 1; + } else { + level = 2; + } + + int startAddr = 0; + int stopAddr = 0; + // cannot scan values + if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != + 3) { + sprintf(temp, "Could not scan patloop%d arguments.\n", level); + break; + } + + if (validate_setPatternLoopAddresses(temp, level, startAddr, + stopAddr) == FAIL) { + break; + } + } + + // patnloop + if ((!strncmp(line, "patnloop0", strlen("patnloop0"))) || + (!strncmp(line, "patnloop1", strlen("patnloop1"))) || + (!strncmp(line, "patnloop2", strlen("patnloop2")))) { + + // level + int level = -1; + if (!strncmp(line, "patnloop0", strlen("patnloop0"))) { + level = 0; + } else if (!strncmp(line, "patnloop1", strlen("patnloop1"))) { + level = 1; + } else { + level = 2; + } + + int numLoops = -1; + // cannot scan values + if (sscanf(line, "%s %d", command, &numLoops) != 2) { + sprintf(temp, "Could not scan patnloop %d arguments.\n", level); + break; + } + + if (validate_setPatternLoopCycles(temp, level, numLoops) == FAIL) { + break; + } + } + + // patwait + if ((!strncmp(line, "patwait0", strlen("patwait0"))) || + (!strncmp(line, "patwait1", strlen("patwait1"))) || + (!strncmp(line, "patwait2", strlen("patwait2")))) { + + // level + int level = -1; + if (!strncmp(line, "patwait0", strlen("patwait0"))) { + level = 0; + } else if (!strncmp(line, "patwait1", strlen("patwait1"))) { + level = 1; + } else { + level = 2; + } + + int addr = 0; + // cannot scan values + if (sscanf(line, "%s 0x%x", command, &addr) != 2) { + sprintf(temp, "Could not scan patwait%d arguments.\n", level); + break; + } + + if (validate_setPatternWaitAddresses(temp, level, addr) == FAIL) { + break; + } + } + + // patwaittime + if ((!strncmp(line, "patwaittime0", strlen("patwaittime0"))) || + (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) || + (!strncmp(line, "patwaittime2", strlen("patwaittime2")))) { + + // level + int level = -1; + if (!strncmp(line, "patwaittime0", strlen("patwaittime0"))) { + level = 0; + } else if (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) { + level = 1; + } else { + level = 2; + } + + uint64_t waittime = 0; + + // cannot scan values +#ifdef VIRTUAL + if (sscanf(line, "%s %ld", command, &waittime) != 2) { +#else + if (sscanf(line, "%s %lld", command, &waittime) != 2) { +#endif + sprintf(temp, "Could not scan patwaittime%d arguments.\n", + level); + break; + } + + if (validate_setPatternWaitTime(temp, level, waittime) == FAIL) { + break; + } + } + + memset(line, 0, LZ); + } + + fclose(fd); + + if (strlen(temp)) { + sprintf(errMessage, "%s(Default pattern file. Line: %s)\n", temp, line); + return FAIL; + } + + LOG(logINFOBLUE, ("Successfully read default pattern file\n")); + return OK; +} \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c b/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c deleted file mode 100644 index d4473be4d..000000000 --- a/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c +++ /dev/null @@ -1,478 +0,0 @@ -#include "readDefaultPattern.h" -#include "loadPattern.h" -#include "clogger.h" -#include "common.h" -#include "sls/ansi.h" -#include "sls/sls_detector_defs.h" -#include "slsDetectorServer_defs.h" - -#include - -extern char initErrorMessage[MAX_STR_LENGTH]; - -#ifndef MYTHEN3D -extern uint64_t writePatternIOControl(uint64_t word); -#endif -extern uint64_t writePatternWord(int addr, uint64_t word); -extern int setPatternWaitAddress(int level, int addr); -extern uint64_t setPatternWaitTime(int level, uint64_t t); -extern void setPatternLoop(int level, int *startAddr, int *stopAddr, - int *nLoop); - -int loadDefaultPattern(char *patFname, char *errMessage) { - char fname[128]; - if (getAbsPath(fname, 128, patFname) == FAIL) { - return FAIL; - } - - // open config file - FILE *fd = fopen(fname, "r"); - if (fd == NULL) { - sprintf(errMessage, "Could not open pattern file [%s].\n", patFname); - LOG(logERROR, ("%s\n\n", errMessage)); - return FAIL; - } - LOG(logINFOBLUE, ("Reading default pattern file %s\n", patFname)); - - // Initialization - const size_t LZ = 256; - char line[LZ]; - memset(line, 0, LZ); - char command[LZ]; - - // keep reading a line - while (fgets(line, LZ, fd)) { - - // ignore comments - if (line[0] == '#') { - LOG(logDEBUG1, ("Ignoring Comment\n")); - continue; - } - - // ignore empty lines - if (strlen(line) <= 1) { - LOG(logDEBUG1, ("Ignoring Empty line\n")); - continue; - } - - // removing leading spaces - if (line[0] == ' ' || line[0] == '\t') { - int len = strlen(line); - // find first valid character - int i = 0; - for (i = 0; i < len; ++i) { - if (line[i] != ' ' && line[i] != '\t') { - break; - } - } - // ignore the line full of spaces (last char \n) - if (i >= len - 1) { - LOG(logDEBUG1, ("Ignoring line full of spaces\n")); - continue; - } - // copying only valid char - char temp[LZ]; - memset(temp, 0, LZ); - memcpy(temp, line + i, strlen(line) - i); - memset(line, 0, LZ); - memcpy(line, temp, strlen(temp)); - LOG(logDEBUG1, ("Removing leading spaces.\n")); - } - - LOG(logDEBUG1, ("Command to process: (size:%d) %.*s\n", strlen(line), - strlen(line) - 1, line)); - memset(command, 0, LZ); - - // patword - if (!strncmp(line, "patword", strlen("patword"))) { - uint32_t addr = 0; - uint64_t word = 0; - - // cannot scan values -#ifdef VIRTUAL - if (sscanf(line, "%s 0x%x 0x%lx", command, &addr, &word) != 3) { -#else - if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) { -#endif - sprintf(errMessage, - "Could not scan patword arguments from default " - "pattern file. Line:[%s].\n", - line); - break; - } - - if (default_writePatternWord(line, addr, word) == FAIL) { - break; - } - } - - // patioctrl -#ifndef MYTHEN3D - if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { - uint64_t arg = 0; - - // cannot scan values -#ifdef VIRTUAL - if (sscanf(line, "%s 0x%lx", command, &arg) != 2) { -#else - if (sscanf(line, "%s 0x%llx", command, &arg) != 2) { -#endif - sprintf(errMessage, - "Could not scan patioctrl arguments from default " - "pattern file. Line:[%s].\n", - line); - break; - } - - if (default_writePatternIOControl(line, arg) == FAIL) { - break; - } - } -#endif - - // patlimits - if (!strncmp(line, "patlimits", strlen("patlimits"))) { - uint32_t startAddr = 0; - uint32_t stopAddr = 0; - - // cannot scan values - if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != - 3) { - sprintf(errMessage, - "Could not scan patlimits arguments from default " - "pattern file. Line:[%s].\n", - line); - break; - } - - if (default_setPatternLoopLimits(line, startAddr, stopAddr) == - FAIL) { - break; - } - } - - // patloop - if ((!strncmp(line, "patloop0", strlen("patloop0"))) || - (!strncmp(line, "patloop1", strlen("patloop1"))) || - (!strncmp(line, "patloop2", strlen("patloop2")))) { - - // level - int level = -1; - if (!strncmp(line, "patloop0", strlen("patloop0"))) { - level = 0; - } else if (!strncmp(line, "patloop1", strlen("patloop1"))) { - level = 1; - } else { - level = 2; - } - - uint32_t startAddr = 0; - uint32_t stopAddr = 0; - // cannot scan values - if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != - 3) { - sprintf(errMessage, - "Could not scan patloop%d arguments from default " - "pattern file. Line:[%s].\n", - level, line); - break; - } - - if (default_setPatternLoopAddresses(line, level, startAddr, - stopAddr) == FAIL) { - break; - } - } - - // patnloop - if ((!strncmp(line, "patnloop0", strlen("patnloop0"))) || - (!strncmp(line, "patnloop1", strlen("patnloop1"))) || - (!strncmp(line, "patnloop2", strlen("patnloop2")))) { - - // level - int level = -1; - if (!strncmp(line, "patnloop0", strlen("patnloop0"))) { - level = 0; - } else if (!strncmp(line, "patnloop1", strlen("patnloop1"))) { - level = 1; - } else { - level = 2; - } - - int numLoops = -1; - // cannot scan values - if (sscanf(line, "%s %d", command, &numLoops) != 2) { - sprintf(errMessage, - "Could not scan patnloop%d arguments from default " - "pattern file. Line:[%s].\n", - level, line); - break; - } - - if (default_setPatternLoopCycles(line, level, numLoops) == FAIL) { - break; - } - } - - // patwait - if ((!strncmp(line, "patwait0", strlen("patwait0"))) || - (!strncmp(line, "patwait1", strlen("patwait1"))) || - (!strncmp(line, "patwait2", strlen("patwait2")))) { - - // level - int level = -1; - if (!strncmp(line, "patwait0", strlen("patwait0"))) { - level = 0; - } else if (!strncmp(line, "patwait1", strlen("patwait1"))) { - level = 1; - } else { - level = 2; - } - - uint32_t addr = 0; - // cannot scan values - if (sscanf(line, "%s 0x%x", command, &addr) != 2) { - sprintf(errMessage, - "Could not scan patwait%d arguments from default " - "pattern file. Line:[%s].\n", - level, line); - break; - } - - if (default_setPatternWaitAddresses(line, level, addr) == FAIL) { - break; - } - } - - // patwaittime - if ((!strncmp(line, "patwaittime0", strlen("patwaittime0"))) || - (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) || - (!strncmp(line, "patwaittime2", strlen("patwaittime2")))) { - - // level - int level = -1; - if (!strncmp(line, "patwaittime0", strlen("patwaittime0"))) { - level = 0; - } else if (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) { - level = 1; - } else { - level = 2; - } - - uint64_t waittime = 0; - - // cannot scan values -#ifdef VIRTUAL - if (sscanf(line, "%s %ld", command, &waittime) != 2) { -#else - if (sscanf(line, "%s %lld", command, &waittime) != 2) { -#endif - sprintf(errMessage, - "Could not scan patwaittime%d arguments from default " - "pattern file. Line:[%s].\n", - level, line); - break; - } - - if (default_setPatternWaitTime(line, level, waittime) == FAIL) { - break; - } - } - - memset(line, 0, LZ); - } - fclose(fd); - - if (strlen(errMessage)) { - LOG(logERROR, ("%s\n\n", errMessage)); - return FAIL; - } - LOG(logINFOBLUE, ("Successfully read default pattern file\n")); - return OK; -} - -int default_writePatternWord(char *line, uint32_t addr, uint64_t word) { - // validations - if ((int32_t)addr < 0 || addr >= MAX_PATTERN_LENGTH) { - sprintf(initErrorMessage, - "Cannot set pattern word from default " - "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", - MAX_PATTERN_LENGTH, line); - return FAIL; - } - writePatternWord(addr, word); - // cannot validate for moench, ctb ( same as executing pattern word) - return OK; -} - -#ifndef MYTHEN3D -int default_writePatternIOControl(char *line, uint64_t arg) { - uint64_t retval = writePatternIOControl(arg); - if (retval != arg) { -#ifdef VIRTUAL - sprintf(initErrorMessage, - "Could not set patioctrl from default pattern " - "file. Set 0x%lx, read 0x%lx. Line:[%s]\n", - arg, retval, line); -#else - sprintf(initErrorMessage, - "Could not set patioctrl from default pattern " - "file. Set 0x%llx, read 0x%llx. Line:[%s]\n", - arg, retval, line); -#endif - return FAIL; - } - return OK; -} -#endif - -int default_setPatternLoopLimits(char *line, uint32_t startAddr, - uint32_t stopAddr) { - // validations - if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || - (int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) { - sprintf(initErrorMessage, - "Cannot set patlimits from default " - "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", - MAX_PATTERN_LENGTH, line); - return FAIL; - } - int numLoops = -1; - int r_startAddr = startAddr, r_stopAddr = stopAddr; - setPatternLoop(-1, &r_startAddr, &r_stopAddr, &numLoops); - - // validate - if (r_startAddr != (int)startAddr || r_stopAddr != (int)stopAddr) { - sprintf(initErrorMessage, - "Could not set patlimits from default pattern " - "file. Read start addr:0x%x, stop addr: 0x%x. Line:[%s]\n", - r_startAddr, r_stopAddr, line); - return FAIL; - } - return OK; -} - -int default_setPatternLoopAddresses(char *line, int level, uint32_t startAddr, - uint32_t stopAddr) { - // validations - if (level < 0 || level > 2) { - sprintf(initErrorMessage, - "Cannot set patloop from default " - "pattern file. Level must be between 0 and 2. Line:[%s]\n", - line); - return FAIL; - } - if ((int32_t)startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || - (int32_t)stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) { - sprintf(initErrorMessage, - "Cannot set patloop (level: %d) from default " - "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", - level, MAX_PATTERN_LENGTH, line); - return FAIL; - } - int numLoops = -1; - int r_startAddr = startAddr, r_stopAddr = stopAddr; - setPatternLoop(level, &r_startAddr, &r_stopAddr, &numLoops); - - // validate - if (r_startAddr != (int)startAddr || r_stopAddr != (int)stopAddr) { - sprintf( - initErrorMessage, - "Could not set patloop (level: %d) from default " - "pattern file. Read start addr:0x%x, stop addr: 0x%x. Line:[%s]\n", - level, r_startAddr, r_stopAddr, line); - return FAIL; - } - return OK; -} - -int default_setPatternLoopCycles(char *line, int level, int numLoops) { - // validations - if (level < 0 || level > 2) { - sprintf(initErrorMessage, - "Cannot set patnloop from default " - "pattern file. Level must be between 0 and 2. Line:[%s]\n", - line); - return FAIL; - } - if (numLoops < 0) { - sprintf(initErrorMessage, - "Cannot set patnloop from default " - "pattern file. Iterations must be between > 0. Line:[%s]\n", - line); - return FAIL; - } - int startAddr = -1; - int stopAddr = -1; - int r_numLoops = numLoops; - setPatternLoop(level, &startAddr, &stopAddr, &r_numLoops); - - // validate - if (r_numLoops != numLoops) { - sprintf(initErrorMessage, - "Could not set patnloop (level: %d) from default " - "pattern file. Read %d loops. Line:[%s]\n", - level, r_numLoops, line); - return FAIL; - } - return OK; -} - -int default_setPatternWaitAddresses(char *line, int level, uint32_t addr) { - // validations - if (level < 0 || level > 2) { - sprintf(initErrorMessage, - "Cannot set patwait address from default " - "pattern file. Level must be between 0 and 2. Line:[%s]\n", - line); - return FAIL; - } - if ((int32_t)addr < 0 || addr >= MAX_PATTERN_LENGTH) { - sprintf(initErrorMessage, - "Cannot set patwait address (level: %d) from default " - "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", - level, MAX_PATTERN_LENGTH, line); - return FAIL; - } - - uint32_t retval = setPatternWaitAddress(level, addr); - - // validate - if (retval != addr) { - sprintf(initErrorMessage, - "Could not set patwait address (level: %d) from default " - "pattern file. Read addr: 0x%x. Line:[%s]\n", - level, retval, line); - return FAIL; - } - return OK; -} - -int default_setPatternWaitTime(char *line, int level, uint64_t waittime) { - // validations - if (level < 0 || level > 2) { - sprintf(initErrorMessage, - "Cannot set patwaittime from default " - "pattern file. Level must be between 0 and 2. Line:[%s]\n", - line); - return FAIL; - } - uint64_t retval = setPatternWaitTime(level, waittime); - - // validate - if (retval != waittime) { -#ifdef VIRTUAL - sprintf(initErrorMessage, - "Could not set patwaittime (level: %d) from default " - "pattern file. Read %ld wait time. Line:[%s]\n", - level, retval, line); -#else - sprintf(initErrorMessage, - "Could not set patwaittime (level: %d) from default " - "pattern file. Read %lld wait time. Line:[%s]\n", - level, retval, line); -#endif - return FAIL; - } - return OK; -} diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 1fb9f6763..4f27c4e83 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -7,6 +7,7 @@ #if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) #include "Pattern.h" +#include "loadPattern.h" #endif #include @@ -400,35 +401,6 @@ void modeNotImplemented(char *modename, int mode) { LOG(logERROR, (mess)); } -void validate(int arg, int retval, char *modename, enum numberMode nummode) { - if (ret == OK && arg != GET_FLAG && retval != arg) { - ret = FAIL; - if (nummode == HEX) - sprintf(mess, "Could not %s. Set 0x%x, but read 0x%x\n", modename, - arg, retval); - else - sprintf(mess, "Could not %s. Set %d, but read %d\n", modename, arg, - retval); - LOG(logERROR, (mess)); - } -} - -void validate64(int64_t arg, int64_t retval, char *modename, - enum numberMode nummode) { - if (ret == OK && arg != GET_FLAG && retval != arg) { - ret = FAIL; - if (nummode == HEX) - sprintf(mess, "Could not %s. Set 0x%llx, but read 0x%llx\n", - modename, (long long unsigned int)arg, - (long long unsigned int)retval); - else - sprintf(mess, "Could not %s. Set %lld, but read %lld\n", modename, - (long long unsigned int)arg, - (long long unsigned int)retval); - LOG(logERROR, (mess)); - } -} - int executeCommand(char *command, char *result, enum TLogLevel level) { const size_t tempsize = 256; char temp[tempsize]; @@ -603,7 +575,8 @@ int set_external_signal_flag(int file_des) { if (ret == OK) { setExtSignal(signalIndex, flag); retval = getExtSignal(signalIndex); - validate((int)flag, (int)retval, "set external signal flag", DEC); + validate(&ret, mess, (int)flag, (int)retval, + "set external signal flag", DEC); LOG(logDEBUG1, ("External Signal Flag: %d\n", retval)); } } @@ -643,7 +616,7 @@ int set_timing_mode(int file_des) { // get retval = getTiming(); #ifndef MYTHEN3D - validate((int)arg, (int)retval, "set timing mode", DEC); + validate(&ret, mess, (int)arg, (int)retval, "set timing mode", DEC); #endif LOG(logDEBUG1, ("Timing Mode: %d\n", retval)); @@ -1054,7 +1027,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { case IO_DELAY: retval = setIODelay(val); LOG(logDEBUG1, ("IODelay: %d\n", retval)); - validate(val, retval, "set iodelay", DEC); + validate(&ret, mess, val, retval, "set iodelay", DEC); break; #endif @@ -1064,7 +1037,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { LOG(logDEBUG1, ("High Voltage: %d\n", retval)); #if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ defined(GOTTHARD2D) || defined(MYTHEN3D) - validate(val, retval, "set high voltage", DEC); + validate(&ret, mess, val, retval, "set high voltage", DEC); #endif #ifdef GOTTHARDD if (retval == -1) { @@ -1073,7 +1046,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { "110, 120, 150, 180, 200\n"); LOG(logERROR, (mess)); } else - validate(val, retval, "set high voltage", DEC); + validate(&ret, mess, val, retval, "set high voltage", DEC); #elif EIGERD if ((retval != SLAVE_HIGH_VOLTAGE_READ_VAL) && (retval < 0)) { ret = FAIL; @@ -1131,7 +1104,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { } retval = getPower(serverDacIndex); LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval)); - validate(val, retval, "set power regulator", DEC); + validate(&ret, mess, val, retval, "set power regulator", DEC); break; case V_POWER_CHIP: @@ -1177,7 +1150,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { } retval = getVLimit(); LOG(logDEBUG1, ("VLimit: %d\n", retval)); - validate(val, retval, "set vlimit", DEC); + validate(&ret, mess, val, retval, "set vlimit", DEC); break; #endif // dacs @@ -1238,8 +1211,8 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { ret = OK; } else { ret = FAIL; - sprintf(mess, "Setting dac %d : wrote %d but read %d\n", - serverDacIndex, val, retval); + sprintf(mess, "Setting dac %d : wrote %d but read %d\n", + serverDacIndex, val, retval); LOG(logERROR, (mess)); } } @@ -1577,7 +1550,8 @@ int set_module(int file_des) { ret = setModule(module, mess); enum detectorSettings retval = getSettings(); #if !(defined(EIGERD) || defined(MYTHEN3D)) - validate(module.reg, (int)retval, "set module (settings)", DEC); + validate(&ret, mess, module.reg, (int)retval, "set module (settings)", + DEC); #endif LOG(logDEBUG1, ("Settings: %d\n", retval)); } @@ -1659,7 +1633,7 @@ int set_settings(int file_des) { LOG(logDEBUG1, ("Settings: %d\n", retval)); if ((int)isett != GET_FLAG) { - validate((int)isett, (int)retval, "set settings", DEC); + validate(&ret, mess, (int)isett, (int)retval, "set settings", DEC); #ifdef GOTTHARDD if (ret == OK) { ret = setDefaultDacs(); @@ -1995,7 +1969,8 @@ int set_num_frames(int file_des) { int64_t retval = getNumFrames(); LOG(logDEBUG1, ("retval num frames %lld\n", (long long int)retval)); - validate64(arg, retval, "set number of frames", DEC); + validate64(&ret, mess, arg, retval, "set number of frames", + DEC); } } } @@ -2027,7 +2002,7 @@ int set_num_triggers(int file_des) { setNumTriggers(arg); int64_t retval = getNumTriggers(); LOG(logDEBUG1, ("retval num triggers %lld\n", (long long int)retval)); - validate64(arg, retval, "set number of triggers", DEC); + validate64(&ret, mess, arg, retval, "set number of triggers", DEC); } return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2070,8 +2045,8 @@ int set_num_additional_storage_cells(int file_des) { setNumAdditionalStorageCells(arg); int retval = getNumAdditionalStorageCells(); LOG(logDEBUG1, ("retval num addl. storage cells %d\n", retval)); - validate(arg, retval, "set number of additional storage cells", - DEC); + validate(&ret, mess, arg, retval, + "set number of additional storage cells", DEC); } } #endif @@ -2128,7 +2103,8 @@ int set_num_analog_samples(int file_des) { } else { int retval = getNumAnalogSamples(); LOG(logDEBUG1, ("retval num analog samples %d\n", retval)); - validate(arg, retval, "set number of analog samples", DEC); + validate(&ret, mess, arg, retval, + "set number of analog samples", DEC); } } } @@ -2175,7 +2151,8 @@ int set_num_digital_samples(int file_des) { } else { int retval = getNumDigitalSamples(); LOG(logDEBUG1, ("retval num digital samples %d\n", retval)); - validate(arg, retval, "set number of digital samples", DEC); + validate(&ret, mess, arg, retval, "set number of digital samples", + DEC); } } #endif @@ -2749,7 +2726,7 @@ int set_dynamic_range(int file_des) { sprintf(mess, "Could not get dynamic range.\n"); LOG(logERROR, (mess)); } - validate(dr, retval, "set dynamic range", DEC); + validate(&ret, mess, dr, retval, "set dynamic range", DEC); break; default: modeNotImplemented("Dynamic range", dr); @@ -2921,7 +2898,7 @@ int enable_ten_giga(int file_des) { } retval = enableTenGigabitEthernet(GET_FLAG); LOG(logDEBUG1, ("10GbE: %d\n", retval)); - validate(arg, retval, "enable/disable 10GbE", DEC); + validate(&ret, mess, arg, retval, "enable/disable 10GbE", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -2956,7 +2933,7 @@ int validateAndSetAllTrimbits(int arg) { // get retval = getAllTrimbits(); LOG(logDEBUG1, ("All trimbits: %d\n", retval)); - validate(arg, retval, "set all trimbits", DEC); + validate(&ret, mess, arg, retval, "set all trimbits", DEC); #endif return retval; } @@ -2992,10 +2969,10 @@ int set_pattern_io_control(int file_des) { LOG(logDEBUG1, ("Setting Pattern IO Control to 0x%llx\n", (long long int)arg)); if (((int64_t)arg == GET_FLAG) || (Server_VerifyLock() == OK)) { - retval = writePatternIOControl(arg); - LOG(logDEBUG1, - ("Pattern IO Control retval: 0x%llx\n", (long long int)retval)); - validate64(arg, retval, "set Pattern IO Control", HEX); + if ((int64_t)arg != GET_FLAG) { + ret = validate_writePatternIOControl(mess, arg); + } + retval = validate_readPatternIOControl(); } #endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); @@ -3019,19 +2996,10 @@ int set_pattern_word(int file_des) { (long long int)word)); } if (Server_VerifyLock() == OK) { - // valid address - if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern (Word, addr:0x%x). Addr must be " - "between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH); - LOG(logERROR, (mess)); + if (word != (uint64_t)-1) { + ret = validate_writePatternWord(mess, addr, word); } else { - retval = writePatternWord(addr, word); - LOG(logDEBUG1, - ("Pattern Word retval: 0x%llx\n", (long long int)retval)); - // no validation (cannot read as it will execute the pattern) + ret = validate_readPatternWord(mess, addr, &retval); } } #endif @@ -3057,37 +3025,27 @@ int set_pattern_loop_addresses(int file_des) { loopLevel, startAddr, stopAddr)); if ((startAddr == GET_FLAG) || (stopAddr == GET_FLAG) || (Server_VerifyLock() == OK)) { - // valid loop level - if (loopLevel < -1 || - loopLevel > 2) { // loop level of -1 : complete pattern - ret = FAIL; - sprintf(mess, - "Cannot set Pattern loop addresses. Level %d should be " - "between -1 and 2\n", - loopLevel); - LOG(logERROR, (mess)); + // loop limits + if (loopLevel == -1) { + // set + if (startAddr >= 0 && stopAddr >= 0) { + ret = validate_setPatternLoopLimits(mess, startAddr, stopAddr); + } + // get + validate_getPatternLoopLimits(&retvals[0], &retvals[1]); } - // valid addr for loop level 0-2 - else if (startAddr >= MAX_PATTERN_LENGTH || - stopAddr >= MAX_PATTERN_LENGTH) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern loop addresses. Address (start " - "addr:0x%x and stop addr:0x%x) " - "should be less than 0x%x\n", - startAddr, stopAddr, MAX_PATTERN_LENGTH); - LOG(logERROR, (mess)); - } else { - int numLoops = -1; - setPatternLoop(loopLevel, &startAddr, &stopAddr, &numLoops); - LOG(logDEBUG1, - ("Pattern loop addresses retval: (start:0x%x, stop:0x%x)\n", - startAddr, stopAddr)); - retvals[0] = startAddr; - retvals[1] = stopAddr; - validate(args[1], startAddr, "set Pattern loops' start address", - HEX); - validate(args[2], stopAddr, "set Pattern loops' stop address", HEX); + // loop addresses + else { + // set + if (startAddr >= 0 && stopAddr >= 0) { + ret = validate_setPatternLoopAddresses(mess, loopLevel, startAddr, + stopAddr); + } + // get + if (ret == OK) { + ret = validate_getPatternLoopAddresses(mess, loopLevel, &retvals[0], + &retvals[1]); + } } } #endif @@ -3110,23 +3068,13 @@ int set_pattern_loop_cycles(int file_des) { LOG(logDEBUG1, ("Setting Pattern loop cycles (loopLevel:%d numLoops:%d)\n", loopLevel, numLoops)); if ((numLoops == GET_FLAG) || (Server_VerifyLock() == OK)) { - // valid loop level - if (loopLevel < 0 || loopLevel > 2) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern loop cycles. Level %d should be " - "between 0 and 2\n", - loopLevel); - LOG(logERROR, (mess)); - } else { - int startAddr = GET_FLAG; - int stopAddr = GET_FLAG; - setPatternLoop(loopLevel, &startAddr, &stopAddr, &numLoops); - retval = numLoops; - LOG(logDEBUG1, - ("Pattern loop cycles retval: (ncycles:%d)\n", retval)); - validate(args[1], retval, "set Pattern loops' number of cycles", - DEC); + // set + if (numLoops != GET_FLAG) { + ret = validate_setPatternLoopCycles(mess, loopLevel, numLoops); + } + // get + if (ret == OK) { + ret = validate_getPatternLoopCycles(mess, loopLevel, &retval); } } #endif @@ -3149,27 +3097,13 @@ int set_pattern_wait_addr(int file_des) { LOG(logDEBUG1, ("Setting Pattern wait address (loopLevel:%d addr:0x%x)\n", loopLevel, addr)); if ((addr == GET_FLAG) || (Server_VerifyLock() == OK)) { - // valid loop level 0-2 - if (loopLevel < 0 || loopLevel > 2) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern wait address. Level %d should be " - "between 0 and 2\n", - loopLevel); - LOG(logERROR, (mess)); + // set + if (addr != GET_FLAG) { + ret = validate_setPatternWaitAddresses(mess, loopLevel, addr); } - // valid addr - else if (addr >= MAX_PATTERN_LENGTH) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern wait address. Address (0x%x) should be " - "between 0 and 0x%x\n", - addr, MAX_PATTERN_LENGTH); - LOG(logERROR, (mess)); - } else { - retval = setPatternWaitAddress(loopLevel, addr); - LOG(logDEBUG1, ("Pattern wait address retval: 0x%x\n", retval)); - validate(addr, retval, "set Pattern wait address", HEX); + // get + if (ret == OK) { + ret = validate_getPatternWaitAddresses(mess, loopLevel, &retval); } } #endif @@ -3192,19 +3126,13 @@ int set_pattern_wait_time(int file_des) { LOG(logDEBUG1, ("Setting Pattern wait time (loopLevel:%d timeval:0x%llx)\n", loopLevel, (long long int)timeval)); if (((int64_t)timeval == GET_FLAG) || (Server_VerifyLock() == OK)) { - // valid loop level 0-2 - if (loopLevel < 0 || loopLevel > 2) { - ret = FAIL; - sprintf(mess, - "Cannot set Pattern wait time. Level %d should be between " - "0 and 2\n", - loopLevel); - LOG(logERROR, (mess)); - } else { - retval = setPatternWaitTime(loopLevel, timeval); - LOG(logDEBUG1, - ("Pattern wait time retval: 0x%llx\n", (long long int)retval)); - validate64(timeval, retval, "set Pattern wait time", HEX); + // set + if ((int64_t)timeval != GET_FLAG) { + ret = validate_setPatternWaitTime(mess, loopLevel, timeval); + } + // get + if (ret == OK) { + ret = validate_getPatternWaitTime(mess, loopLevel, &retval); } } #endif @@ -3229,7 +3157,7 @@ int set_pattern_mask(int file_des) { uint64_t retval64 = getPatternMask(); LOG(logDEBUG1, ("Pattern mask: 0x%llx\n", (long long unsigned int)retval64)); - validate64(arg, retval64, "set Pattern Mask", HEX); + validate64(&ret, mess, arg, retval64, "set Pattern Mask", HEX); } #endif return Server_SendResult(file_des, INT32, NULL, 0); @@ -3272,7 +3200,7 @@ int set_pattern_bit_mask(int file_des) { uint64_t retval64 = getPatternBitMask(); LOG(logDEBUG1, ("Pattern bit mask: 0x%llx\n", (long long unsigned int)retval64)); - validate64(arg, retval64, "set Pattern Bit Mask", HEX); + validate64(&ret, mess, arg, retval64, "set Pattern Bit Mask", HEX); } #endif return Server_SendResult(file_des, INT32, NULL, 0); @@ -3350,7 +3278,7 @@ int set_counter_bit(int file_des) { // get retval = setCounterBit(GET_FLAG); LOG(logDEBUG1, ("Set counter bit retval: %d\n", retval)); - validate(arg, retval, "set counter bit", DEC); + validate(&ret, mess, arg, retval, "set counter bit", DEC); #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -3450,7 +3378,7 @@ int set_rate_correct(int file_des) { strcpy(mess, "Rate correction failed\n"); LOG(logERROR, (mess)); } else { - validate64(tau_ns, retval, "set rate correction", DEC); + validate64(&ret, mess, tau_ns, retval, "set rate correction", DEC); } } #endif @@ -3493,7 +3421,7 @@ int set_ten_giga_flow_control(int file_des) { } else { int retval = getTenGigaFlowControl(); LOG(logDEBUG1, ("ten giga flow control retval: %d\n", retval)); - validate(arg, retval, "set ten giga flow control", DEC); + validate(&ret, mess, arg, retval, "set ten giga flow control", DEC); } } #endif @@ -3552,7 +3480,8 @@ int set_transmission_delay_frame(int file_des) { int retval = getTransmissionDelayFrame(); LOG(logDEBUG1, ("transmission delay frame retval: %d\n", retval)); - validate(arg, retval, "set transmission delay frame", DEC); + validate(&ret, mess, arg, retval, + "set transmission delay frame", DEC); } } } @@ -3602,7 +3531,8 @@ int set_transmission_delay_left(int file_des) { } else { int retval = getTransmissionDelayLeft(); LOG(logDEBUG1, ("transmission delay left retval: %d\n", retval)); - validate(arg, retval, "set transmission delay left", DEC); + validate(&ret, mess, arg, retval, "set transmission delay left", + DEC); } } #endif @@ -3651,7 +3581,8 @@ int set_transmission_delay_right(int file_des) { } else { int retval = getTransmissionDelayRight(); LOG(logDEBUG1, ("transmission delay right retval: %d\n", retval)); - validate(arg, retval, "set transmission delay right", DEC); + validate(&ret, mess, arg, retval, "set transmission delay right", + DEC); } } #endif @@ -3902,7 +3833,7 @@ int power_chip(int file_des) { retval = powerChip(arg); LOG(logDEBUG1, ("Power chip: %d\n", retval)); } - validate(arg, retval, "power on/off chip", DEC); + validate(&ret, mess, arg, retval, "power on/off chip", DEC); #ifdef JUNGFRAUD // narrow down error when powering on if (ret == FAIL && arg > 0) { @@ -3949,7 +3880,7 @@ int set_activate(int file_des) { LOG(logERROR, (mess)); } else { LOG(logDEBUG1, ("Activate: %d\n", retval)); - validate(arg, retval, "set/get activate", DEC); + validate(&ret, mess, arg, retval, "set/get activate", DEC); } } } @@ -3983,7 +3914,7 @@ int threshold_temp(int file_des) { else { retval = setThresholdTemperature(arg); LOG(logDEBUG1, ("Threshold temperature: %d\n", retval)); - validate(arg, retval, "set threshold temperature", DEC); + validate(&ret, mess, arg, retval, "set threshold temperature", DEC); } } #endif @@ -4008,7 +3939,7 @@ int temp_control(int file_des) { if ((arg == GET_FLAG) || (Server_VerifyLock() == OK)) { retval = setTemperatureControl(arg); LOG(logDEBUG1, ("Temperature control: %d\n", retval)); - validate(arg, retval, "set temperature control", DEC); + validate(&ret, mess, arg, retval, "set temperature control", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -4032,7 +3963,7 @@ int temp_event(int file_des) { if ((arg == GET_FLAG) || (Server_VerifyLock() == OK)) { retval = setTemperatureEvent(arg); LOG(logDEBUG1, ("Temperature event: %d\n", retval)); - validate(arg, retval, "set temperature event", DEC); + validate(&ret, mess, arg, retval, "set temperature event", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -4055,7 +3986,7 @@ int auto_comp_disable(int file_des) { if ((arg == GET_FLAG) || (Server_VerifyLock() == OK)) { retval = autoCompDisable(arg); LOG(logDEBUG1, ("Auto comp disable: %d\n", retval)); - validate(arg, retval, "set auto comp disable", DEC); + validate(&ret, mess, arg, retval, "set auto comp disable", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -4083,7 +4014,7 @@ int storage_cell_start(int file_des) { } else { retval = selectStoragecellStart(arg); LOG(logDEBUG1, ("Storage cell start: %d\n", retval)); - validate(arg, retval, "set storage cell start", DEC); + validate(&ret, mess, arg, retval, "set storage cell start", DEC); } } #endif @@ -4211,7 +4142,7 @@ int led(int file_des) { if ((arg == GET_FLAG) || (Server_VerifyLock() == OK)) { retval = setLEDEnable(arg); LOG(logDEBUG1, ("LED Enable: %d\n", retval)); - validate(arg, retval, "enable/disable LED", DEC); + validate(&ret, mess, arg, retval, "enable/disable LED", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -4515,7 +4446,8 @@ int set_external_sampling_source(int file_des) { } else { retval = setExternalSamplingSource(arg); LOG(logDEBUG1, ("External Sampling source: %d\n", retval)); - validate(arg, retval, "set external sampling source", DEC); + validate(&ret, mess, arg, retval, "set external sampling source", + DEC); } } #endif @@ -4540,7 +4472,7 @@ int set_external_sampling(int file_des) { arg = (arg > 0) ? 1 : arg; retval = setExternalSampling(arg); LOG(logDEBUG1, ("External Sampling enable: %d\n", retval)); - validate(arg, retval, "set external sampling enable", DEC); + validate(&ret, mess, arg, retval, "set external sampling enable", DEC); } #endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); @@ -5629,7 +5561,7 @@ int set_readout_mode(int file_des) { } else { LOG(logDEBUG1, ("readout mode retval: %u\n", retval)); } - validate(arg, retval, "set readout mode", DEC); + validate(&ret, mess, arg, retval, "set readout mode", DEC); } } } @@ -5714,7 +5646,7 @@ int set_clock_frequency(int file_des) { int retval = getFrequency(c); LOG(logDEBUG1, ("retval %s: %d %s\n", modeName, retval, myDetectorType == GOTTHARD2 ? "Hz" : "MHz")); - validate(val, retval, modeName, DEC); + validate(&ret, mess, val, retval, modeName, DEC); } } } @@ -5866,7 +5798,7 @@ int set_clock_phase(int file_des) { int retval = getPhase(c, inDegrees); LOG(logDEBUG1, ("retval %s : %d\n", modeName, retval)); if (!inDegrees) { - validate(val, retval, modeName, DEC); + validate(&ret, mess, val, retval, modeName, DEC); } else { ret = validatePhaseinDegrees(c, val, retval); if (ret == FAIL) { @@ -6069,7 +6001,7 @@ int set_clock_divider(int file_des) { } else { int retval = getClockDivider(c); LOG(logDEBUG1, ("retval %s : %d\n", modeName, retval)); - validate(val, retval, modeName, DEC); + validate(&ret, mess, val, retval, modeName, DEC); } } } @@ -6160,7 +6092,7 @@ int set_pipeline(int file_des) { setPipeline(c, val); int retval = getPipeline(c); LOG(logDEBUG1, ("retval %s: %d\n", modeName, retval)); - validate(val, retval, modeName, DEC); + validate(&ret, mess, val, retval, modeName, DEC); } } #endif @@ -6276,7 +6208,7 @@ int set_on_chip_dac(int file_des) { } else { int retval = getOnChipDAC(dacIndex, chipIndex); LOG(logDEBUG1, ("retval %s: 0x%x\n", modeName, retval)); - validate(val, retval, modeName, DEC); + validate(&ret, mess, val, retval, modeName, DEC); } } } @@ -6745,7 +6677,7 @@ int set_num_bursts(int file_des) { setNumBursts(arg); int64_t retval = getNumBursts(); LOG(logDEBUG1, ("retval num bursts %lld\n", (long long int)retval)); - validate64(arg, retval, "set number of bursts", DEC); + validate64(&ret, mess, arg, retval, "set number of bursts", DEC); } #endif return Server_SendResult(file_des, INT64, NULL, 0); @@ -6812,7 +6744,7 @@ int set_current_source(int file_des) { setCurrentSource(arg); int retval = getCurrentSource(); LOG(logDEBUG1, ("current source enable retval: %u\n", retval)); - validate(arg, retval, "set current source enable", DEC); + validate(&ret, mess, arg, retval, "set current source enable", DEC); } #endif return Server_SendResult(file_des, INT32, NULL, 0); @@ -7374,7 +7306,7 @@ int set_num_gates(int file_des) { setNumGates(arg); int retval = getNumGates(); LOG(logDEBUG1, ("retval num gates %d\n", retval)); - validate(arg, retval, "set number of gates", DEC); + validate(&ret, mess, arg, retval, "set number of gates", DEC); } #endif return Server_SendResult(file_des, INT32, NULL, 0); @@ -7572,7 +7504,7 @@ int set_veto(int file_des) { if (ret == OK) { int retval = getVeto(); LOG(logDEBUG1, ("veto mode retval: %u\n", retval)); - validate(arg, retval, "set veto mode", DEC); + validate(&ret, mess, arg, retval, "set veto mode", DEC); } } #endif @@ -7598,88 +7530,7 @@ int set_pattern(int file_des) { if (Server_VerifyLock() == OK) { LOG(logINFO, ("Setting Pattern from structure\n")); - LOG(logINFO, - ("Setting Pattern Word (printing every 10 words that are not 0\n")); - /****************************************************************************************************************/ - /* I SUGGEST TO VALIDATE THE VALUES HERE AND THEN WRITE THE PATTERN IN A - * SEPARATE FUNCTION WHICH COULD BE REUSED*/ - /* added loadPattern.c/h - the same func could be reused also in - * readDefaultPattern */ - /***************************************************************************************************************/ - - for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) { - if ((i % 10 == 0) && pat->word[i] != 0) { - LOG(logINFO, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", - i, (long long int)pat->word[i])); - } - writePatternWord(i, pat->word[i]); - } -#ifndef MYTHEN3D - if (ret == OK) { - uint64_t retval64 = writePatternIOControl(pat->ioctrl); - validate64(pat->ioctrl, retval64, "set pattern IO Control", HEX); - } -#endif - if (ret == OK) { - int numLoops = -1; - int retval0 = pat->limits[0]; - int retval1 = pat->limits[1]; - setPatternLoop(-1, &retval0, &retval1, &numLoops); - validate(pat->limits[0], retval0, - "set pattern Limits start address", HEX); - validate(pat->limits[1], retval1, - "set pattern Limits start address", HEX); - } - if (ret == OK) { - for (int i = 0; i <= 2; ++i) { - char msg[128]; - int retval0 = -1, retval1 = -1, numLoops = -1; - uint64_t retval64 = -1; - - // patloop - retval0 = pat->loop[i * 2 + 0]; - retval1 = pat->loop[i * 2 + 1]; - numLoops = pat->nloop[i]; - setPatternLoop(i, &retval0, &retval1, &numLoops); - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d start address", i); - validate(pat->loop[i * 2 + 0], retval0, msg, HEX); - if (ret == FAIL) { - break; - } - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d stop address", i); - validate(pat->loop[i * 2 + 1], retval1, msg, HEX); - if (ret == FAIL) { - break; - } - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d num loops", i); - validate(pat->nloop[i], numLoops, msg, HEX); - if (ret == FAIL) { - break; - } - - // patwait - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d wait address", i); - retval0 = setPatternWaitAddress(i, pat->wait[i]); - validate(pat->wait[i], retval0, msg, HEX); - if (ret == FAIL) { - break; - } - - // patwaittime - memset(msg, 0, sizeof(msg)); - sprintf(msg, "set pattern Loop %d wait time", i); - retval64 = setPatternWaitTime(i, pat->waittime[i]); - validate64(pat->waittime[i], retval64, msg, HEX); - if (ret == FAIL) { - break; - } - } - } - /******* DOWN TO HERE ***********/ + ret = loadPattern(mess, logINFO, pat); } if (pat != NULL) free(pat); @@ -7701,97 +7552,7 @@ int get_pattern(int file_des) { memset(pat, 0, sizeof(patternParameters)); if (Server_VerifyLock() == OK) { - LOG(logINFO, ("Getting Pattern from structure\n")); - - // patword - LOG(logDEBUG, - ("retval pattern word (printing every 10 words that are not 0\n")); - for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) { - pat->word[i] = readPatternWord(i); - if ((int64_t)pat->word[i] == -1) { - ret = FAIL; - sprintf(mess, "could not read pattern word for address 0x%x\n", - i); - LOG(logERROR, (mess)); - break; - } - // debug print - if ((i % 10 == 0) && pat->word[i] != 0) { - LOG(logDEBUG, - ("retval Patpattern word (addr:0x%x, word:0x%llx)\n", i, - (long long int)pat->word[i])); - } - } - - // patioctrl -#ifndef MYTHEN3D - if (ret == OK) { - pat->ioctrl = writePatternIOControl(-1); - LOG(logDEBUG, ("retval pattern io control:0x%llx\n", - (long long int)pat->ioctrl)); - } -#endif - if (ret == OK) { - // patlimits - int numLoops = -1; - int retval0 = -1; - int retval1 = -1; - setPatternLoop(-1, &retval0, &retval1, &numLoops); - pat->limits[0] = retval0; - pat->limits[1] = retval1; - LOG(logDEBUG, ("retval pattern limits start:0x%x stop:0x%x\n", - pat->limits[0], pat->limits[1])); - - for (int i = 0; i <= 2; ++i) { - // patloop - { - int numLoops = -1; - int retval0 = -1; - int retval1 = -1; - setPatternLoop(i, &retval0, &retval1, &numLoops); - pat->nloop[i] = numLoops; - pat->loop[i * 2 + 0] = retval0; - pat->loop[i * 2 + 1] = retval1; - LOG(logDEBUG, ("retval pattern loop level %d start:0x%x " - "stop:0x%x numLoops:%d\n", - i, pat->loop[i * 2 + 0], - pat->loop[i * 2 + 0], pat->nloop[i])); - } - // patwait - { - pat->wait[i] = setPatternWaitAddress(i, -1); - if ((int)pat->wait[i] == -1) { - ret = FAIL; - sprintf(mess, - "could not read pattern wait address for level " - "%d\n", - i); - LOG(logERROR, (mess)); - break; - } - LOG(logDEBUG, - ("retval pattern wait address for level %d: 0x%x\n", i, - pat->wait[i])); - } - - // patwaittime - { - pat->waittime[i] = setPatternWaitTime(i, -1); - if ((int64_t)pat->waittime[i] == -1) { - ret = FAIL; - sprintf( - mess, - "could not read pattern wait time for level %d\n", - i); - LOG(logERROR, (mess)); - break; - } - LOG(logDEBUG, - ("retval pattern wait time for level %d: %lld\n", i, - (long long int)pat->waittime[i])); - } - } - } + ret = getPattern(mess, pat); } // ignoring endianness for eiger @@ -7862,7 +7623,7 @@ int set_scan(int file_des) { setNumFrames(arg); retval = getNumFrames(); LOG(logDEBUG1, ("retval num frames %lld\n", (long long int)retval)); - validate64(arg, retval, "set number of frames", DEC); + validate64(&ret, mess, arg, retval, "set number of frames", DEC); } // enable scan else { @@ -7912,7 +7673,8 @@ int set_scan(int file_des) { retval = getNumFrames(); LOG(logDEBUG1, ("retval num frames %lld\n", (long long int)retval)); - validate64(arg, retval, "set number of frames", DEC); + validate64(&ret, mess, arg, retval, "set number of frames", + DEC); retval = numScanSteps; } } @@ -7977,7 +7739,7 @@ int set_cds_gain(int file_des) { setCDSGain(arg); int retval = getCDSGain(); LOG(logDEBUG1, ("cds gain enable retval: %u\n", retval)); - validate(arg, retval, "set cds gain enable", DEC); + validate(&ret, mess, arg, retval, "set cds gain enable", DEC); } } #endif @@ -8026,7 +7788,7 @@ int set_filter(int file_des) { setFilter(arg); int retval = getFilter(); LOG(logDEBUG1, ("filter retval: %u\n", retval)); - validate(arg, retval, "set filter", DEC); + validate(&ret, mess, arg, retval, "set filter", DEC); } } #endif @@ -8129,7 +7891,7 @@ int set_adc_config(int file_des) { } else { int retval = getADCConfiguration(chipIndex, adcIndex); LOG(logDEBUG1, ("adc config retval: %u\n", retval)); - validate(value, retval, "configure adc", HEX); + validate(&ret, mess, value, retval, "configure adc", HEX); } } } @@ -8360,7 +8122,7 @@ int load_default_pattern(int file_des) { functionNotImplemented(); #else if (Server_VerifyLock() == OK) { - ret = loadDefaultPattern(DEFAULT_PATTERN_FILE, mess); + ret = loadPatternFile(DEFAULT_PATTERN_FILE, mess); if (ret == FAIL) { LOG(logERROR, (mess)); } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 9e45e0103..3766cc731 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -1,12 +1,12 @@ /** API versions */ #define GITBRANCH "developer" -#define APICTB 0x210225 -#define APIGOTTHARD 0x210225 -#define APIGOTTHARD2 0x210225 -#define APIJUNGFRAU 0x210225 -#define APIMOENCH 0x210225 -#define APIMYTHEN3 0x210608 #define APILIB 0x210225 #define APIRECEIVER 0x210225 #define APIGUI 0x210225 -#define APIEIGER 0x210608 +#define APICTB 0x210621 +#define APIGOTTHARD 0x210621 +#define APIGOTTHARD2 0x210621 +#define APIJUNGFRAU 0x210621 +#define APIMYTHEN3 0x210621 +#define APIMOENCH 0x210621 +#define APIEIGER 0x210621 diff --git a/slsSupportLib/tests/test-file_utils.cpp b/slsSupportLib/tests/test-file_utils.cpp index 85c7dc9d3..254c52055 100644 --- a/slsSupportLib/tests/test-file_utils.cpp +++ b/slsSupportLib/tests/test-file_utils.cpp @@ -1,13 +1,12 @@ #include "catch.hpp" #include "sls/file_utils.h" +#include #include #include -#include #include TEST_CASE("Get size of empty file") { char fname[] = "temfile_XXXXXX"; - int fh = mkstemp(fname); std::ifstream ifs(fname); auto size = sls::getFileSize(ifs); REQUIRE(size == 0); @@ -23,6 +22,5 @@ TEST_CASE("Get size of file with data") { std::ifstream ifs(fname); auto size = sls::getFileSize(ifs); REQUIRE(size == n_bytes); - REQUIRE(ifs.tellg() == 0); //getting size resets pos! + REQUIRE(ifs.tellg() == 0); // getting size resets pos! } -