diff --git a/frame_serialize/CborUtil.h b/frame_serialize/CborUtil.h index a4313b1e..cb016f54 100644 --- a/frame_serialize/CborUtil.h +++ b/frame_serialize/CborUtil.h @@ -6,6 +6,7 @@ #include "tinycbor/src/cbor.h" +constexpr const CborTag SelfDescribedCBOR = 55799; constexpr const CborTag TagMultiDimArray = 40; constexpr const CborTag TagDECTRISCompression = 56500; diff --git a/frame_serialize/JFJochFrameDeserializer.cpp b/frame_serialize/JFJochFrameDeserializer.cpp index 341f4ef0..13bb11ab 100644 --- a/frame_serialize/JFJochFrameDeserializer.cpp +++ b/frame_serialize/JFJochFrameDeserializer.cpp @@ -587,6 +587,11 @@ std::unique_lock ul(m); CborParser parser; CborValue value; cborErr(cbor_parser_init(buffer.data(), buffer.size(), 0, &parser, &value)); + + if (GetCBORTag(value) != SelfDescribedCBOR) + throw JFJochException(JFJochExceptionCategory::CBORError, "CBOR must start with dedicated tag"); + + if (cbor_value_is_map(&value)) { CborValue map_value; cborErr(cbor_value_enter_container(&value, &map_value)); diff --git a/frame_serialize/JFJochFrameSerializer.cpp b/frame_serialize/JFJochFrameSerializer.cpp index 0754b38d..bb897b90 100644 --- a/frame_serialize/JFJochFrameSerializer.cpp +++ b/frame_serialize/JFJochFrameSerializer.cpp @@ -293,8 +293,9 @@ const std::vector &JFJochFrameSerializer::GetBuffer() const { void JFJochFrameSerializer::SerializeSequenceStart(const StartMessage& message) { buffer.resize(max_buffer_size); CborEncoder encoder, mapEncoder; - cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); + cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); + cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR )); size_t elements = 27; cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, elements)); @@ -344,6 +345,7 @@ void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) { CborEncoder encoder, mapEncoder; cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); + cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR )); cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 6)); CBOR_ENC(mapEncoder, "type", "end"); @@ -364,6 +366,8 @@ void JFJochFrameSerializer::SerializeImage(const DataMessage& message) { CborEncoder encoder, mapEncoder, userDataMapEncoder; cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); + + cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR )); cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 4)); CBOR_ENC(mapEncoder, "type", "image"); diff --git a/tests/CBORTest.cpp b/tests/CBORTest.cpp index 3b6f18f3..c38b2def 100644 --- a/tests/CBORTest.cpp +++ b/tests/CBORTest.cpp @@ -2,7 +2,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include -#include #include "../frame_serialize/JFJochFrameSerializer.h" #include "../frame_serialize/JFJochFrameDeserializer.h" @@ -384,23 +383,61 @@ TEST_CASE("CBORSerialize_Image_Spots", "[CBOR]") { REQUIRE(image_array.spots[1].intensity == 123); } -TEST_CASE("CBORSerialize_End_NLohmann", "[CBOR]") { +TEST_CASE("CBORSerialize_Start_stream2", "[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" + + StartMessage message { + .data_file_count = 3, + .detector_distance = 0.0005, + .beam_center_x = 456.6, + .beam_center_y = 124.3, + .number_of_images = 34567, + .image_size_x = 456, + .image_size_y = 457, + .pixel_bit_depth = 32, + .pixel_signed = true, + .incident_energy = 12400, + .incident_wavelength = 0.988, + .frame_time = 0.0001, + .count_time = 0.000098, + .saturation_value = 65535, + .min_value = -32767, + .pixel_size_x = 0.000075, + .pixel_size_y = 0.000075, + .sensor_thickness = 0.0005, + .sensor_material = "Si", + .compression_algorithm = CompressionAlgorithm::BSHUF_LZ4, + .compression_block_size = 8192, + .unit_cell = {45,37,45,90,108,120}, + .space_group_number = 154, + .max_spot_count = 250, + .storage_cell_number = 16, + .pixel_mask_enabled = true, + .arm_date = "abc", + .sample_name = "lyso", + .file_prefix = "lyso1/dir/file", + .channels = {"default", "sc2"}, + .detector_description = "EIGER 16M", + .detector_serial_number = "123", + .series_unique_id = "bla", + .series_id = 4567, + .goniometer = {{"omega", { + .increment = 0.1f, + .start = 10.0f + }}}, + .detector_translation = {0.5f, 0.0f, 0.5f}, + .source_name = "Swiss Light Source", + .source_name_short = "SLS", + .instrument_name = "X06SA", + .instrument_name_short = "PXIII", + .rad_int_bin_number = 35, + .summation = 567 }; + message.pixel_mask["sc0"] = std::vector(456*457, 15); - REQUIRE_NOTHROW(serializer.SerializeSequenceEnd(message)); + REQUIRE_NOTHROW(serializer.SerializeSequenceStart(message)); + + auto image = serializer.GetBuffer(); - auto serialized = serializer.GetBuffer(); - nlohmann::json j ; - REQUIRE_NOTHROW(j = nlohmann::json::from_cbor(serialized)); - REQUIRE(j["type"] == "end"); - REQUIRE(j["write_master_file"] == true); - REQUIRE(j["end_date"] == "ccc"); } \ No newline at end of file