diff --git a/frame_serialize/ImageMessage.h b/frame_serialize/ImageMessage.h index 011f9a65..ce7a1659 100644 --- a/frame_serialize/ImageMessage.h +++ b/frame_serialize/ImageMessage.h @@ -26,6 +26,7 @@ struct DataMessage { CBORImage image; std::vector spots; std::vector rad_int_profile; + uint64_t indexing_result; // 0 - not tried, 1 - tried and failed, 2 - tried and success }; #endif //JUNGFRAUJOCH_IMAGEMESSAGE_H diff --git a/frame_serialize/JFJochFrameDeserializer.cpp b/frame_serialize/JFJochFrameDeserializer.cpp index 410ce2e7..4f9e1137 100644 --- a/frame_serialize/JFJochFrameDeserializer.cpp +++ b/frame_serialize/JFJochFrameDeserializer.cpp @@ -47,8 +47,9 @@ inline float GetCBORFloat(CborValue &value) { } inline bool GetCBORBool(CborValue &value) { - if (!cbor_value_is_boolean(&value) ) - throw JFJochException(JFJochExceptionCategory::CBORError, "Bool expected"); + if (!cbor_value_is_boolean(&value) ) { + throw JFJochException(JFJochExceptionCategory::CBORError, "Bool expected " + std::to_string(cbor_value_get_type(&value))); + } bool tmp; cborErr(cbor_value_get_boolean(&value, &tmp)); cborErr(cbor_value_advance(&value)); @@ -335,6 +336,8 @@ bool JFJochFrameDeserializer::ProcessImageMapElement(CborValue &value) { GetCBORSpots(value); else if (key == "rad_int_profile") GetCBORFloatArray(value, data_message.rad_int_profile); + else if (key == "indexing_result") + data_message.indexing_result = GetCBORUInt(value); else cbor_value_advance(&value); return true; diff --git a/frame_serialize/JFJochFrameSerializer.cpp b/frame_serialize/JFJochFrameSerializer.cpp index 3da90754..e66e324b 100644 --- a/frame_serialize/JFJochFrameSerializer.cpp +++ b/frame_serialize/JFJochFrameSerializer.cpp @@ -363,13 +363,14 @@ void JFJochFrameSerializer::SerializeImage(const DataMessage& message) { CborEncoder encoder, mapEncoder; cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); - cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 5)); + cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 6)); CBOR_ENC(mapEncoder, "type", "image"); CBOR_ENC(mapEncoder, "image_id", message.number); CBOR_ENC(mapEncoder, "data", message.image); CBOR_ENC(mapEncoder, "spots", message.spots); CBOR_ENC(mapEncoder, "rad_int_profile", message.rad_int_profile); + CBOR_ENC(mapEncoder, "indexing_result", message.indexing_result); cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 5adebaa2..0be888e0 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -290,7 +290,7 @@ int64_t JFJochReceiver::FrameTransformationThread() { while (images_to_go.Get(image_number) != 0) { try { - DataMessage message; + DataMessage message{}; message.number = image_number; bool send_preview = false; @@ -376,11 +376,15 @@ int64_t JFJochReceiver::FrameTransformationThread() { auto indexer_result = indexer->Run(recip); - if (!indexer_result.empty()) + if (!indexer_result.empty()) { + message.indexing_result = 2; indexing_solution.AddElement(image_number, 1); - else + } else { + message.indexing_result = 1; indexing_solution.AddElement(image_number, 0); - } + } + } else + message.indexing_result = 0; if (send_bkg_estimate) { uint16_t rad_int_min_bin = std::floor( diff --git a/tests/CBORTest.cpp b/tests/CBORTest.cpp index 47345fee..2992c953 100644 --- a/tests/CBORTest.cpp +++ b/tests/CBORTest.cpp @@ -46,8 +46,8 @@ TEST_CASE("CBORSerialize_Start", "[CBOR]") { .series_unique_id = "bla", .series_id = 4567, .goniometer = {{"omega", { - .increment = 0.1f, - .start = 10.0f + .increment = 0.1f, + .start = 10.0f }}}, .detector_translation = {0.5f, 0.0f, 0.5f}, .source_name = "Swiss Light Source", @@ -121,11 +121,11 @@ TEST_CASE("CBORSerialize_End", "[CBOR]") { JFJochFrameSerializer serializer(8*1024*1024); EndMessage message { - .number_of_images = 57789, - .max_receiver_delay = 3456, - .efficiency = 0.99, - .write_master_file = true, - .end_date = "ccc" + .number_of_images = 57789, + .max_receiver_delay = 3456, + .efficiency = 0.99, + .write_master_file = true, + .end_date = "ccc" }; REQUIRE_NOTHROW(serializer.SerializeSequenceEnd(message)); @@ -155,20 +155,21 @@ TEST_CASE("CBORSerialize_Image", "[CBOR]") { test[i] = (i * 253 + 56) % 256; CBORImage image { - .data = test.data(), - .size = 1024, - .xpixel = 256, - .ypixel = 2, - .pixel_depth_bytes = 2, - .pixel_is_signed = true, - .algorithm = CompressionAlgorithm::NO_COMPRESSION, - .channel = "default" + .data = test.data(), + .size = 1024, + .xpixel = 256, + .ypixel = 2, + .pixel_depth_bytes = 2, + .pixel_is_signed = true, + .algorithm = CompressionAlgorithm::NO_COMPRESSION, + .channel = "default" }; DataMessage message { - .number = 456, - .image = image, - .spots = spots + .number = 456, + .image = image, + .spots = spots, + .indexing_result = 1 }; REQUIRE_NOTHROW(serializer.SerializeImage(message)); @@ -186,6 +187,7 @@ TEST_CASE("CBORSerialize_Image", "[CBOR]") { REQUIRE(image_array.image.pixel_is_signed); REQUIRE(image_array.image.channel == "default"); REQUIRE(image_array.image.size == test.size()); + REQUIRE(image_array.indexing_result == message.indexing_result); REQUIRE(image_array.number == 456); REQUIRE(memcmp(image_array.image.data, test.data(), test.size()) == 0); } @@ -211,9 +213,10 @@ TEST_CASE("CBORSerialize_Image_2", "[CBOR]") { }; DataMessage message { - .number = 456, + .number = 480, .image = image, - .spots = spots + .spots = spots, + .indexing_result = 3 }; REQUIRE_NOTHROW(serializer.SerializeImage(message)); @@ -232,7 +235,8 @@ TEST_CASE("CBORSerialize_Image_2", "[CBOR]") { REQUIRE(!image_array.image.pixel_is_signed); REQUIRE(image_array.image.channel == "default"); REQUIRE(image_array.image.size == test.size()); - REQUIRE(image_array.number == 456); + REQUIRE(image_array.indexing_result == message.indexing_result); + REQUIRE(image_array.number == 480); REQUIRE(memcmp(image_array.image.data, test.data(), test.size()) == 0); }