CARLA
 
载入中...
搜索中...
未找到
CarlaLineInvasionPubSubTypes.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 CarlaLineInvasionPubSubTypes.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
26
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
29
30// 定义carla_msgs命名空间,以下相关的类和函数都位于这个命名空间内
31namespace carla_msgs {
32 // 再定义msg子命名空间,用于存放消息相关的类型定义等内容
33 namespace msg {
34 // LaneInvasionEventPubSubType类的构造函数,用于初始化该类型相关的属性
36 {
37 // 设置类型名称,用于标识这个发布/订阅类型,这里具体名称为 "carla_msgs::msg::dds_::LaneInvasionEvent_"
38 setName("carla_msgs::msg::dds_::LaneInvasionEvent_");
39 // 获取 LaneInvasionEvent 类型的最大CDR序列化大小,CDR(Common Data Representation)是一种数据序列化格式
41 // 根据可能的子消息对齐要求(这里按4字节对齐),调整类型大小
42 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
43 // 计算最终的类型大小,加上4字节可能用于封装相关的开销
44 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
45 // 判断 LaneInvasionEvent 类型是否定义了获取键(Key)的操作,并记录下来
46 m_isGetKeyDefined = LaneInvasionEvent::isKeyDefined();
47 // 获取 LaneInvasionEvent 类型的最大键(Key)CDR序列化大小,如果大于16字节则取其本身大小,否则取16字节作为键缓冲区的长度
48 size_t keyLength = LaneInvasionEvent::getKeyMaxCdrSerializedSize() > 16?
50 // 分配键缓冲区内存,用于后续存储键相关的数据
51 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
52 // 将键缓冲区的内存初始化为0
53 memset(m_keyBuffer, 0, keyLength);
54 }
55
56 // LaneInvasionEventPubSubType类的析构函数,用于释放构造函数中分配的键缓冲区内存
64
65 // 函数用于将 LaneInvasionEvent 类型的数据进行序列化,将其转换为适合网络传输等操作的二进制格式,并填充到 SerializedPayload_t 结构中
67 void* data,
68 SerializedPayload_t* payload)
69 {
70 // 将输入的 void* 类型的数据指针转换为 LaneInvasionEvent 类型的指针,方便后续操作
71 LaneInvasionEvent* p_type = static_cast<LaneInvasionEvent*>(data);
72
73 // 创建一个 eprosima::fastcdr::FastBuffer 对象,它用于管理序列化过程中要使用的原始缓冲区,将 payload 中的数据指针转换为 char* 类型传递给它
74 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
75
76 // 创建一个 eprosima::fastcdr::Cdr 对象,用于实际执行序列化的相关操作,传入前面创建的缓冲区对象以及默认的字节序、DDS相关的CDR格式等参数
77 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
78
79 // 根据序列化器的字节序(大端或小端)来设置 payload 的封装格式,如果是大端序则设置为 CDR_BE,小端序设置为 CDR_LE
80 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
81
82 // 序列化封装头,封装头通常包含字节序等相关元数据信息,方便后续反序列化时进行解析
83 ser.serialize_encapsulation();
84
85 try
86 {
87 // 调用 LaneInvasionEvent 类型对象自身的 serialize 函数,通过传入的 ser 对象将其成员变量等数据序列化到缓冲区中
88 p_type->serialize(ser);
89 }
90 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
91 {
92 // 如果在序列化过程中出现内存不足的情况(捕获相应的异常),则返回 false 表示序列化失败
93 return false;
94 }
95
96 // 获取序列化后的数据长度,并将其存入 payload->length 成员变量中,用于记录实际序列化后的数据大小
97 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
98
99 // 如果序列化过程顺利完成,返回 true 表示序列化成功
100 return true;
101 }
102
103
104 // 函数用于将接收到的二进制格式数据(SerializedPayload_t 结构中的数据)反序列化,转换为 LaneInvasionEvent 类型的数据对象
106 SerializedPayload_t* payload,
107 void* data)
108 {
109 try
110 {
111 // 将传入的 void* 类型的数据指针转换为 LaneInvasionEvent 类型的指针,方便后续操作
112 LaneInvasionEvent* p_type = static_cast<LaneInvasionEvent*>(data);
113
114 // 创建一个 eprosima::fastcdr::FastBuffer 对象,用于管理包含要反序列化数据的原始缓冲区,传入 payload 中的数据指针及实际数据长度
115 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
116
117 // 创建一个 eprosima::fastcdr::Cdr 对象,用于实际执行反序列化的相关操作,传入前面创建的缓冲区对象以及默认的字节序、DDS相关的CDR格式等参数
118 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
119
120 // 先反序列化封装信息,例如字节序等元数据,用于后续正确解析数据
121 deser.read_encapsulation();
122 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
123
124 // 调用 LaneInvasionEvent 类型对象自身的 deserialize 函数,通过传入的 deser 对象将缓冲区中的数据反序列化到对象的成员变量中
125 p_type->deserialize(deser);
126 }
127 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
128 {
129 return false;
130 }
131
132 return true;
133 }
134
135 // 函数返回一个可调用对象(lambda表达式),该可调用对象用于获取给定 LaneInvasionEvent 类型数据对象序列化后的大小(包含封装等额外开销)
137 void* data)
138 {
139 return [data]() -> uint32_t
140 {
141 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<LaneInvasionEvent*>(data))) +
142 4u /*encapsulation*/;
143 };
144 }
145
146 // 函数用于创建一个 LaneInvasionEvent 类型的数据对象,并返回其 void* 类型的指针,用于后续的操作(例如序列化等)
148 {
149 return reinterpret_cast<void*>(new LaneInvasionEvent());
150 }
151
152 // 函数用于释放之前通过 createData 函数创建的 LaneInvasionEvent 类型的数据对象所占用的内存空间
154 void* data)
155 {
156 delete(reinterpret_cast<LaneInvasionEvent*>(data));
157 }
158
159 // 函数尝试获取给定 LaneInvasionEvent 类型数据对象的键(Key)信息,并将其填充到 InstanceHandle_t 结构中,用于标识对象等用途
161 void* data,
162 InstanceHandle_t* handle,
163 bool force_md5)
164 {
165 if (!m_isGetKeyDefined)
166 {
167 return false;
168 }
169
170 LaneInvasionEvent* p_type = static_cast<LaneInvasionEvent*>(data);
171
172 // 创建一个 eprosima::fastcdr::FastBuffer 对象,用于管理存储键数据的缓冲区,传入键缓冲区指针及 LaneInvasionEvent 类型的最大键CDR序列化大小
173 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
175
176 // 创建一个 eprosima::fastcdr::Cdr 对象,用于将数据对象的键相关信息序列化到缓冲区中,这里指定了大端序
177 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
178 p_type->serializeKey(ser);
179 if (force_md5 || LaneInvasionEvent::getKeyMaxCdrSerializedSize() > 16)
180 {
181 m_md5.init();
182 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
183 m_md5.finalize();
184 for (uint8_t i = 0; i < 16; ++i)
185 {
186 handle->value[i] = m_md5.digest[i];
187 }
188 }
189 else
190 {
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 carla_msgs
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 bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport ~LaneInvasionEventPubSubType() 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 void deleteData(void *data) override
此类表示用户在IDL文件中定义的LaneInvasionEvent结构。这个类表示在IDL文件中用户定义的LaneInvasionEvent结构,通常用于处理车道入侵相关的消息事件,是整个消息结构体的主...
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化方式对对象进行序列化。
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
此函数使用CDR序列化方式对对象进行反序列化。
static eProsima_user_DllExport size_t getCdrSerializedSize(const carla_msgs::msg::LaneInvasionEvent &data, size_t current_alignment=0)
此函数根据缓冲区对齐方式返回数据的序列化大小。
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式返回对象的最大序列化大小。
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
此函数根据缓冲区对齐方式返回对象的键(Key)的最大序列化大小。
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
此函数使用CDR序列化方式对对象的键(Key)成员进行序列化。
static eProsima_user_DllExport bool isKeyDefined()
此函数告知是否已为该类型定义了键(Key)。 该静态函数用于判断该类型是否已经定义了键(Key),返回布尔值表示是否已定义