mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-08 14:30:35 +08:00
Type safe DataTypeID class
This commit is contained in:
@@ -23,6 +23,36 @@ enum DataTypeKind
|
||||
NumDataTypeKinds
|
||||
};
|
||||
|
||||
|
||||
class DataTypeID
|
||||
{
|
||||
uint16_t value_;
|
||||
|
||||
public:
|
||||
enum { Max = 1023 };
|
||||
|
||||
DataTypeID() : value_(0xFFFF) { }
|
||||
|
||||
DataTypeID(uint16_t id)
|
||||
: value_(id)
|
||||
{
|
||||
assert(isValid());
|
||||
}
|
||||
|
||||
bool isValid() const { return value_ <= Max; }
|
||||
|
||||
uint16_t get() const { return value_; }
|
||||
|
||||
bool operator==(DataTypeID rhs) const { return value_ == rhs.value_; }
|
||||
bool operator!=(DataTypeID rhs) const { return value_ != rhs.value_; }
|
||||
|
||||
bool operator<(DataTypeID rhs) const { return value_ < rhs.value_; }
|
||||
bool operator>(DataTypeID rhs) const { return value_ > rhs.value_; }
|
||||
bool operator<=(DataTypeID rhs) const { return value_ <= rhs.value_; }
|
||||
bool operator>=(DataTypeID rhs) const { return value_ >= rhs.value_; }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* CRC-64-WE
|
||||
* Description: http://reveng.sourceforge.net/crc-catalogue/17plus.htm#crc.cat-bits.64
|
||||
@@ -89,39 +119,36 @@ public:
|
||||
class DataTypeDescriptor
|
||||
{
|
||||
DataTypeKind kind_;
|
||||
uint16_t id_;
|
||||
DataTypeID id_;
|
||||
DataTypeSignature signature_;
|
||||
const char* full_name_;
|
||||
|
||||
public:
|
||||
enum { MaxDataTypeID = 1023 };
|
||||
enum { MaxFullNameLen = 80 };
|
||||
|
||||
DataTypeDescriptor()
|
||||
: kind_(DataTypeKind(0))
|
||||
, id_(0)
|
||||
, full_name_("")
|
||||
{ }
|
||||
|
||||
DataTypeDescriptor(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature, const char* name)
|
||||
DataTypeDescriptor(DataTypeKind kind, DataTypeID id, const DataTypeSignature& signature, const char* name)
|
||||
: kind_(kind)
|
||||
, id_(id)
|
||||
, signature_(signature)
|
||||
, full_name_(name)
|
||||
{
|
||||
assert(id <= MaxDataTypeID);
|
||||
assert(kind < NumDataTypeKinds);
|
||||
assert(name);
|
||||
assert(std::strlen(name) <= MaxFullNameLen);
|
||||
}
|
||||
|
||||
DataTypeKind getKind() const { return kind_; }
|
||||
uint16_t getID() const { return id_; }
|
||||
DataTypeID getID() const { return id_; }
|
||||
const DataTypeSignature& getSignature() const { return signature_; }
|
||||
const char* getFullName() const { return full_name_; }
|
||||
|
||||
bool match(DataTypeKind kind, const char* name) const;
|
||||
bool match(DataTypeKind kind, uint16_t id) const;
|
||||
bool match(DataTypeKind kind, DataTypeID id) const;
|
||||
|
||||
std::string toString() const;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
namespace uavcan
|
||||
{
|
||||
|
||||
typedef std::bitset<DataTypeDescriptor::MaxDataTypeID + 1> DataTypeIDMask;
|
||||
typedef std::bitset<DataTypeID::Max + 1> DataTypeIDMask;
|
||||
|
||||
class GlobalDataTypeRegistry : Noncopyable
|
||||
{
|
||||
@@ -29,14 +29,14 @@ class GlobalDataTypeRegistry : Noncopyable
|
||||
|
||||
Entry() { }
|
||||
|
||||
Entry(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature, const char* name)
|
||||
Entry(DataTypeKind kind, DataTypeID id, const DataTypeSignature& signature, const char* name)
|
||||
: descriptor(kind, id, signature, name)
|
||||
{ }
|
||||
};
|
||||
|
||||
struct EntryInsertionComparator
|
||||
{
|
||||
const uint16_t id;
|
||||
const DataTypeID id;
|
||||
EntryInsertionComparator(Entry* dtd) : id(dtd->descriptor.getID()) { }
|
||||
bool operator()(const Entry* entry) const
|
||||
{
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
|
||||
/// Last call wins
|
||||
template <typename Type>
|
||||
RegistResult regist(uint16_t id)
|
||||
RegistResult regist(DataTypeID id)
|
||||
{
|
||||
if (isFrozen())
|
||||
return RegistResultFrozen;
|
||||
|
||||
@@ -26,9 +26,9 @@ class Dispatcher : Noncopyable
|
||||
|
||||
class DataTypeIDInsertionComparator
|
||||
{
|
||||
const uint16_t id_;
|
||||
const DataTypeID id_;
|
||||
public:
|
||||
DataTypeIDInsertionComparator(uint16_t id) : id_(id) { }
|
||||
DataTypeIDInsertionComparator(DataTypeID id) : id_(id) { }
|
||||
bool operator()(const TransferListenerBase* listener) const
|
||||
{
|
||||
assert(listener);
|
||||
|
||||
@@ -20,7 +20,7 @@ class Frame
|
||||
{
|
||||
uint8_t payload_[sizeof(CanFrame::data)];
|
||||
TransferType transfer_type_;
|
||||
uint_fast16_t data_type_id_;
|
||||
DataTypeID data_type_id_;
|
||||
uint_fast8_t payload_len_;
|
||||
NodeID src_node_id_;
|
||||
NodeID dst_node_id_;
|
||||
@@ -33,14 +33,13 @@ public:
|
||||
|
||||
Frame()
|
||||
: transfer_type_(TransferType(NumTransferTypes)) // That is invalid value
|
||||
, data_type_id_(0)
|
||||
, payload_len_(0)
|
||||
, frame_index_(0)
|
||||
, transfer_id_(0)
|
||||
, last_frame_(false)
|
||||
{ }
|
||||
|
||||
Frame(uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
|
||||
Frame(DataTypeID data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
|
||||
uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false)
|
||||
: transfer_type_(transfer_type)
|
||||
, data_type_id_(data_type_id)
|
||||
@@ -52,7 +51,7 @@ public:
|
||||
, last_frame_(last_frame)
|
||||
{
|
||||
assert((transfer_type == TransferTypeMessageBroadcast) == dst_node_id.isBroadcast());
|
||||
assert(data_type_id <= DataTypeDescriptor::MaxDataTypeID);
|
||||
assert(data_type_id.isValid());
|
||||
assert(src_node_id != dst_node_id);
|
||||
assert(frame_index <= MaxIndex);
|
||||
}
|
||||
@@ -64,7 +63,7 @@ public:
|
||||
const uint8_t* getPayloadPtr() const { return payload_; }
|
||||
|
||||
TransferType getTransferType() const { return transfer_type_; }
|
||||
uint_fast16_t getDataTypeID() const { return data_type_id_; }
|
||||
DataTypeID getDataTypeID() const { return data_type_id_; }
|
||||
NodeID getSrcNodeID() const { return src_node_id_; }
|
||||
NodeID getDstNodeID() const { return dst_node_id_; }
|
||||
TransferID getTransferID() const { return transfer_id_; }
|
||||
|
||||
@@ -17,17 +17,16 @@ namespace uavcan
|
||||
UAVCAN_PACKED_BEGIN
|
||||
class OutgoingTransferRegistryKey
|
||||
{
|
||||
uint16_t data_type_id_;
|
||||
DataTypeID data_type_id_;
|
||||
uint8_t transfer_type_;
|
||||
NodeID destination_node_id_; ///< Not applicable for message broadcasting
|
||||
|
||||
public:
|
||||
OutgoingTransferRegistryKey()
|
||||
: data_type_id_(0xFFFF)
|
||||
, transfer_type_(0xFF)
|
||||
: transfer_type_(0xFF)
|
||||
{ }
|
||||
|
||||
OutgoingTransferRegistryKey(uint16_t data_type_id, TransferType transfer_type, NodeID destination_node_id)
|
||||
OutgoingTransferRegistryKey(DataTypeID data_type_id, TransferType transfer_type, NodeID destination_node_id)
|
||||
: data_type_id_(data_type_id)
|
||||
, transfer_type_(transfer_type)
|
||||
, destination_node_id_(destination_node_id)
|
||||
|
||||
Reference in New Issue
Block a user