// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include "../common/DiffractionExperiment.h" #include "../fpga/hls_simulation/HLSDevice.h" #include "FPGAAcquisitionDevice.h" class HLSSimulatedDevice : public FPGAAcquisitionDevice { // Owns the simulated frame buffers. Plain heap (this path is not performance-critical, so no // NUMA placement and no mmap), but page-aligned (4 KiB) to match the real device's kernel DMA // buffers - more than enough for the data path's alignment needs (AXI datamover 64 B, // FPGAIntegrationTest 128 B). Declared before `device` so the buffers outlive the HLSDevice // action thread that writes into them; buffer_device points into these. struct alignas(4096) FrameBuffer { uint8_t data[FPGA_BUFFER_LOCATION_SIZE]; }; std::vector> buffers; std::unique_ptr device; void HW_ReadActionRegister(DataCollectionConfig *job) override; void HW_WriteActionRegister(const DataCollectionConfig *job) override; void FPGA_StartAction(const DiffractionExperiment &experiment) override; void FPGA_EndAction() override; bool HW_IsIdle() const override; bool HW_ReadMailbox(uint32_t *values) override; bool HW_SendWorkRequest(uint32_t handle) override; void HW_LoadCalibration(const LoadCalibrationConfig &config) override; void HW_SetSpotFinderParameters(const SpotFinderParameters ¶ms) override; void HW_RunInternalGenerator(const FrameGeneratorConfig &config) override; public: HLSSimulatedDevice(uint16_t data_stream, size_t in_frame_buffer_size_modules); ~HLSSimulatedDevice() override = default; void CreateJFPacket(const DiffractionExperiment& experiment, uint64_t frame_number, uint32_t eth_packet, uint32_t module_number, const uint16_t *data, int8_t adjust_axis = 0, uint8_t user = 0); void CreateJFPackets(const DiffractionExperiment& experiment, uint64_t frame_number_0, uint64_t frames, uint32_t module_number, const uint16_t *data); void CreateEIGERPacket(const DiffractionExperiment& experiment, uint64_t frame_number, uint32_t eth_packet, uint32_t module_number, uint32_t col, uint32_t row, const uint16_t *data); void CreateXfelBunchIDPacket(double bunchid, uint32_t event_code); void CreateFinalPacket(const DiffractionExperiment& experiment); DataCollectionStatus GetDataCollectionStatus() const override; void Cancel() override; DeviceStatus GetDeviceStatus() const override; };