CARLA
 
载入中...
搜索中...
未找到
CarlaEgoVehicleControlPubSubTypes.cpp
浏览该文件的文档.
1#include <fastcdr/FastBuffer.h>
2#include <fastcdr/Cdr.h>
3
5
6// 为eprosima::fastrtps::rtps::SerializedPayload_t类型定义别名SerializedPayload_t,方便后续代码使用
7// SerializedPayload_t用于表示序列化后的负载数据结构
8using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
9// 为eprosima::fastrtps::rtps::InstanceHandle_t类型定义别名InstanceHandle_t,方便后续代码使用
10// InstanceHandle_t通常用于标识数据实例在分布式系统中的唯一性等相关操作
11using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
12
13namespace carla_msgs {
14 namespace msg {
15 // CarlaEgoVehicleControlPubSubType类的构造函数,用于初始化该类型相关的属性和资源
17 {
18 // 设置该类型在相关系统(可能是数据发布/订阅系统)中的名称
19 setName("carla_msgs::msg::dds_::CarlaEgoVehicleControl_");
20 // 获取CarlaEgoVehicleControl类型能达到的最大CDR序列化大小
22 // 考虑可能的子消息对齐需求(这里按4字节对齐),对类型大小进行调整
23 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
24 // 计算最终的类型大小,额外加上4字节用于封装相关的数据结构等(具体取决于协议或实现要求)
25 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
26 // 判断CarlaEgoVehicleControl类型是否定义了获取键(用于唯一标识等用途)的操作
27 m_isGetKeyDefined = CarlaEgoVehicleControl::isKeyDefined();
28 // 根据CarlaEgoVehicleControl类型获取键的最大CDR序列化大小来确定键缓冲区的长度
29 // 如果获取键的最大序列化大小大于16字节,则使用该实际大小,否则使用16字节作为长度
32 // 分配用于存储键数据的缓冲区内存,其大小由前面计算的keyLength决定
33 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
34 // 将刚分配的键缓冲区内存初始化为0,确保初始状态下数据的一致性
35 memset(m_keyBuffer, 0, keyLength);
36 }
37
38 // CarlaEgoVehicleControlPubSubType类的析构函数,用于释放构造函数中申请的相关资源
40 {
41 // 检查键缓冲区是否为空,如果不为空,则释放其占用的内存空间
42 if (m_keyBuffer!= nullptr)
43 {
44 free(m_keyBuffer);
45 }
46 }
47
48 // 序列化函数,将给定的数据对象序列化为可以传输或存储的格式(这里是符合相关协议的格式),存储在SerializedPayload_t结构中
50 void* data,
51 SerializedPayload_t* payload)
52 {
53 // 将传入的void*类型数据转换为CarlaEgoVehicleControl*类型的指针,以便后续操作
54 CarlaEgoVehicleControl* p_type = static_cast<CarlaEgoVehicleControl*>(data);
55
56 // 创建一个FastBuffer对象,用于管理原始的字节缓冲区,它关联了payload中的数据指针和最大可用空间
57 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
58 // 创建一个Cdr对象,用于进行数据的序列化操作,指定了缓冲区、默认字节序以及相关的DDS CDR模式
59 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
60 // 根据Cdr对象当前的字节序(大端或小端)设置payload的封装字节序标识,以便后续解析能正确识别
61 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
62 // 序列化封装相关的信息(具体内容取决于协议实现,可能是一些头部等标识信息)
63 ser.serialize_encapsulation();
64
65 try
66 {
67 // 调用CarlaEgoVehicleControl对象自身的序列化方法,将实际的数据内容序列化到Cdr对象管理的缓冲区中
68 p_type->serialize(ser);
69 }
70 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
71 {
72 // 如果在序列化过程中出现内存不足的异常情况,返回false表示序列化失败
73 return false;
74 }
75
76 // 获取序列化后数据的实际长度,并赋值给payload结构中的length成员,以便后续使用知道有效数据的范围
77 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
78 // 序列化成功,返回true
79 return true;
80 }
81
82 // 反序列化函数,将给定的SerializedPayload_t结构中的数据解析还原为对应的对象数据结构
84 SerializedPayload_t* payload,
85 void* data)
86 {
87 try
88 {
89 // 将传入的void*类型数据转换为CarlaEgoVehicleControl*类型的指针,以便后续操作
90 CarlaEgoVehicleControl* p_type = static_cast<CarlaEgoVehicleControl*>(data);
91
92 // 创建一个FastBuffer对象,用于管理原始的字节缓冲区,关联了payload中的数据指针和实际有效数据长度
93 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
94
95 // 创建一个Cdr对象,用于进行数据的反序列化操作,指定了缓冲区、默认字节序以及相关的DDS CDR模式
96 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
97
98 // 反序列化封装相关的信息,以便后续能正确解析实际的数据内容
99 deser.read_encapsulation();
100 // 根据Cdr对象当前的字节序(大端或小端)设置payload的封装字节序标识,保持与序列化时一致
101 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
102
103 // 调用CarlaEgoVehicleControl对象自身的反序列化方法,从Cdr对象管理的缓冲区中解析还原数据到对象中
104 p_type->deserialize(deser);
105 }
106 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
107 {
108 // 如果在反序列化过程中出现内存不足的异常情况,返回false表示反序列化失败
109 return false;
110 }
111
112 // 反序列化成功,返回true
113 return true;
114 }
115
116 // 返回一个函数对象(lambda表达式),该函数对象用于获取给定数据对象序列化后的大小(包含封装等额外部分)
118 void* data)
119 {
120 return [data]() -> uint32_t
121 {
122 // 先获取CarlaEgoVehicleControl对象自身序列化后的大小,再加上4字节的封装部分大小,返回最终的序列化大小
123 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<CarlaEgoVehicleControl*>(data))) +
124 4u /*encapsulation*/;
125 };
126 }
127
128 // 创建一个CarlaEgoVehicleControl类型的数据对象,并返回其void*类型的指针,用于后续操作(比如序列化等)
130 {
131 return reinterpret_cast<void*>(new CarlaEgoVehicleControl());
132 }
133
134 // 释放给定的void*类型指针所指向的CarlaEgoVehicleControl类型的数据对象内存,进行资源清理
136 void* data)
137 {
138 delete(reinterpret_cast<CarlaEgoVehicleControl*>(data));
139 }
140
141 // 获取给定数据对象的键(用于唯一标识等目的),并将其填充到InstanceHandle_t结构中
143 void* data,
144 InstanceHandle_t* handle,
145 bool force_md5)
146 {
147 // 如果该类型没有定义获取键的操作(在构造函数中判断),则直接返回false
148 if (!m_isGetKeyDefined)
149 {
150 return false;
151 }
152
153 CarlaEgoVehicleControl* p_type = static_cast<CarlaEgoVehicleControl*>(data);
154
155 // 创建一个FastBuffer对象,用于管理原始的字节缓冲区,关联了用于存储键数据的m_keyBuffer和键数据的最大序列化大小
156 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
158
159 // 创建一个Cdr对象,用于进行键数据的序列化操作,这里指定为大端字节序(具体要求可能取决于系统设计)
160 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
161 // 调用CarlaEgoVehicleControl对象自身的序列化键的方法,将键数据序列化到Cdr对象管理的缓冲区中
162 p_type->serializeKey(ser);
164 {
165 // 如果要求强制使用MD5(可能用于更可靠的唯一标识等情况)或者键的最大序列化大小大于16字节
166 m_md5.init();
167 // 使用MD5对象更新要计算哈希的数据范围(从m_keyBuffer开始,长度为序列化后的键数据长度)
168 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
169 // 完成MD5计算,生成最终的哈希值
170 m_md5.finalize();
171 // 将生成的MD5哈希值的每个字节依次填充到InstanceHandle_t结构的value数组中(通常用于唯一标识该数据对象)
172 for (uint8_t i = 0; i < 16; ++i)
173 {
174 handle->value[i] = m_md5.digest[i];
175 }
176 }
177 else
178 {
179 // 如果不需要MD5或者键的最大序列化大小不超过16字节,直接将缓冲区中的键数据复制到InstanceHandle_t结构的value数组中
180 for (uint8_t i = 0; i < 16; ++i)
181 {
182 handle->value[i] = m_keyBuffer[i];
183 }
184 }
185 return true;
186 }
187 }
188}
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 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 bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) 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 ~CarlaEgoVehicleControlPubSubType() override
该类表示用户在 IDL 文件中定义的结构 CarlaEgoVehicleControl。 <>
static eProsima_user_DllExport size_t getCdrSerializedSize(const carla_msgs::msg::CarlaEgoVehicleControl &data, size_t current_alignment=0)
该函数返回数据的序列化大小,取决于缓冲区对齐方式。
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
该函数使用 CDR 序列化序列化一个对象。
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
该函数返回对象的最大序列化大小,取决于缓冲区对齐方式。
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
该函数使用 CDR 序列化序列化对象的键成员。
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
该函数使用 CDR 序列化反序列化一个对象。
static eProsima_user_DllExport bool isKeyDefined()
该函数告诉您此类型的键是否已定义。
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
该函数返回对象键的最大序列化大小,取决于缓冲区对齐方式。