mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-23 23:10:02 +02:00

* Setting pattern from memory (#218) * ToString accepts c-style arrays * fixed patwait time bug in validation * Introduced pattern class * compile for servers too * Python binding for Pattern * added scanParameters in Python * slsReceiver: avoid potential memory leak around Implementation::generalData * additional constructors for scanPrameters in python * bugfix: avoid potentital memory leak in receiver if called outside constructor context * added scanParameters in Python * additional constructors for scanPrameters in python * M3defaultpattern (#227) * default pattern for m3 and moench including Python bindings * M3settings (#228) * some changes to compile on RH7 and in the server to load the default chip status register at startup * Updated mythen3DeectorServer_developer executable with correct initialization at startup Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com> Co-authored-by: Anna Bergamaschi <anna.bergamaschi@psi.ch> * Pattern.h as a public header files (#229) * fixed buffer overflow but caused by using global instead of local enum * replacing out of range trimbits with edge values * replacing dac values that are out of range after interpolation * updated pybind11 to 2.6.2 * Mythen3 improved synchronization (#231) Disabling scans for multi module Mythen3, since there is no feedback of the detectors being ready startDetector first starts the slaves then the master acquire firs calls startDetector for the slaves then acquire on the master getMaster to read back from hardware which one is master * New server for JF to go with the new FW (#232) * Modified Jungfrau speed settings for HW1.0 - FW fix version 1.1.1, compilation date 210218 * Corrected bug. DBIT clk phase is implemented in both HW version 1.0 and 2.0. Previous version did not update the DBIT phase shift on the configuration of a speed. * fix for m3 scan with single module * m3 fw version * m3 server * bugfix for bottom when setting quad * new strategy for finding zmq based on cppzmq Co-authored-by: Dhanya Thattil <dhanya.thattil@psi.ch> Co-authored-by: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Co-authored-by: Alejandro Homs Puron <ahoms@esrf.fr> Co-authored-by: Anna Bergamaschi <anna.bergamaschi@psi.ch> Co-authored-by: Xiaoqiang Wang <xiaoqiangwang@gmail.com> Co-authored-by: lopez_c <carlos.lopez-cuenca@psi.ch>
652 lines
24 KiB
C++
652 lines
24 KiB
C++
#include "CmdProxy.h"
|
|
#include "catch.hpp"
|
|
#include "sls/Detector.h"
|
|
#include "sls/sls_detector_defs.h"
|
|
#include <array>
|
|
#include <sstream>
|
|
#include <thread>
|
|
|
|
#include "sls/versionAPI.h"
|
|
#include "test-CmdProxy-global.h"
|
|
#include "tests/globals.h"
|
|
|
|
using sls::CmdProxy;
|
|
using sls::Detector;
|
|
using test::GET;
|
|
using test::PUT;
|
|
|
|
/** temperature */
|
|
|
|
TEST_CASE("temp_fpgaext", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgaext", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgaext", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_fpgaext "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_fpgaext", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_10ge", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_10ge", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_10ge", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_10ge "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_10ge", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_dcdc", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_dcdc", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_dcdc", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_dcdc "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_dcdc", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_sodl", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_sodl", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_sodl", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_sodl "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_sodl", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_sodr", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_sodr", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_sodr", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_sodr "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_sodr", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_fpgafl", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgafl", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgafl", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_fpgafl "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_fpgafl", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("temp_fpgafr", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgafr", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
REQUIRE_NOTHROW(proxy.Call("temp_fpgafr", {}, 0, GET, oss));
|
|
std::string s = (oss.str()).erase(0, strlen("temp_fpgafr "));
|
|
REQUIRE(std::stoi(s) != -1);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("temp_fpgafr", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
/* dacs */
|
|
|
|
TEST_CASE("Setting and reading back EIGER dacs", "[.cmd][.dacs]") {
|
|
// vsvp, vtr, vrf, vrs, vsvn, vtgstv, vcmp_ll, vcmp_lr, vcal, vcmp_rl,
|
|
// rxb_rb, rxb_lb, vcmp_rr, vcp, vcn, vis, vthreshold
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
SECTION("vsvp") { test_dac(defs::VSVP, "vsvp", 5); }
|
|
SECTION("vtrim") { test_dac(defs::VTRIM, "vtrim", 1200); }
|
|
SECTION("vrpreamp") { test_dac(defs::VRPREAMP, "vrpreamp", 1500); }
|
|
SECTION("vrshaper") { test_dac(defs::VRSHAPER, "vrshaper", 1510); }
|
|
SECTION("vsvn") { test_dac(defs::VSVN, "vsvn", 3800); }
|
|
SECTION("vtgstv") { test_dac(defs::VTGSTV, "vtgstv", 2550); }
|
|
SECTION("vcmp_ll") { test_dac(defs::VCMP_LL, "vcmp_ll", 1400); }
|
|
SECTION("vcmp_lr") { test_dac(defs::VCMP_LR, "vcmp_lr", 1400); }
|
|
SECTION("vcal") { test_dac(defs::VCAL, "vcal", 1400); }
|
|
SECTION("vcmp_rl") { test_dac(defs::VCMP_RL, "vcmp_rl", 1400); }
|
|
SECTION("rxb_rb") { test_dac(defs::RXB_RB, "rxb_rb", 1400); }
|
|
SECTION("rxb_lb") { test_dac(defs::RXB_LB, "rxb_lb", 1400); }
|
|
SECTION("vcmp_rr") { test_dac(defs::VCMP_RR, "vcmp_rr", 1400); }
|
|
SECTION("vcp") { test_dac(defs::VCP, "vcp", 1400); }
|
|
SECTION("vcn") { test_dac(defs::VCN, "vcn", 1400); }
|
|
SECTION("vishaper") { test_dac(defs::VISHAPER, "vishaper", 1400); }
|
|
SECTION("iodelay") { test_dac(defs::IO_DELAY, "iodelay", 1400); }
|
|
SECTION("vthreshold") {
|
|
// Read out individual vcmp to be able to reset after
|
|
// the test is done
|
|
auto vcmp_ll = det.getDAC(defs::VCMP_LL, false);
|
|
auto vcmp_lr = det.getDAC(defs::VCMP_LR, false);
|
|
auto vcmp_rl = det.getDAC(defs::VCMP_RL, false);
|
|
auto vcmp_rr = det.getDAC(defs::VCMP_RR, false);
|
|
auto vcp = det.getDAC(defs::VCP, false);
|
|
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("vthreshold", {"1234"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "dac vthreshold 1234\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("vthreshold", {}, -1, GET, oss);
|
|
REQUIRE(oss.str() == "dac vthreshold 1234\n");
|
|
}
|
|
|
|
// Reset dacs after test
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setDAC(defs::VCMP_LL, vcmp_ll[i], false, {i});
|
|
det.setDAC(defs::VCMP_LR, vcmp_lr[i], false, {i});
|
|
det.setDAC(defs::VCMP_RL, vcmp_rl[i], false, {i});
|
|
det.setDAC(defs::VCMP_RR, vcmp_rr[i], false, {i});
|
|
det.setDAC(defs::VCP, vcp[i], false, {i});
|
|
}
|
|
}
|
|
// gotthard
|
|
REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET));
|
|
// mythen3
|
|
// REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET));
|
|
// REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vrshaper_n", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET));
|
|
// REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcal_n", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcal_p", {}, -1, GET));
|
|
// REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET));
|
|
// gotthard2
|
|
REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET));
|
|
// jungfrau
|
|
REQUIRE_THROWS(proxy.Call("vb_comp", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vdd_prot", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vin_com", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_prech", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_pixbuf", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vb_ds", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
/* acquisition */
|
|
|
|
/* Network Configuration (Detector<->Receiver) */
|
|
|
|
TEST_CASE("txndelay_left", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getTransmissionDelayLeft();
|
|
{
|
|
std::ostringstream oss1, oss2;
|
|
proxy.Call("txndelay_left", {"5000"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "txndelay_left 5000\n");
|
|
proxy.Call("txndelay_left", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "txndelay_left 5000\n");
|
|
}
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setTransmissionDelayLeft(prev_val[i]);
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("txndelay_left", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("txndelay_right", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getTransmissionDelayRight();
|
|
{
|
|
std::ostringstream oss1, oss2;
|
|
proxy.Call("txndelay_right", {"5000"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "txndelay_right 5000\n");
|
|
proxy.Call("txndelay_right", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "txndelay_right 5000\n");
|
|
}
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setTransmissionDelayRight(prev_val[i]);
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("txndelay_right", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
/* Eiger Specific */
|
|
|
|
TEST_CASE("subexptime", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto time = det.getSubExptime();
|
|
std::ostringstream oss1, oss2;
|
|
proxy.Call("subexptime", {"2.5us"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "subexptime 2.5us\n");
|
|
proxy.Call("subexptime", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "subexptime 2.5us\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setSubExptime(time[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("subexptime", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("subexptime", {"2.13"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("subdeadtime", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto time = det.getSubDeadTime();
|
|
std::ostringstream oss1, oss2;
|
|
proxy.Call("subdeadtime", {"500us"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "subdeadtime 500us\n");
|
|
proxy.Call("subdeadtime", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "subdeadtime 500us\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setSubDeadTime(time[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("subdeadtime", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("subdeadtime", {"2.13"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("overflow", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto previous = det.getOverFlowMode();
|
|
std::ostringstream oss1, oss2, oss3;
|
|
proxy.Call("overflow", {"1"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "overflow 1\n");
|
|
proxy.Call("overflow", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "overflow 1\n");
|
|
proxy.Call("overflow", {"0"}, -1, PUT, oss3);
|
|
REQUIRE(oss3.str() == "overflow 0\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setOverFlowMode(previous[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("overflow", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("flippeddatax", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto previous = det.getBottom();
|
|
std::ostringstream oss1, oss2, oss3;
|
|
proxy.Call("flippeddatax", {"1"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "flippeddatax 1\n");
|
|
proxy.Call("flippeddatax", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "flippeddatax 1\n");
|
|
proxy.Call("flippeddatax", {"0"}, -1, PUT, oss3);
|
|
REQUIRE(oss3.str() == "flippeddatax 0\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setBottom(previous[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("flippeddatax", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("ratecorr", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_dr = det.getDynamicRange().tsquash("inconsistent dr to test");
|
|
auto prev_tau = det.getRateCorrection();
|
|
det.setDynamicRange(16);
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("ratecorr", {"120"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "ratecorr 120ns\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("ratecorr", {}, -1, GET, oss);
|
|
REQUIRE(oss.str() == "ratecorr 120ns\n");
|
|
}
|
|
// may fail if default settings not loaded
|
|
// REQUIRE_NOTHROW(proxy.Call("ratecorr", {"-1"}, -1, PUT));
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("ratecorr", {"0"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "ratecorr 0ns\n");
|
|
}
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setRateCorrection(prev_tau[i], {i});
|
|
}
|
|
det.setDynamicRange(prev_dr);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("ratecorr", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("readnlines", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getPartialReadout();
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("readnlines", {"256"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "readnlines 256\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("readnlines", {}, -1, GET, oss);
|
|
REQUIRE(oss.str() == "readnlines 256\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("readnlines", {"16"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "readnlines 16\n");
|
|
}
|
|
REQUIRE_THROWS(proxy.Call("readnlines", {"0"}, -1, PUT));
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setPartialReadout(prev_val[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("readnlines", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("interruptsubframe", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getInterruptSubframe();
|
|
|
|
std::ostringstream oss1, oss2, oss3;
|
|
proxy.Call("interruptsubframe", {"1"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "interruptsubframe 1\n");
|
|
proxy.Call("interruptsubframe", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "interruptsubframe 1\n");
|
|
proxy.Call("interruptsubframe", {"0"}, -1, PUT, oss3);
|
|
REQUIRE(oss3.str() == "interruptsubframe 0\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setInterruptSubframe(prev_val[i], {i});
|
|
}
|
|
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("interruptsubframe", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("interruptsubframe", {"1"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("measuredperiod", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_frames = det.getNumberOfFrames().tsquash(
|
|
"inconsistent number of frames to test");
|
|
auto prev_timing =
|
|
det.getTimingMode().tsquash("inconsistent timing mode to test");
|
|
auto prev_period = det.getPeriod();
|
|
det.setNumberOfFrames(2);
|
|
det.setPeriod(std::chrono::seconds(1));
|
|
det.setTimingMode(defs::AUTO_TIMING);
|
|
det.startDetector();
|
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
|
std::ostringstream oss;
|
|
proxy.Call("measuredperiod", {}, -1, GET, oss);
|
|
std::string st = oss.str();
|
|
std::string s;
|
|
if (st.find('[') != std::string::npos) {
|
|
s = st.erase(0, strlen("measuredperiod ["));
|
|
} else {
|
|
s = st.erase(0, strlen("measuredperiod "));
|
|
}
|
|
double val = std::stod(s);
|
|
// REQUIRE(val >= 1.0);
|
|
REQUIRE(val < 2.0);
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setPeriod(prev_period[i], {i});
|
|
}
|
|
det.setNumberOfFrames(prev_frames);
|
|
det.setTimingMode(prev_timing);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("measuredperiod", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("measuredsubperiod", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_frames = det.getNumberOfFrames().tsquash(
|
|
"inconsistent number of frames to test");
|
|
auto prev_timing =
|
|
det.getTimingMode().tsquash("inconsistent timing mode to test");
|
|
auto prev_period = det.getPeriod();
|
|
auto prev_dr = det.getDynamicRange().tsquash("inconsistent dr to test");
|
|
det.setNumberOfFrames(1);
|
|
det.setPeriod(std::chrono::seconds(1));
|
|
det.setTimingMode(defs::AUTO_TIMING);
|
|
det.setDynamicRange(32);
|
|
det.startDetector();
|
|
std::this_thread::sleep_for(std::chrono::seconds(3));
|
|
std::ostringstream oss;
|
|
proxy.Call("measuredsubperiod", {}, -1, GET, oss);
|
|
std::string st = oss.str();
|
|
std::string s;
|
|
if (st.find('[') != std::string::npos) {
|
|
s = st.erase(0, strlen("measuredsubperiod ["));
|
|
} else {
|
|
s = st.erase(0, strlen("measuredsubperiod "));
|
|
}
|
|
double val = std::stod(s);
|
|
REQUIRE(val >= 0);
|
|
REQUIRE(val < 1000);
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setPeriod(prev_period[i], {i});
|
|
}
|
|
det.setNumberOfFrames(prev_frames);
|
|
det.setTimingMode(prev_timing);
|
|
det.setDynamicRange(prev_dr);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("measuredsubperiod", {}, -1, GET));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("activate", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getActive();
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("activate", {"1"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "activate 1\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("activate", {"1", "nopadding"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "activate 1 nopadding\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("activate", {"0", "padding"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "activate 0 padding\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("activate", {"0", "nopadding"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "activate 0 nopadding\n");
|
|
}
|
|
{
|
|
std::ostringstream oss;
|
|
proxy.Call("activate", {"1", "padding"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "activate 1 padding\n");
|
|
}
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setActive(prev_val[i], {i});
|
|
}
|
|
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("activate", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("activate", {"1"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("partialreset", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getPartialReset();
|
|
std::ostringstream oss1, oss2, oss3;
|
|
proxy.Call("partialreset", {"1"}, -1, PUT, oss1);
|
|
REQUIRE(oss1.str() == "partialreset 1\n");
|
|
proxy.Call("partialreset", {}, -1, GET, oss2);
|
|
REQUIRE(oss2.str() == "partialreset 1\n");
|
|
proxy.Call("partialreset", {"0"}, -1, PUT, oss3);
|
|
REQUIRE(oss3.str() == "partialreset 0\n");
|
|
for (int i = 0; i != det.size(); ++i) {
|
|
det.setPartialReset(prev_val[i], {i});
|
|
}
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("partialreset", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("partialreset", {"1"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("pulse", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_THROWS(proxy.Call("pulse", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
proxy.Call("pulse", {"1", "1", "5"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "pulse [1, 1, 5]\n");
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("pulse", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("pulse", {"1", "1", "5"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("pulsenmove", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_THROWS(proxy.Call("pulsenmove", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
proxy.Call("pulsenmove", {"1", "1", "5"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "pulsenmove [1, 1, 5]\n");
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("pulsenmove", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("pulsenmove", {"1", "1", "5"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("pulsechip", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
REQUIRE_THROWS(proxy.Call("pulsechip", {}, -1, GET));
|
|
std::ostringstream oss;
|
|
proxy.Call("pulsechip", {"1"}, -1, PUT, oss);
|
|
REQUIRE(oss.str() == "pulsechip 1\n");
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("pulsechip", {}, -1, GET));
|
|
REQUIRE_THROWS(proxy.Call("pulsechip", {"1"}, -1, PUT));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("quad", "[.cmd]") {
|
|
Detector det;
|
|
CmdProxy proxy(&det);
|
|
auto det_type = det.getDetectorType().squash();
|
|
if (det_type == defs::EIGER) {
|
|
auto prev_val = det.getQuad().tsquash("inconsistent quad to test");
|
|
// Quad only works with a single half module EIGER
|
|
std::ostringstream oss;
|
|
proxy.Call("quad", {}, -1, GET, oss);
|
|
REQUIRE(oss.str() == "quad 0\n");
|
|
det.setQuad(prev_val);
|
|
} else {
|
|
REQUIRE_THROWS(proxy.Call("quad", {}, -1, GET));
|
|
}
|
|
}
|