ctb address check, integration test added for ctb pattern

This commit is contained in:
maliakal_d 2019-04-18 17:18:01 +02:00
parent 45884a72da
commit 3d40fb2d2c
6 changed files with 121 additions and 49 deletions

View File

@ -2,8 +2,8 @@
#include <string> #include <string>
struct SingleDetectorConfig { struct SingleDetectorConfig {
slsDetectorDefs::detectorType type_enum = slsDetectorDefs::detectorType type_enum =
slsDetectorDefs::detectorType::EIGER; slsDetectorDefs::detectorType::CHIPTESTBOARD;
const std::string hostname = "beb031+beb032+"; const std::string hostname = "bchip173";
const std::string type_string = "Eiger"; const std::string type_string = "Chiptestboard";
const std::string my_ip = "129.129.205.171"; const std::string my_ip = "129.129.205.171";
}; };

View File

@ -224,7 +224,7 @@ TEST_CASE("Excersise all possible set timer functions", "[.integration]") {
// d.freeSharedMemory(); // d.freeSharedMemory();
// } // }
TEST_CASE("Eiger Dynamic Range with effect on rate correction and clock divider", "[.integration]") { TEST_CASE("Eiger Dynamic Range with effect on rate correction and clock divider", "[.eigerintegration]") {
SingleDetectorConfig c; SingleDetectorConfig c;
int ratecorr = 125; int ratecorr = 125;
@ -276,3 +276,84 @@ TEST_CASE("Eiger Dynamic Range with effect on rate correction and clock divider"
CHECK_THROWS_AS(m.setDynamicRange(4), sls::NonCriticalError); CHECK_THROWS_AS(m.setDynamicRange(4), sls::NonCriticalError);
CHECK(m.getRateCorrection()==0); CHECK(m.getRateCorrection()==0);
} }
TEST_CASE("Chiptestboard Loading Patterns", "[.ctbintegration]") {
SingleDetectorConfig c;
// pick up multi detector from shm id 0
multiSlsDetector m(0);
// ensure ctb detector type, hostname and online
REQUIRE(m.getDetectorTypeAsEnum()==c.type_enum);
REQUIRE(m.getHostname()==c.hostname);
REQUIRE(m.setOnline(true)==slsDetectorDefs::ONLINE_FLAG);
uint64_t word = 0;
int addr = 0;
int level = 0;
const int MAX_ADDR = 0x7fff;
word = 0xc000000000f47ff;
CHECK(m.setPatternIOControl(word) == word);
CHECK(m.setPatternIOControl(-1) == word);
CHECK(m.setPatternIOControl(0) == 0);
CHECK(m.setPatternClockControl(word) == word);
CHECK(m.setPatternClockControl(-1) == word);
CHECK(m.setPatternClockControl(0) == 0);
// testing pattern word will execute the pattern as well
addr = 0;
m.setPatternWord(addr, word);
CHECK(m.setPatternWord(addr, -1) == word);
addr = MAX_ADDR - 1;
m.setPatternWord(addr, word);
CHECK(m.setPatternWord(addr, -1) == word);
addr = 0x2FF;
m.setPatternWord(addr, word);
CHECK(m.setPatternWord(addr, -1) == word);
addr = MAX_ADDR;
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::NonCriticalError);
CHECK_THROWS_WITH(m.setPatternWord(addr, word), Catch::Matchers::Contains( "be between 0 and" ));
addr = -1;
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::NonCriticalError);
CHECK_THROWS_WITH(m.setPatternWord(addr, word), Catch::Matchers::Contains( "be between 0 and" ));
addr = 0x2FF;
for (level = 0; level < 3; ++level) {
CHECK(m.setPatternWaitAddr(level, addr) == addr);
CHECK(m.setPatternWaitAddr(level, -1) == addr);
}
CHECK_THROWS_WITH(m.setPatternWaitAddr(-1, addr), Catch::Matchers::Contains( "be between 0 and" ));
CHECK_THROWS_WITH(m.setPatternWaitAddr(0, MAX_ADDR), Catch::Matchers::Contains( "be between 0 and" ));
for (level = 0; level < 3; ++level) {
CHECK(m.setPatternWaitTime(level, word) == word);
CHECK(m.setPatternWaitTime(level, -1) == word);
}
CHECK_THROWS_WITH(m.setPatternWaitTime(-1, word), Catch::Matchers::Contains( "be between 0 and" ));
{
int startaddr = addr;
int stopaddr = addr + 5;
int nloops = 2;
for (level = 0; level < 3; ++level) {
m.setPatternLoops(level, startaddr, stopaddr, nloops);
auto r = m.getPatternLoops(level);
CHECK(r[0] == startaddr);
CHECK(r[1] == stopaddr);
CHECK(r[2] == nloops);
}
m.setPatternLoops(-1, startaddr, stopaddr, nloops);
auto r = m.getPatternLoops(-1);
CHECK(r[0] == startaddr);
CHECK(r[1] == stopaddr);
CHECK(r[2] == -1);
CHECK_THROWS_WITH(m.setPatternLoops(-1, startaddr, MAX_ADDR, nloops),
Catch::Matchers::Contains("be less than"));
CHECK_THROWS_WITH(m.setPatternLoops(-1, MAX_ADDR, stopaddr, nloops),
Catch::Matchers::Contains("be less than"));
}
}

View File

@ -1833,33 +1833,33 @@ int getAdcOffsetRegister(int adc) {
uint64_t writePatternIOControl(uint64_t word) { uint64_t writePatternIOControl(uint64_t word) {
if (word != -1) { if (word != -1) {
FILE_LOG(logINFO, ("Setting Pattern - I/O Control: 0x%llx\n", (long long int) word)); FILE_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); 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); uint64_t retval = get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
FILE_LOG(logDEBUG1, (" I/O Control: 0x%llx\n", (long long int) retval)); FILE_LOG(logDEBUG1, (" I/O Control retval: 0x%llx\n", (long long int) retval));
return retval; return retval;
} }
uint64_t writePatternClkControl(uint64_t word) { uint64_t writePatternClkControl(uint64_t word) {
if (word != -1) { if (word != -1) {
FILE_LOG(logINFO, ("Setting Pattern - Clock Control: 0x%llx\n", (long long int) word)); FILE_LOG(logINFO, ("Setting Pattern Clock Control: 0x%llx\n", (long long int) word));
set64BitReg(word, PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG); set64BitReg(word, PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG);
} }
uint64_t retval = get64BitReg(PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG); uint64_t retval = get64BitReg(PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG);
FILE_LOG(logDEBUG1, (" Clock Control: 0x%llx\n", (long long int) retval)); FILE_LOG(logDEBUG1, (" Clock Control retval: 0x%llx\n", (long long int) retval));
return retval; return retval;
} }
uint64_t readPatternWord(int addr) { uint64_t readPatternWord(int addr) {
// error (handled in tcp) // error (handled in tcp)
if (addr < 0 || addr > MAX_PATTERN_LENGTH) { if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. "
"Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH));
return -1; return -1;
} }
FILE_LOG(logDEBUG1, (" Reading Pattern - Word (addr:0x%x)\n", addr)); FILE_LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr));
uint32_t reg = PATTERN_CNTRL_REG; uint32_t reg = PATTERN_CNTRL_REG;
// overwrite with only addr // overwrite with only addr
@ -1874,7 +1874,7 @@ uint64_t readPatternWord(int addr) {
// read value // read value
uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
FILE_LOG(logDEBUG1, (" Word(addr:0x%x): 0x%llx\n", addr, (long long int) retval)); FILE_LOG(logDEBUG1, (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int) retval));
return retval; return retval;
} }
@ -1885,13 +1885,13 @@ uint64_t writePatternWord(int addr, uint64_t word) {
return readPatternWord(addr); return readPatternWord(addr);
// error (handled in tcp) // error (handled in tcp)
if (addr < 0 || addr > MAX_PATTERN_LENGTH) { if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. "
"Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH));
return -1; return -1;
} }
FILE_LOG(logINFO, ("Setting Pattern - Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word)); FILE_LOG(logINFO, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word));
uint32_t reg = PATTERN_CNTRL_REG; uint32_t reg = PATTERN_CNTRL_REG;
// write word // write word
@ -1914,9 +1914,9 @@ uint64_t writePatternWord(int addr, uint64_t word) {
int setPatternWaitAddress(int level, int addr) { int setPatternWaitAddress(int level, int addr) {
// error (handled in tcp) // error (handled in tcp)
if (addr > MAX_PATTERN_LENGTH) { if (addr >= MAX_PATTERN_LENGTH) {
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid addr 0x%x. " FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. "
"Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH));
return -1; return -1;
} }
@ -1941,20 +1941,20 @@ int setPatternWaitAddress(int level, int addr) {
mask = PATTERN_WAIT_2_ADDR_MSK; mask = PATTERN_WAIT_2_ADDR_MSK;
break; break;
default: default:
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid level 0x%x. " FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. "
"Should be between 0 and 2.\n", level)); "Should be between 0 and 2.\n", level));
return -1; return -1;
} }
// set // set
if (addr >= 0) { if (addr >= 0) {
FILE_LOG(logINFO, ("Setting Pattern - Wait Address (level:%d, addr:0x%x)\n", level, addr)); FILE_LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr));
bus_w(reg, ((addr << offset) & mask)); bus_w(reg, ((addr << offset) & mask));
} }
// get // get
uint32_t regval = bus_r((reg & mask) >> offset); uint32_t regval = bus_r((reg & mask) >> offset);
FILE_LOG(logDEBUG1, (" Wait Address (level:%d, addr:0x%x)\n", level, regval)); FILE_LOG(logDEBUG1, (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval));
return regval; return regval;
} }
@ -1976,38 +1976,29 @@ uint64_t setPatternWaitTime(int level, uint64_t t) {
regm = PATTERN_WAIT_TIMER_2_MSB_REG; regm = PATTERN_WAIT_TIMER_2_MSB_REG;
break; break;
default: default:
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Time. Invalid level %d. " FILE_LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. "
"Should be between 0 and 2.\n", level)); "Should be between 0 and 2.\n", level));
return -1; return -1;
} }
// set // set
if (t >= 0) { if (t >= 0) {
FILE_LOG(logINFO, ("Setting Pattern - Wait Time (level:%d, t:%lld)\n", level, (long long int)t)); FILE_LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level, (long long int)t));
set64BitReg(t, regl, regm); set64BitReg(t, regl, regm);
} }
// get // get
uint64_t regval = get64BitReg(regl, regm); uint64_t regval = get64BitReg(regl, regm);
FILE_LOG(logDEBUG1, (" Wait Time (level:%d, t:%lld)\n", level, (long long int)regval)); FILE_LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, (long long int)regval));
return regval; return regval;
} }
void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
// level 0-2, addr upto patternlength + 1 (checked at tcp) // (checked at tcp)
if ((level != -1) && if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) {
(*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) { FILE_LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, stopaddr:0x%x) must be "
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, level:%d, startaddr:0x%x, stopaddr:0x%x). " "less than 0x%x\n",
"Addr must be <= 0x%x\n",
level, *startAddr, *stopAddr, MAX_PATTERN_LENGTH));
}
//level -1, addr upto patternlength (checked at tcp)
else if ((level == -1) &&
(*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) {
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, startaddr:0x%x, stopaddr:0x%x). "
"Addr must be <= 0x%x\n",
*startAddr, *stopAddr, MAX_PATTERN_LENGTH)); *startAddr, *stopAddr, MAX_PATTERN_LENGTH));
} }
@ -2054,7 +2045,7 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
break; break;
default: default:
// already checked at tcp interface // already checked at tcp interface
FILE_LOG(logERROR, ("Cannot set Pattern - Pattern loop. Invalid level %d. " FILE_LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. "
"Should be between -1 and 2.\n", level)); "Should be between -1 and 2.\n", level));
*startAddr = 0; *startAddr = 0;
*stopAddr = 0; *stopAddr = 0;
@ -2065,7 +2056,7 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
if (level >= 0) { if (level >= 0) {
// set iteration // set iteration
if (*nLoop >= 0) { if (*nLoop >= 0) {
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, nLoop:%d)\n", FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, nLoop:%d)\n",
level, *nLoop)); level, *nLoop));
bus_w(nLoopReg, *nLoop); bus_w(nLoopReg, *nLoop);
} }
@ -2073,9 +2064,9 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
} }
// set // set
if (*startAddr != -1 && *stopAddr != -1) { if (*startAddr >= 0 && *stopAddr >= 0) {
// writing start and stop addr // writing start and stop addr
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n",
level, *startAddr, *stopAddr)); level, *startAddr, *stopAddr));
bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask)); bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask));
FILE_LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr))); FILE_LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr)));
@ -2084,11 +2075,11 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
// get // get
else { else {
*startAddr = ((bus_r(addr) & startMask) >> startOffset); *startAddr = ((bus_r(addr) & startMask) >> startOffset);
FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n", FILE_LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n",
level, *startAddr)); level, *startAddr));
*stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset);
FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n", FILE_LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n",
level, *stopAddr)); level, *stopAddr));
} }
} }

View File

@ -2753,9 +2753,9 @@ int set_pattern_word(int file_des) {
FILE_LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx\n", addr, (long long int)word)); FILE_LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx\n", addr, (long long int)word));
if (Server_VerifyLock() == OK) { if (Server_VerifyLock() == OK) {
// valid address // valid address
if (addr > MAX_PATTERN_LENGTH) { if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
ret = FAIL; ret = FAIL;
sprintf(mess, "Cannot set Pattern (Word, addr:0x%x). Addr must be <= 0x%x\n", sprintf(mess, "Cannot set Pattern (Word, addr:0x%x). Addr must be between 0 and 0x%x\n",
addr, MAX_PATTERN_LENGTH); addr, MAX_PATTERN_LENGTH);
FILE_LOG(logERROR, (mess)); FILE_LOG(logERROR, (mess));
} else { } else {
@ -2797,7 +2797,7 @@ int set_pattern_loop(int file_des) {
FILE_LOG(logERROR, (mess)); FILE_LOG(logERROR, (mess));
} }
// valid addr for loop level 0-2 // valid addr for loop level 0-2
else if (startAddr > MAX_PATTERN_LENGTH || stopAddr > MAX_PATTERN_LENGTH ) { else if (startAddr >= MAX_PATTERN_LENGTH || stopAddr >= MAX_PATTERN_LENGTH ) {
ret = FAIL; ret = FAIL;
sprintf(mess, "Cannot set Pattern loops. Address (start addr:0x%x and stop addr:0x%x) " sprintf(mess, "Cannot set Pattern loops. Address (start addr:0x%x and stop addr:0x%x) "
"should be less than 0x%x\n", startAddr, stopAddr, MAX_PATTERN_LENGTH); "should be less than 0x%x\n", startAddr, stopAddr, MAX_PATTERN_LENGTH);
@ -2846,9 +2846,9 @@ int set_pattern_wait_addr(int file_des) {
FILE_LOG(logERROR, (mess)); FILE_LOG(logERROR, (mess));
} }
// valid addr // valid addr
else if (addr > MAX_PATTERN_LENGTH) { else if (addr >= MAX_PATTERN_LENGTH) {
ret = FAIL; ret = FAIL;
sprintf(mess, "Cannot set Pattern wait address. Address (0x%x) should be less than 0x%x\n", addr, MAX_PATTERN_LENGTH); sprintf(mess, "Cannot set Pattern wait address. Address (0x%x) should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH);
FILE_LOG(logERROR, (mess)); FILE_LOG(logERROR, (mess));
} }
else { else {

View File

@ -6,5 +6,5 @@
#define APILIB 0x190405 #define APILIB 0x190405
#define APIRECEIVER 0x190405 #define APIRECEIVER 0x190405
#define APIGUI 0x190405 #define APIGUI 0x190405
#define APICTB 0x190418
#define APIEIGER 0x190418 #define APIEIGER 0x190418
#define APICTB 0x190418