141 lines
4.5 KiB
C++
141 lines
4.5 KiB
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
|
|
#ifndef JUNGFRAUJOCH_ACQUISITIONDEVICE_H
|
|
#define JUNGFRAUJOCH_ACQUISITIONDEVICE_H
|
|
|
|
#include <map>
|
|
#include <mutex>
|
|
#include <future>
|
|
#include <unistd.h>
|
|
|
|
#include "../common/Definitions.h"
|
|
#include "../common/DiffractionExperiment.h"
|
|
#include "../common/Logger.h"
|
|
|
|
#include "../common/ThreadSafeFIFO.h"
|
|
#include "../jungfrau/JFCalibration.h"
|
|
#include "../fpga/pcie_driver/ActionConfig.h"
|
|
|
|
#include "AcquisitionCounters.h"
|
|
#include "Completion.h"
|
|
|
|
#pragma pack(push)
|
|
#pragma pack(1)
|
|
|
|
struct IntegrationResult {
|
|
int64_t count;
|
|
int64_t sum;
|
|
};
|
|
|
|
struct SpotFindingResult {
|
|
char strong_pixel[RAW_MODULE_SIZE / 8];
|
|
int32_t count_threshold;
|
|
int32_t snr_threshold;
|
|
int32_t strong_pixel_count;
|
|
int32_t reserved[13];
|
|
};
|
|
|
|
struct DeviceOutput {
|
|
int16_t pixels[512 * 64 * 32];
|
|
SpotFindingResult spot_finding_result;
|
|
IntegrationResult integration_result[FPGA_INTEGRATION_BIN_COUNT];
|
|
uint32_t adu_histogram[ADU_HISTO_BIN_COUNT];
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
struct AcquisitionDeviceStatistics {
|
|
uint64_t good_packets;
|
|
uint64_t packets_expected;
|
|
float efficiency;
|
|
uint64_t bytes_received;
|
|
time_t start_timestamp;
|
|
time_t end_timestamp;
|
|
uint64_t nmodules;
|
|
std::vector<uint64_t> packets_received_per_module;
|
|
};
|
|
|
|
class AcquisitionDevice {
|
|
std::vector<int16_t> buffer_err;
|
|
|
|
std::chrono::time_point<std::chrono::system_clock> start_time;
|
|
std::chrono::time_point<std::chrono::system_clock> end_time;
|
|
|
|
int64_t expected_frames;
|
|
|
|
virtual void Start(const DiffractionExperiment& experiment, uint32_t flags) = 0;
|
|
virtual void Finalize() {}; // do clean-up after action is done
|
|
virtual void StartSendingWorkRequests() {};
|
|
void SendWorkRequest(uint32_t handle);
|
|
protected:
|
|
AcquisitionCounters counters;
|
|
|
|
ThreadSafeFIFO<Completion> work_completion_queue;
|
|
ThreadSafeFIFO<WorkRequest> work_request_queue;
|
|
|
|
std::vector<uint16_t *> buffer_device;
|
|
Logger *logger;
|
|
|
|
uint16_t data_stream;
|
|
uint32_t max_modules = 1;
|
|
uint64_t mac_addr;
|
|
uint32_t ipv4_addr;
|
|
std::atomic<uint32_t> work_completion_count;
|
|
|
|
explicit AcquisitionDevice(uint16_t data_stream);
|
|
|
|
void UnmapBuffers();
|
|
void MapBuffersStandard(size_t c2h_buffer_count, size_t h2c_buffer_count, int16_t numa_node);
|
|
public:
|
|
AcquisitionDevice(const AcquisitionDevice &other) = delete;
|
|
AcquisitionDevice &operator=(const AcquisitionDevice &other) = delete;
|
|
|
|
static constexpr const uint64_t HandleNotValid = UINT64_MAX;
|
|
|
|
virtual ~AcquisitionDevice() { UnmapBuffers(); };
|
|
|
|
void StartAction(const DiffractionExperiment &experiment, uint32_t optional_flags = 0);
|
|
void PrepareAction(const DiffractionExperiment &experiment);
|
|
|
|
void WaitForActionComplete();
|
|
virtual void Cancel() = 0;
|
|
|
|
void EnableLogging(Logger *logger);
|
|
|
|
// Post measurement statistics - only guaranteed valid after WaitForActionComplete ends
|
|
uint64_t GetBytesReceived() const;
|
|
|
|
virtual DataCollectionStatus GetDataCollectionStatus() const;
|
|
virtual DeviceStatus GetDeviceStatus() const;
|
|
AcquisitionDeviceStatistics GetStatistics() const;
|
|
const DeviceOutput *GetDeviceOutput(size_t frame_number, uint16_t module_number) const;
|
|
|
|
void FrameBufferRelease(size_t frame_number, uint16_t module_number);
|
|
const int16_t *GetErrorFrameBuffer() const;
|
|
|
|
int16_t *GetDeviceBuffer(size_t handle);
|
|
|
|
// Calibration
|
|
virtual void InitializeCalibration(const DiffractionExperiment &experiment, const JFCalibration &calib);
|
|
virtual void InitializeIntegrationMap(const DiffractionExperiment &experiment, const std::vector<uint16_t> &v);
|
|
virtual void InitializeIntegrationMap(const DiffractionExperiment &experiment, const std::vector<uint16_t> &v,
|
|
const std::vector<float> &weights);
|
|
const AcquisitionCounters& Counters() const;
|
|
|
|
virtual void SetSpotFinderParameters(int16_t count_threshold, double snr_threshold) {};
|
|
virtual std::string GetIPv4Address() const;
|
|
virtual void SetIPv4Address(uint32_t ipv4_addr_network_order);
|
|
virtual void SetMACAddress(uint64_t mac_addr_network_order);
|
|
virtual std::string GetMACAddress() const;
|
|
virtual uint16_t GetUDPPort() const;
|
|
virtual int32_t GetNUMANode() const;
|
|
virtual uint32_t GetCompletedDescriptors() const = 0;
|
|
virtual std::vector<uint16_t> GetInternalGeneratorFrame() const {
|
|
return {};
|
|
}
|
|
AcquisitionDeviceNetConfig GetNetConfig() const;
|
|
};
|
|
|
|
|
|
#endif //JUNGFRAUJOCH_ACQUISITIONDEVICE_H
|