CARLA
 
载入中...
搜索中...
未找到
CarlaCollisionEventPubSubTypes.cpp
浏览该文件的文档.
1// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*!
16 * @file CarlaCollisionEventPubSubTypes.cpp
17 * This header file contains the implementation of the serialization functions.
18 *
19 * This file was generated by the tool fastcdrgen.
20 */
21
22#include <fastcdr/FastBuffer.h>
23#include <fastcdr/Cdr.h>
24
26
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
29
30namespace carla_msgs {
31 namespace msg {
33{
34 // 设置数据类型(消息类型)的名称,用于序列化和反序列化
35 setName("carla_msgs::msg::dds_::CarlaCollisionEvent_");
36
37 // 获取 CarlaCollisionEvent 对象序列化所需的最大字节数
38 // 这包括消息的大小和任何附加的序列化数据
39 auto type_size = CarlaCollisionEvent::getMaxCdrSerializedSize();
40
41 // 调整可能的子消息对齐(例如,序列化时需要的填充)
42 // CDR(通用数据表示)标准可能需要对数据进行特定对齐
43 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* 可能的子消息对齐 */
44
45 // 设置总类型大小,包括封装(4 字节)以符合 DDS 序列化格式
46 m_typeSize = static_cast<uint32_t>(type_size) + 4; /* 封装 */
47
48 // 检查 CarlaCollisionEvent 类型是否定义了键
49 // 在 DDS 中,某些消息可能会包含一个键,用于唯一标识数据
50 m_isGetKeyDefined = CarlaCollisionEvent::isKeyDefined();
51
52 // 计算最大键长度,这个键可能会参与序列化
53 // 键长度为最大键的序列化字节数,或者 16 字节(取较大者)
54 size_t keyLength = CarlaCollisionEvent::getKeyMaxCdrSerializedSize() > 16 ?
55 CarlaCollisionEvent::getKeyMaxCdrSerializedSize() : 16;
56
57 // 为键缓冲区分配内存,用于存储序列化/反序列化时的键
58 // 确保分配足够的内存来存储键
59 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
60
61 // 将键缓冲区初始化为零,以避免包含任何垃圾值
62 memset(m_keyBuffer, 0, keyLength);
63}
64
65
73
75 void* data,
76 SerializedPayload_t* payload)
77 {
78 // 将 void* 类型的数据指针转换为 CarlaCollisionEvent* 类型,指向实际的数据对象
79 CarlaCollisionEvent* p_type = static_cast<CarlaCollisionEvent*>(data);
80
81 // 创建一个 FastBuffer 对象来管理原始数据缓冲区
82 // fastbuffer 将会操作 payload->data 中的数据,最大缓冲区大小由 payload->max_size 决定
83 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
84
85 // 创建一个 Cdr 对象来进行序列化操作
86 // Cdr 对象是基于 fastbuffer 创建的,默认使用系统字节序,并且序列化采用 DDS CDR 格式
87 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
88
89 // 根据 Cdr 对象的字节序判断封装类型,设置 payload 的封装类型
90 // 如果使用大端字节序,使用 CDR_BE,否则使用 CDR_LE
91 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
92
93 // 序列化封装部分
94 ser.serialize_encapsulation();
95
96 try
97 {
98 // 序列化数据对象(p_type 即 CarlaCollisionEvent 类型的对象)
99 // 调用 CarlaCollisionEvent 类的 serialize 方法将数据序列化到 Cdr 对象中
100 p_type->serialize(ser);
101 }
102 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
103 {
104 // 如果序列化过程中内存不足,捕获异常并返回 false
105 return false;
106 }
107
108 // 获取序列化后的数据长度,赋值给 payload->length
109 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
110
111 // 序列化成功,返回 true
112 return true;
113 }
114
115
117 SerializedPayload_t* payload,
118 void* data)
119 {
120 try
121 {
122 //Convert DATA to pointer of your type
123 CarlaCollisionEvent* p_type = static_cast<CarlaCollisionEvent*>(data);
124
125 // Object that manages the raw buffer.
126 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
127
128 // Object that deserializes the data.
129 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
130
131 // Deserialize encapsulation.
132 deser.read_encapsulation();
133 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
134
135 // Deserialize the object.
136 p_type->deserialize(deser);
137 }
138 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
139 {
140 return false;
141 }
142
143 return true;
144 }
145
147 void* data)
148 {
149 return [data]() -> uint32_t
150 {
151 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<CarlaCollisionEvent*>(data))) +
152 4u /*encapsulation*/;
153 };
154 }
155
157 {
158 return reinterpret_cast<void*>(new CarlaCollisionEvent());
159 }
160
162 void* data)
163 {
164 delete(reinterpret_cast<CarlaCollisionEvent*>(data));
165 }
166
168 void* data,
169 InstanceHandle_t* handle,
170 bool force_md5)
171 {
172 if (!m_isGetKeyDefined)
173 {
174 return false;
175 }
176
177 CarlaCollisionEvent* p_type = static_cast<CarlaCollisionEvent*>(data);
178
179 // Object that manages the raw buffer.
180 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
181 CarlaCollisionEvent::getKeyMaxCdrSerializedSize());
182
183 // Object that serializes the data.
184 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
185 p_type->serializeKey(ser);
186 if (force_md5 || CarlaCollisionEvent::getKeyMaxCdrSerializedSize() > 16)
187 {
188 m_md5.init();
189 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
190 m_md5.finalize();
191 for (uint8_t i = 0; i < 16; ++i)
192 {
193 handle->value[i] = m_md5.digest[i];
194 }
195 }
196 else
197 {
198 for (uint8_t i = 0; i < 16; ++i)
199 {
200 handle->value[i] = m_keyBuffer[i];
201 }
202 }
203 return true;
204 }
205 } //End of namespace msg
206} //End of namespace carla_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport ~CarlaCollisionEventPubSubType() override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport void * createData() override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override