CARLA
 
载入中...
搜索中...
未找到
TransformPubSubTypes.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 TransformPubSubTypes.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
30// 定义在geometry_msgs命名空间下的msg命名空间,用于组织相关消息类型的代码逻辑
31namespace geometry_msgs {
32 namespace msg {
33 // TransformPubSubType类的构造函数
35 {
36 // 设置类型名称,这里表明是geometry_msgs::msg::dds_::Transform_类型
37 setName("geometry_msgs::msg::dds_::Transform_");
38 // 获取Transform类型的最大CDR序列化大小
39 auto type_size = Transform::getMaxCdrSerializedSize();
40 // 考虑可能的子消息对齐情况,进行字节对齐操作
41 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
42 // 计算最终的类型大小,加上4字节用于封装(encapsulation)相关处理
43 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
44 // 判断Transform类型是否定义了获取键(Key)的相关操作
45 m_isGetKeyDefined = Transform::isKeyDefined();
46 // 根据Transform类型获取键的最大CDR序列化大小来确定键缓冲区的长度
47 // 如果获取键的最大CDR序列化大小大于16,则取其本身,否则取16
48 size_t keyLength = Transform::getKeyMaxCdrSerializedSize() > 16?
50 // 分配键缓冲区的内存空间
51 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
52 // 将键缓冲区的内存初始化为0
53 memset(m_keyBuffer, 0, keyLength);
54 }
55
56 // TransformPubSubType类的析构函数,用于释放资源
58 {
59 // 如果键缓冲区指针不为空,则释放其占用的内存空间
60 if (m_keyBuffer!= nullptr)
61 {
62 free(m_keyBuffer);
63 }
64 }
65
66 // 序列化函数,将给定的数据对象序列化为SerializedPayload_t类型的数据
68 void* data,
69 SerializedPayload_t* payload)
70 {
71 // 将传入的void*类型数据转换为Transform*类型指针,方便后续操作
72 Transform* p_type = static_cast<Transform*>(data);
73
74 // 创建一个FastBuffer对象,用于管理原始缓冲区,将SerializedPayload_t中的数据指针和最大尺寸传入
75 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
76 // 创建一个Cdr对象,用于执行序列化操作,传入FastBuffer以及相关的字节序和CDR类型参数
77 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
78 // 根据序列化对象的字节序设置SerializedPayload_t的封装字节序标识
79 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
80 // 序列化封装相关信息(可能是一些头部等标识信息)
81 ser.serialize_encapsulation();
82
83 try
84 {
85 // 调用Transform对象的serialize方法,通过Cdr对象将其具体数据序列化到缓冲区中
86 p_type->serialize(ser);
87 }
88 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
89 {
90 // 如果内存不足出现异常,返回false表示序列化失败
91 return false;
92 }
93
94 // 获取序列化后数据的实际长度,设置到SerializedPayload_t结构中
95 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
96 // 序列化成功,返回true
97 return true;
98 }
99
100 // 反序列化函数,将SerializedPayload_t类型的数据反序列化为对应的数据对象
102 SerializedPayload_t* payload,
103 void* data)
104 {
105 try
106 {
107 // 将传入的void*类型数据转换为Transform*类型指针,用于接收反序列化后的数据
108 Transform* p_type = static_cast<Transform*>(data);
109
110 // 创建一个FastBuffer对象,用于管理原始缓冲区,传入SerializedPayload_t中的数据指针和实际长度
111 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
112
113 // 创建一个Cdr对象,用于执行反序列化操作,传入FastBuffer以及相关的字节序和CDR类型参数
114 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
115
116 // 反序列化封装相关信息,获取其字节序等信息设置到SerializedPayload_t中
117 deser.read_encapsulation();
118 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
119
120 // 调用Transform对象的deserialize方法,通过Cdr对象从缓冲区中反序列化数据到对象中
121 p_type->deserialize(deser);
122 }
123 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
124 {
125 // 如果内存不足出现异常,返回false表示反序列化失败
126 return false;
127 }
128
129 // 反序列化成功,返回true
130 return true;
131 }
132
133 // 获取序列化大小的函数提供者,返回一个lambda表达式,用于计算给定数据对象的序列化大小(包含封装部分)
135 void* data)
136 {
137 return [data]() -> uint32_t
138 {
139 // 计算数据对象的CDR序列化大小,并加上4字节的封装大小,返回总的序列化大小
140 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Transform*>(data))) +
141 4u /*encapsulation*/;
142 };
143 }
144
145 // 创建一个新的Transform类型的数据对象,并返回其void*指针,用于后续的操作(如序列化等)
147 {
148 return reinterpret_cast<void*>(new Transform());
149 }
150
151 // 删除给定的void*指针指向的Transform类型的数据对象,释放其占用的内存资源
153 void* data)
154 {
155 delete(reinterpret_cast<Transform*>(data));
156 }
157
158 // 获取数据对象的键(Key)信息,用于在某些场景下(比如消息匹配等)的标识
160 void* data,
161 InstanceHandle_t* handle,
162 bool force_md5)
163 {
164 // 如果没有定义获取键的操作,则直接返回false
165 if (!m_isGetKeyDefined)
166 {
167 return false;
168 }
169
170 Transform* p_type = static_cast<Transform*>(data);
171
172 // 创建一个FastBuffer对象,用于管理键缓冲区,传入键缓冲区指针和获取键的最大CDR序列化大小
173 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
175
176 // 创建一个Cdr对象,用于将数据对象的键相关信息序列化到键缓冲区中,设置为大端字节序
177 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
178 p_type->serializeKey(ser);
179 if (force_md5 || Transform::getKeyMaxCdrSerializedSize() > 16)
180 {
181 // 如果需要强制使用MD5或者键的最大CDR序列化大小大于16,则进行MD5相关计算处理
182 m_md5.init();
183 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
184 m_md5.finalize();
185 for (uint8_t i = 0; i < 16; ++i)
186 {
187 handle->value[i] = m_md5.digest[i];
188 }
189 }
190 else
191 {
192 // 否则直接将键缓冲区中的前16字节数据复制到InstanceHandle_t结构中作为键值
193 for (uint8_t i = 0; i < 16; ++i)
194 {
195 handle->value[i] = m_keyBuffer[i];
196 }
197 }
198 return true;
199 }
200 } //msg命名空间结尾
201} //geometry_msgs命名空间结尾
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport void * createData() override
virtual eProsima_user_DllExport ~TransformPubSubType() override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
此类表示用户在IDL文件中定义的Transform结构。
static eProsima_user_DllExport size_t getCdrSerializedSize(const geometry_msgs::msg::Transform &data, size_t current_alignment=0)
此函数根据缓冲区对齐方式,返回给定数据的序列化大小。
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式,返回一个对象的最大序列化大小。
static eProsima_user_DllExport bool isKeyDefined()
此函数用于判断对于该类型是否已经定义了键(Key)。
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式,返回对象的键(Key)的最大序列化大小。键通常用于在某些数据存储或查找场景中唯一标识对象。
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
此函数使用CDR序列化机制对对象进行反序列化操作,将接收到的序列化数据还原为对象,参数cdr是包含序列化数据的对象。
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化机制对对象进行序列化操作,将对象转换为适合传输或存储的格式(通常是二进制格式),参数cdr是用于执行序列化的对象。
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化机制对对象的键成员进行序列化操作,将键相关的数据转换为适合传输或存储的格式。