ddt  0.1
ddtPublisherSimulator.hpp
Go to the documentation of this file.
1 // @copyright
2 // (c) Copyright ESO 2020
3 // All Rights Reserved
4 // ESO (eso.org) is an Intergovernmental Organization, and therefore special
5 // legal conditions apply.
6 //
7 // @file ddtPublisherSimulator.hpp
8 // @brief Simulator for sending data.
9 //
10 // This is a simulator for publishing data. Data is read from a directory
11 // containing FITS files.
12 //
13 // @author Carsten Mannel, CGI
14 // @since 2020/09/25
15 //
16 
17 #ifndef DDTPUBLISHERSIMULATOR_HPP_
18 #define DDTPUBLISHERSIMULATOR_HPP_
19 
20 #include <boost/bind/bind.hpp>
21 #include <boost/filesystem.hpp>
22 #include <boost/signals2/signal.hpp>
23 #include <random>
24 
26 #include "ddt/ddtDataPublisher.hpp"
29 #include "ddt/ddtLogger.hpp"
30 
31 #include <cpl.h>
32 
34 #include "ddt/ddtEncDecImage2D.hpp"
35 #include "ddt/ddtEncDecImage3D.hpp"
36 
37 namespace datatransfer = ::elt::ddt::datatransfer;
38 
39 using namespace ddt;
40 using namespace boost::filesystem;
41 
42 namespace ddt {
43 
47  MULTIDIM = 3,
51  UNSIGNEDINT32 = 7
52 };
53 
58  public:
63 
67  ~DdtPublisherSimulator() final;
68 
73  int Run();
74 
78  bool Init(const int argc, char** argv);
79 
84  int RunImageTransfer();
85 
90  int RunOscilloscopeTransfer();
91 
96  int RunMultiDimensionalArrayTransfer();
97 
102  int RunNumericalSampleArrayTransfer();
103 
108  int RunSegmentedImageTransfer();
109 
114  int RunUnsignedIntegerTransfer(const unsigned int numBits);
115 
116  private:
117  DdtLogger* logger;
118  CommandLineParserBuilder* builder;
119 
120  std::string broker_uri;
121  std::string data_stream_identifier;
122  int publishing_interval;
123  int num_samples_in_buffer;
124  std::string image_folder;
125  int mode;
126  bool checksum;
127 
128  const int LATENCY = 10000;
129  const int DEADLINE = 10;
130 
136  bool CheckBytesPerPixel(std::vector<std::string>& file_list);
137 
138  void DetermineBytesPerPixelAndDataType(
139  const cpl_propertylist* const property_list, const cpl_image* const image,
140  int* const bytes_per_pixel, uint32_t* const data_type,
141  cpl_type* const cplImageType);
142 
143  bool GetSimulationData(std::vector<std::string>& file_list,
144  std::vector<cpl_image*>& images);
145 
146  void FillDataVectors(std::vector<std::vector<uint8_t>>& datavecs,
147  int& max_sample_size, std::vector<cpl_image*>& images,
148  const int num_images, const cpl_type cplImageType,
149  const int bytes_per_pixel) const;
150 
151  void FillDataVectorInt(std::vector<std::vector<uint8_t>>& datavecs,
152  cpl_image* const image, const int vec_elems,
153  const int bytes_per_pixel) const;
154 
155  void FillDataVectorFloat(std::vector<std::vector<uint8_t>>& datavecs,
156  cpl_image* const image, const int vec_elems,
157  const int bytes_per_pixel) const;
158 
159  void FillDataVectorDouble(std::vector<std::vector<uint8_t>>& datavecs,
160  cpl_image* const image, const int vec_elems,
161  const int bytes_per_pixel) const;
162 
163  void FillMetaDataWCSItems(const cpl_propertylist* const property_list,
164  MetaDataElementsImage3D& meta_data_img_3d);
165 
166  void FillMetadataBase(MetaDataElementsImage3D& meta_data_img_3d,
167  const int bytes_per_pixel,
168  const uint32_t number_dimensions,
169  const bool complete_flag, const bool last_segment,
170  const bool byte_order_little_endian,
171  const uint32_t data_type) const;
172 
173  void FillMetadataBase(MetaDataElementsImage2D& meta_data_img_2d,
174  const int bytes_per_pixel,
175  const uint32_t number_dimensions,
176  const bool complete_flag,
177  const bool byte_order_little_endian,
178  const uint32_t data_type) const;
179 
180  void FillMetadataSpecific(MetaDataElementsImage3D& meta_data_img_3d,
181  const uint32_t number_pixels_x,
182  const uint32_t number_pixels_y,
183  const int32_t binning_factor_x,
184  const int32_t binning_factor_y,
185  const uint32_t number_layers,
186  const uint32_t item_size) const;
187 
188  void FillMetadataSpecific(MetaDataElementsImage2D& meta_data_img_2d,
189  const uint32_t number_pixels_x,
190  const uint32_t number_pixels_y,
191  const int32_t binning_factor_x,
192  const int32_t binning_factor_y,
193  const uint32_t number_chunks_x,
194  const uint32_t number_chunks_y) const;
195 
196  void CompleteMetadataSpecific(MetaDataElementsImage2D& meta_data_img_2d,
197  const uint32_t first_pixel_x,
198  const uint32_t first_pixel_y,
199  const bool last_segment,
200  const int32_t image_id) const;
201 
202  void PublishData_ImageTransfer(std::vector<cpl_image*>& images,
203  const int bytes_per_pixel,
204  const uint32_t data_type, const int num_images,
205  const int max_sample_size,
206  MetaDataElementsImage3D& meta_data_img_3d,
207  std::vector<std::vector<uint8_t>>& datavecs);
208 
209  void PublishData_SegmentedImageTransfer(const int bytes_per_pixel,
210  const uint32_t number_pixels_x,
211  const uint32_t number_pixels_y,
212  const int vec_elems);
213 
214  void PublishData_MultiDimension(const uint32_t bytes_per_value,
215  const int number_dimensions,
216  const uint32_t data_type,
217  const std::string array_dimensions,
218  const int vec_elems,
219  const std::vector<uint8_t>& datavec,
220  std::vector<std::string>& descriptions);
221 
222  void PublishData_UnsignedIntegerTransfer(
223  const uint32_t bytes_per_value, const int dim1, const int dim2,
224  const int number_dimensions, const uint32_t data_type,
225  const int vec_elems, const std::vector<uint8_t>& datavec,
226  std::vector<std::string>& descriptions);
227 
228  cpl_propertylist* LoadPropertyList(const std::string file_name);
229 
230  void LogNoSimDataFolder();
231  void LogNoDirectory();
232  void LogNoSimDataFiles();
233 
234  int CreateAndRegPublisher(const int vec_elems);
235  void TransferData(DdtEncDecBinaryxD* const enc_dec_binary_xd,
236  const MetaDataElementsBinaryxD& meta_data_binary_xD,
237  const std::vector<uint8_t>& datavec,
238  const int32_t sample_id);
239  void InitMetaDataBinaryXD(MetaDataElementsBinaryxD* const meta_data_binary_xD,
240  const uint32_t bytes_per_pixel,
241  const uint32_t number_dimensions,
242  const bool byte_order_little_endian,
243  const bool complete_flag, const bool last_segment,
244  const uint32_t data_type,
245  const std::string array_dimensions) const;
246 
247  std::vector<uint8_t> GetDataVectorOscilloscope(const int dim1);
248  std::vector<uint8_t> GetDataVectorMultiDimension(const int dim1,
249  const int dim2,
250  const int dim3,
251  const int dim4);
252  void FillDataVectorNumericalSample(const int dim1, const int cnt,
253  std::vector<uint8_t>& datavec);
254  void FillDataVectorSegmentedImage(const uint32_t number_pixels_x,
255  const uint32_t number_pixels_y,
256  const int chunk_cnt_x,
257  const int chunk_cnt_y,
258  const uint32_t number_chunks_x,
259  std::vector<uint8_t>& datavec) const;
260 
261  std::unique_ptr<DdtDataPublisher> publisher;
262 };
263 
264 } // namespace ddt
265 
266 #endif /* DDTPUBLISHERSIMULATOR_HPP_ */
MetaDataElementsImage3D
Definition: ddtEncDecImage3D.hpp:30
ddt::DdtPublisherSimulator
Definition: ddtPublisherSimulator.hpp:57
testPyDdtDataTransfer.number_chunks_x
number_chunks_x
Definition: testPyDdtDataTransfer.py:59
commandLineParserBuilder.hpp
ddt::IMAGETRANSFER
@ IMAGETRANSFER
Definition: ddtPublisherSimulator.hpp:45
testPyDdtDataTransfer.data_type
data_type
Definition: testPyDdtDataTransfer.py:43
testPyDdtDataTransfer.number_pixels_x
number_pixels_x
Definition: testPyDdtDataTransfer.py:53
testPyDdtDataTransfer.number_dimensions
number_dimensions
Definition: testPyDdtDataTransfer.py:38
ddt::DdtLogger
Definition: ddtLogger.hpp:48
ddt
Definition: ddtClient.hpp:36
ddtEncDecImage3D.hpp
ddt::UNSIGNEDINT32
@ UNSIGNEDINT32
Definition: ddtPublisherSimulator.hpp:51
testPyDdtDataTransfer.image_id
image_id
Definition: testPyDdtDataTransfer.py:61
ddt::SEGMENTEDIMAGE
@ SEGMENTEDIMAGE
Definition: ddtPublisherSimulator.hpp:49
testPyDdtDataTransfer.byte_order_little_endian
byte_order_little_endian
Definition: testPyDdtDataTransfer.py:42
testPyDdtDataTransfer.first_pixel_x
first_pixel_x
Definition: testPyDdtDataTransfer.py:57
ddt::CommandLineParserBuilder
Definition: commandLineParserBuilder.hpp:24
ddtDataPublisherApplication.hpp
ddt::DdtDataPublisher
Definition: ddtDataPublisher.hpp:35
testPyDdtDataTransfer.array_dimensions
array_dimensions
Definition: testPyDdtDataTransfer.py:66
testPyDdtDataTransfer.number_pixels_y
number_pixels_y
Definition: testPyDdtDataTransfer.py:54
ddtEncDecImage2D.hpp
ddt::PublisherModes
PublisherModes
Definition: ddtPublisherSimulator.hpp:44
testPyDdtDataTransfer.number_layers
number_layers
Definition: testPyDdtDataTransfer.py:76
testPyDdtDataTransfer.binning_factor_x
binning_factor_x
Definition: testPyDdtDataTransfer.py:55
ddt::CONFIGURATIONMAP
@ CONFIGURATIONMAP
Definition: ddtPublisherSimulator.hpp:48
ddt::UNSIGNEDINT16
@ UNSIGNEDINT16
Definition: ddtPublisherSimulator.hpp:50
ddtEncDecBinaryxD.hpp
testPyDdtDataTransfer.number_chunks_y
number_chunks_y
Definition: testPyDdtDataTransfer.py:60
MetaDataElementsImage2D
Definition: ddtEncDecImage2D.hpp:30
ddt::DdtPublisherSimulator::DdtPublisherSimulator
DdtPublisherSimulator()
MetaDataElementsBinaryxD
Definition: ddtEncDecBinaryxD.hpp:30
testPyDdtDataTransfer.bytes_per_pixel
bytes_per_pixel
Definition: testPyDdtDataTransfer.py:37
ddtDataPublisher.hpp
ddt::DdtDataPublisherApplication
Definition: ddtDataPublisherApplication.hpp:25
DdtEncDecBinaryxD
Definition: ddtEncDecBinaryxD.hpp:47
ddt::OSCILLOSCOPE
@ OSCILLOSCOPE
Definition: ddtPublisherSimulator.hpp:46
ddtLogger.hpp
testPyDdtDataTransfer.complete_flag
complete_flag
Definition: testPyDdtDataTransfer.py:40
testPyDdtDataTransfer.binning_factor_y
binning_factor_y
Definition: testPyDdtDataTransfer.py:56
testPyDdtDataTransfer.last_segment
last_segment
Definition: testPyDdtDataTransfer.py:41
testPyDdtDataTransfer.item_size
item_size
Definition: testPyDdtDataTransfer.py:77
testPyDdtDataTransfer.first_pixel_y
first_pixel_y
Definition: testPyDdtDataTransfer.py:58
ddtDataTransferFactory.hpp
ddt::MULTIDIM
@ MULTIDIM
Definition: ddtPublisherSimulator.hpp:47