CARLA
 
载入中...
搜索中...
未找到
Float32PubSubTypes.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 Float32PubSubTypes.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
25#include "Float32PubSubTypes.h"
26// 为eprosima::fastrtps::rtps::SerializedPayload_t类型定义一个更简洁的别名SerializedPayload_t,
27// 方便后续代码中使用,SerializedPayload_t通常用于表示经过序列化后的消息负载相关的数据结构
28using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
29// 为eprosima::fastrtps::rtps::InstanceHandle_t类型定义别名InstanceHandle_t,
30// 该类型一般与实例的标识、操作句柄相关,在消息交互等场景中会用到
31using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
32
33namespace std_msgs {
34 namespace msg {
35// Float32PubSubType类的构造函数定义,用于初始化该类的各个成员变量,完成相关的资源准备工作
37 {// 设置此类型的名称,这里将名称设置为 "std_msgs::msg::dds_::Float32_",
38 // 该名称可能在整个消息发布/订阅系统中用于标识这个特定的消息类型
39 setName("std_msgs::msg::dds_::Float32_");
40 auto type_size = Float32::getMaxCdrSerializedSize();
41 // 根据给定的对齐要求(这里是按4字节对齐),对获取到的类型尺寸进行调整,
42 // 确保数据在存储或传输等过程中符合特定的对齐规范,有助于提高数据处理效率等,
43 // 例如某些硬件架构或者通信协议可能对数据的对齐有要求
44 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
45 m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
46 m_isGetKeyDefined = Float32::isKeyDefined();
47 size_t keyLength = Float32::getKeyMaxCdrSerializedSize() > 16 ?
49 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
50 memset(m_keyBuffer, 0, keyLength);
51 }
52
54 {
55 // 在析构函数中,检查键缓冲区指针是否为空,如果不为空,则释放之前为其分配的内存空间,避免内存泄漏
56 if (m_keyBuffer != nullptr)
57 {
58 free(m_keyBuffer);
59 }
60 }
61// 将传入的void*类型数据转换为Float32*类型指针,方便后续对具体的Float32类型数据进行操
63 void* data,
64 SerializedPayload_t* payload)
65 {
66 Float32* p_type = static_cast<Float32*>(data);
67// 创建一个FastBuffer对象,用于管理原始的缓冲区,它将关联到SerializedPayload_t结构体中的数据缓冲区,
68 // 方便后续在其上进行数据的读写操作,这里传入的是payload中的数据指针和最大尺寸信息
69 // Object that manages the raw buffer.
70 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
71 // 创建一个Cdr对象,用于进行数据的序列化操作,传入FastBuffer对象以及相关的字节序、CDR格式等参数,
72 // 这里使用默认字节序和DDS_CDR格式,Cdr对象将基于FastBuffer来实际处理数据的序列化逻辑
73 // Object that serializes the data.
74 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
75 // 根据Cdr对象当前的字节序设置SerializedPayload_t结构体中的封装字节序标识,
76 // 如果是大端序(BIG_ENDIANNESS)则设置为CDR_BE,否则设置为CDR_LE,方便后续解析时知晓数据的字节序情况
77 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
78 // Serialize encapsulation
79 ser.serialize_encapsulation();
80
81 try
82 {
83 // 调用Float32类型对象的serialize函数,通过Cdr对象将Float32类型的数据进行序列化,
84 // 实际是将数据按照CDR格式写入到之前关联的FastBuffer中,若内存不足等情况会抛出异常
85 // Serialize the object.
86 p_type->serialize(ser);
87 }
88 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
89 {
90 // 如果在序列化过程中出现内存不足异常,则返回false表示序列化失败
91 return false;
92 }
93// 获取序列化后的数据长度,并将其设置到SerializedPayload_t结构体中,
94 // 这样接收方可以根据这个长度准确地知道实际有效数据的范围,便于后续反序列化操作
95 // Get the serialized length
96 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
97 // 如果序列化过程没有出现异常且成功完成,返回true表示序列化成功
98 return true;
99 }
100
102 SerializedPayload_t* payload,
103 void* data)
104 {
105 try
106 {
107 // 将传入的void*类型数据转换为Float32*类型指针,以便后续将反序列化后的数据填充到对应的Float32类型对象中
108 //Convert DATA to pointer of your type
109 Float32* p_type = static_cast<Float32*>(data);
110
111 // Object that manages the raw buffer.
112 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
113
114 // Object that deserializes the data.
115 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
116
117 // Deserialize encapsulation.
118 deser.read_encapsulation();
119 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
120
121 // Deserialize the object.
122 p_type->deserialize(deser);
123 }
124 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
125 {
126 // 如果在反序列化过程中出现内存不足等异常,则返回false表示反序列化失败
127 return false;
128 }
129// 如果反序列化过程没有出现异常且成功完成,返回true表示反序列化成功
130 return true;
131 }
132
134 void* data)
135 {
136 return [data]() -> uint32_t
137 {
138 // 返回给定Float32类型数据序列化后的尺寸,包括实际数据的CDR序列化尺寸以及额外的4字节封装尺寸,
139 // 这里通过调用Float32类型的相关函数获取数据的序列化尺寸,并加上封装尺寸后返回
140 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Float32*>(data))) +
141 4u /*encapsulation*/;
142 };
143 }
144
146 {
147 / 创建一个新的Float32类型对象,并将其指针转换为void*类型返回,
148 // 通常用于在需要动态分配该类型数据空间的场景,比如在消息传递过程中创建新的数据实例
149 return reinterpret_cast<void*>(new Float32());
150 }
151
153 void* data)
154 {
155 // 将传入的void*类型数据转换为Float32*类型指针,然后删除对应的Float32类型对象,
156 // 用于释放之前通过createData等方式动态分配的内存空间,避免内存泄漏
157 delete(reinterpret_cast<Float32*>(data));
158 }
159
161 void* data,
162 InstanceHandle_t* handle,
163 bool force_md5)
164 {
165 // 如果之前判断出Float32类型没有定义获取键(Key)的相关操作,则直接返回false,表示无法获取键
166 if (!m_isGetKeyDefined)
167 {
168 return false;
169 }
170
171 Float32* p_type = static_cast<Float32*>(data);
172
173 // Object that manages the raw buffer.
174 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
176
177 // Object that serializes the data.
178 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
179 p_type->serializeKey(ser);
180 if (force_md5 || Float32::getKeyMaxCdrSerializedSize() > 16)
181 {
182 m_md5.init();
183 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
184 m_md5.finalize();
185 for (uint8_t i = 0; i < 16; ++i)
186 {
187 handle->value[i] = m_md5.digest[i];
188 }
189 }
190 else
191 {
192 // 如果不需要使用MD5计算且键的最大CDR序列化尺寸不大于16字节,则直接将键缓冲区中的数据(前16字节)
193 // 逐个字节复制到InstanceHandle_t结构体的value数组中,作为实例的标识信息
194 for (uint8_t i = 0; i < 16; ++i)
195 {
196 handle->value[i] = m_keyBuffer[i];
197 }
198 }
199 // 如果成功获取并处理了键相关的数据,返回true表示获取键操作成功
200 return true;
201 }
202 } //End of namespace msg
203} //End of namespace std_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport ~Float32PubSubType() override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport void * createData() override
eProsima_user_DllExport Float32PubSubType()
virtual eProsima_user_DllExport void deleteData(void *data) override
这个类表示用户在IDL文件中定义的Float32结构。
Definition Float32.h:72
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
使用CDR反序列化对象。
Definition Float32.cpp:145
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
返回对象的Key的最大序列化大小,取决于缓冲区对齐。
Definition Float32.cpp:186
static eProsima_user_DllExport size_t getCdrSerializedSize(const std_msgs::msg::Float32 &data, size_t current_alignment=0)
返回数据的序列化大小,取决于缓冲区对齐。
Definition Float32.cpp:123
static eProsima_user_DllExport bool isKeyDefined()
告诉你是否为这种类型定义了Key。
Definition Float32.cpp:198
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
使用CDR序列化对象。
Definition Float32.cpp:137
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
使用CDR序列化对象的Key成员。
Definition Float32.cpp:205
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
返回对象的最大序列化大小,取决于缓冲区对齐。
Definition Float32.cpp:113