AcquisitionDevice: Completion queue is handled by particular implementation of the device

This commit is contained in:
2023-04-25 15:58:07 +02:00
parent f01f2e79d1
commit bf2a23ef7e
15 changed files with 64 additions and 71 deletions

View File

@@ -118,22 +118,20 @@ void AcquisitionDevice::StartAction(const DiffractionExperiment &experiment) {
throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError,
"Mismatch between expected and actual values of configuration registers (#modules)");
// Ensure internal queues are empty
// Ensure internal WR queue is empty
work_request_queue.Clear();
work_completion_queue.Clear();
HW_StartAction();
send_work_request_future = std::async(std::launch::async, &AcquisitionDevice::SendWorkRequestThread, this);
read_work_completion_future = std::async(std::launch::async, &AcquisitionDevice::ReadWorkCompletionThread, this);
for (uint32_t i = 0; i < buffer_device.size(); i++)
SendWorkRequest(i);
auto c = work_completion_queue.GetBlocking();
if (c.type != Completion::Type::Start)
throw JFJochException(JFJochExceptionCategory::AcquisitionDeviceError, "Mismatch in completion queue");
for (uint32_t i = 0; i < buffer_device.size(); i++)
SendWorkRequest(i);
start_time = std::chrono::system_clock::now();
}
@@ -162,14 +160,6 @@ const std::vector<uint16_t> &AcquisitionDevice::GetInternalGeneratorFrame() cons
return internal_pkt_gen_frame;
}
void AcquisitionDevice::ReadWorkCompletionThread() {
Completion c;
do {
c = ReadCompletion();
work_completion_queue.PutBlocking(c);
} while (c.type != Completion::Type::End);
}
void AcquisitionDevice::WaitForActionComplete() {
auto c = work_completion_queue.GetBlocking();
@@ -193,7 +183,7 @@ void AcquisitionDevice::WaitForActionComplete() {
c = work_completion_queue.GetBlocking();
}
bytes_received = c.frame_number * 8192LU;
read_work_completion_future.get();
counters.SetAcquisitionFinished();
end_time = std::chrono::system_clock::now();