From 7f72be086ab69a032a009ecd5c7a29dcf061c224 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Fri, 13 Jul 2018 09:50:26 +0200 Subject: [PATCH] Fix array length==1 bug --- lib/src/ZmqReceiver.cpp | 14 +++++++++----- lib/src/ZmqReceiver.hpp | 8 ++++++-- lib/test/test_ZmqReceiver.cpp | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/lib/src/ZmqReceiver.cpp b/lib/src/ZmqReceiver.cpp index 551754b..f344555 100644 --- a/lib/src/ZmqReceiver.cpp +++ b/lib/src/ZmqReceiver.cpp @@ -9,7 +9,12 @@ using namespace std; namespace pt = boost::property_tree; HeaderDataType::HeaderDataType(const std::string& type, size_t shape) : - type(type), value_shape(shape), endianness("little") { + type(type), value_shape(shape), endianness("little"), is_array(true) { + value_bytes_size = get_type_byte_size(type); +} + +HeaderDataType::HeaderDataType(const std::string& type) : + type(type), value_shape(1), endianness("little"), is_array(false) { value_bytes_size = get_type_byte_size(type); } @@ -220,10 +225,7 @@ shared_ptr get_value_from_json(const pt::ptree& json_header, const string& { char* buffer = new char[header_data_type.value_bytes_size * header_data_type.value_shape]; - if (header_data_type.value_shape == 1) { - copy_value_to_buffer(buffer, 0, json_header.get_child(name), header_data_type); - - } else { + if (header_data_type.is_array) { size_t index = 0; for (const auto& item : json_header.get_child(name)) { @@ -233,6 +235,8 @@ shared_ptr get_value_from_json(const pt::ptree& json_header, const string& ++index; } + } else { + copy_value_to_buffer(buffer, 0, json_header.get_child(name), header_data_type); } return shared_ptr(buffer, default_delete()); diff --git a/lib/src/ZmqReceiver.hpp b/lib/src/ZmqReceiver.hpp index 9449860..b16967f 100644 --- a/lib/src/ZmqReceiver.hpp +++ b/lib/src/ZmqReceiver.hpp @@ -20,8 +20,10 @@ struct HeaderDataType size_t value_shape; std::string endianness; size_t value_bytes_size; + bool is_array; - HeaderDataType(const std::string& type, size_t shape=1); + HeaderDataType(const std::string& type); + HeaderDataType(const std::string& type, size_t shape); }; size_t get_type_byte_size(const std::string& type); @@ -45,7 +47,7 @@ class ZmqReceiver std::shared_ptr> header_values_type = NULL; - std::shared_ptr read_json_header(const std::string& header); + @@ -57,6 +59,8 @@ class ZmqReceiver void connect(); + std::shared_ptr read_json_header(const std::string& header); + std::pair, char*> receive(); const std::shared_ptr> get_header_values_type() const; diff --git a/lib/test/test_ZmqReceiver.cpp b/lib/test/test_ZmqReceiver.cpp index 10a0349..c2337ff 100644 --- a/lib/test/test_ZmqReceiver.cpp +++ b/lib/test/test_ZmqReceiver.cpp @@ -1,4 +1,5 @@ #include "../src/ZmqReceiver.hpp" +#include "../src/ZmqReceiver.hpp" using namespace std; namespace pt = boost::property_tree; @@ -33,7 +34,7 @@ TEST(ZmqReceiver, get_value_from_json) uint64_t frame_number = 1234567890; json_header.add("frame_number", frame_number); - HeaderDataType header_data_type_scalar("uint64", 1); + HeaderDataType header_data_type_scalar("uint64"); auto scalar_buffer = get_value_from_json(json_header, "frame_number", header_data_type_scalar); auto scalar_value = reinterpret_cast(scalar_buffer.get()); @@ -59,4 +60,34 @@ TEST(ZmqReceiver, get_value_from_json) for (int i=0; i<3; i++) { ASSERT_TRUE(array_values[i] == modules_number[i]); } +} + +TEST(ZmqReceiver, read_json_header) +{ + int n_modules = 1; + + auto header_values = shared_ptr>(new unordered_map { + {"pulse_id", HeaderDataType("uint64")}, + {"frame", HeaderDataType("uint64")}, + {"is_good_frame", HeaderDataType("uint64")}, + {"daq_rec", HeaderDataType("int64")}, + + {"pulse_id_diff", HeaderDataType("int64", n_modules)}, + {"framenum_diff", HeaderDataType("int64", n_modules)}, + + {"missing_packets_1", HeaderDataType("uint64", n_modules)}, + {"missing_packets_2", HeaderDataType("uint64", n_modules)}, + {"daq_recs", HeaderDataType("uint64", n_modules)}, + + {"pulse_ids", HeaderDataType("uint64", n_modules)}, + {"framenums", HeaderDataType("uint64", n_modules)}, + + {"module_number", HeaderDataType("uint64", n_modules)} + }); + + ZmqReceiver receiver("something", 1, 1, header_values); + + auto header_string = "{\"missing_packets_2\":[0],\"missing_packets_1\":[0],\"frame\":0,\"daq_recs\":[3840],\"module_number\":[0],\"shape\":[512,1024],\"pulse_id\":6021771850,\"framenum_diff\":[0],\"pulse_ids\":[6021771850],\"is_good_frame\":1,\"framenums\":[193],\"pulse_id_diff\":[0],\"daq_rec\":3840,\"type\":\"uint16\",\"htype\":\"array-1.0\"}"; + + auto frame_metadata = receiver.read_json_header(header_string); } \ No newline at end of file