diff --git a/receiver/JFJochReceiverFPGA.cpp b/receiver/JFJochReceiverFPGA.cpp index fe1d493d..97e534ee 100644 --- a/receiver/JFJochReceiverFPGA.cpp +++ b/receiver/JFJochReceiverFPGA.cpp @@ -439,7 +439,6 @@ void JFJochReceiverFPGA::FrameTransformationThread(uint32_t threadid) { message.az_int_profile = az_int_profile_image.GetResult(); message.bkg_estimate = az_int_profile_image.GetBkgEstimate(experiment.GetAzimuthalIntegrationSettings()); - plots.Add(message, az_int_profile_image); scan_result.Add(message); auto image_end_time = std::chrono::high_resolution_clock::now(); @@ -468,52 +467,52 @@ void JFJochReceiverFPGA::FrameTransformationThread(uint32_t threadid) { if (loc == nullptr) { // No free buffer locations - continue writer_queue_full = true; - continue; + } else { + auto writer_buffer = (uint8_t *) loc->GetImage(); + + CBORStream2Serializer serializer(writer_buffer, experiment.GetImageBufferLocationSize()); + message.image = CompressedImage(nullptr, 0, + experiment.GetXPixelsNum(), + experiment.GetYPixelsNum(), + experiment.GetImageMode(), + experiment.GetCompressionAlgorithm()); + serializer.SerializeImage(message); + if (experiment.GetImageBufferLocationSize() - serializer.GetImageAppendOffset() + < experiment.GetMaxCompressedSize()) + throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, + "Not enough memory to save image"); + + const auto compression_start_time = std::chrono::steady_clock::now(); + size_t image_size = transformation.CompressImage(writer_buffer + serializer.GetImageAppendOffset()); + const auto compression_end_time = std::chrono::steady_clock::now(); + message.compression_time_s = std::chrono::duration(compression_end_time - compression_start_time).count(); + + serializer.AppendImage(image_size); + compressed_size += image_size; + + loc->SetImageNumber(image_number); + loc->SetImageSize(serializer.GetBufferSize()); + loc->SetIndexed(message.indexing_result.value_or(false)); + loc->ReadyToSend(); + + if (zmq_preview_socket != nullptr) + zmq_preview_socket->SendImage(writer_buffer, serializer.GetBufferSize()); + + if (zmq_metadata_socket != nullptr) + zmq_metadata_socket->AddDataMessage(message); + + if (push_images_to_writer) { + image_pusher.SendImage(*loc); + ++images_sent; // Handle case when image not sent properly + } else + loc->release(); + UpdateMaxImageSent(message.number); } - - auto writer_buffer = (uint8_t *) loc->GetImage(); - - CBORStream2Serializer serializer(writer_buffer, experiment.GetImageBufferLocationSize()); - message.image = CompressedImage(nullptr, 0, - experiment.GetXPixelsNum(), - experiment.GetYPixelsNum(), - experiment.GetImageMode(), - experiment.GetCompressionAlgorithm()); - serializer.SerializeImage(message); - if (experiment.GetImageBufferLocationSize() - serializer.GetImageAppendOffset() - < experiment.GetMaxCompressedSize()) - throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, - "Not enough memory to save image"); - - const auto compression_start_time = std::chrono::steady_clock::now(); - size_t image_size = transformation.CompressImage(writer_buffer + serializer.GetImageAppendOffset()); - const auto compression_end_time = std::chrono::steady_clock::now(); - message.compression_time_s = std::chrono::duration(compression_end_time - compression_start_time).count(); - - serializer.AppendImage(image_size); - compressed_size += image_size; - - loc->SetImageNumber(image_number); - loc->SetImageSize(serializer.GetBufferSize()); - loc->SetIndexed(message.indexing_result.value_or(false)); - loc->ReadyToSend(); - - if (zmq_preview_socket != nullptr) - zmq_preview_socket->SendImage(writer_buffer, serializer.GetBufferSize()); - - if (zmq_metadata_socket != nullptr) - zmq_metadata_socket->AddDataMessage(message); - - if (push_images_to_writer) { - image_pusher.SendImage(*loc); - ++images_sent; // Handle case when image not sent properly - } else - loc->release(); - UpdateMaxImageSent(message.number); } logger.Debug("Frame transformation thread - done sending image {} / {}", image_number, message.number); + plots.Add(message, az_int_profile_image); current_status.SetProgress(GetProgress()); current_status.SetStatus(GetStatus()); } catch (const JFJochException &e) {