CARLA
 
载入中...
搜索中...
未找到
TwistPubSubTypes.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 TwistPubSubTypes.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
25#include "TwistPubSubTypes.h"
26
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
29
30namespace geometry_msgs {
31 namespace msg {
32 // TwistPubSubType类的构造函数
34 {
35 // 设置类型名称
36 setName("geometry_msgs::msg::dds_::Twist_");
37 // 获取Twist类型的最大CDR序列化大小
38 auto type_size = Twist::getMaxCdrSerializedSize();
39 // 进行可能的子消息对齐(按照4字节对齐)
40 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* 可能的子消息对齐 */
41 // 计算类型大小,加上封装所需的4字节
42 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*封装*/
43 // 检查Twist类型是否定义了获取键(key)的操作
44 m_isGetKeyDefined = Twist::isKeyDefined();
45 // 根据Twist类型获取键的最大CDR序列化大小来确定键缓冲区的长度,若大于16则取其自身大小,否则取16
46 size_t keyLength = Twist::getKeyMaxCdrSerializedSize() > 16?
48 // 分配键缓冲区内存
49 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
50 // 将键缓冲区的内存初始化为0
51 memset(m_keyBuffer, 0, keyLength);
52 }
53
54 // TwistPubSubType类的析构函数
56 {
57 // 如果键缓冲区不为空,则释放其内存
58 if (m_keyBuffer!= nullptr)
59 {
60 free(m_keyBuffer);
61 }
62 }
63
64 // 序列化函数,用于将给定的数据对象序列化为SerializedPayload_t类型
66 void* data,
67 SerializedPayload_t* payload)
68 {
69 // 将传入的void*类型数据转换为Twist*类型指针,方便后续操作
70 Twist* p_type = static_cast<Twist*>(data);
71
72 // 创建一个FastBuffer对象,用于管理原始缓冲区,它包装了SerializedPayload_t中的数据缓冲区
73 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
74 // 创建一个Cdr对象,用于对数据进行序列化操作,指定了字节序和相关的CDR模式
75 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
76 // 根据序列化对象的字节序来设置SerializedPayload_t中的封装字节序标识(大端序或小端序)
77 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
78 // 序列化封装信息(可能包含头部等相关封装数据)
79 ser.serialize_encapsulation();
80
81 try
82 {
83 // 调用Twist对象的serialize函数,将Twist对象的实际数据序列化到Cdr对象管理的缓冲区中
84 p_type->serialize(ser);
85 }
86 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
87 {
88 // 如果出现内存不足异常,则返回false表示序列化失败
89 return false;
90 }
91
92 // 获取序列化后数据的长度,并设置到SerializedPayload_t对象中
93 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
94 return true;
95 }
96
97 // 反序列化函数,用于将SerializedPayload_t类型的数据反序列化为对应的数据对象
99 SerializedPayload_t* payload,
100 void* data)
101 {
102 try
103 {
104 // 将传入的void*类型数据转换为Twist*类型指针,用于接收反序列化后的数据
105 Twist* p_type = static_cast<Twist*>(data);
106
107 // 创建一个FastBuffer对象,用于管理原始缓冲区,其长度为传入的SerializedPayload_t中包含的实际有效数据长度
108 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
109
110 // 创建一个Cdr对象,用于对数据进行反序列化操作,指定了字节序和相关的CDR模式
111 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
112
113 // 先反序列化封装信息(可能包含头部等相关封装数据)
114 deser.read_encapsulation();
115 // 根据反序列化对象的字节序来设置SerializedPayload_t中的封装字节序标识(大端序或小端序)
116 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
117
118 // 调用Twist对象的deserialize函数,将Cdr对象管理的缓冲区中的数据反序列化为Twist对象
119 p_type->deserialize(deser);
120 }
121 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
122 {
123 // 如果出现内存不足异常,则返回false表示反序列化失败
124 return false;
125 }
126
127 return true;
128 }
129
130 // 返回一个函数对象,该函数对象用于获取给定数据对象序列化后的大小(包含封装部分)
132 void* data)
133 {
134 return [data]() -> uint32_t
135 {
136 // 返回Twist对象序列化后的大小(通过调用其相关函数获取)再加上封装所需的4字节
137 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Twist*>(data))) +
138 4u /*封装*/;
139 };
140 }
141
142 // 创建一个Twist类型的数据对象,并返回其void*指针形式(用于后续操作中传递该对象指针)
144 {
145 return reinterpret_cast<void*>(new Twist());
146 }
147
148 // 删除给定的Twist类型的数据对象(通过先将void*指针转换为Twist*指针,再调用delete进行内存释放)
150 void* data)
151 {
152 delete(reinterpret_cast<Twist*>(data));
153 }
154
155 // 获取给定数据对象(Twist类型)的键(key)信息,并设置到InstanceHandle_t对象中
157 void* data,
158 InstanceHandle_t* handle,
159 bool force_md5)
160 {
161 // 如果没有定义获取键的操作,则直接返回false
162 if (!m_isGetKeyDefined)
163 {
164 return false;
165 }
166
167 Twist* p_type = static_cast<Twist*>(data);
168
169 // 创建一个FastBuffer对象,用于管理键缓冲区,其长度为Twist类型获取键的最大CDR序列化大小
170 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
172
173 // 创建一个Cdr对象,用于对键数据进行序列化操作,这里指定为大端序
174 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
175 // 调用Twist对象的serializeKey函数,将键相关数据序列化到Cdr对象管理的缓冲区中
176 p_type->serializeKey(ser);
177 if (force_md5 || Twist::getKeyMaxCdrSerializedSize() > 16)
178 {
179 // 如果强制使用MD5或者键的最大CDR序列化大小大于16字节,则进行MD5相关操作
180 m_md5.init();
181 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
182 m_md5.finalize();
183 for (uint8_t i = 0; i < 16; ++i)
184 {
185 handle->value[i] = m_md5.digest[i];
186 }
187 }
188 else
189 {
190 // 否则直接将键缓冲区中的前16字节数据复制到InstanceHandle_t对象中
191 for (uint8_t i = 0; i < 16; ++i)
192 {
193 handle->value[i] = m_keyBuffer[i];
194 }
195 }
196 return true;
197 }
198 } //End of namespace msg
199} //End of namespace geometry_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport ~TwistPubSubType() override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport void * createData() 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
eProsima_user_DllExport TwistPubSubType()
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
Definition Twist.cpp:94
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
Definition Twist.cpp:119
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
Definition Twist.cpp:215
static eProsima_user_DllExport size_t getCdrSerializedSize(const geometry_msgs::msg::Twist &data, size_t current_alignment=0)
Definition Twist.cpp:101
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
Definition Twist.cpp:203
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
Definition Twist.cpp:112
static eProsima_user_DllExport bool isKeyDefined()
Definition Twist.cpp:210