mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-08 05:40:35 +08:00
DataTypeSignature
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <cassert>
|
||||
#include <stdint.h>
|
||||
#include <algorithm>
|
||||
#include <uavcan/internal/transport/crc.hpp>
|
||||
|
||||
namespace uavcan
|
||||
{
|
||||
@@ -60,6 +61,30 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class DataTypeSignature
|
||||
{
|
||||
uint64_t value_;
|
||||
|
||||
void mixin64(uint64_t x);
|
||||
|
||||
DataTypeSignature() : value_(0) { }
|
||||
|
||||
public:
|
||||
static DataTypeSignature zero() { return DataTypeSignature(); }
|
||||
|
||||
explicit DataTypeSignature(uint64_t value) : value_(value) { }
|
||||
|
||||
void extend(DataTypeSignature dts);
|
||||
|
||||
TransferCRC toTransferCRC() const;
|
||||
|
||||
uint64_t get() const { return value_; }
|
||||
|
||||
bool operator==(DataTypeSignature rhs) const { return value_ == rhs.value_; }
|
||||
bool operator!=(DataTypeSignature rhs) const { return !operator==(rhs); }
|
||||
};
|
||||
|
||||
|
||||
struct DataTypeHash
|
||||
{
|
||||
enum { NumBytes = 16 };
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <cassert>
|
||||
#include <uavcan/internal/data_type.hpp>
|
||||
|
||||
namespace uavcan
|
||||
{
|
||||
/*
|
||||
* DataTypeSignature
|
||||
*/
|
||||
void DataTypeSignature::mixin64(uint64_t x)
|
||||
{
|
||||
DataTypeSignatureCRC crc = DataTypeSignatureCRC::extend(value_);
|
||||
for (int i = 0; i < 64; i += 8) // LSB first
|
||||
crc.add((x >> i) & 0xFF);
|
||||
value_ = crc.get();
|
||||
}
|
||||
|
||||
void DataTypeSignature::extend(DataTypeSignature dts)
|
||||
{
|
||||
const uint64_t y = value_;
|
||||
mixin64(dts.get());
|
||||
mixin64(y);
|
||||
}
|
||||
|
||||
TransferCRC DataTypeSignature::toTransferCRC() const
|
||||
{
|
||||
TransferCRC tcrc;
|
||||
for (int i = 0; i < 64; i += 8) // LSB first
|
||||
tcrc.add((value_ >> i) & 0xFF);
|
||||
return tcrc;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -35,3 +35,51 @@ TEST(DataTypeSignatureCRC, Extension)
|
||||
|
||||
ASSERT_EQ(0x62EC59E3F1A4F00A, crc2.get());
|
||||
}
|
||||
|
||||
|
||||
TEST(DataTypeSignature, Correctness)
|
||||
{
|
||||
using uavcan::DataTypeSignature;
|
||||
using uavcan::DataTypeSignatureCRC;
|
||||
|
||||
DataTypeSignature signature = DataTypeSignature::zero();
|
||||
ASSERT_EQ(0, signature.get());
|
||||
|
||||
/*
|
||||
* First extension
|
||||
*/
|
||||
signature.extend(DataTypeSignature(0x123456789abcdef0));
|
||||
|
||||
DataTypeSignatureCRC crc;
|
||||
crc.add(0xF0);
|
||||
crc.add(0xDE);
|
||||
crc.add(0xBC);
|
||||
crc.add(0x9A);
|
||||
crc.add(0x78);
|
||||
crc.add(0x56);
|
||||
crc.add(0x34);
|
||||
crc.add(0x12);
|
||||
for (int i = 0; i < 8; i++)
|
||||
crc.add(0);
|
||||
|
||||
ASSERT_EQ(crc.get(), signature.get());
|
||||
|
||||
const uint64_t old_signature = signature.get();
|
||||
|
||||
/*
|
||||
* Second extension
|
||||
*/
|
||||
signature.extend(DataTypeSignature(0xfedcba9876543210));
|
||||
crc.add(0x10);
|
||||
crc.add(0x32);
|
||||
crc.add(0x54);
|
||||
crc.add(0x76);
|
||||
crc.add(0x98);
|
||||
crc.add(0xba);
|
||||
crc.add(0xdc);
|
||||
crc.add(0xfe);
|
||||
for (int i = 0; i < 64; i += 8)
|
||||
crc.add((old_signature >> i) & 0xFF);
|
||||
|
||||
ASSERT_EQ(crc.get(), signature.get());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user