diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp index d9fc6972b..22354af78 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp @@ -8,7 +8,6 @@ #include "sls/Result.h" #include "sls/ToString.h" -#include "sls/logger.h" #include "sls/versionAPI.h" #include "test-Caller-global.h" #include "tests/globals.h" @@ -18,27 +17,6 @@ namespace sls { using test::GET; using test::PUT; -struct testCtbAcquireInfo { - defs::readoutMode readout_mode{defs::ANALOG_AND_DIGITAL}; - bool ten_giga{false}; - int num_adc_samples{5000}; - int num_dbit_samples{6000}; - int num_trans_samples{288}; - uint32_t adc_enable_1g{0xFFFFFF00}; - uint32_t adc_enable_10g{0xFF00FFFF}; - int dbit_offset{0}; - std::vector dbit_list{0, 12, 2, 43}; - bool dbit_reorder{false}; - uint32_t transceiver_mask{0x3}; -}; -testCtbAcquireInfo get_ctb_config_state(const Detector &det); -void set_ctb_config_state(Detector &det, - const testCtbAcquireInfo &ctb_config_info); -uint64_t calculate_ctb_image_size(const testCtbAcquireInfo &test_info); -void test_ctb_acquire_with_receiver(const testCtbAcquireInfo &test_info, - int64_t num_frames_to_acquire, - Detector &det, Caller &caller); - TEST_CASE("ctb_acquire_check_file_size", "[.cmdcall]") { Detector det; Caller caller(&det); @@ -152,142 +130,6 @@ TEST_CASE("ctb_acquire_check_file_size", "[.cmdcall]") { } } -testCtbAcquireInfo get_ctb_config_state(const Detector &det) { - return testCtbAcquireInfo{ - det.getReadoutMode().tsquash("inconsistent readout mode to test"), - det.getTenGiga().tsquash("inconsistent ten giga enable to test"), - det.getNumberOfAnalogSamples().tsquash( - "inconsistent number of analog samples to test"), - det.getNumberOfDigitalSamples().tsquash( - "inconsistent number of digital samples to test"), - det.getNumberOfTransceiverSamples().tsquash( - "inconsistent number of transceiver samples to test"), - det.getADCEnableMask().tsquash("inconsistent adc enable mask to test"), - det.getTenGigaADCEnableMask().tsquash( - "inconsistent ten giga adc enable mask to test"), - det.getRxDbitOffset().tsquash("inconsistent rx dbit offset to test"), - det.getRxDbitList().tsquash("inconsistent rx dbit list to test"), - det.getRxDbitReorder().tsquash("inconsistent rx dbit reorder to test"), - det.getTransceiverEnableMask().tsquash( - "inconsistent transceiver mask to test")}; -} - -void set_ctb_config_state(Detector &det, - const testCtbAcquireInfo &ctb_config_info) { - det.setReadoutMode(ctb_config_info.readout_mode); - det.setTenGiga(ctb_config_info.ten_giga); - det.setNumberOfAnalogSamples(ctb_config_info.num_adc_samples); - det.setNumberOfDigitalSamples(ctb_config_info.num_dbit_samples); - det.setNumberOfTransceiverSamples(ctb_config_info.num_trans_samples); - det.setADCEnableMask(ctb_config_info.adc_enable_1g); - det.setTenGigaADCEnableMask(ctb_config_info.adc_enable_10g); - det.setRxDbitOffset(ctb_config_info.dbit_offset); - det.setRxDbitList(ctb_config_info.dbit_list); - det.setRxDbitReorder(ctb_config_info.dbit_reorder); - det.setTransceiverEnableMask(ctb_config_info.transceiver_mask); -} - -uint64_t calculate_ctb_image_size(const testCtbAcquireInfo &test_info) { - uint64_t num_analog_bytes = 0, num_digital_bytes = 0, - num_transceiver_bytes = 0; - if (test_info.readout_mode == defs::ANALOG_ONLY || - test_info.readout_mode == defs::ANALOG_AND_DIGITAL) { - uint32_t adc_enable_mask = - (test_info.ten_giga ? test_info.adc_enable_10g - : test_info.adc_enable_1g); - int num_analog_chans = __builtin_popcount(adc_enable_mask); - const int num_bytes_per_sample = 2; - num_analog_bytes = - num_analog_chans * num_bytes_per_sample * test_info.num_adc_samples; - LOG(logDEBUG1) << "[Analog Databytes: " << num_analog_bytes << ']'; - } - - // digital channels - if (test_info.readout_mode == defs::DIGITAL_ONLY || - test_info.readout_mode == defs::ANALOG_AND_DIGITAL || - test_info.readout_mode == defs::DIGITAL_AND_TRANSCEIVER) { - int num_digital_samples = test_info.num_dbit_samples; - if (test_info.dbit_offset > 0) { - uint64_t num_digital_bytes_reserved = - num_digital_samples * sizeof(uint64_t); - num_digital_bytes_reserved -= test_info.dbit_offset; - num_digital_samples = num_digital_bytes_reserved / sizeof(uint64_t); - } - int num_digital_chans = test_info.dbit_list.size(); - if (num_digital_chans == 0) { - num_digital_chans = 64; - } - if (!test_info.dbit_reorder) { - uint32_t num_bits_per_sample = num_digital_chans; - if (num_bits_per_sample % 8 != 0) { - num_bits_per_sample += (8 - (num_bits_per_sample % 8)); - } - num_digital_bytes = (num_bits_per_sample / 8) * num_digital_samples; - } else { - uint32_t num_bits_per_bit = num_digital_samples; - if (num_bits_per_bit % 8 != 0) { - num_bits_per_bit += (8 - (num_bits_per_bit % 8)); - } - num_digital_bytes = num_digital_chans * (num_bits_per_bit / 8); - } - LOG(logDEBUG1) << "[Digital Databytes: " << num_digital_bytes << ']'; - } - // transceiver channels - if (test_info.readout_mode == defs::TRANSCEIVER_ONLY || - test_info.readout_mode == defs::DIGITAL_AND_TRANSCEIVER) { - int num_transceiver_chans = - __builtin_popcount(test_info.transceiver_mask); - const int num_bytes_per_channel = 8; - num_transceiver_bytes = num_transceiver_chans * num_bytes_per_channel * - test_info.num_trans_samples; - LOG(logDEBUG1) << "[Transceiver Databytes: " << num_transceiver_bytes - << ']'; - } - - uint64_t image_size = - num_analog_bytes + num_digital_bytes + num_transceiver_bytes; - LOG(logDEBUG1) << "Expected image size: " << image_size; - return image_size; -} - -void test_ctb_acquire_with_receiver(const testCtbAcquireInfo &test_info, - int64_t num_frames_to_acquire, - Detector &det, Caller &caller) { - - // save previous state - testFileInfo prev_file_info = get_file_state(det); - testCommonDetAcquireInfo prev_det_config_info = - // overwrite exptime if not using virtual ctb server - get_common_acquire_config_state(det); - testCtbAcquireInfo prev_ctb_config_info = get_ctb_config_state(det); - - // defaults - testFileInfo test_file_info; - set_file_state(det, test_file_info); - testCommonDetAcquireInfo det_config; - det_config.num_frames_to_acquire = num_frames_to_acquire; - set_common_acquire_config_state(det, det_config); - - // set ctb config - set_ctb_config_state(det, test_info); - - // acquire - test_acquire_with_receiver(caller, std::chrono::seconds{2}); - - // check frames caught - test_frames_caught(det, num_frames_to_acquire); - - // check file size (assuming local pc) - uint64_t expected_image_size = calculate_ctb_image_size(test_info); - test_acquire_binary_file_size(test_file_info, num_frames_to_acquire, - expected_image_size); - - // restore previous state - set_file_state(det, prev_file_info); - set_common_acquire_config_state(det, prev_det_config_info); - set_ctb_config_state(det, prev_ctb_config_info); -} - /* dacs */ TEST_CASE("dacname", "[.cmdcall]") { diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp index 0604666d4..c04ccfb8b 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp @@ -4,6 +4,7 @@ #include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" +#include "sls/logger.h" #include "tests/globals.h" namespace sls { @@ -152,4 +153,153 @@ void set_common_acquire_config_state( det.setPeriod(det_config_info.period); } +testCtbAcquireInfo get_ctb_config_state(const Detector &det) { + testCtbAcquireInfo ctb_config_info{ + det.getReadoutMode().tsquash("inconsistent readout mode to test"), + true, + det.getNumberOfAnalogSamples().tsquash( + "inconsistent number of analog samples to test"), + det.getNumberOfDigitalSamples().tsquash( + "inconsistent number of digital samples to test"), + det.getNumberOfTransceiverSamples().tsquash( + "inconsistent number of transceiver samples to test"), + 0, + det.getTenGigaADCEnableMask().tsquash( + "inconsistent ten giga adc enable mask to test"), + det.getRxDbitOffset().tsquash("inconsistent rx dbit offset to test"), + det.getRxDbitList().tsquash("inconsistent rx dbit list to test"), + det.getRxDbitReorder().tsquash("inconsistent rx dbit reorder to test"), + det.getTransceiverEnableMask().tsquash( + "inconsistent transceiver mask to test")}; + + if (det.getDetectorType().tsquash("inconsistent detector type to test") == + slsDetectorDefs::CHIPTESTBOARD) { + ctb_config_info.ten_giga = + det.getTenGiga().tsquash("inconsistent ten giga enable to test"); + ctb_config_info.adc_enable_1g = det.getADCEnableMask().tsquash( + "inconsistent adc enable mask to test"); + } + return ctb_config_info; +} + +void set_ctb_config_state(Detector &det, + const testCtbAcquireInfo &ctb_config_info) { + det.setReadoutMode(ctb_config_info.readout_mode); + if (det.getDetectorType().tsquash("inconsistent detector type to test") == + slsDetectorDefs::CHIPTESTBOARD) { + det.setTenGiga(ctb_config_info.ten_giga); + det.setADCEnableMask(ctb_config_info.adc_enable_1g); + } + det.setNumberOfAnalogSamples(ctb_config_info.num_adc_samples); + det.setNumberOfDigitalSamples(ctb_config_info.num_dbit_samples); + det.setNumberOfTransceiverSamples(ctb_config_info.num_trans_samples); + det.setTenGigaADCEnableMask(ctb_config_info.adc_enable_10g); + det.setRxDbitOffset(ctb_config_info.dbit_offset); + det.setRxDbitList(ctb_config_info.dbit_list); + det.setRxDbitReorder(ctb_config_info.dbit_reorder); + det.setTransceiverEnableMask(ctb_config_info.transceiver_mask); +} + +uint64_t calculate_ctb_image_size(const testCtbAcquireInfo &test_info) { + uint64_t num_analog_bytes = 0, num_digital_bytes = 0, + num_transceiver_bytes = 0; + if (test_info.readout_mode == defs::ANALOG_ONLY || + test_info.readout_mode == defs::ANALOG_AND_DIGITAL) { + uint32_t adc_enable_mask = + (test_info.ten_giga ? test_info.adc_enable_10g + : test_info.adc_enable_1g); + int num_analog_chans = __builtin_popcount(adc_enable_mask); + const int num_bytes_per_sample = 2; + num_analog_bytes = + num_analog_chans * num_bytes_per_sample * test_info.num_adc_samples; + LOG(logDEBUG1) << "[Analog Databytes: " << num_analog_bytes << ']'; + } + + // digital channels + if (test_info.readout_mode == defs::DIGITAL_ONLY || + test_info.readout_mode == defs::ANALOG_AND_DIGITAL || + test_info.readout_mode == defs::DIGITAL_AND_TRANSCEIVER) { + int num_digital_samples = test_info.num_dbit_samples; + if (test_info.dbit_offset > 0) { + uint64_t num_digital_bytes_reserved = + num_digital_samples * sizeof(uint64_t); + num_digital_bytes_reserved -= test_info.dbit_offset; + num_digital_samples = num_digital_bytes_reserved / sizeof(uint64_t); + } + int num_digital_chans = test_info.dbit_list.size(); + if (num_digital_chans == 0) { + num_digital_chans = 64; + } + if (!test_info.dbit_reorder) { + uint32_t num_bits_per_sample = num_digital_chans; + if (num_bits_per_sample % 8 != 0) { + num_bits_per_sample += (8 - (num_bits_per_sample % 8)); + } + num_digital_bytes = (num_bits_per_sample / 8) * num_digital_samples; + } else { + uint32_t num_bits_per_bit = num_digital_samples; + if (num_bits_per_bit % 8 != 0) { + num_bits_per_bit += (8 - (num_bits_per_bit % 8)); + } + num_digital_bytes = num_digital_chans * (num_bits_per_bit / 8); + } + LOG(logDEBUG1) << "[Digital Databytes: " << num_digital_bytes << ']'; + } + // transceiver channels + if (test_info.readout_mode == defs::TRANSCEIVER_ONLY || + test_info.readout_mode == defs::DIGITAL_AND_TRANSCEIVER) { + int num_transceiver_chans = + __builtin_popcount(test_info.transceiver_mask); + const int num_bytes_per_channel = 8; + num_transceiver_bytes = num_transceiver_chans * num_bytes_per_channel * + test_info.num_trans_samples; + LOG(logDEBUG1) << "[Transceiver Databytes: " << num_transceiver_bytes + << ']'; + } + + uint64_t image_size = + num_analog_bytes + num_digital_bytes + num_transceiver_bytes; + LOG(logDEBUG1) << "Expected image size: " << image_size; + return image_size; +} + +void test_ctb_acquire_with_receiver(const testCtbAcquireInfo &test_info, + int64_t num_frames_to_acquire, + Detector &det, Caller &caller) { + + // save previous state + testFileInfo prev_file_info = get_file_state(det); + testCommonDetAcquireInfo prev_det_config_info = + // overwrite exptime if not using virtual ctb server + get_common_acquire_config_state(det); + testCtbAcquireInfo prev_ctb_config_info = get_ctb_config_state(det); + + // defaults + testFileInfo test_file_info; + set_file_state(det, test_file_info); + testCommonDetAcquireInfo det_config; + det_config.num_frames_to_acquire = num_frames_to_acquire; + set_common_acquire_config_state(det, det_config); + + // set ctb config + set_ctb_config_state(det, test_info); + + // acquire + REQUIRE_NOTHROW( + test_acquire_with_receiver(caller, std::chrono::seconds{2})); + + // check frames caught + REQUIRE_NOTHROW(test_frames_caught(det, num_frames_to_acquire)); + + // check file size (assuming local pc) + uint64_t expected_image_size = calculate_ctb_image_size(test_info); + REQUIRE_NOTHROW(test_acquire_binary_file_size( + test_file_info, num_frames_to_acquire, expected_image_size)); + + // restore previous state + set_file_state(det, prev_file_info); + set_common_acquire_config_state(det, prev_det_config_info); + set_ctb_config_state(det, prev_ctb_config_info); +} + } // namespace sls diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-global.h b/slsDetectorSoftware/tests/Caller/test-Caller-global.h index aa08c4332..2d9345623 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-global.h +++ b/slsDetectorSoftware/tests/Caller/test-Caller-global.h @@ -27,6 +27,20 @@ struct testCommonDetAcquireInfo { std::chrono::nanoseconds period{std::chrono::milliseconds{2}}; }; +struct testCtbAcquireInfo { + defs::readoutMode readout_mode{defs::ANALOG_AND_DIGITAL}; + bool ten_giga{false}; + int num_adc_samples{5000}; + int num_dbit_samples{6000}; + int num_trans_samples{288}; + uint32_t adc_enable_1g{0xFFFFFF00}; + uint32_t adc_enable_10g{0xFF00FFFF}; + int dbit_offset{0}; + std::vector dbit_list{0, 12, 2, 43}; + bool dbit_reorder{false}; + uint32_t transceiver_mask{0x3}; +}; + void test_valid_port_caller(const std::string &command, const std::vector &arguments, int detector_id, int action); @@ -50,4 +64,12 @@ testCommonDetAcquireInfo get_common_acquire_config_state(const Detector &det); void set_common_acquire_config_state( Detector &det, const testCommonDetAcquireInfo &det_config_info); +testCtbAcquireInfo get_ctb_config_state(const Detector &det); +void set_ctb_config_state(Detector &det, + const testCtbAcquireInfo &ctb_config_info); +uint64_t calculate_ctb_image_size(const testCtbAcquireInfo &test_info); +void test_ctb_acquire_with_receiver(const testCtbAcquireInfo &test_info, + int64_t num_frames_to_acquire, + Detector &det, Caller &caller); + } // namespace sls