ifm3d
struct_o3r_ods_polar_occupancy_grid_v1.hpp
1 // -*- c++ -*-
2 /*
3  * Copyright 2025-present ifm electronic, gmbh
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef IFM3D_DESERIALIZE_STRUCT_O3R_ODS_POLAR_OCCUPANCY_GRID_V1_HPP
8 #define IFM3D_DESERIALIZE_STRUCT_O3R_ODS_POLAR_OCCUPANCY_GRID_V1_HPP
9 
10 #include <array>
11 #include <ifm3d/device/device.h>
12 #include <ifm3d/device/err.h>
13 #include <ifm3d/fg/organizer_utils.h>
14 #include <ifm3d/fg/buffer.h>
15 #include <ifm3d/deserialize/deserialize_utils.hpp>
16 
17 namespace ifm3d
18 {
19  namespace
20  {
21  constexpr auto ODS_POLAR_OCCUPANCY_GRID_VERSION_INDEX = 0x0000;
22  constexpr auto ODS_POLAR_OCCUPANCY_GRID_POLAR_OCC_GRID_INDEX = 0x0004;
23  constexpr auto ARRAY_SIZE = 675;
24  constexpr auto ODS_POLAR_OCCUPANCY_GRID_TIMESTAMP_NS_INDEX = 0x054A;
25  };
26 
29  {
30  public:
31  using Ptr = std::shared_ptr<ODSPolarOccupancyGridV1>;
32 
33  static bool
34  IsValid(const uint8_t* data, size_t size)
35  {
36  uint32_t version =
37  mkval<std::uint32_t>(data + ODS_POLAR_OCCUPANCY_GRID_VERSION_INDEX);
38 
39  if (size < ods_polar_occupancy_grid_v1_minimum_size || version < 1)
40  {
41  return false;
42  }
43  return true;
44  }
45 
46  void
47  Read(const uint8_t* start_ptr, size_t size)
48  {
49  if (!IsValid(start_ptr, size))
50  {
51  throw ifm3d::Error(IFM3D_CORRUPTED_STRUCT);
52  }
53 
54  version = mkval<std::uint32_t>(start_ptr +
55  ODS_POLAR_OCCUPANCY_GRID_VERSION_INDEX);
56  mkarray<uint16_t, ARRAY_SIZE>(
57  start_ptr + ODS_POLAR_OCCUPANCY_GRID_POLAR_OCC_GRID_INDEX,
58  polarOccGrid);
59  timestamp_ns = mkval<std::uint64_t>(
60  start_ptr + ODS_POLAR_OCCUPANCY_GRID_TIMESTAMP_NS_INDEX);
61  };
62 
63  /*@brief Version number(current 1) of polar occupancy grid*/
64  uint32_t version;
65  /* @brief A compressed version of the grid using polar coordinates.
66  * The index corresponds to the angle slice i*360/675 degree to
67  * (i+1)*360/675 degree. The value is the distance to the nearest occupied
68  * cell on the ray from the vehicle origin, given in [mm]. In case there
69  * are no occupied cells on the ray, the value 65535 is set.
70  */
71  std::array<uint16_t, ARRAY_SIZE> polarOccGrid;
72  /*@brief Timestamp of polar occupany grid in [ns]*/
73  uint64_t timestamp_ns;
74 
75  private:
76  static constexpr size_t ods_polar_occupancy_grid_v1_minimum_size = 1354;
77 
78  public:
80  Deserialize(const Buffer& ods_polar_occupancy_buffer_grid)
81  {
82  ODSPolarOccupancyGridV1 ods_polar_occupancy_grid_v1;
83 
84  ods_polar_occupancy_grid_v1.Read(
85  ods_polar_occupancy_buffer_grid.ptr<uint8_t>(0),
86  ods_polar_occupancy_buffer_grid.size());
87  return ods_polar_occupancy_grid_v1;
88  }
89  };
90 } // end namespace ifm3d
91 
92 #endif // IFM3D_DESERIALIZE_STRUCT_O3R_ODS_POLAR_OCCUPANCY_GRID_V1_HPP
ifm3d::Buffer::size
size_t size() const
Return the size of the buffer in bytes.
ifm3d::Buffer
The class Buffer represent a STL container to store data from the ifm devices in 2 dimension and supp...
Definition: buffer.h:99
ifm3d::Buffer::ptr
T * ptr(const std::uint32_t row)
returns a pointer to the specified Buffer row.
ifm3d::Error
Definition: err.h:114
ifm3d::ODSPolarOccupancyGridV1
Definition: struct_o3r_ods_polar_occupancy_grid_v1.hpp:28