CARLA
 
载入中...
搜索中...
未找到
HeaderPubSubTypes.cpp
浏览该文件的文档.
1#include <fastcdr/FastBuffer.h>
2#include <fastcdr/Cdr.h>
3
4#include "HeaderPubSubTypes.h"
5// 定义SerializedPayload_t类型别名,用于表示序列化后的负载数据类型
6using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
7// 定义InstanceHandle_t类型别名,用于表示实例句柄类型
8using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
9
10namespace std_msgs {
11 namespace msg {
12// HeaderPubSubType类的构造函数,用于初始化与消息类型相关的属性
14 {// 设置消息类型的名称
15 setName("std_msgs::msg::dds_::Header_");
16 // 获取Header类型的最大CDR序列化大小
17 auto type_size = Header::getMaxCdrSerializedSize();
18 // 根据可能的子消息对齐要求,对类型大小进行对齐调整
19 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4);
20 // 计算最终的类型大小,加上4字节用于封装
21 m_typeSize = static_cast<uint32_t>(type_size) + 4;
22 // 判断Header类型是否定义了键(用于标识等用途)
23 m_isGetKeyDefined = Header::isKeyDefined();
24 // 根据Header类型的最大键序列化大小来确定键缓冲区的长度,取较大值
25 size_t keyLength = Header::getKeyMaxCdrSerializedSize() > 16 ?
26 Header::getKeyMaxCdrSerializedSize() : 16;
27 // 分配键缓冲区内存
28 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
29 // 初始化键缓冲区内存为0
30 memset(m_keyBuffer, 0, keyLength);
31 }
32// HeaderPubSubType类的析构函数,用于释放键缓冲区内存
34 {
35 if (m_keyBuffer != nullptr)
36 {
37 free(m_keyBuffer);
38 }
39 }
40// 序列化函数,将给定的数据对象(这里是Header类型)序列化为SerializedPayload_t格式
42 void* data,
43 SerializedPayload_t* payload)
44 {// 将传入的void*类型数据转换为Header*类型指针,以便后续操作
45 Header* p_type = static_cast<Header*>(data);
46
47 // 创建一个FastBuffer对象,用于管理原始缓冲区,它包装了payload的data指针和最大可用大小
48 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
49 // 创建一个Cdr对象,用于实际的数据序列化操作,指定了缓冲区、字节序(默认字节序)以及采用DDS_CDR模式
50 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
51 // 根据序列化对象的字节序设置负载的封装字节序标识(大端序或小端序)
52 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
53 // 先序列化封装相关的信息(具体内容由Cdr实现决定)
54 ser.serialize_encapsulation();
55 // 调用Header对象的序列化函数,将实际的数据内容序列化到Cdr对象中
56 p_type->serialize(ser);
57 // 获取序列化后的数据长度,并设置到负载结构体的length成员中
58 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
59 return true;
60 }
61// 反序列化函数,将SerializedPayload_t格式的数据反序列化为对应的数据对象(Header类型)
63 SerializedPayload_t* payload,
64 void* data)
65 {
66 // 将传入的void*类型数据转换为Header*类型指针,以便后续操作
67 Header* p_type = static_cast<Header*>(data);
68
69 // 创建一个FastBuffer对象,用于管理原始缓冲区,根据传入负载的实际长度来设置缓冲区大小
70 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
71
72 // 创建一个Cdr对象,用于实际的数据反序列化操作,指定了缓冲区、字节序(默认字节序)以及采用DDS_CDR模式
73 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
74
75 // 先反序列化封装相关的信息(例如字节序等相关的封装标识)
76 deser.read_encapsulation();
77 // 根据反序列化对象的字节序设置负载的封装字节序标识(大端序或小端序)
78 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
79
80 // 调用Header对象的反序列化函数,从Cdr对象中还原出实际的数据内容
81 p_type->deserialize(deser);
82 return true;
83 }
84// 返回一个函数对象,该函数对象用于获取给定数据(Header类型)序列化后的大小
86 void* data)
87 {
88 return [data]() -> uint32_t
89 {// 计算并返回包含封装部分的序列化大小,先获取Header类型的CDR序列化大小,再加上4字节封装大小
90 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Header*>(data))) +
91 4u;
92 };
93 }
94// 创建一个新的Header类型的数据对象,并返回其void*指针表示
96 {
97 return reinterpret_cast<void*>(new Header());
98 }
99// 删除给定的Header类型的数据对象(释放内存)
101 void* data)
102 {
103 delete(reinterpret_cast<Header*>(data));
104 }
105// 获取给定数据(Header类型)对应的键值,用于实例标识等用途,填充到InstanceHandle_t结构体中
107 void* data,
108 InstanceHandle_t* handle,
109 bool force_md5)
110 {
111 if (!m_isGetKeyDefined)
112 {
113 return false;
114 }
115
116 Header* p_type = static_cast<Header*>(data);
117
118 // 创建一个FastBuffer对象,用于管理键缓冲区,大小根据Header类型的最大键序列化大小确定
119 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
120 Header::getKeyMaxCdrSerializedSize());
121
122 // 创建一个Cdr对象,用于序列化键数据,指定为大端序
123 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
124 // 调用Header对象的键序列化函数,将键相关的数据序列化到Cdr对象对应的缓冲区中
125 p_type->serializeKey(ser);
126 if (force_md5 || Header::getKeyMaxCdrSerializedSize() > 16)
127 {// 如果需要强制使用MD5(可能用于更安全的标识等情况)或者键序列化大小大于16字节
128 m_md5.init();
129 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
130 m_md5.finalize();
131 for (uint8_t i = 0; i < 16; ++i)
132 {
133 handle->value[i] = m_md5.digest[i];
134 }
135 }
136 else
137 {// 如果不需要MD5且键序列化大小小于等于16字节,直接将键缓冲区的数据复制到实例句柄的value数组中
138 for (uint8_t i = 0; i < 16; ++i)
139 {
140 handle->value[i] = m_keyBuffer[i];
141 }
142 }
143 return true;
144 }
145 }
146}
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
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 std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport void deleteData(void *data) override
eProsima_user_DllExport HeaderPubSubType()
virtual eProsima_user_DllExport ~HeaderPubSubType() override