ifm3d
deserialize.h
1 // -*- c++ -*-
2 /*
3  * Copyright 2022-present ifm electronic, gmbh
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef IFM3D_DESERIALIZE_DESERIALIZE_H
7 #define IFM3D_DESERIALIZE_DESERIALIZE_H
8 
11 #include <ifm3d/deserialize/struct_o3r_ods_extrinsic_calibration_correction_v1.hpp>
12 #include <ifm3d/deserialize/struct_o3r_ods_info_v1.hpp>
13 #include <ifm3d/deserialize/struct_o3r_ods_occupancy_grid_v1.hpp>
14 #include <ifm3d/deserialize/struct_o3r_ods_polar_occupancy_grid_v1.hpp>
15 #include <ifm3d/deserialize/struct_rgb_info_v1.hpp>
16 #include <ifm3d/deserialize/struct_tof_info_v3.hpp>
17 #include <ifm3d/deserialize/struct_tof_info_v4.hpp>
18 #include <ifm3d/fg/buffer.h>
19 #include <ifm3d/fg/organizer_utils.h>
20 #include <variant>
21 
22 namespace ifm3d
23 {
24  using VariantType = std::variant<std::monostate,
25  ODSInfoV1,
26  TOFInfoV3,
27  TOFInfoV4,
28  RGBInfoV1,
29  ODSOccupancyGridV1,
30  ODSPolarOccupancyGridV1,
31  ODSExtrinsicCalibrationCorrectionV1>;
32 
33  template <typename T>
34  static T
35  create_and_read(const uint8_t* data, size_t size)
36  {
37  T obj{};
38  obj.Read(data, size);
39  return obj;
40  }
41 
55  static VariantType
56  deserialize(const uint8_t* data, size_t size, ifm3d::buffer_id buffer_id)
57  {
58  switch (buffer_id)
59  {
60  case (ifm3d::buffer_id::O3R_ODS_INFO):
61  return create_and_read<ODSInfoV1>(data, size);
62  case (ifm3d::buffer_id::TOF_INFO): {
63  if (TOFInfoV4::IsValid(data, size))
64  {
65  return create_and_read<TOFInfoV4>(data, size);
66  }
67 
68  if (TOFInfoV3::IsValid(data, size))
69  {
70  return create_and_read<TOFInfoV3>(data, size);
71  }
72 
73  return std::monostate{};
74  }
75  case (ifm3d::buffer_id::RGB_INFO):
76  return create_and_read<RGBInfoV1>(data, size);
77  case (ifm3d::buffer_id::O3R_ODS_OCCUPANCY_GRID):
78  return create_and_read<ODSOccupancyGridV1>(data, size);
79  case (ifm3d::buffer_id::O3R_ODS_POLAR_OCC_GRID):
80  return create_and_read<ODSPolarOccupancyGridV1>(data, size);
81  case (ifm3d::buffer_id::O3R_ODS_EXTRINSIC_CALIBRATION_CORRECTION):
82  return create_and_read<ODSExtrinsicCalibrationCorrectionV1>(data,
83  size);
84  default:
85  return std::monostate{};
86  }
87  }
88 
89  static VariantType
90  deserialize(const Buffer& buffer)
91  {
92  return deserialize(buffer.Ptr<uint8_t>(0),
93  buffer.Size(),
94  buffer.BufferId());
95  }
96 } // end namespace ifm3d
97 
98 #endif // IFM3D_DESERIALIZE_DESERIALIZE_H
BufferId
BufferIds available for use with the default Organizer.
Definition: buffer_id.h:19