libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
packet.cpp
1#include "libxr_mem.hpp"
2#include "message.hpp"
3
4using namespace LibXR;
5
6void Topic::PackedDataHeader::SetDataLen(uint32_t len)
7{
8 data_len_raw[0] = static_cast<uint8_t>(len >> 16);
9 data_len_raw[1] = static_cast<uint8_t>(len >> 8);
10 data_len_raw[2] = static_cast<uint8_t>(len);
11}
12
13uint32_t Topic::PackedDataHeader::GetDataLen() const
14{
15 return static_cast<uint32_t>(data_len_raw[0]) << 16 |
16 static_cast<uint32_t>(data_len_raw[1]) << 8 |
17 static_cast<uint32_t>(data_len_raw[2]);
18}
19
20void Topic::PackedDataHeader::SetTimestamp(MicrosecondTimestamp timestamp)
21{
22 uint64_t value = static_cast<uint64_t>(timestamp);
23 for (size_t i = 0; i < sizeof(timestamp_us_raw); i++)
24 {
25 timestamp_us_raw[i] =
26 static_cast<uint8_t>(value >> ((sizeof(timestamp_us_raw) - 1U - i) * 8U));
27 }
28}
29
30MicrosecondTimestamp Topic::PackedDataHeader::GetTimestamp() const
31{
32 uint64_t value = 0;
33 for (uint8_t byte : timestamp_us_raw)
34 {
35 value = (value << 8U) | static_cast<uint64_t>(byte);
36 }
37 return MicrosecondTimestamp(value);
38}
39
40void Topic::PackData(uint32_t topic_name_crc32, RawData buffer,
41 MicrosecondTimestamp timestamp, ConstRawData data)
42{
43 PackedData<uint8_t>* pack = reinterpret_cast<PackedData<uint8_t>*>(buffer.addr_);
44
45 LibXR::Memory::FastCopy(&pack->raw.data_, data.addr_, data.size_);
46
47 pack->raw.header_.prefix = PACKET_PREFIX;
48 pack->raw.header_.topic_name_crc32 = topic_name_crc32;
49 pack->raw.header_.SetDataLen(data.size_);
50 pack->raw.header_.SetTimestamp(timestamp);
51 pack->raw.header_.pack_header_crc8 =
52 CRC8::Calculate(&pack->raw, sizeof(PackedDataHeader) - sizeof(uint8_t));
53 uint8_t* crc8_pack = reinterpret_cast<uint8_t*>(
54 reinterpret_cast<uint8_t*>(pack) + PACK_BASE_SIZE + data.size_ - sizeof(uint8_t));
55 *crc8_pack = CRC8::Calculate(pack, PACK_BASE_SIZE - sizeof(uint8_t) + data.size_);
56}
static uint8_t Calculate(const void *raw, size_t len)
计算数据的 CRC8 校验码 / Computes the CRC8 checksum for the given data
Definition crc.hpp:67
只读原始数据视图 / Immutable raw data view
size_t size_
数据字节数 / Data size in bytes
const void * addr_
数据起始地址 / Data start address
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
Definition libxr_mem.cpp:5
微秒时间戳 / Microsecond timestamp
可写原始数据视图 / Mutable raw data view
void * addr_
数据起始地址 / Data start address
static void PackData(uint32_t topic_name_crc32, RawData buffer, MicrosecondTimestamp timestamp, ConstRawData data)
打包数据
Definition packet.cpp:40
LibXR 命名空间
Definition ch32_can.hpp:14