From e1e46f411f1f003288d07a986e30dce22648639c Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sat, 3 Jun 2023 18:37:56 +0200 Subject: [PATCH] AcquisitionDevice: refactor to make it less FPGA dependent --- receiver/JFJochReceiverTest.cpp | 6 +- receiver/host/AcquisitionDevice.cpp | 169 +----------------------- receiver/host/AcquisitionDevice.h | 35 ++--- receiver/host/FPGAAcquisitionDevice.cpp | 166 ++++++++++++++++++++++- receiver/host/FPGAAcquisitionDevice.h | 23 +++- receiver/host/HLSSimulatedDevice.cpp | 9 +- receiver/host/HLSSimulatedDevice.h | 5 +- receiver/host/LinuxSocketDevice.cpp | 38 +----- receiver/host/LinuxSocketDevice.h | 14 +- receiver/host/MlxRawEthDevice.cpp | 39 ++---- receiver/host/MlxRawEthDevice.h | 13 +- receiver/host/MockAcquisitionDevice.cpp | 29 +--- receiver/host/MockAcquisitionDevice.h | 13 +- receiver/host/PCIExpressDevice.cpp | 8 +- receiver/host/PCIExpressDevice.h | 5 +- receiver/jfjoch_action_test.cpp | 15 +-- receiver/jfjoch_receiver.cpp | 16 +-- tests/FPGAIntegrationTest.cpp | 1 + 18 files changed, 260 insertions(+), 344 deletions(-) diff --git a/receiver/JFJochReceiverTest.cpp b/receiver/JFJochReceiverTest.cpp index 664bcb2e..39f44fa9 100644 --- a/receiver/JFJochReceiverTest.cpp +++ b/receiver/JFJochReceiverTest.cpp @@ -92,8 +92,10 @@ bool JFJochReceiverTest(JFJochProtoBuf::ReceiverOutput &output, Logger &logger, for (int i = 0; i < x.GetDataStreamsNum(); i++) { uint32_t module0 = x.GetFirstModuleOfDataStream(i); for (int m = 0; m < x.GetModulesNum(i); m++) { - memcpy(raw_expected_image.data() + (module0 + m) * RAW_MODULE_SIZE, - aq_devices[i]->GetInternalGeneratorFrame().data(), RAW_MODULE_SIZE * sizeof(uint16_t)); + auto int_gen_frame = aq_devices[i]->GetInternalGeneratorFrame(); + if (int_gen_frame.size() == RAW_MODULE_SIZE) + memcpy(raw_expected_image.data() + (module0 + m) * RAW_MODULE_SIZE, int_gen_frame.data(), + RAW_MODULE_SIZE * sizeof(uint16_t)); } } diff --git a/receiver/host/AcquisitionDevice.cpp b/receiver/host/AcquisitionDevice.cpp index 02cc3b93..9736a892 100644 --- a/receiver/host/AcquisitionDevice.cpp +++ b/receiver/host/AcquisitionDevice.cpp @@ -7,11 +7,9 @@ #include #include -#include #include #include #include -#include #include "../../common/JFJochException.h" #include "AcquisitionDevice.h" @@ -36,12 +34,9 @@ void *mmap_acquisition_buffer(size_t size, int16_t numa_node) { } AcquisitionDevice::AcquisitionDevice(uint16_t in_data_stream) : -buffer_err(RAW_MODULE_SIZE), internal_pkt_gen_frame(RAW_MODULE_SIZE) { +buffer_err(RAW_MODULE_SIZE) { logger = nullptr; data_stream = in_data_stream; - - for (int i = 0; i < RAW_MODULE_SIZE; i++) - internal_pkt_gen_frame[i] = i % 65536; } bool AcquisitionDevice::IsFullModuleCollected(size_t frame, uint8_t module_number) const { @@ -52,32 +47,7 @@ uint64_t AcquisitionDevice::GetBufferHandle(size_t frame, uint8_t module_number) return counters.GetBufferHandle(frame, module_number); } -void AcquisitionDevice::FillActionRegister(const DiffractionExperiment& x, ActionConfig &job) { - std::random_device rd; - std::uniform_int_distribution dist; - data_collection_id = dist(rd); - - job.nmodules = x.GetModulesNum(data_stream); - job.nframes = x.GetFrameNum(); - job.one_over_energy = std::lround((1<<20)/ x.GetPhotonEnergy_keV()); - job.nstorage_cells = x.GetStorageCellNumber() - 1; - job.mode = data_collection_id << 16; - - if (fpga_non_blocking_mode) - job.mode |= MODE_NONBLOCKING_ON_WR; - - if ((x.GetDetectorMode() == DetectorMode::Conversion) && x.GetConversionOnFPGA()) - job.mode |= MODE_CONV; - - if (x.IsUsingInternalPacketGen()) - job.mode |= MODE_INTERNAL_PACKET_GEN; -} - void AcquisitionDevice::PrepareAction(const DiffractionExperiment &experiment) { - if (!HW_IsIdle()) - throw(JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, - "Hardware action running prior to start of data acquisition")); - if (experiment.GetModulesNum(data_stream) > max_modules) throw(JFJochException(JFJochExceptionCategory::InputParameterAboveMax, "Number of modules exceeds max possible for FPGA")); @@ -88,10 +58,6 @@ void AcquisitionDevice::PrepareAction(const DiffractionExperiment &experiment) { void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) { HW_SetCancelDataCollectionBit(); - if (!HW_IsIdle()) - throw(JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, - "Hardware action running prior to start of data acquisition")); - if (experiment.GetModulesNum(data_stream) > max_modules) throw(JFJochException(JFJochExceptionCategory::InputParameterAboveMax, "Number of modules exceeds max possible for FPGA")); @@ -107,29 +73,10 @@ void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) { completion_vector.Reset(experiment, data_stream); expected_frames = experiment.GetFrameNum(); - ActionConfig cfg_in{}, cfg_out{}; - - FillActionRegister(experiment, cfg_in); - HW_WriteActionRegister(&cfg_in); - HW_ReadActionRegister(&cfg_out); - - if (experiment.IsUsingInternalPacketGen()) - CopyInternalPacketGenFrameToDeviceBuffer(); - - if (cfg_out.mode != cfg_in.mode) - throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, - "Mismatch between expected and actual values of configuration registers (mode)"); - if (cfg_out.nframes != cfg_in.nframes) - throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, - "Mismatch between expected and actual values of configuration registers (Frames per trigger)"); - if (cfg_out.nmodules != cfg_in.nmodules) - throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, - "Mismatch between expected and actual values of configuration registers (#modules)"); - // Ensure internal WR queue is empty work_request_queue.Clear(); - HW_StartAction(); + HW_StartAction(experiment); for (uint32_t i = 0; i < buffer_device.size(); i++) SendWorkRequest(i); @@ -146,11 +93,6 @@ void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) { logger->Info("Started"); } -void AcquisitionDevice::CopyInternalPacketGenFrameToDeviceBuffer() { - memcpy(buffer_device[0], internal_pkt_gen_frame.data(), - RAW_MODULE_SIZE * sizeof(uint16_t)); -} - int64_t AcquisitionDevice::CalculateDelay(size_t curr_frame, uint16_t module_number) const { return counters.CalculateDelay(curr_frame, module_number); } @@ -159,18 +101,6 @@ void AcquisitionDevice::WaitForFrame(size_t curr_frame, uint16_t module_number) counters.WaitForFrame(curr_frame, module_number); } -void AcquisitionDevice::SetCustomInternalGeneratorFrame(const std::vector &v) { - if (v.size() != RAW_MODULE_SIZE) - throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, - "Error in size of custom internal generator frame"); - for (int i = 0; i < RAW_MODULE_SIZE; i++) - internal_pkt_gen_frame[i] = v[i]; -} - -const std::vector &AcquisitionDevice::GetInternalGeneratorFrame() const { - return internal_pkt_gen_frame; -} - void AcquisitionDevice::WaitForActionComplete() { auto c = work_completion_queue.GetBlocking(); @@ -200,8 +130,6 @@ void AcquisitionDevice::WaitForActionComplete() { end_time = std::chrono::system_clock::now(); HW_SetCancelDataCollectionBit(); HW_EndAction(); - while (!HW_IsIdle()) - std::this_thread::sleep_for(std::chrono::milliseconds(1)); } void AcquisitionDevice::SendWorkRequest(uint32_t handle) { @@ -288,95 +216,6 @@ void AcquisitionDevice::EnableLogging(Logger *in_logger) { logger = in_logger; } -inline JFJochProtoBuf::FPGAFIFOStatus FIFO_check(uint32_t fifo_register, uint16_t pos_empty, uint16_t pos_full) { - if (std::bitset<32>(fifo_register).test(pos_empty)) - return JFJochProtoBuf::FPGAFIFOStatus::EMPTY; - if (std::bitset<32>(fifo_register).test(pos_full)) - return JFJochProtoBuf::FPGAFIFOStatus::FULL; - return JFJochProtoBuf::FPGAFIFOStatus::PARTIAL; -} - -JFJochProtoBuf::FPGAStatus AcquisitionDevice::GetStatus() const { - ActionStatus status{}; - ActionEnvParams env{}; - - HW_GetStatus(&status); - HW_GetEnvParams(&env); - - JFJochProtoBuf::FPGAStatus ret; - auto full_status_register = status.ctrl_reg; - ret.set_full_status_register(full_status_register); - - ret.set_stalls_hbm(status.pipeline_stalls_hbm); - ret.set_stalls_host(status.pipeline_stalls_host); - - ret.set_max_modules(status.max_modules); - ret.set_git_sha1(status.git_sha1); - - (*ret.mutable_fifo_status())["Conversion input (data)"] = FIFO_check(status.fifo_status, 0, 1); - (*ret.mutable_fifo_status())["Conversion input (cmd)"] = FIFO_check(status.fifo_status, 2, 3); - (*ret.mutable_fifo_status())["UDP"] = FIFO_check(status.fifo_status, 6, 7); - (*ret.mutable_fifo_status())["Work Request"] = FIFO_check(status.fifo_status, 12, 13); - (*ret.mutable_fifo_status())["Work Completion"] = FIFO_check(status.fifo_status, 14, 15); - (*ret.mutable_fifo_status())["Host mem (data)"] = FIFO_check(status.fifo_status, 8, 9); - (*ret.mutable_fifo_status())["Host mem (cmd)"] = FIFO_check(status.fifo_status, 10, 11); - (*ret.mutable_fifo_status())["Data FIFO #8"] = FIFO_check(status.fifo_status, 16, 17); - (*ret.mutable_fifo_status())["Addr FIFO #3"] = FIFO_check(status.fifo_status, 18, 19); - - ret.set_fpga_idle(HW_IsIdle()); - - ret.set_packets_ether(status.packets_eth); - ret.set_packets_udp(status.packets_udp); - ret.set_packets_icmp(status.packets_icmp); - ret.set_packets_jfjoch(status.packets_processed); - ret.set_packets_sls(status.packets_sls); - ret.set_error_eth(status.udp_err_eth); - ret.set_error_packet_len(status.udp_err_len); - ret.set_cancel_bit(full_status_register & (1<<2)); - ret.set_host_writer_idle(full_status_register & (1<<4)); - ret.set_frame_statistics_alignment_err(full_status_register & (1 << 24)); - ret.set_frame_statistics_tlast_err(full_status_register & (1 << 25)); - ret.set_frame_statistics_work_req_err(full_status_register & (1 << 26)); - - ret.set_mailbox_status_reg(env.mailbox_status_reg); - ret.set_mailbox_err_reg(env.mailbox_err_reg); - - ret.set_fpga_temp_degc(env.fpga_temp_C); - - ret.set_current_edge_12v_a(static_cast(env.fpga_pcie_12V_I_mA) / 1000.0); - ret.set_voltage_edge_12v_v(static_cast(env.fpga_pcie_12V_V_mV) / 1000.0); - - ret.set_current_edge_3p3v_a(static_cast(env.fpga_pcie_3p3V_I_mA) / 1000.0); - ret.set_voltage_edge_3p3v_v(static_cast(env.fpga_pcie_3p3V_V_mV) / 1000.0); - - ret.set_pcie_c2h_beats(env.pcie_c2h_beats); - ret.set_pcie_h2c_beats(env.pcie_h2c_beats); - ret.set_pcie_c2h_descriptors(env.pcie_c2h_descriptors); - ret.set_pcie_h2c_descriptors(env.pcie_h2c_descriptors); - ret.set_pcie_c2h_status(env.pcie_c2h_status); - ret.set_pcie_h2c_status(env.pcie_h2c_status); - - ret.set_ethernet_rx_aligned(env.ethernet_aligned); - ret.set_hbm_temp_0_degc(env.hbm_0_temp_C); - ret.set_hbm_temp_1_degc(env.hbm_1_temp_C); - ret.set_slowest_head(GetSlowestHead()); - return ret; -} - -std::string AcquisitionDevice::GetMACAddress() const { - return MacAddressToStr(HW_GetMACAddress()); -} - -std::string AcquisitionDevice::GetIPv4Address() const { - return IPv4AddressToStr(HW_GetIPv4Address()); -} - -ActionConfig AcquisitionDevice::ReadActionRegister() { - ActionConfig cfg{}; - HW_ReadActionRegister(&cfg); - return cfg; -} - int32_t AcquisitionDevice::GetNUMANode() const { return -1; } @@ -400,7 +239,3 @@ uint32_t AcquisitionDevice::GetExptime(size_t curr_frame, uint16_t module_number uint64_t AcquisitionDevice::GetTimestamp(size_t curr_frame, uint16_t module_number) const { return counters.GetTimestamp(curr_frame, module_number); } - -void AcquisitionDevice::SetFPGANonBlockingMode(bool input) { - fpga_non_blocking_mode = input; -} \ No newline at end of file diff --git a/receiver/host/AcquisitionDevice.h b/receiver/host/AcquisitionDevice.h index 40b3e91d..6a1a244c 100644 --- a/receiver/host/AcquisitionDevice.h +++ b/receiver/host/AcquisitionDevice.h @@ -18,7 +18,6 @@ #include "../../common/ThreadSafeFIFO.h" #include "../../jungfrau/JFModuleGainCalibration.h" -#include "ActionConfig.h" #include "AcquisitionOnlineCounters.h" #include "Completion.h" #include "AcquisitionOfflineCounters.h" @@ -27,45 +26,29 @@ void *mmap_acquisition_buffer(size_t size, int16_t numa_node); class AcquisitionDevice { uint64_t bytes_received = 0; - bool fpga_non_blocking_mode = true; std::vector buffer_err; std::chrono::time_point start_time; std::chrono::time_point end_time; - void FillActionRegister(const DiffractionExperiment& x, ActionConfig& job); - int64_t expected_frames; AcquisitionOnlineCounters counters; AcquisitionOfflineCounters completion_vector; - virtual void HW_WriteActionRegister(const ActionConfig *job) = 0; - virtual void HW_ReadActionRegister(ActionConfig *job) = 0; - virtual void HW_StartAction() = 0; - - virtual bool HW_IsIdle() const = 0; + virtual void HW_StartAction(const DiffractionExperiment& experiment) = 0; virtual void HW_SetCancelDataCollectionBit() = 0; - virtual void HW_GetStatus(ActionStatus *status) const = 0; - virtual void HW_GetEnvParams(ActionEnvParams *status) const { - memset(status, 0, sizeof(ActionEnvParams)); - } - virtual uint32_t HW_GetIPv4Address() const = 0; - virtual uint64_t HW_GetMACAddress() const = 0; virtual void HW_EndAction() {}; // do clean-up after action is done - virtual void CopyInternalPacketGenFrameToDeviceBuffer(); virtual void StartSendingWorkRequests() {}; protected: ThreadSafeFIFO work_completion_queue; ThreadSafeFIFO work_request_queue; std::vector buffer_device; - std::vector internal_pkt_gen_frame; uint16_t data_stream; Logger *logger; uint32_t max_modules = 1; - uint16_t data_collection_id = 0; explicit AcquisitionDevice(uint16_t data_stream); @@ -89,11 +72,7 @@ public: uint64_t GetBytesReceived() const; void SaveStatistics(const DiffractionExperiment &experiment, JFJochProtoBuf::AcquisitionDeviceStatistics &statistics) const; - JFJochProtoBuf::FPGAStatus GetStatus() const; - - // Internal frame generator - void SetCustomInternalGeneratorFrame(const std::vector &v); - const std::vector &GetInternalGeneratorFrame() const; + virtual JFJochProtoBuf::FPGAStatus GetStatus() const { return JFJochProtoBuf::FPGAStatus(); }; const int16_t *GetFrameBuffer(size_t frame_number, uint16_t module_number) const; @@ -116,14 +95,16 @@ public: uint32_t GetExptime(size_t curr_frame, uint16_t module_number) const; bool IsFullModuleCollected(size_t frame, uint8_t module_number) const; - ActionConfig ReadActionRegister(); bool IsDone() const; - std::string GetIPv4Address() const; - std::string GetMACAddress() const; + virtual std::string GetIPv4Address() const = 0; + virtual std::string GetMACAddress() const = 0; virtual uint16_t GetUDPPort() const; virtual int32_t GetNUMANode() const; - void SetFPGANonBlockingMode(bool input); + + virtual const std::vector GetInternalGeneratorFrame() const { + return {}; + } }; diff --git a/receiver/host/FPGAAcquisitionDevice.cpp b/receiver/host/FPGAAcquisitionDevice.cpp index 4e7ae9ec..586335ce 100644 --- a/receiver/host/FPGAAcquisitionDevice.cpp +++ b/receiver/host/FPGAAcquisitionDevice.cpp @@ -2,11 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "FPGAAcquisitionDevice.h" - -void FPGAAcquisitionDevice::HW_StartAction() { - FPGA_StartAction(); - read_work_completion_future = std::async(std::launch::async, &FPGAAcquisitionDevice::ReadWorkCompletionThread, this); -} +#include +#include void FPGAAcquisitionDevice::StartSendingWorkRequests() { stop_work_requests = false; @@ -20,6 +17,9 @@ void FPGAAcquisitionDevice::HW_EndAction() { send_work_request_future.get(); FPGA_EndAction(); + + while (!HW_IsIdle()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } void FPGAAcquisitionDevice::ReadWorkCompletionThread() { @@ -97,4 +97,160 @@ void FPGAAcquisitionDevice::InitializeCalibration(const DiffractionExperiment &e } } +} + + +void FPGAAcquisitionDevice::FillActionRegister(const DiffractionExperiment& x, ActionConfig &job) { + std::random_device rd; + std::uniform_int_distribution dist; + data_collection_id = dist(rd); + + job.nmodules = x.GetModulesNum(data_stream); + job.nframes = x.GetFrameNum(); + job.one_over_energy = std::lround((1<<20)/ x.GetPhotonEnergy_keV()); + job.nstorage_cells = x.GetStorageCellNumber() - 1; + job.mode = data_collection_id << 16; + + if (fpga_non_blocking_mode) + job.mode |= MODE_NONBLOCKING_ON_WR; + + if ((x.GetDetectorMode() == DetectorMode::Conversion) && x.GetConversionOnFPGA()) + job.mode |= MODE_CONV; + + if (x.IsUsingInternalPacketGen()) + job.mode |= MODE_INTERNAL_PACKET_GEN; +} + + +void FPGAAcquisitionDevice::HW_StartAction(const DiffractionExperiment &experiment) { + if (!HW_IsIdle()) + throw(JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, + "Hardware action running prior to start of data acquisition")); + ActionConfig cfg_in{}, cfg_out{}; + + FillActionRegister(experiment, cfg_in); + HW_WriteActionRegister(&cfg_in); + HW_ReadActionRegister(&cfg_out); + + if (experiment.IsUsingInternalPacketGen()) + memcpy(buffer_device[0], internal_pkt_gen_frame.data(), RAW_MODULE_SIZE * sizeof(uint16_t)); + + if (cfg_out.mode != cfg_in.mode) + throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, + "Mismatch between expected and actual values of configuration registers (mode)"); + if (cfg_out.nframes != cfg_in.nframes) + throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, + "Mismatch between expected and actual values of configuration registers (Frames per trigger)"); + if (cfg_out.nmodules != cfg_in.nmodules) + throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, + "Mismatch between expected and actual values of configuration registers (#modules)"); + + FPGA_StartAction(); + + read_work_completion_future = std::async(std::launch::async, &FPGAAcquisitionDevice::ReadWorkCompletionThread, this); +} + +ActionConfig FPGAAcquisitionDevice::ReadActionRegister() { + ActionConfig cfg{}; + HW_ReadActionRegister(&cfg); + return cfg; +} + +inline JFJochProtoBuf::FPGAFIFOStatus FIFO_check(uint32_t fifo_register, uint16_t pos_empty, uint16_t pos_full) { + if (std::bitset<32>(fifo_register).test(pos_empty)) + return JFJochProtoBuf::FPGAFIFOStatus::EMPTY; + if (std::bitset<32>(fifo_register).test(pos_full)) + return JFJochProtoBuf::FPGAFIFOStatus::FULL; + return JFJochProtoBuf::FPGAFIFOStatus::PARTIAL; +} + +JFJochProtoBuf::FPGAStatus FPGAAcquisitionDevice::GetStatus() const { + + ActionStatus status{}; + ActionEnvParams env{}; + + HW_GetStatus(&status); + HW_GetEnvParams(&env); + + JFJochProtoBuf::FPGAStatus ret; + auto full_status_register = status.ctrl_reg; + ret.set_full_status_register(full_status_register); + + ret.set_stalls_hbm(status.pipeline_stalls_hbm); + ret.set_stalls_host(status.pipeline_stalls_host); + + ret.set_max_modules(status.max_modules); + ret.set_git_sha1(status.git_sha1); + + (*ret.mutable_fifo_status())["Conversion input (data)"] = FIFO_check(status.fifo_status, 0, 1); + (*ret.mutable_fifo_status())["Conversion input (cmd)"] = FIFO_check(status.fifo_status, 2, 3); + (*ret.mutable_fifo_status())["UDP"] = FIFO_check(status.fifo_status, 6, 7); + (*ret.mutable_fifo_status())["Work Request"] = FIFO_check(status.fifo_status, 12, 13); + (*ret.mutable_fifo_status())["Work Completion"] = FIFO_check(status.fifo_status, 14, 15); + (*ret.mutable_fifo_status())["Host mem (data)"] = FIFO_check(status.fifo_status, 8, 9); + (*ret.mutable_fifo_status())["Host mem (cmd)"] = FIFO_check(status.fifo_status, 10, 11); + (*ret.mutable_fifo_status())["Data FIFO #8"] = FIFO_check(status.fifo_status, 16, 17); + (*ret.mutable_fifo_status())["Addr FIFO #3"] = FIFO_check(status.fifo_status, 18, 19); + + ret.set_fpga_idle(HW_IsIdle()); + + ret.set_packets_ether(status.packets_eth); + ret.set_packets_udp(status.packets_udp); + ret.set_packets_icmp(status.packets_icmp); + ret.set_packets_jfjoch(status.packets_processed); + ret.set_packets_sls(status.packets_sls); + ret.set_error_eth(status.udp_err_eth); + ret.set_error_packet_len(status.udp_err_len); + ret.set_cancel_bit(full_status_register & (1<<2)); + ret.set_host_writer_idle(full_status_register & (1<<4)); + ret.set_frame_statistics_alignment_err(full_status_register & (1 << 24)); + ret.set_frame_statistics_tlast_err(full_status_register & (1 << 25)); + ret.set_frame_statistics_work_req_err(full_status_register & (1 << 26)); + + ret.set_mailbox_status_reg(env.mailbox_status_reg); + ret.set_mailbox_err_reg(env.mailbox_err_reg); + + ret.set_fpga_temp_degc(env.fpga_temp_C); + + ret.set_current_edge_12v_a(static_cast(env.fpga_pcie_12V_I_mA) / 1000.0); + ret.set_voltage_edge_12v_v(static_cast(env.fpga_pcie_12V_V_mV) / 1000.0); + + ret.set_current_edge_3p3v_a(static_cast(env.fpga_pcie_3p3V_I_mA) / 1000.0); + ret.set_voltage_edge_3p3v_v(static_cast(env.fpga_pcie_3p3V_V_mV) / 1000.0); + + ret.set_pcie_c2h_beats(env.pcie_c2h_beats); + ret.set_pcie_h2c_beats(env.pcie_h2c_beats); + ret.set_pcie_c2h_descriptors(env.pcie_c2h_descriptors); + ret.set_pcie_h2c_descriptors(env.pcie_h2c_descriptors); + ret.set_pcie_c2h_status(env.pcie_c2h_status); + ret.set_pcie_h2c_status(env.pcie_h2c_status); + + ret.set_ethernet_rx_aligned(env.ethernet_aligned); + ret.set_hbm_temp_0_degc(env.hbm_0_temp_C); + ret.set_hbm_temp_1_degc(env.hbm_1_temp_C); + ret.set_slowest_head(GetSlowestHead()); + return ret; +} + +void FPGAAcquisitionDevice::SetFPGANonBlockingMode(bool input) { + fpga_non_blocking_mode = input; +} + +void FPGAAcquisitionDevice::SetCustomInternalGeneratorFrame(const std::vector &v) { + if (v.size() != RAW_MODULE_SIZE) + throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, + "Error in size of custom internal generator frame"); + for (int i = 0; i < RAW_MODULE_SIZE; i++) + internal_pkt_gen_frame[i] = v[i]; +} + +const std::vector FPGAAcquisitionDevice::GetInternalGeneratorFrame() const { + return internal_pkt_gen_frame; +} + +FPGAAcquisitionDevice::FPGAAcquisitionDevice(uint16_t data_stream) +: AcquisitionDevice(data_stream), +internal_pkt_gen_frame(RAW_MODULE_SIZE) { + for (int i = 0; i < RAW_MODULE_SIZE; i++) + internal_pkt_gen_frame[i] = i % 65536; } \ No newline at end of file diff --git a/receiver/host/FPGAAcquisitionDevice.h b/receiver/host/FPGAAcquisitionDevice.h index e42568f4..32a79951 100644 --- a/receiver/host/FPGAAcquisitionDevice.h +++ b/receiver/host/FPGAAcquisitionDevice.h @@ -5,12 +5,17 @@ #define JUNGFRAUJOCH_FPGAACQUISITIONDEVICE_H #include "AcquisitionDevice.h" +#include "ActionConfig.h" class FPGAAcquisitionDevice : public AcquisitionDevice { virtual void FPGA_StartAction() = 0; virtual void FPGA_EndAction() = 0; - void HW_StartAction() final; + virtual void HW_WriteActionRegister(const ActionConfig *job) = 0; + virtual void HW_ReadActionRegister(ActionConfig *job) = 0; + virtual bool HW_IsIdle() const = 0; + void FillActionRegister(const DiffractionExperiment& x, ActionConfig& job); + void HW_EndAction() final; std::future read_work_completion_future; @@ -23,10 +28,24 @@ class FPGAAcquisitionDevice : public AcquisitionDevice { virtual bool HW_ReadMailbox(uint32_t values[16]) = 0; virtual bool HW_SendWorkRequest(uint32_t handle) = 0; void StartSendingWorkRequests() override; + void HW_StartAction(const DiffractionExperiment &experiment) override; + uint16_t data_collection_id = 0; + bool fpga_non_blocking_mode = true; + std::vector internal_pkt_gen_frame; protected: - explicit FPGAAcquisitionDevice(uint16_t data_stream) : AcquisitionDevice(data_stream) {} + explicit FPGAAcquisitionDevice(uint16_t data_stream); + virtual void HW_GetStatus(ActionStatus *status) const = 0; + virtual void HW_GetEnvParams(ActionEnvParams *status) const { + memset(status, 0, sizeof(ActionEnvParams)); + } public: + ActionConfig ReadActionRegister(); + JFJochProtoBuf::FPGAStatus GetStatus() const override; void InitializeCalibration(const DiffractionExperiment &experiment, const JFCalibration &calib) override; + + void SetFPGANonBlockingMode(bool input); + void SetCustomInternalGeneratorFrame(const std::vector &v); + const std::vector GetInternalGeneratorFrame() const override; }; diff --git a/receiver/host/HLSSimulatedDevice.cpp b/receiver/host/HLSSimulatedDevice.cpp index 7c55861a..e3bae085 100644 --- a/receiver/host/HLSSimulatedDevice.cpp +++ b/receiver/host/HLSSimulatedDevice.cpp @@ -6,6 +6,7 @@ #include #include #include "datamover_model.h" +#include "../common/NetworkAddressConvert.h" uint16_t checksum(const uint16_t *addr, size_t count) { /* Compute Internet Checksum for "count" bytes @@ -359,12 +360,12 @@ void HLSSimulatedDevice::HLSMainThread() { idle = true; } -uint32_t HLSSimulatedDevice::HW_GetIPv4Address() const { - return fpga_ipv4_addr; +std::string HLSSimulatedDevice::GetIPv4Address() const { + return IPv4AddressToStr(fpga_ipv4_addr); } -uint64_t HLSSimulatedDevice::HW_GetMACAddress() const { - return fpga_mac_addr; +std::string HLSSimulatedDevice::GetMACAddress() const { + return MacAddressToStr(fpga_mac_addr); } void HLSSimulatedDevice::HW_GetStatus(ActionStatus *status) const { diff --git a/receiver/host/HLSSimulatedDevice.h b/receiver/host/HLSSimulatedDevice.h index 3ff19f3e..5d84ea4a 100644 --- a/receiver/host/HLSSimulatedDevice.h +++ b/receiver/host/HLSSimulatedDevice.h @@ -47,8 +47,6 @@ class HLSSimulatedDevice : public FPGAAcquisitionDevice { bool HW_ReadMailbox(uint32_t values[16]); void HW_SetCancelDataCollectionBit() override; bool HW_SendWorkRequest(uint32_t handle) override; - uint64_t HW_GetMACAddress() const override; - uint32_t HW_GetIPv4Address() const override; void HW_GetStatus(ActionStatus *status) const override; void HLSMainThread() ; public: @@ -63,6 +61,9 @@ public: uint8_t user = 0); void CreateFinalPacket(const DiffractionExperiment& experiment); AXI_STREAM &OutputStream(); + + std::string GetMACAddress() const override; + std::string GetIPv4Address() const override; }; diff --git a/receiver/host/LinuxSocketDevice.cpp b/receiver/host/LinuxSocketDevice.cpp index bb6613d4..bfac2a84 100644 --- a/receiver/host/LinuxSocketDevice.cpp +++ b/receiver/host/LinuxSocketDevice.cpp @@ -9,8 +9,7 @@ #include #include "../common/JFJochException.h" - -#define MAX_MODULES 16 +#include "../../common/NetworkAddressConvert.h" LinuxSocketDevice::LinuxSocketDevice(uint32_t in_ipv4_addr, uint16_t in_udp_port, uint16_t data_stream, size_t in_frame_buffer_size_modules, @@ -57,16 +56,8 @@ void LinuxSocketDevice::MeasureThread(int fd) { idle = true; } -void LinuxSocketDevice::HW_WriteActionRegister(const ActionConfig *job) { - memcpy(&cfg, job, sizeof(ActionConfig)); -} - -void LinuxSocketDevice::HW_ReadActionRegister(ActionConfig *job) { - memcpy(job, &cfg, sizeof(ActionConfig)); -} - -void LinuxSocketDevice::HW_StartAction() { - if (cfg.mode & MODE_CONV) +void LinuxSocketDevice::HW_StartAction(const DiffractionExperiment& experiment) { + if (experiment.GetConversionOnFPGA()) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Conversion on CPU flag has to be enabled for Raw Ethernet device"); @@ -101,27 +92,16 @@ void LinuxSocketDevice::HW_StartAction() { measure = std::async(std::launch::async, &LinuxSocketDevice::MeasureThread, this, fd); } -bool LinuxSocketDevice::HW_IsIdle() const { - return idle; -} - void LinuxSocketDevice::HW_SetCancelDataCollectionBit() { cancel = true; } -void LinuxSocketDevice::HW_GetStatus(ActionStatus *status) const { - memset(status, 0, sizeof(ActionStatus)); - - status->modules_internal_packet_generator = 1; - status->max_modules = max_modules; +std::string LinuxSocketDevice::GetMACAddress() const { + return MacAddressToStr(mac_addr); } -uint64_t LinuxSocketDevice::HW_GetMACAddress() const { - return mac_addr; -} - -uint32_t LinuxSocketDevice::HW_GetIPv4Address() const { - return ipv4_addr; +std::string LinuxSocketDevice::GetIPv4Address() const { + return IPv4AddressToStr(ipv4_addr); } void LinuxSocketDevice::HW_EndAction() { @@ -129,10 +109,6 @@ void LinuxSocketDevice::HW_EndAction() { measure.get(); } -void LinuxSocketDevice::CopyInternalPacketGenFrameToDeviceBuffer() { - // Do nothing -} - int32_t LinuxSocketDevice::GetNUMANode() const { return numa_node; } diff --git a/receiver/host/LinuxSocketDevice.h b/receiver/host/LinuxSocketDevice.h index b5da5ee3..37b35d3e 100644 --- a/receiver/host/LinuxSocketDevice.h +++ b/receiver/host/LinuxSocketDevice.h @@ -14,7 +14,6 @@ class LinuxSocketDevice : public AcquisitionDevice { uint64_t mac_addr; uint32_t ipv4_addr; uint16_t udp_port; - ActionConfig cfg; const int16_t numa_node; std::future measure; @@ -22,16 +21,11 @@ class LinuxSocketDevice : public AcquisitionDevice { volatile bool cancel = false; volatile bool idle = true; - void HW_WriteActionRegister(const ActionConfig *job) override; - void HW_ReadActionRegister(ActionConfig *job) override; - void HW_StartAction() override; - bool HW_IsIdle() const override; + void HW_StartAction(const DiffractionExperiment& experiment) override; + void HW_SetCancelDataCollectionBit() override; - void HW_GetStatus(ActionStatus *status) const override; - uint64_t HW_GetMACAddress() const override; - uint32_t HW_GetIPv4Address() const override; + void HW_EndAction() override; - void CopyInternalPacketGenFrameToDeviceBuffer() override; void MeasureThread(int fd); void FindMACAddress(); public: @@ -42,6 +36,8 @@ public: int32_t GetNUMANode() const override; uint16_t GetUDPPort() const override; + std::string GetMACAddress() const override; + std::string GetIPv4Address() const override; }; diff --git a/receiver/host/MlxRawEthDevice.cpp b/receiver/host/MlxRawEthDevice.cpp index bec27014..616429a2 100644 --- a/receiver/host/MlxRawEthDevice.cpp +++ b/receiver/host/MlxRawEthDevice.cpp @@ -3,6 +3,7 @@ #ifdef JFJOCH_USE_IBVERBS #include "MlxRawEthDevice.h" +#include "../../common/NetworkAddressConvert.h" #include @@ -25,14 +26,6 @@ int32_t MlxRawEthDevice::GetNUMANode() const { return numa_node; } -void MlxRawEthDevice::HW_WriteActionRegister(const ActionConfig *job) { - memcpy(&cfg, job, sizeof(ActionConfig)); -} - -void MlxRawEthDevice::HW_ReadActionRegister(ActionConfig *job) { - memcpy(job, &cfg, sizeof(ActionConfig)); -} - void MlxRawEthDevice::MeasureThread() { uint64_t packet_count = 0; @@ -46,7 +39,7 @@ void MlxRawEthDevice::MeasureThread() { IBCompletionQueue cq(context, BUFFER_COUNT+2); IBQueuePair qp(pd, cq, 16, BUFFER_COUNT); IBRegBuffer buffer(pd, BUFFER_COUNT, BUFFER_SIZE, numa_node); - ProcessJFPacket process(work_completion_queue, work_request_queue, cfg.nmodules); + ProcessJFPacket process(work_completion_queue, work_request_queue, max_modules); qp.Init(); qp.ReadyToReceive(); @@ -85,8 +78,8 @@ void MlxRawEthDevice::MeasureThread() { idle = true; } -void MlxRawEthDevice::HW_StartAction() { - if (cfg.mode & MODE_CONV) +void MlxRawEthDevice::HW_StartAction(const DiffractionExperiment& experiment) { + if (experiment.GetConversionOnFPGA()) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Conversion on CPU flag has to be enabled for Raw Ethernet device"); @@ -95,30 +88,15 @@ void MlxRawEthDevice::HW_StartAction() { measure = std::async(std::launch::async, &MlxRawEthDevice::MeasureThread, this); } -bool MlxRawEthDevice::HW_IsIdle() const { - return idle; -} - void MlxRawEthDevice::HW_SetCancelDataCollectionBit() { cancel = true; } -void MlxRawEthDevice::HW_GetStatus(ActionStatus *status) const { - memset(status, 0, sizeof(ActionStatus)); - - status->modules_internal_packet_generator = 1; - status->max_modules = max_modules; -} - void MlxRawEthDevice::HW_EndAction() { if (measure.valid()) measure.get(); } -void MlxRawEthDevice::CopyInternalPacketGenFrameToDeviceBuffer() { - // Do nothing -} - void MlxRawEthDevice::SetMACAddress(uint64_t mac_addr_network_order) { mac_addr = mac_addr_network_order; } @@ -127,12 +105,12 @@ void MlxRawEthDevice::SetIPv4Address(uint32_t ipv4_addr_network_order) { ipv4_addr = ipv4_addr_network_order; } -uint64_t MlxRawEthDevice::HW_GetMACAddress() const { - return mac_addr; +std::string MlxRawEthDevice::GetMACAddress() const { + return MacAddressToStr(mac_addr); } -uint32_t MlxRawEthDevice::HW_GetIPv4Address() const { - return ipv4_addr; +std::string MlxRawEthDevice::GetIPv4Address() const { + return IPv4AddressToStr(ipv4_addr); } uint64_t MlxRawEthDevice::PollCQ(IBRegBuffer &buffer, IBQueuePair &qp, IBCompletionQueue &cq, ProcessJFPacket &process) { @@ -210,4 +188,5 @@ void MlxRawEthDevice::SendARP(IBRegBuffer &buffer, IBQueuePair &qp) { } } + #endif //JFJOCH_USE_IBVERBS \ No newline at end of file diff --git a/receiver/host/MlxRawEthDevice.h b/receiver/host/MlxRawEthDevice.h index e626ba0c..b3eb79d4 100644 --- a/receiver/host/MlxRawEthDevice.h +++ b/receiver/host/MlxRawEthDevice.h @@ -21,7 +21,7 @@ class MlxRawEthDevice : public AcquisitionDevice { IBContext context; uint64_t mac_addr; uint32_t ipv4_addr; - ActionConfig cfg; + const int16_t numa_node; std::future measure; @@ -37,16 +37,9 @@ class MlxRawEthDevice : public AcquisitionDevice { ProcessJFPacket &process); void MeasureThread(); - void HW_WriteActionRegister(const ActionConfig *job) override; - void HW_ReadActionRegister(ActionConfig *job) override; - void HW_StartAction() override; - bool HW_IsIdle() const override; + void HW_StartAction(const DiffractionExperiment& experiment) override; void HW_SetCancelDataCollectionBit() override; - void HW_GetStatus(ActionStatus *status) const override; - uint64_t HW_GetMACAddress() const override; - uint32_t HW_GetIPv4Address() const override; void HW_EndAction() override; - void CopyInternalPacketGenFrameToDeviceBuffer() override; public: MlxRawEthDevice(uint16_t dev_id, uint16_t data_stream, size_t in_frame_buffer_size_modules, int16_t numa_node = -1); @@ -54,6 +47,8 @@ public: int32_t GetNUMANode() const override; void SetMACAddress(uint64_t mac_addr_network_order); void SetIPv4Address(uint32_t ipv4_addr_network_order); + std::string GetMACAddress() const override; + std::string GetIPv4Address() const override; }; #endif //JUNGFRAUJOCH_RAWETHDEVICE_H diff --git a/receiver/host/MockAcquisitionDevice.cpp b/receiver/host/MockAcquisitionDevice.cpp index d15757a4..09bc9483 100644 --- a/receiver/host/MockAcquisitionDevice.cpp +++ b/receiver/host/MockAcquisitionDevice.cpp @@ -5,15 +5,7 @@ #include "../../common/JFJochException.h" #include -void MockAcquisitionDevice::HW_ReadActionRegister(ActionConfig *job) { - memcpy(job, &cfg, sizeof(ActionConfig)); -} - -void MockAcquisitionDevice::HW_WriteActionRegister(const ActionConfig *job) { - memcpy(&cfg, job, sizeof(ActionConfig)); -} - -void MockAcquisitionDevice::HW_StartAction() { +void MockAcquisitionDevice::HW_StartAction(const DiffractionExperiment& experiment) { idle = false; } @@ -25,10 +17,6 @@ void MockAcquisitionDevice::HW_SetCancelDataCollectionBit() { } } -bool MockAcquisitionDevice::HW_IsIdle() const { - return true; -} - MockAcquisitionDevice::MockAcquisitionDevice(uint16_t data_stream, size_t in_frame_buffer_size_modules) : AcquisitionDevice(data_stream) { max_modules = 16; @@ -72,18 +60,11 @@ void MockAcquisitionDevice::Terminate() { idle = true; } -uint64_t MockAcquisitionDevice::HW_GetMACAddress() const { - return 0; // Doesn't matter +std::string MockAcquisitionDevice::GetMACAddress() const { + return "00:00:00:00:00:00"; } -uint32_t MockAcquisitionDevice::HW_GetIPv4Address() const { - return 0; +std::string MockAcquisitionDevice::GetIPv4Address() const { + return "127.0.0.1"; } -void MockAcquisitionDevice::HW_GetStatus(ActionStatus *status) const { - memset(status, 0, sizeof(ActionStatus)); - status->max_modules = max_modules; - status->modules_internal_packet_generator = 1; -} - -void MockAcquisitionDevice::CopyInternalPacketGenFrameToDeviceBuffer() {} diff --git a/receiver/host/MockAcquisitionDevice.h b/receiver/host/MockAcquisitionDevice.h index 61b10486..1274c78e 100644 --- a/receiver/host/MockAcquisitionDevice.h +++ b/receiver/host/MockAcquisitionDevice.h @@ -10,26 +10,19 @@ class MockAcquisitionDevice : public AcquisitionDevice { uint32_t current_handle = 0; uint32_t max_handle = 0; - ActionConfig cfg; bool idle = true; void SendCompletion(uint32_t handle, uint16_t module_number, uint64_t frame_number); - constexpr static const uint32_t frames_int_pkt_gen = 1; - void HW_ReadActionRegister(ActionConfig *job) override; - void HW_WriteActionRegister(const ActionConfig *job) override; - void HW_StartAction() override; + void HW_StartAction(const DiffractionExperiment& experiment) override; void HW_SetCancelDataCollectionBit() override; - bool HW_IsIdle() const override; - uint64_t HW_GetMACAddress() const override; - uint32_t HW_GetIPv4Address() const override; - void HW_GetStatus(ActionStatus *status) const override; - void CopyInternalPacketGenFrameToDeviceBuffer() override; public: MockAcquisitionDevice(uint16_t data_stream, size_t in_frame_buffer_size_modules); void AddModule(uint64_t frame, uint16_t module_number, const uint16_t *data); void Terminate(); + std::string GetMACAddress() const override; + std::string GetIPv4Address() const override; }; #endif //JUNGFRAUJOCH_MOCKACQUISITIONDEVICE_H diff --git a/receiver/host/PCIExpressDevice.cpp b/receiver/host/PCIExpressDevice.cpp index fd5c6249..1fb53d93 100644 --- a/receiver/host/PCIExpressDevice.cpp +++ b/receiver/host/PCIExpressDevice.cpp @@ -125,12 +125,12 @@ void PCIExpressDevice::HW_ReadActionRegister(ActionConfig *config) { "Failed reading config", errno); } -uint64_t PCIExpressDevice::HW_GetMACAddress() const { +std::string PCIExpressDevice::GetMACAddress() const { uint64_t tmp; if (ioctl(fd, IOCTL_JFJOCH_GET_MAC, &tmp) != 0) throw JFJochException(JFJochExceptionCategory::PCIeError, "Failed getting MAC address", errno); - return tmp; + return MacAddressToStr(tmp); } void PCIExpressDevice::SetMACAddress(uint64_t mac_addr_network_order) { @@ -195,10 +195,10 @@ void PCIExpressDevice::SetIPv4Address(uint32_t ipv4_addr_network_order) { "Failed setting IPv4 address", errno); } -uint32_t PCIExpressDevice::HW_GetIPv4Address() const { +std::string PCIExpressDevice::GetIPv4Address() const { uint32_t tmp; if (ioctl(fd, IOCTL_JFJOCH_GET_IPV4, &tmp) != 0) throw JFJochException(JFJochExceptionCategory::PCIeError, "Failed getting MAC address", errno); - return tmp; + return IPv4AddressToStr(tmp); } diff --git a/receiver/host/PCIExpressDevice.h b/receiver/host/PCIExpressDevice.h index 883241ea..3df37380 100644 --- a/receiver/host/PCIExpressDevice.h +++ b/receiver/host/PCIExpressDevice.h @@ -15,8 +15,6 @@ class PCIExpressDevice : public FPGAAcquisitionDevice { bool HW_IsIdle() const final; void HW_WriteActionRegister(const ActionConfig *job) override; void HW_ReadActionRegister(ActionConfig *job) override; - uint64_t HW_GetMACAddress() const override; - uint32_t HW_GetIPv4Address() const override; void FPGA_EndAction() override; void Reset(); @@ -40,6 +38,9 @@ public: void SetMACAddress(uint64_t mac_addr_network_order); void SetDefaultMAC() const; void SetIPv4Address(uint32_t ipv4_addr_network_order); + + std::string GetMACAddress() const override; + std::string GetIPv4Address() const override; }; diff --git a/receiver/jfjoch_action_test.cpp b/receiver/jfjoch_action_test.cpp index 9fe7c162..1a843298 100644 --- a/receiver/jfjoch_action_test.cpp +++ b/receiver/jfjoch_action_test.cpp @@ -55,7 +55,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - std::vector> oc_devices; + std::vector> pcie_devices; std::vector aq_devices; std::string image_path = std::string(argv[1]) + "/tests/test_data/mod5_raw0.bin"; @@ -63,17 +63,16 @@ int main(int argc, char **argv) { LoadBinaryFile(image_path, input.data(), RAW_MODULE_SIZE); for (int i = 0; i < nstreams; i++) { - oc_devices.push_back(std::make_unique(dev_name[i], i)); - oc_devices[i]->SetCustomInternalGeneratorFrame(input); - oc_devices[i]->EnableLogging(&logger); - oc_devices[i]->SetFPGANonBlockingMode(nonblocking_mode); - aq_devices.push_back(oc_devices[i].get()); + pcie_devices.push_back(std::make_unique(dev_name[i], i)); + pcie_devices[i]->SetCustomInternalGeneratorFrame(input); + pcie_devices[i]->EnableLogging(&logger); + pcie_devices[i]->SetFPGANonBlockingMode(nonblocking_mode); + aq_devices.push_back(pcie_devices[i].get()); } if (!nonblocking_mode) logger.Warning("FPGA uses blocking mode - in case data acquisition is aborted, it is necessary to cold reboot the machine"); - volatile bool done = false; JFJochProtoBuf::ReceiverOutput output; bool ret; @@ -90,7 +89,7 @@ int main(int argc, char **argv) { if (print_status_updates) { while (!done) { for (int i = 0; i < nstreams; i++) { - auto status = oc_devices[i]->GetStatus(); + auto status = pcie_devices[i]->GetStatus(); logger.Info("Device {}: Head packet: {:8d} Power: {:5.1f} W FPGA Temp: {:d} degC HBM Temp: {:d}/{:d} degC Stalls: {:15d}", i, status.slowest_head(), status.current_edge_12v_a() * status.voltage_edge_12v_v() + status.current_edge_3p3v_a() * status.voltage_edge_3p3v_v(), diff --git a/receiver/jfjoch_receiver.cpp b/receiver/jfjoch_receiver.cpp index d50c7a33..89ef352c 100644 --- a/receiver/jfjoch_receiver.cpp +++ b/receiver/jfjoch_receiver.cpp @@ -48,6 +48,14 @@ AcquisitionDevice *SetupAcquisitionDevice(const nlohmann::json &input, uint16_t pci_dev->SetMACAddress(MacAddressFromStr(input["mac_addr"].get())); else pci_dev->SetDefaultMAC(); + + if (input.contains("custom_test_frame")) { + std::vector tmp(RAW_MODULE_SIZE); + auto filename = input["custom_test_frame"].get(); + std::fstream file(filename.c_str(), std::fstream::in | std::fstream::binary); + file.read((char *) tmp.data(),RAW_MODULE_SIZE * sizeof(uint16_t)); + pci_dev->SetCustomInternalGeneratorFrame(tmp); + } ret = pci_dev; #ifdef JFJOCH_USE_IBVERBS } else if (input.contains("type") && (input["type"] == "mlx_raw_eth")) { @@ -59,14 +67,6 @@ AcquisitionDevice *SetupAcquisitionDevice(const nlohmann::json &input, uint16_t #endif else throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Unsupported device type"); - if (input.contains("custom_test_frame")) { - std::vector tmp(RAW_MODULE_SIZE); - auto filename = input["custom_test_frame"].get(); - std::fstream file(filename.c_str(), std::fstream::in | std::fstream::binary); - file.read((char *) tmp.data(),RAW_MODULE_SIZE * sizeof(uint16_t)); - ret->SetCustomInternalGeneratorFrame(tmp); - } - return ret; } diff --git a/tests/FPGAIntegrationTest.cpp b/tests/FPGAIntegrationTest.cpp index c7586726..99e3ee84 100644 --- a/tests/FPGAIntegrationTest.cpp +++ b/tests/FPGAIntegrationTest.cpp @@ -77,6 +77,7 @@ TEST_CASE("HLS_C_Simulation_internal_packet_generator_custom_frame", "[FPGA][Ful HLSSimulatedDevice test(0, 64); test.SetCustomInternalGeneratorFrame(test_frame); + test.SetFPGANonBlockingMode(true); REQUIRE_NOTHROW(test.StartAction(x)); REQUIRE_NOTHROW(test.WaitForActionComplete());