CARLA
 
载入中...
搜索中...
未找到
TimePubSubTypes.cpp
浏览该文件的文档.
1#include <fastcdr/FastBuffer.h>
2#include <fastcdr/Cdr.h>
3
4#include "TimePubSubTypes.h"
5
6using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
7using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
8
9// 定义在 builtin_interfaces::msg 命名空间下的 TimePubSubType 类
10namespace builtin_interfaces {
11 namespace msg {
12 // TimePubSubType 类的构造函数
14 {
15 // 设置类型名称,用于标识该数据类型在 DDS(Data Distribution Service)中的名称
16 setName("builtin_interfaces::msg::dds_::Time_");
17 // 获取 Time 类型的最大 CDR(Common Data Representation)序列化大小
18 auto type_size = Time::getMaxCdrSerializedSize();
19 // 根据可能的子消息对齐要求,对类型大小进行对齐调整(按 4 字节对齐)
20 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
21 // 计算最终的类型大小,加上 4 字节用于封装(encapsulation)相关信息
22 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
23 // 判断 Time 类型是否定义了获取键(Key)的操作
24 m_isGetKeyDefined = Time::isKeyDefined();
25 // 根据 Time 类型获取键的最大 CDR 序列化大小来确定键缓冲区的长度
26 // 如果大于 16 字节则使用实际的最大键序列化大小,否则使用 16 字节
27 size_t keyLength = Time::getKeyMaxCdrSerializedSize() > 16?
29 // 分配键缓冲区的内存空间
30 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
31 // 将键缓冲区的内存初始化为 0
32 memset(m_keyBuffer, 0, keyLength);
33 }
34
35 // TimePubSubType 类的析构函数,用于释放键缓冲区的内存
37 {
38 if (m_keyBuffer!= nullptr)
39 {
40 free(m_keyBuffer);
41 }
42 }
43
44 // 序列化函数,将给定的数据对象(Time 类型)序列化为 SerializedPayload_t 格式
46 void* data,
47 SerializedPayload_t* payload)
48 {
49 // 将传入的 void* 类型数据转换为 Time* 类型指针,方便后续操作
50 Time* p_type = static_cast<Time*>(data);
51
52 // 创建一个 FastBuffer 对象,用于管理原始缓冲区(指向 payload->data),其大小为 payload->max_size
53 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
54 // 创建一个 Cdr 对象,用于执行序列化操作,设置了字节序(默认字节序)和 DDS CDR 相关模式
55 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
56 // 根据序列化对象的字节序设置 payload 的封装字节序标识(CDR_BE 表示大端序,CDR_LE 表示小端序)
57 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
58 // 序列化封装相关的头部信息(比如可能的长度等元数据)
59 ser.serialize_encapsulation();
60 // 调用 Time 对象的 serialize 方法,将具体的 Time 数据序列化到 Cdr 对象中
61 p_type->serialize(ser);
62 // 获取序列化后的数据长度,并设置到 payload 的 length 成员中
63 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
64 return true;
65 }
66
67 // 反序列化函数,将 SerializedPayload_t 格式的数据反序列化为 Time 类型对象
69 SerializedPayload_t* payload,
70 void* data)
71 {
72 // 将传入的 void* 类型数据转换为 Time* 类型指针,方便后续操作
73 Time* p_type = static_cast<Time*>(data);
74
75 // 创建一个 FastBuffer 对象,用于管理原始缓冲区(指向 payload->data),其大小为 payload->length(实际数据长度)
76 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
77
78 // 创建一个 Cdr 对象,用于执行反序列化操作,设置了字节序(默认字节序)和 DDS CDR 相关模式
79 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
80
81 // 反序列化封装相关的头部信息(比如读取长度等元数据)
82 deser.read_encapsulation();
83 // 根据反序列化对象的字节序设置 payload 的封装字节序标识(CDR_BE 表示大端序,CDR_LE 表示小端序)
84 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
85
86 // 调用 Time 对象的 deserialize 方法,从 Cdr 对象中反序列化出具体的 Time 数据
87 p_type->deserialize(deser);
88
89 return true;
90 }
91
92 // 返回一个函数对象,该函数对象用于获取给定 Time 数据对象序列化后的大小(包含封装部分)
94 void* data)
95 {
96 return [data]() -> uint32_t
97 {
98 // 计算并返回 Time 数据对象的 CDR 序列化大小(包含封装部分,额外加 4 字节)
99 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Time*>(data))) +
100 4u /*encapsulation*/;
101 };
102 }
103
104 // 创建一个 Time 类型的数据对象,并返回其 void* 指针表示(用于后续操作,比如序列化等)
106 {
107 return reinterpret_cast<void*>(new Time());
108 }
109
110 // 删除之前通过 createData 创建的 Time 类型数据对象,释放内存
112 void* data)
113 {
114 delete(reinterpret_cast<Time*>(data));
115 }
116
117 // 获取给定 Time 数据对象的键(Key)信息,用于在 DDS 等场景中标识该对象实例
119 void* data,
120 InstanceHandle_t* handle,
121 bool force_md5)
122 {
123 if (!m_isGetKeyDefined)
124 {
125 return false;
126 }
127
128 Time* p_type = static_cast<Time*>(data);
129
130 // 创建一个 FastBuffer 对象,用于管理键缓冲区(指向 m_keyBuffer),其大小为 Time 类型获取键的最大 CDR 序列化大小
131 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
133
134 // 创建一个 Cdr 对象,用于将 Time 数据对象的键信息序列化到键缓冲区中,设置为大端序
135 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
136 p_type->serializeKey(ser);
137 if (force_md5 || Time::getKeyMaxCdrSerializedSize() > 16)
138 {
139 // 如果需要强制使用 MD5 或者键序列化大小大于 16 字节,则进行 MD5 计算相关操作
140 m_md5.init();
141 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
142 m_md5.finalize();
143 for (uint8_t i = 0; i < 16; ++i)
144 {
145 handle->value[i] = m_md5.digest[i];
146 }
147 }
148 else
149 {
150 // 如果不需要 MD5 计算,直接将键缓冲区的前 16 字节内容复制到 InstanceHandle_t 的 value 数组中
151 for (uint8_t i = 0; i < 16; ++i)
152 {
153 handle->value[i] = m_keyBuffer[i];
154 }
155 }
156 return true;
157 }
158 }
159}
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 std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport ~TimePubSubType() 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 void * createData() override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
此类表示用户在IDL文件中定义的Time结构。
static eProsima_user_DllExport bool isKeyDefined()
此函数告知是否为此类型定义了键。
Definition Time.cpp:218
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化方式序列化对象。
Definition Time.cpp:132
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式返回对象的最大序列化大小。
Definition Time.cpp:111
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式返回对象键的最大序列化大小。
Definition Time.cpp:210
static eProsima_user_DllExport size_t getCdrSerializedSize(const builtin_interfaces::msg::Time &data, size_t current_alignment=0)
此函数根据缓冲区对齐方式返回数据的序列化大小。
Definition Time.cpp:119
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
此函数使用CDR序列化方式反序列化对象。
Definition Time.cpp:140
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化方式序列化对象的键成员。
Definition Time.cpp:224