From 19e04b06a92e4935441dadf380d5a62c004f59c9 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 12 Dec 2025 10:29:08 +0100 Subject: [PATCH] jfjoch_viewer: Handle image buffer counter to stop updating --- broker/OpenAPIConvert.cpp | 15 ++++++++- broker/OpenAPIConvert.h | 1 + common/ImageBuffer.h | 2 +- reader/JFJochHttpReader.cpp | 48 ++++++++++++++++++++++++----- reader/JFJochHttpReader.h | 6 ++++ viewer/JFJochImageReadingWorker.cpp | 7 ++++- 6 files changed, 68 insertions(+), 11 deletions(-) diff --git a/broker/OpenAPIConvert.cpp b/broker/OpenAPIConvert.cpp index cc426d8c..a23a8a84 100644 --- a/broker/OpenAPIConvert.cpp +++ b/broker/OpenAPIConvert.cpp @@ -753,7 +753,20 @@ org::openapitools::server::model::Image_buffer_status Convert(const ImageBufferS ret.setImageNumbers(input.images_in_the_buffer); ret.setMaxImageNumber(input.max_image_number); ret.setMinImageNumber(input.min_image_number); - ret.setCurrentCounter(input.current_counter); + if (input.current_counter.has_value()) + ret.setCurrentCounter(input.current_counter.value()); + return ret; +} + +ImageBufferStatus Convert(const org::openapitools::server::model::Image_buffer_status& input) { + ImageBufferStatus ret; + ret.available_slots = input.getAvailableSlots(); + ret.total_slots = input.getTotalSlots(); + ret.images_in_the_buffer = input.getImageNumbers(); + ret.max_image_number = input.getMaxImageNumber(); + ret.min_image_number = input.getMinImageNumber(); + if (input.currentCounterIsSet()) + ret.current_counter = input.getCurrentCounter(); return ret; } diff --git a/broker/OpenAPIConvert.h b/broker/OpenAPIConvert.h index e381de73..018e0332 100644 --- a/broker/OpenAPIConvert.h +++ b/broker/OpenAPIConvert.h @@ -75,6 +75,7 @@ DatasetSettings Convert(const org::openapitools::server::model::Dataset_settings std::vector Convert(const std::vector &input); org::openapitools::server::model::Pixel_mask_statistics Convert(const PixelMaskStatistics& input); org::openapitools::server::model::Image_buffer_status Convert(const ImageBufferStatus& input); +ImageBufferStatus Convert(const org::openapitools::server::model::Image_buffer_status& input); org::openapitools::server::model::Zeromq_preview_settings Convert(const ZMQPreviewSettings& settings); ZMQPreviewSettings Convert(const org::openapitools::server::model::Zeromq_preview_settings& input); diff --git a/common/ImageBuffer.h b/common/ImageBuffer.h index 614ee3cf..8e669276 100644 --- a/common/ImageBuffer.h +++ b/common/ImageBuffer.h @@ -15,7 +15,7 @@ struct ImageBufferStatus { int64_t total_slots; int64_t available_slots; - int64_t current_counter; + std::optional current_counter; }; struct ImageBufferEntry { diff --git a/reader/JFJochHttpReader.cpp b/reader/JFJochHttpReader.cpp index 37369b04..f4cc9cd3 100644 --- a/reader/JFJochHttpReader.cpp +++ b/reader/JFJochHttpReader.cpp @@ -14,14 +14,11 @@ void JFJochHttpReader::Close() { std::unique_lock ul(http_mutex); addr = ""; SetStartMessage({}); + last_image_buffer_counter = {}; + last_op_http_sync = false; } -uint64_t JFJochHttpReader::GetNumberOfImages() const { - std::unique_lock ul(http_mutex); - - if (addr.empty()) - return 0; - +ImageBufferStatus JFJochHttpReader::GetImageBufferStatus() const { httplib::Client cli_cmd(addr); auto res = cli_cmd.Get("/image_buffer/status"); @@ -31,13 +28,30 @@ uint64_t JFJochHttpReader::GetNumberOfImages() const { try { org::openapitools::server::model::Image_buffer_status status = nlohmann::json::parse(res->body); - return status.getMaxImageNumber() + 1; + ImageBufferStatus ret{}; + ret.max_image_number = status.getMaxImageNumber(); + ret.min_image_number = status.getMinImageNumber(); + ret.available_slots = status.getAvailableSlots(); + ret.total_slots = status.getTotalSlots(); + ret.images_in_the_buffer = status.getImageNumbers(); + if (status.currentCounterIsSet()) + ret.current_counter = status.getCurrentCounter(); + return ret; } catch (std::exception &e) { throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Could not parse image buffer status"); } } +uint64_t JFJochHttpReader::GetNumberOfImages() const { + std::unique_lock ul(http_mutex); + + if (addr.empty()) + return 0; + auto status = GetImageBufferStatus(); + return status.max_image_number + 1; +} + std::shared_ptr JFJochHttpReader::UpdateDataset_i() { httplib::Client cli_cmd(addr); @@ -153,8 +167,26 @@ bool JFJochHttpReader::LoadImage_i(std::shared_ptr &dataset httplib::Client cli_cmd(addr); + bool buffer_changed = false; + + // For autoupdate - if buffer didn't change don't update dataset + auto status = GetImageBufferStatus(); + if (!last_image_buffer_counter.has_value() // No information on the previous buffer state - always assume it changed + || !status.current_counter.has_value() // No information on the current buffer state - e.g. old version of software + || last_image_buffer_counter.value() != status.current_counter.value()) // current counter value different from previous + buffer_changed = true; + last_image_buffer_counter = status.current_counter; + + if (image_number == -1) { + if (last_op_http_sync && !buffer_changed) + return false; + last_op_http_sync = true; + } else { + last_op_http_sync = false; + } + // Always update dataset, as it might have changed from the last time - if (update_dataset) + if (buffer_changed && update_dataset) dataset = UpdateDataset_i(); if (!dataset) return false; diff --git a/reader/JFJochHttpReader.h b/reader/JFJochHttpReader.h index c1400081..fc33c3be 100644 --- a/reader/JFJochHttpReader.h +++ b/reader/JFJochHttpReader.h @@ -5,11 +5,17 @@ #define JFJOCH_JFJOCHHTTPREADER_H #include "JFJochReader.h" +#include "../common/ImageBuffer.h" class JFJochHttpReader : public JFJochReader { mutable std::mutex http_mutex; std::string addr; + std::optional last_image_buffer_counter; + bool last_op_http_sync = false; + + ImageBufferStatus GetImageBufferStatus() const; + bool LoadImage_i(std::shared_ptr &dataset, DataMessage& message, std::vector &buffer, diff --git a/viewer/JFJochImageReadingWorker.cpp b/viewer/JFJochImageReadingWorker.cpp index ea1fee6b..cbbdad39 100644 --- a/viewer/JFJochImageReadingWorker.cpp +++ b/viewer/JFJochImageReadingWorker.cpp @@ -119,7 +119,12 @@ void JFJochImageReadingWorker::LoadImage_i(int64_t image_number, int64_t summati if (http_mode) { if (image_number < 0 && summation != 1) return; - current_image_ptr = http_reader.LoadImage(image_number, summation); + const auto tmp_image_ptr = http_reader.LoadImage(image_number, summation); + if (image_number < 0 && tmp_image_ptr == nullptr) { + logger.Debug("No change in online buffer, not updating viewer"); + return; // Do nothing, since there is no update in the file + } + current_image_ptr = tmp_image_ptr; total_images = http_reader.GetNumberOfImages(); emit datasetLoaded(http_reader.GetDataset()); } else {