Dev/xilinx defaults and pattern (#888)

* implemented testbus, testfpga, set/get #frames, triggers, allowed that and for connection to client, also allowed, getnumchannels, configuremac, getrunstatus, setdetectorposition with dummy values

* connected kernelversion, hardwareversion, versions, framesl, triggersl, dr, timingmode, pattern (except patioctrl) thats there for altera ctb

* replaced set/get64Bit to set/getU64bit in all loadpattern.c for (ctb and m3 also)
This commit is contained in:
2024-01-11 18:01:08 +01:00
committed by GitHub
parent 9a08ecc5a5
commit c8bb70f876
26 changed files with 1433 additions and 465 deletions

View File

@ -23,7 +23,7 @@ TEST_CASE("Caller::patfname", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
REQUIRE_THROWS(caller.call("patfname", {}, -1, PUT));
REQUIRE_NOTHROW(caller.call("patfname", {}, -1, GET));
} else {
@ -35,7 +35,7 @@ TEST_CASE("Caller::pattern", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
// no proper test for put
REQUIRE_THROWS(caller.call("pattern", {}, -1, GET));
} else {
@ -47,7 +47,7 @@ TEST_CASE("Caller::savepattern", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
REQUIRE_THROWS(
caller.call("savepattern", {"/tmp/pattern.txt"}, -1, GET));
if (det.size() == 1) {
@ -108,7 +108,7 @@ TEST_CASE("Caller::patword", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
int addr = 0x23;
std::string saddr = ToStringHex(addr, 4);
auto prev_val = det.getPatternWord(addr);
@ -118,6 +118,12 @@ TEST_CASE("Caller::patword", "[.cmdcall]") {
REQUIRE(oss.str() ==
"patword [" + saddr + ", 0xc15004808d0a21a4]\n");
}
{
std::ostringstream oss;
caller.call("patword", {saddr, "0x815004808d0a21a4"}, -1, PUT, oss);
REQUIRE(oss.str() ==
"patword [" + saddr + ", 0x815004808d0a21a4]\n");
}
{
std::ostringstream oss;
caller.call("patword", {saddr, "0xaadf0"}, -1, PUT, oss);
@ -143,7 +149,7 @@ TEST_CASE("Caller::patlimits", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
auto prev_val = det.getPatternLoopAddresses(-1);
{
std::ostringstream oss;
@ -169,7 +175,7 @@ TEST_CASE("Caller::patloop", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) {
// m3 only has 3 levels
if (det_type == defs::MYTHEN3 && iLoop >= 3) {
@ -217,7 +223,7 @@ TEST_CASE("Caller::patnloop", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) {
// m3 only has 3 levels
if (det_type == defs::MYTHEN3 && iLoop >= 3) {
@ -262,7 +268,7 @@ TEST_CASE("Caller::patwait", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) {
// m3 only has 3 levels
if (det_type == defs::MYTHEN3 && iLoop >= 3) {
@ -307,7 +313,7 @@ TEST_CASE("Caller::patwaittime", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) {
// m3 only has 3 levels
if (det_type == defs::MYTHEN3 && iLoop >= 3) {
@ -352,7 +358,7 @@ TEST_CASE("Caller::patmask", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
auto prev_val = det.getPatternMask();
{
std::ostringstream oss;
@ -377,7 +383,7 @@ TEST_CASE("Caller::patsetbit", "[.cmdcall]") {
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) {
if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) {
auto prev_val = det.getPatternBitMask();
{
std::ostringstream oss;

View File

@ -87,13 +87,8 @@ TEST_CASE("CALLER::virtual", "[.cmdcall]") {
TEST_CASE("CALLER::versions", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type != defs::XILINX_CHIPTESTBOARD) {
REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET));
REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT));
} else {
REQUIRE_THROWS(caller.call("versions", {}, -1, GET));
}
REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET));
REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT));
}
TEST_CASE("CALLER::packageversion", "[.cmdcall]") {
@ -127,25 +122,15 @@ TEST_CASE("CALLER::detectorserverversion", "[.cmdcall]") {
TEST_CASE("CALLER::hardwareversion", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type != defs::XILINX_CHIPTESTBOARD) {
REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET));
REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT));
} else {
REQUIRE_THROWS(caller.call("hardwareversion", {}, -1, GET));
}
REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET));
REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT));
}
TEST_CASE("CALLER::kernelversion", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type != defs::XILINX_CHIPTESTBOARD) {
REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET));
REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT));
} else {
REQUIRE_THROWS(caller.call("kernelversion", {}, -1, GET));
}
REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET));
REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT));
}
TEST_CASE("CALLER::serialnumber", "[.cmdcall]") {
@ -959,7 +944,7 @@ TEST_CASE("CALLER::framesl", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) {
if (det_type == defs::EIGER) {
REQUIRE_THROWS(caller.call("framesl", {}, -1, GET));
} else {
REQUIRE_NOTHROW(caller.call("framesl", {}, -1, GET));
@ -970,7 +955,7 @@ TEST_CASE("CALLER::triggersl", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) {
if (det_type == defs::EIGER) {
REQUIRE_THROWS(caller.call("triggersl", {}, -1, GET));
} else {
REQUIRE_NOTHROW(caller.call("triggersl", {}, -1, GET));
@ -1017,45 +1002,41 @@ TEST_CASE("CALLER::dr", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type != defs::XILINX_CHIPTESTBOARD) {
if (det_type == defs::EIGER) {
auto dr = det.getDynamicRange().squash();
std::array<int, 4> vals{4, 8, 16, 32};
for (const auto val : vals) {
std::ostringstream oss1, oss2;
caller.call("dr", {std::to_string(val)}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n');
caller.call("dr", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n');
}
det.setDynamicRange(dr);
} else if (det_type == defs::MYTHEN3) {
auto dr = det.getDynamicRange().squash();
// not updated in firmware to support dr 1
std::array<int, 3> vals{8, 16, 32};
for (const auto val : vals) {
std::ostringstream oss1, oss2;
caller.call("dr", {std::to_string(val)}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n');
caller.call("dr", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n');
}
det.setDynamicRange(dr);
} else {
// For the other detectors we should get an error message
// except for dr 16
REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT));
REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT));
REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT));
if (det_type == defs::EIGER) {
auto dr = det.getDynamicRange().squash();
std::array<int, 4> vals{4, 8, 16, 32};
for (const auto val : vals) {
std::ostringstream oss1, oss2;
caller.call("dr", {"16"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr 16\n");
caller.call("dr", {"16"}, -1, PUT, oss2);
REQUIRE(oss2.str() == "dr 16\n");
caller.call("dr", {std::to_string(val)}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n');
caller.call("dr", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n');
}
det.setDynamicRange(dr);
} else if (det_type == defs::MYTHEN3) {
auto dr = det.getDynamicRange().squash();
// not updated in firmware to support dr 1
std::array<int, 3> vals{8, 16, 32};
for (const auto val : vals) {
std::ostringstream oss1, oss2;
caller.call("dr", {std::to_string(val)}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n');
caller.call("dr", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n');
}
det.setDynamicRange(dr);
} else {
REQUIRE_THROWS(caller.call("dr", {}, -1, GET));
// For the other detectors we should get an error message
// except for dr 16
REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT));
REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT));
REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT));
std::ostringstream oss1, oss2;
caller.call("dr", {"16"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "dr 16\n");
caller.call("dr", {"16"}, -1, PUT, oss2);
REQUIRE(oss2.str() == "dr 16\n");
}
}
@ -1070,66 +1051,61 @@ TEST_CASE("CALLER::timing", "[.cmdcall]") {
Detector det;
Caller caller(&det);
auto det_type = det.getDetectorType().squash();
if (det_type != defs::XILINX_CHIPTESTBOARD) {
auto prev_val = det.getTimingMode();
det.setTimingMode(defs::AUTO_TIMING);
auto prev_val = det.getTimingMode();
det.setTimingMode(defs::AUTO_TIMING);
{
std::ostringstream oss1, oss2;
caller.call("timing", {"auto"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing auto\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing auto\n");
}
{
std::ostringstream oss1, oss2;
caller.call("timing", {"trigger"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing trigger\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing trigger\n");
}
if (det_type == defs::EIGER) {
{
std::ostringstream oss1, oss2;
caller.call("timing", {"auto"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing auto\n");
caller.call("timing", {"gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing auto\n");
REQUIRE(oss2.str() == "timing gating\n");
}
{
std::ostringstream oss1, oss2;
caller.call("timing", {"trigger"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing trigger\n");
caller.call("timing", {"burst_trigger"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing burst_trigger\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing trigger\n");
REQUIRE(oss2.str() == "timing burst_trigger\n");
}
if (det_type == defs::EIGER) {
{
std::ostringstream oss1, oss2;
caller.call("timing", {"gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing gating\n");
}
{
std::ostringstream oss1, oss2;
caller.call("timing", {"burst_trigger"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing burst_trigger\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing burst_trigger\n");
}
REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT));
} else if (det_type == defs::MYTHEN3) {
{
std::ostringstream oss1, oss2;
caller.call("timing", {"gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing gating\n");
}
{
std::ostringstream oss1, oss2;
caller.call("timing", {"trigger_gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing trigger_gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing trigger_gating\n");
}
REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT));
} else {
REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT));
REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT));
REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT));
REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT));
} else if (det_type == defs::MYTHEN3) {
{
std::ostringstream oss1, oss2;
caller.call("timing", {"gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing gating\n");
}
for (int i = 0; i != det.size(); ++i) {
det.setTimingMode(prev_val[i], {i});
{
std::ostringstream oss1, oss2;
caller.call("timing", {"trigger_gating"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "timing trigger_gating\n");
caller.call("timing", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "timing trigger_gating\n");
}
REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT));
} else {
REQUIRE_THROWS(caller.call("timing", {}, -1, GET));
REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT));
REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT));
REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT));
}
for (int i = 0; i != det.size(); ++i) {
det.setTimingMode(prev_val[i], {i});
}
}