mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-04-30 17:24:07 +08:00
DataTypeDescriptor got name_
This commit is contained in:
parent
bc54015265
commit
d71ec29fcf
@ -87,33 +87,49 @@ public:
|
||||
};
|
||||
|
||||
|
||||
struct DataTypeDescriptor
|
||||
class DataTypeDescriptor
|
||||
{
|
||||
DataTypeKind kind_;
|
||||
uint16_t id_;
|
||||
DataTypeSignature signature_;
|
||||
const char* name_;
|
||||
|
||||
public:
|
||||
enum { MaxDataTypeID = Frame::MaxDataTypeID };
|
||||
|
||||
DataTypeKind kind;
|
||||
uint16_t id;
|
||||
DataTypeSignature signature;
|
||||
|
||||
DataTypeDescriptor()
|
||||
: kind(DataTypeKind(0))
|
||||
, id(0)
|
||||
, signature(DataTypeSignature::zero())
|
||||
: kind_(DataTypeKind(0))
|
||||
, id_(0)
|
||||
, signature_(DataTypeSignature::zero())
|
||||
, name_("")
|
||||
{ }
|
||||
|
||||
DataTypeDescriptor(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature)
|
||||
: kind(kind)
|
||||
, id(id)
|
||||
, signature(signature)
|
||||
DataTypeDescriptor(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature, const char* name)
|
||||
: kind_(kind)
|
||||
, id_(id)
|
||||
, signature_(signature)
|
||||
, name_(name)
|
||||
{
|
||||
assert(id <= MaxDataTypeID);
|
||||
assert(kind < NumDataTypeKinds);
|
||||
assert(name);
|
||||
}
|
||||
|
||||
DataTypeKind getKind() const { return kind_; }
|
||||
uint16_t getID() const { return id_; }
|
||||
const DataTypeSignature& getSignature() const { return signature_; }
|
||||
const char* getName() const { return name_; }
|
||||
|
||||
std::string toString() const;
|
||||
|
||||
bool operator!=(const DataTypeDescriptor& rhs) const { return !operator==(rhs); }
|
||||
bool operator==(const DataTypeDescriptor& rhs) const
|
||||
{
|
||||
return (kind == rhs.kind) && (id == rhs.id) && (signature == rhs.signature);
|
||||
return
|
||||
(kind_ == rhs.kind_) &&
|
||||
(id_ == rhs.id_) &&
|
||||
(signature_ == rhs.signature_) &&
|
||||
!std::strcmp(name_, rhs.name_);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ class Dispatcher : Noncopyable
|
||||
bool operator()(const TransferListenerBase* listener) const
|
||||
{
|
||||
assert(listener);
|
||||
return id_ > listener->getDataTypeDescriptor().id;
|
||||
return id_ > listener->getDataTypeDescriptor().getID();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -95,7 +95,7 @@ class TransferListenerBase : public LinkedListNode<TransferListenerBase>
|
||||
protected:
|
||||
TransferListenerBase(const DataTypeDescriptor& data_type)
|
||||
: data_type_(data_type)
|
||||
, crc_base_(data_type.signature.toTransferCRC())
|
||||
, crc_base_(data_type.getSignature().toTransferCRC())
|
||||
{ }
|
||||
|
||||
virtual ~TransferListenerBase() { }
|
||||
|
||||
@ -31,7 +31,7 @@ public:
|
||||
: max_transfer_interval_(max_transfer_interval)
|
||||
, data_type_(data_type)
|
||||
, qos_(qos)
|
||||
, crc_base_(data_type.signature.toTransferCRC())
|
||||
, crc_base_(data_type.getSignature().toTransferCRC())
|
||||
, dispatcher_(dispatcher)
|
||||
{ }
|
||||
|
||||
|
||||
@ -2,7 +2,8 @@
|
||||
* Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <cassert>
|
||||
#include <uavcan/data_type.hpp>
|
||||
|
||||
@ -34,4 +35,22 @@ TransferCRC DataTypeSignature::toTransferCRC() const
|
||||
return tcrc;
|
||||
}
|
||||
|
||||
/*
|
||||
* DataTypeDescriptor
|
||||
*/
|
||||
std::string DataTypeDescriptor::toString() const
|
||||
{
|
||||
char kindch = '?';
|
||||
switch (kind_)
|
||||
{
|
||||
case DataTypeKindMessage: kindch = 'm'; break;
|
||||
case DataTypeKindService: kindch = 's'; break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
std::ostringstream os;
|
||||
os << name_ << ":" << id_ << kindch << ":" << std::hex << std::setfill('0') << std::setw(16) << signature_.get();
|
||||
return os.str();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -18,13 +18,13 @@ bool Dispatcher::ListenerRegister::add(TransferListenerBase* listener, Mode mode
|
||||
TransferListenerBase* p = list_.get();
|
||||
while (p)
|
||||
{
|
||||
if (p->getDataTypeDescriptor().id == listener->getDataTypeDescriptor().id)
|
||||
if (p->getDataTypeDescriptor().getID() == listener->getDataTypeDescriptor().getID())
|
||||
return false;
|
||||
p = p->getNextListNode();
|
||||
}
|
||||
}
|
||||
// Objective is to arrange entries by Data Type ID in ascending order from root.
|
||||
list_.insertBefore(listener, DataTypeIDInsertionComparator(listener->getDataTypeDescriptor().id));
|
||||
list_.insertBefore(listener, DataTypeIDInsertionComparator(listener->getDataTypeDescriptor().getID()));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -48,9 +48,9 @@ void Dispatcher::ListenerRegister::handleFrame(const RxFrame& frame)
|
||||
TransferListenerBase* p = list_.get();
|
||||
while (p)
|
||||
{
|
||||
if (p->getDataTypeDescriptor().id == frame.getDataTypeID())
|
||||
if (p->getDataTypeDescriptor().getID() == frame.getDataTypeID())
|
||||
p->handleFrame(frame);
|
||||
else if (p->getDataTypeDescriptor().id < frame.getDataTypeID()) // Listeners are ordered by data type id!
|
||||
else if (p->getDataTypeDescriptor().getID() < frame.getDataTypeID()) // Listeners are ordered by data type id!
|
||||
break;
|
||||
p = p->getNextListNode();
|
||||
}
|
||||
@ -145,7 +145,7 @@ void Dispatcher::cleanup(uint64_t ts_monotonic)
|
||||
|
||||
bool Dispatcher::registerMessageListener(TransferListenerBase* listener)
|
||||
{
|
||||
if (listener->getDataTypeDescriptor().kind != DataTypeKindMessage)
|
||||
if (listener->getDataTypeDescriptor().getKind() != DataTypeKindMessage)
|
||||
{
|
||||
assert(0);
|
||||
return false;
|
||||
@ -155,7 +155,7 @@ bool Dispatcher::registerMessageListener(TransferListenerBase* listener)
|
||||
|
||||
bool Dispatcher::registerServiceRequestListener(TransferListenerBase* listener)
|
||||
{
|
||||
if (listener->getDataTypeDescriptor().kind != DataTypeKindService)
|
||||
if (listener->getDataTypeDescriptor().getKind() != DataTypeKindService)
|
||||
{
|
||||
assert(0);
|
||||
return false;
|
||||
@ -165,7 +165,7 @@ bool Dispatcher::registerServiceRequestListener(TransferListenerBase* listener)
|
||||
|
||||
bool Dispatcher::registerServiceResponseListener(TransferListenerBase* listener)
|
||||
{
|
||||
if (listener->getDataTypeDescriptor().kind != DataTypeKindService)
|
||||
if (listener->getDataTypeDescriptor().getKind() != DataTypeKindService)
|
||||
{
|
||||
assert(0);
|
||||
return false;
|
||||
|
||||
@ -14,7 +14,7 @@ int TransferSender::send(const uint8_t* payload, int payload_len, uint64_t monot
|
||||
uint64_t monotonic_blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
|
||||
TransferID tid)
|
||||
{
|
||||
Frame frame(data_type_.id, transfer_type, dispatcher_.getSelfNodeID(), dst_node_id, 0, tid);
|
||||
Frame frame(data_type_.getID(), transfer_type, dispatcher_.getSelfNodeID(), dst_node_id, 0, tid);
|
||||
|
||||
if (frame.getMaxPayloadLen() >= payload_len) // Single Frame Transfer
|
||||
{
|
||||
@ -87,7 +87,7 @@ int TransferSender::send(const uint8_t* payload, int payload_len, uint64_t monot
|
||||
int TransferSender::send(const uint8_t* payload, int payload_len, uint64_t monotonic_tx_deadline,
|
||||
uint64_t monotonic_blocking_deadline, TransferType transfer_type, NodeID dst_node_id)
|
||||
{
|
||||
const OutgoingTransferRegistryKey otr_key(data_type_.id, transfer_type, dst_node_id);
|
||||
const OutgoingTransferRegistryKey otr_key(data_type_.getID(), transfer_type, dst_node_id);
|
||||
|
||||
assert(monotonic_tx_deadline > 0);
|
||||
const uint64_t otr_deadline = monotonic_tx_deadline + max_transfer_interval_;
|
||||
@ -95,7 +95,8 @@ int TransferSender::send(const uint8_t* payload, int payload_len, uint64_t monot
|
||||
TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline);
|
||||
if (tid == NULL)
|
||||
{
|
||||
UAVCAN_TRACE("TransferSender", "OTR access failure, dtid=%i tt=%i", int(data_type_.id), int(transfer_type));
|
||||
UAVCAN_TRACE("TransferSender", "OTR access failure, dtd=%s tt=%i",
|
||||
data_type_.toString().c_str(), int(transfer_type));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@ -91,3 +91,14 @@ TEST(DataTypeSignature, Correctness)
|
||||
ASSERT_FALSE(signature != DataTypeSignature(signature.get()));
|
||||
ASSERT_TRUE(signature != DataTypeSignature::zero());
|
||||
}
|
||||
|
||||
|
||||
TEST(DataTypeDescriptor, ToString)
|
||||
{
|
||||
uavcan::DataTypeDescriptor desc;
|
||||
ASSERT_EQ(":0s:0000000000000000", desc.toString());
|
||||
|
||||
desc = uavcan::DataTypeDescriptor(uavcan::DataTypeKindMessage, 123,
|
||||
uavcan::DataTypeSignature(0xdeadbeef1234), "Bar");
|
||||
ASSERT_EQ("Bar:123m:0000deadbeef1234", desc.toString());
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ public:
|
||||
|
||||
TEST(TransferListener, BasicMFT)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
static const int NUM_POOL_BLOCKS = 12; // This number is just enough to pass the test
|
||||
uavcan::PoolAllocator<uavcan::MemPoolBlockSize * NUM_POOL_BLOCKS, uavcan::MemPoolBlockSize> pool;
|
||||
@ -85,7 +85,7 @@ TEST(TransferListener, BasicMFT)
|
||||
|
||||
TEST(TransferListener, CrcFailure)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
uavcan::PoolManager<1> poolmgr; // No dynamic memory
|
||||
TestSubscriber<256, 2, 2> subscriber(type, poolmgr); // Static buffer only, 2 entries
|
||||
@ -128,7 +128,7 @@ TEST(TransferListener, CrcFailure)
|
||||
|
||||
TEST(TransferListener, BasicSFT)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
uavcan::PoolManager<1> poolmgr; // No dynamic memory. At all.
|
||||
TestSubscriber<0, 0, 5> subscriber(type, poolmgr); // Max buf size is 0, i.e. SFT-only
|
||||
@ -163,7 +163,7 @@ TEST(TransferListener, BasicSFT)
|
||||
|
||||
TEST(TransferListener, Cleanup)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
uavcan::PoolManager<1> poolmgr; // No dynamic memory
|
||||
TestSubscriber<256, 1, 2> subscriber(type, poolmgr); // Static buffer only, 1 entry
|
||||
@ -217,7 +217,7 @@ TEST(TransferListener, Cleanup)
|
||||
|
||||
TEST(TransferListener, MaximumTransferLength)
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
const uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "A");
|
||||
|
||||
uavcan::PoolManager<1> poolmgr;
|
||||
TestSubscriber<uavcan::MaxTransferPayloadLen * 2, 2, 2> subscriber(type, poolmgr);
|
||||
|
||||
@ -32,7 +32,7 @@ TEST(TransferTestHelpers, Transfer)
|
||||
|
||||
TEST(TransferTestHelpers, MFTSerialization)
|
||||
{
|
||||
uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "Foo");
|
||||
|
||||
static const std::string DATA = "To go wrong in one's own way is better than to go right in someone else's.";
|
||||
const Transfer transfer(1, 100000, uavcan::TransferTypeMessageUnicast, 2, 42, 127, DATA, type);
|
||||
@ -61,7 +61,7 @@ TEST(TransferTestHelpers, MFTSerialization)
|
||||
|
||||
TEST(TransferTestHelpers, SFTSerialization)
|
||||
{
|
||||
uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789));
|
||||
uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "Foo");
|
||||
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TransferTypeMessageBroadcast, 7, 42, 0, "Nvrfrget", type);
|
||||
|
||||
@ -85,7 +85,7 @@ struct Transfer
|
||||
<< " tid=" << int(transfer_id.get())
|
||||
<< " snid=" << int(src_node_id.get())
|
||||
<< " dnid=" << int(dst_node_id.get())
|
||||
<< " dtid=" << int(data_type.id)
|
||||
<< " dtid=" << int(data_type.getID())
|
||||
<< "\n\t'" << payload << "'";
|
||||
return os.str();
|
||||
}
|
||||
@ -165,7 +165,7 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer)
|
||||
std::vector<uint8_t> raw_payload;
|
||||
if (need_crc)
|
||||
{
|
||||
uavcan::TransferCRC payload_crc = transfer.data_type.signature.toTransferCRC();
|
||||
uavcan::TransferCRC payload_crc = transfer.data_type.getSignature().toTransferCRC();
|
||||
payload_crc.add(reinterpret_cast<const uint8_t*>(transfer.payload.c_str()), transfer.payload.length());
|
||||
// Little endian
|
||||
raw_payload.push_back(payload_crc.get() & 0xFF);
|
||||
@ -184,8 +184,8 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer)
|
||||
const int bytes_left = raw_payload.size() - offset;
|
||||
EXPECT_TRUE(bytes_left >= 0);
|
||||
|
||||
uavcan::Frame frm(transfer.data_type.id, transfer.transfer_type, transfer.src_node_id, transfer.dst_node_id,
|
||||
frame_index, transfer.transfer_id);
|
||||
uavcan::Frame frm(transfer.data_type.getID(), transfer.transfer_type, transfer.src_node_id,
|
||||
transfer.dst_node_id, frame_index, transfer.transfer_id);
|
||||
const int spres = frm.setPayload(&*(raw_payload.begin() + offset), bytes_left);
|
||||
if (spres < 0)
|
||||
{
|
||||
@ -210,10 +210,10 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer)
|
||||
return output;
|
||||
}
|
||||
|
||||
uavcan::DataTypeDescriptor makeDataType(uavcan::DataTypeKind kind, uint16_t id)
|
||||
uavcan::DataTypeDescriptor makeDataType(uavcan::DataTypeKind kind, uint16_t id, const char* name = "")
|
||||
{
|
||||
const uavcan::DataTypeSignature signature((uint64_t(kind) << 16) | (id << 8) | (id & 0xFF));
|
||||
return uavcan::DataTypeDescriptor(kind, id, signature);
|
||||
return uavcan::DataTypeDescriptor(kind, id, signature, name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user