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!
}
-