CARLA
 
载入中...
搜索中...
未找到
TF2ErrorPubSubTypes.cpp
浏览该文件的文档.
1// 版权所有 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// 根据 Apache 许可证第 2.0 版(“许可证”)获得许可;
4// 您不得在未遵守许可证的情况下使用此文件。
5// 您可以在以下网址获取许可证副本:
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// 除非适用法律要求或书面同意,否则本许可证下分发的软件是
10// 以“原样”方式提供的,不提供任何明示或暗示的担保或条件。
11// 有关许可证下特定语言的权限和限制,请参见许可证的内容。
12
13/*!
14 * @file TF2ErrorPubSubTypes.cpp
15 * 该源文件实现了 TF2Error 消息类型的序列化和反序列化函数。
16 *
17 * 此文件由工具 fastcdrgen 生成。
18 */
19
20#include <fastcdr/FastBuffer.h>// 引入 Fast CDR 用于高效的数据序列化
21#include <fastcdr/Cdr.h>// 引入 Fast CDR 的主要功能
22
23#include "TF2ErrorPubSubTypes.h"// 引入 TF2Error 消息类型的定义
24
25using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;// 定义序列化载体类型
26using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;// 定义实例句柄类型
27
28namespace tf2_msgs {
29 namespace msg {
31 {
32 setName("tf2_msgs::msg::dds_::TF2Error_");// 设置消息类型的名称
33 auto type_size = TF2Error::getMaxCdrSerializedSize();// 获取 TF2Error 类型的最大序列化大小
34 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); // 处理字节对齐
35 m_typeSize = static_cast<uint32_t>(type_size) + 4; // 加上封装头的总大小
36 m_isGetKeyDefined = TF2Error::isKeyDefined();// 检查 TF2Error 是否定义键
37 // 根据最大键序列化大小分配键缓冲区的大小
38 size_t keyLength = TF2Error::getKeyMaxCdrSerializedSize() > 16 ?
40 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));// 分配内存用于键缓冲区
41 memset(m_keyBuffer, 0, keyLength);// 初始化键缓冲区
42 }
43// 析构函数,释放分配的资源
45 {
46 if (m_keyBuffer != nullptr)
47 {
48 free(m_keyBuffer);// 释放键缓冲区的内存
49 }
50 }
51// 序列化函数,将 TF2Error 对象序列化为字节流
53 void* data,
54 SerializedPayload_t* payload)
55 {
56 TF2Error* p_type = static_cast<TF2Error*>(data); // 将输入数据转换为 TF2Error 类型指针
57
58 // 创建一个快速缓冲区来管理原始字节缓冲区
59 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
60 // 创建序列化对象
61 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
62 // 检测字节序
63 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
64 // 序列化封装头
65 ser.serialize_encapsulation();
66
67 try
68 {
69 // 序列化对象数据
70 p_type->serialize(ser);
71 }
72 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
73 {
74 return false;// 捕获内存不足异常
75 }
76
77 // 获取序列化后的数据长度
78 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
79 return true;// 返回序列化成功
80 }
81// 反序列化函数,从字节流中还原 TF2Error 对象
83 SerializedPayload_t* payload,
84 void* data)
85 {
86 try
87 {
88 // 将数据转换为 TF2Error 类型指针
89 TF2Error* p_type = static_cast<TF2Error*>(data);
90
91 // 创建快速缓冲区
92 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
93
94 // 创建反序列化对象
95 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
96
97 // 读取封装头
98 deser.read_encapsulation();
99 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
100
101 // 从字节流中反序列化对象
102 p_type->deserialize(deser);
103 }
104 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
105 {
106 return false;// 捕获内存不足异常
107 }
108
109 return true;// 返回反序列化成功
110 }
111// 返回序列化大小提供者的函数
113 void* data)
114 {
115 // 返回一个函数来计算序列化大小
116 return [data]() -> uint32_t
117 {
118 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<TF2Error*>(data))) +
119 4u /*封装头*/;
120 };
121 }
122// 创建设备数据的函数
124 {
125 // 创建并返回新的 TF2Error 实例
126 return reinterpret_cast<void*>(new TF2Error());
127 }
128// 删除设备数据的函数
130 void* data)
131 {
132 delete(reinterpret_cast<TF2Error*>(data));// 释放 TF2Error 实例的内存
133 }
134// 获取对象的键
136 void* data,
137 InstanceHandle_t* handle,
138 bool force_md5)
139 {
140 if (!m_isGetKeyDefined)
141 {
142 return false;// 如果没有定义键,返回 false
143 }
144
145 TF2Error* p_type = static_cast<TF2Error*>(data);// 转换数据类型为 TF2Error
146
147 // 创建快速缓冲区来管理键的字节序列
148 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
150
151 // 创建序列化对象
152 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
153 p_type->serializeKey(ser); // 序列化键
154 if (force_md5 || TF2Error::getKeyMaxCdrSerializedSize() > 16)
155 {
156 m_md5.init();// 初始化 MD5 哈希
157 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
158 m_md5.finalize();// 完成哈希计算
159 for (uint8_t i = 0; i < 16; ++i)
160 {
161 handle->value[i] = m_md5.digest[i];// 将 MD5 哈希值存储到句柄中
162 }
163 }
164 else
165 {
166 for (uint8_t i = 0; i < 16; ++i)
167 {
168 handle->value[i] = m_keyBuffer[i];// 直接获取键值
169 }
170 }
171 return true;// 返回成功
172 }
173 } // 结束命名空间 msg
174} // 结束命名空间 tf2_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport void deleteData(void *data) 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
virtual eProsima_user_DllExport ~TF2ErrorPubSubType() 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 * createData() override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
eProsima_user_DllExport TF2ErrorPubSubType()
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
Definition TF2Error.cpp:109
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
Definition TF2Error.cpp:141
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
Definition TF2Error.cpp:127
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
Definition TF2Error.cpp:216
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
Definition TF2Error.cpp:234
static eProsima_user_DllExport bool isKeyDefined()
Definition TF2Error.cpp:229
static eProsima_user_DllExport size_t getCdrSerializedSize(const tf2_msgs::msg::TF2Error &data, size_t current_alignment=0)
Definition TF2Error.cpp:116