7 #ifndef IFM3D_DESERIALIZE_STRUCT_O3R_ODS_OCCUPANCY_GRID_V1_HPP
8 #define IFM3D_DESERIALIZE_STRUCT_O3R_ODS_OCCUPANCY_GRID_V1_HPP
12 #include <ifm3d/deserialize/deserialize_utils.hpp>
13 #include <ifm3d/device/device.h>
14 #include <ifm3d/device/err.h>
15 #include <ifm3d/fg/buffer.h>
16 #include <ifm3d/fg/organizer_utils.h>
22 constexpr
auto ODS_OCCUPANCY_GRID_TIMESTAMP_NS_INDEX = 0x0000;
23 constexpr
auto ODS_OCCUPANCY_GRID_WIDTH_INDEX = 0x0008;
24 constexpr
auto ODS_OCCUPANCY_GRID_HEIGHT_INDEX = 0x000C;
25 constexpr
auto ODS_OCCUPANCY_GRID_TRANSFORM_CELL_CENTER_TO_USER_INDEX =
27 constexpr
auto ODS_OCCUPANCY_GRID_IMAGE_INDEX = 0x0028;
34 using Ptr = std::shared_ptr<ODSOccupancyGridV1>;
37 IsValid(
const uint8_t*,
size_t size)
39 return size >= ODS_OCCUPANCY_GRID_V1_MINIMUM_SIZE;
43 Read(
const uint8_t* data,
size_t size)
45 if (!IsValid(data, size))
49 const uint8_t* start_ptr = data;
50 timestamp_ns = mkval<std::uint64_t>(
51 start_ptr + ODS_OCCUPANCY_GRID_TIMESTAMP_NS_INDEX);
52 width = mkval<std::uint32_t>(start_ptr + ODS_OCCUPANCY_GRID_WIDTH_INDEX);
54 mkval<std::uint32_t>(start_ptr + ODS_OCCUPANCY_GRID_HEIGHT_INDEX);
56 start_ptr + ODS_OCCUPANCY_GRID_TRANSFORM_CELL_CENTER_TO_USER_INDEX,
57 transform_cell_center_to_user);
58 ods_occupancy_grid_v1_size = ODS_OCCUPANCY_GRID_V1_MINIMUM_SIZE +
59 static_cast<size_t>(width) * height;
60 if (!IsValid(data, size))
65 image =
ifm3d::Buffer(height, width, 1, ifm3d::PixelFormat::FORMAT_8U);
66 std::memcpy(image.
Ptr<uint8_t>(0),
67 start_ptr + ODS_OCCUPANCY_GRID_IMAGE_INDEX,
71 uint64_t timestamp_ns{};
81 std::array<float, 6> transform_cell_center_to_user{};
85 size_t ods_occupancy_grid_v1_size{};
88 static constexpr
size_t ODS_OCCUPANCY_GRID_V1_MINIMUM_SIZE = 40;
92 Deserialize(
const Buffer& ods_occupancy_buffer_grid)
96 ods_occupancy_grid_v1.Read(ods_occupancy_buffer_grid.
Ptr<uint8_t>(0),
97 ods_occupancy_buffer_grid.
Size());
98 return ods_occupancy_grid_v1;
103 #endif // IFM3D_DESERIALIZE_STRUCT_O3R_ODS_OCCUPANCY_GRID_V1_HPP