diff --git a/receiver/AcquisitionDevice.cpp b/receiver/AcquisitionDevice.cpp index 1f677e2a..8727c822 100644 --- a/receiver/AcquisitionDevice.cpp +++ b/receiver/AcquisitionDevice.cpp @@ -46,7 +46,7 @@ void AcquisitionDevice::PrepareAction(const DiffractionExperiment &experiment) { counters.Reset(experiment, data_stream); } -void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) { +void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment, uint32_t optional_flags) { Cancel(); if (experiment.GetModulesNum(data_stream) > max_modules) @@ -66,7 +66,7 @@ void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) { // Ensure internal WR queue is empty work_request_queue.Clear(); - Start(experiment); + Start(experiment, optional_flags); for (uint32_t i = 0; i < buffer_device.size(); i++) SendWorkRequest(i); diff --git a/receiver/AcquisitionDevice.h b/receiver/AcquisitionDevice.h index 823575e7..cbf1623e 100644 --- a/receiver/AcquisitionDevice.h +++ b/receiver/AcquisitionDevice.h @@ -53,7 +53,7 @@ class AcquisitionDevice { int64_t expected_frames; - virtual void Start(const DiffractionExperiment& experiment) = 0; + 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); @@ -81,7 +81,7 @@ public: virtual ~AcquisitionDevice() { UnmapBuffers(); }; - void StartAction(const DiffractionExperiment &experiment); + void StartAction(const DiffractionExperiment &experiment, uint32_t optional_flags = 0); void PrepareAction(const DiffractionExperiment &experiment); void WaitForActionComplete(); diff --git a/receiver/FPGAAcquisitionDevice.cpp b/receiver/FPGAAcquisitionDevice.cpp index daabac6a..5a708102 100644 --- a/receiver/FPGAAcquisitionDevice.cpp +++ b/receiver/FPGAAcquisitionDevice.cpp @@ -188,14 +188,15 @@ void FPGAAcquisitionDevice::FillActionRegister(const DiffractionExperiment& x, D job.mode |= MODE_CONV; } - -void FPGAAcquisitionDevice::Start(const DiffractionExperiment &experiment) { +void FPGAAcquisitionDevice::Start(const DiffractionExperiment &experiment, uint32_t flag) { if (!HW_IsIdle()) throw(JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, "Hardware action running prior to start of data acquisition")); DataCollectionConfig cfg_in{}, cfg_out{}; FillActionRegister(experiment, cfg_in); + cfg_in.mode |= flag; + HW_WriteActionRegister(&cfg_in); HW_ReadActionRegister(&cfg_out); diff --git a/receiver/FPGAAcquisitionDevice.h b/receiver/FPGAAcquisitionDevice.h index 21af4bd0..23a305df 100644 --- a/receiver/FPGAAcquisitionDevice.h +++ b/receiver/FPGAAcquisitionDevice.h @@ -33,7 +33,7 @@ class FPGAAcquisitionDevice : public AcquisitionDevice { virtual bool HW_SendWorkRequest(uint32_t handle) = 0; virtual void HW_SetSpotFinderParameters(const SpotFinderParameters ¶ms) = 0; void StartSendingWorkRequests() override; - void Start(const DiffractionExperiment &experiment) override; + void Start(const DiffractionExperiment &experiment, uint32_t flag) override; protected: std::vector internal_pkt_gen_frame; explicit FPGAAcquisitionDevice(uint16_t data_stream); diff --git a/receiver/LinuxSocketDevice.cpp b/receiver/LinuxSocketDevice.cpp index 09b4f537..a2960d21 100644 --- a/receiver/LinuxSocketDevice.cpp +++ b/receiver/LinuxSocketDevice.cpp @@ -50,7 +50,7 @@ void LinuxSocketDevice::MeasureThread(int fd) { close(fd); } -void LinuxSocketDevice::Start(const DiffractionExperiment& experiment) { +void LinuxSocketDevice::Start(const DiffractionExperiment& experiment, uint32_t optional_flags) { if (experiment.GetConversionOnFPGA()) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Conversion on CPU flag has to be enabled for Raw Ethernet device"); diff --git a/receiver/LinuxSocketDevice.h b/receiver/LinuxSocketDevice.h index 80d21e4e..7067071f 100644 --- a/receiver/LinuxSocketDevice.h +++ b/receiver/LinuxSocketDevice.h @@ -18,7 +18,7 @@ class LinuxSocketDevice : public AcquisitionDevice { volatile bool cancel = false; - void Start(const DiffractionExperiment& experiment) override; + void Start(const DiffractionExperiment& experiment, uint32_t optional_flags) override; void Finalize() override; void MeasureThread(int fd); diff --git a/receiver/MlxRawEthDevice.cpp b/receiver/MlxRawEthDevice.cpp index 8dc087bc..0c6302fe 100644 --- a/receiver/MlxRawEthDevice.cpp +++ b/receiver/MlxRawEthDevice.cpp @@ -72,7 +72,7 @@ void MlxRawEthDevice::MeasureThread() { }); } -void MlxRawEthDevice::Start(const DiffractionExperiment& experiment) { +void MlxRawEthDevice::Start(const DiffractionExperiment& experiment, uint32_t optional_flags) { if (experiment.GetConversionOnFPGA()) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Conversion on CPU flag has to be enabled for Raw Ethernet device"); diff --git a/receiver/MlxRawEthDevice.h b/receiver/MlxRawEthDevice.h index 093a593a..577a6ed6 100644 --- a/receiver/MlxRawEthDevice.h +++ b/receiver/MlxRawEthDevice.h @@ -34,7 +34,7 @@ class MlxRawEthDevice : public AcquisitionDevice { ProcessJFPacket &process); void MeasureThread(); - void Start(const DiffractionExperiment& experiment) override; + void Start(const DiffractionExperiment& experiment, uint32_t optional_flags) override; void Finalize() override; public: MlxRawEthDevice(uint16_t dev_id, uint16_t data_stream, size_t in_frame_buffer_size_modules, diff --git a/receiver/MockAcquisitionDevice.cpp b/receiver/MockAcquisitionDevice.cpp index 18b66269..8076e9d8 100644 --- a/receiver/MockAcquisitionDevice.cpp +++ b/receiver/MockAcquisitionDevice.cpp @@ -5,7 +5,7 @@ #include #include "../jungfrau/JFConversionFloatingPoint.h" -void MockAcquisitionDevice::Start(const DiffractionExperiment& experiment) { +void MockAcquisitionDevice::Start(const DiffractionExperiment& experiment, uint32_t optional_flags) { idle = false; cancel = false; completed_descriptors = 0; diff --git a/receiver/MockAcquisitionDevice.h b/receiver/MockAcquisitionDevice.h index 3f60e8d5..be01398b 100644 --- a/receiver/MockAcquisitionDevice.h +++ b/receiver/MockAcquisitionDevice.h @@ -19,7 +19,7 @@ class MockAcquisitionDevice : public AcquisitionDevice { ThreadSafeFIFO mock_completions; void SendCompletion(uint32_t handle, uint16_t module_number, uint64_t frame_number); - void Start(const DiffractionExperiment& experiment) override; + void Start(const DiffractionExperiment& experiment, uint32_t optional_flags) override; void MeasureThread(); void InternalPacketGeneratorThread(uint32_t nmodules, uint32_t nframes); public: