OTR deinterfaced

This commit is contained in:
Pavel Kirienko
2015-10-14 20:15:19 +03:00
parent 0d5fc65907
commit 899aae44f7
10 changed files with 56 additions and 97 deletions
+1 -3
View File
@@ -47,7 +47,6 @@ class UAVCAN_EXPORT Node : public INode
typedef PoolAllocator<MemPoolSize, MemPoolBlockSize> Allocator; typedef PoolAllocator<MemPoolSize, MemPoolBlockSize> Allocator;
Allocator pool_allocator_; Allocator pool_allocator_;
OutgoingTransferRegistry outgoing_trans_reg_;
Scheduler scheduler_; Scheduler scheduler_;
NodeStatusProvider proto_nsp_; NodeStatusProvider proto_nsp_;
@@ -75,8 +74,7 @@ protected:
public: public:
Node(ICanDriver& can_driver, ISystemClock& system_clock) Node(ICanDriver& can_driver, ISystemClock& system_clock)
: outgoing_trans_reg_(pool_allocator_) : scheduler_(can_driver, pool_allocator_, system_clock)
, scheduler_(can_driver, pool_allocator_, system_clock, outgoing_trans_reg_)
, proto_nsp_(*this) , proto_nsp_(*this)
#if !UAVCAN_TINY #if !UAVCAN_TINY
, proto_dtp_(*this) , proto_dtp_(*this)
+2 -2
View File
@@ -92,8 +92,8 @@ class UAVCAN_EXPORT Scheduler : Noncopyable
void pollCleanup(MonotonicTime mono_ts, uint32_t num_frames_processed_with_last_spin); void pollCleanup(MonotonicTime mono_ts, uint32_t num_frames_processed_with_last_spin);
public: public:
Scheduler(ICanDriver& can_driver, IPoolAllocator& allocator, ISystemClock& sysclock, IOutgoingTransferRegistry& otr) Scheduler(ICanDriver& can_driver, IPoolAllocator& allocator, ISystemClock& sysclock)
: dispatcher_(can_driver, allocator, sysclock, otr) : dispatcher_(can_driver, allocator, sysclock)
, prev_cleanup_ts_(sysclock.getMonotonic()) , prev_cleanup_ts_(sysclock.getMonotonic())
, deadline_resolution_(MonotonicDuration::fromMSec(DefaultDeadlineResolutionMs)) , deadline_resolution_(MonotonicDuration::fromMSec(DefaultDeadlineResolutionMs))
, cleanup_period_(MonotonicDuration::fromMSec(DefaultCleanupPeriodMs)) , cleanup_period_(MonotonicDuration::fromMSec(DefaultCleanupPeriodMs))
+1 -3
View File
@@ -31,7 +31,6 @@ class UAVCAN_EXPORT SubNode : public INode
typedef PoolAllocator<MemPoolSize, MemPoolBlockSize> Allocator; typedef PoolAllocator<MemPoolSize, MemPoolBlockSize> Allocator;
Allocator pool_allocator_; Allocator pool_allocator_;
OutgoingTransferRegistry outgoing_trans_reg_;
Scheduler scheduler_; Scheduler scheduler_;
uint64_t internal_failure_cnt_; uint64_t internal_failure_cnt_;
@@ -46,8 +45,7 @@ protected:
public: public:
SubNode(ICanDriver& can_driver, ISystemClock& system_clock) : SubNode(ICanDriver& can_driver, ISystemClock& system_clock) :
outgoing_trans_reg_(pool_allocator_), scheduler_(can_driver, pool_allocator_, system_clock),
scheduler_(can_driver, pool_allocator_, system_clock, outgoing_trans_reg_),
internal_failure_cnt_(0) internal_failure_cnt_(0)
{ } { }
@@ -81,7 +81,7 @@ class UAVCAN_EXPORT Dispatcher : Noncopyable
{ {
CanIOManager canio_; CanIOManager canio_;
ISystemClock& sysclock_; ISystemClock& sysclock_;
IOutgoingTransferRegistry& outgoing_transfer_reg_; OutgoingTransferRegistry outgoing_transfer_reg_;
TransferPerfCounter perf_; TransferPerfCounter perf_;
class ListenerRegistry class ListenerRegistry
@@ -133,10 +133,10 @@ class UAVCAN_EXPORT Dispatcher : Noncopyable
void notifyRxFrameListener(const CanRxFrame& can_frame, CanIOFlags flags); void notifyRxFrameListener(const CanRxFrame& can_frame, CanIOFlags flags);
public: public:
Dispatcher(ICanDriver& driver, IPoolAllocator& allocator, ISystemClock& sysclock, IOutgoingTransferRegistry& otr) Dispatcher(ICanDriver& driver, IPoolAllocator& allocator, ISystemClock& sysclock)
: canio_(driver, allocator, sysclock) : canio_(driver, allocator, sysclock)
, sysclock_(sysclock) , sysclock_(sysclock)
, outgoing_transfer_reg_(otr) , outgoing_transfer_reg_(allocator)
#if !UAVCAN_TINY #if !UAVCAN_TINY
, rx_listener_(NULL) , rx_listener_(NULL)
#endif #endif
@@ -201,7 +201,7 @@ public:
* @} * @}
*/ */
IOutgoingTransferRegistry& getOutgoingTransferRegistry() { return outgoing_transfer_reg_; } OutgoingTransferRegistry& getOutgoingTransferRegistry() { return outgoing_transfer_reg_; }
#if !UAVCAN_TINY #if !UAVCAN_TINY
LoopbackFrameListenerRegistry& getLoopbackFrameListenerRegistry() { return loopback_listeners_; } LoopbackFrameListenerRegistry& getLoopbackFrameListenerRegistry() { return loopback_listeners_; }
@@ -60,23 +60,8 @@ public:
* Outgoing transfer registry keeps track of Transfer ID values for all currently existing local transfer senders. * Outgoing transfer registry keeps track of Transfer ID values for all currently existing local transfer senders.
* If a local transfer sender was inactive for a sufficiently long time, the outgoing transfer registry will * If a local transfer sender was inactive for a sufficiently long time, the outgoing transfer registry will
* remove the respective Transfer ID tracking object. * remove the respective Transfer ID tracking object.
*
* TODO: Deinterface this.
*/ */
class UAVCAN_EXPORT IOutgoingTransferRegistry class UAVCAN_EXPORT OutgoingTransferRegistry : Noncopyable
{
public:
static const MonotonicDuration MinEntryLifetime;
virtual ~IOutgoingTransferRegistry() { }
virtual TransferID* accessOrCreate(const OutgoingTransferRegistryKey& key, MonotonicTime new_deadline) = 0;
virtual bool exists(DataTypeID dtid, TransferType tt) const = 0;
virtual void cleanup(MonotonicTime deadline) = 0;
};
class UAVCAN_EXPORT OutgoingTransferRegistry : public IOutgoingTransferRegistry, Noncopyable
{ {
struct Value struct Value
{ {
@@ -127,54 +112,19 @@ class UAVCAN_EXPORT OutgoingTransferRegistry : public IOutgoingTransferRegistry,
Map<OutgoingTransferRegistryKey, Value> map_; Map<OutgoingTransferRegistryKey, Value> map_;
public: public:
static const MonotonicDuration MinEntryLifetime;
explicit OutgoingTransferRegistry(IPoolAllocator& allocator) explicit OutgoingTransferRegistry(IPoolAllocator& allocator)
: map_(allocator) : map_(allocator)
{ } { }
virtual TransferID* accessOrCreate(const OutgoingTransferRegistryKey& key, MonotonicTime new_deadline); TransferID* accessOrCreate(const OutgoingTransferRegistryKey& key, MonotonicTime new_deadline);
virtual bool exists(DataTypeID dtid, TransferType tt) const; bool exists(DataTypeID dtid, TransferType tt) const;
virtual void cleanup(MonotonicTime ts); void cleanup(MonotonicTime ts);
}; };
// ----------------------------------------------------------------------------
/*
* OutgoingTransferRegistry
* TODO: deinterface and move to .cpp
*/
inline
TransferID* OutgoingTransferRegistry::accessOrCreate(const OutgoingTransferRegistryKey& key,
MonotonicTime new_deadline)
{
UAVCAN_ASSERT(!new_deadline.isZero());
Value* p = map_.access(key);
if (p == NULL)
{
p = map_.insert(key, Value());
if (p == NULL)
{
return NULL;
}
UAVCAN_TRACE("OutgoingTransferRegistry", "Created %s", key.toString().c_str());
}
p->deadline = new_deadline;
return &p->tid;
}
inline
bool OutgoingTransferRegistry::exists(DataTypeID dtid, TransferType tt) const
{
return NULL != map_.find(ExistenceCheckingPredicate(dtid, tt));
}
inline
void OutgoingTransferRegistry::cleanup(MonotonicTime ts)
{
map_.removeAllWhere(DeadlineExpiredPredicate(ts));
}
} }
#endif // UAVCAN_TRANSPORT_OUTGOING_TRANSFER_REGISTRY_HPP_INCLUDED #endif // UAVCAN_TRANSPORT_OUTGOING_TRANSFER_REGISTRY_HPP_INCLUDED
@@ -20,8 +20,36 @@ std::string OutgoingTransferRegistryKey::toString() const
#endif #endif
/* /*
* IOutgoingTransferRegistry * OutgoingTransferRegistry
*/ */
const MonotonicDuration IOutgoingTransferRegistry::MinEntryLifetime = MonotonicDuration::fromMSec(2000); const MonotonicDuration OutgoingTransferRegistry::MinEntryLifetime = MonotonicDuration::fromMSec(2000);
TransferID* OutgoingTransferRegistry::accessOrCreate(const OutgoingTransferRegistryKey& key,
MonotonicTime new_deadline)
{
UAVCAN_ASSERT(!new_deadline.isZero());
Value* p = map_.access(key);
if (p == NULL)
{
p = map_.insert(key, Value());
if (p == NULL)
{
return NULL;
}
UAVCAN_TRACE("OutgoingTransferRegistry", "Created %s", key.toString().c_str());
}
p->deadline = new_deadline;
return &p->tid;
}
bool OutgoingTransferRegistry::exists(DataTypeID dtid, TransferType tt) const
{
return NULL != map_.find(ExistenceCheckingPredicate(dtid, tt));
}
void OutgoingTransferRegistry::cleanup(MonotonicTime ts)
{
map_.removeAllWhere(DeadlineExpiredPredicate(ts));
}
} }
@@ -153,7 +153,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
UAVCAN_ASSERT(!tx_deadline.isZero()); UAVCAN_ASSERT(!tx_deadline.isZero());
const MonotonicTime otr_deadline = tx_deadline + max(max_transfer_interval_ * 2, const MonotonicTime otr_deadline = tx_deadline + max(max_transfer_interval_ * 2,
IOutgoingTransferRegistry::MinEntryLifetime); OutgoingTransferRegistry::MinEntryLifetime);
TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline); TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline);
if (tid == NULL) if (tid == NULL)
+1 -3
View File
@@ -20,13 +20,11 @@
struct TestNode : public uavcan::INode struct TestNode : public uavcan::INode
{ {
uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 1024, uavcan::MemPoolBlockSize> pool; uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 1024, uavcan::MemPoolBlockSize> pool;
uavcan::OutgoingTransferRegistry otr;
uavcan::Scheduler scheduler; uavcan::Scheduler scheduler;
uint64_t internal_failure_count; uint64_t internal_failure_count;
TestNode(uavcan::ICanDriver& can_driver, uavcan::ISystemClock& clock_driver, uavcan::NodeID self_node_id) TestNode(uavcan::ICanDriver& can_driver, uavcan::ISystemClock& clock_driver, uavcan::NodeID self_node_id)
: otr(pool) : scheduler(can_driver, pool, clock_driver)
, scheduler(can_driver, pool, clock_driver, otr)
, internal_failure_count(0) , internal_failure_count(0)
{ {
setNodeID(self_node_id); setNodeID(self_node_id);
+6 -13
View File
@@ -57,9 +57,7 @@ TEST(Dispatcher, Reception)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(pool); uavcan::Dispatcher dispatcher(driver, pool, clockmock);
uavcan::Dispatcher dispatcher(driver, pool, clockmock, out_trans_reg);
ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID)); ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
ASSERT_EQ(SELF_NODE_ID, dispatcher.getNodeID()); ASSERT_EQ(SELF_NODE_ID, dispatcher.getNodeID());
@@ -255,9 +253,7 @@ TEST(Dispatcher, Transmission)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(pool); uavcan::Dispatcher dispatcher(driver, pool, clockmock);
uavcan::Dispatcher dispatcher(driver, pool, clockmock, out_trans_reg);
ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID)); ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
@@ -280,7 +276,8 @@ TEST(Dispatcher, Transmission)
ASSERT_FALSE(dispatcher.hasPublisher(123)); ASSERT_FALSE(dispatcher.hasPublisher(123));
ASSERT_FALSE(dispatcher.hasPublisher(456)); ASSERT_FALSE(dispatcher.hasPublisher(456));
const uavcan::OutgoingTransferRegistryKey otr_key(123, uavcan::TransferTypeMessageBroadcast, 0); const uavcan::OutgoingTransferRegistryKey otr_key(123, uavcan::TransferTypeMessageBroadcast, 0);
ASSERT_TRUE(out_trans_reg.accessOrCreate(otr_key, uavcan::MonotonicTime::fromMSec(1000000))); ASSERT_TRUE(dispatcher.getOutgoingTransferRegistry().accessOrCreate(otr_key,
uavcan::MonotonicTime::fromMSec(1000000)));
ASSERT_TRUE(dispatcher.hasPublisher(123)); ASSERT_TRUE(dispatcher.hasPublisher(123));
ASSERT_FALSE(dispatcher.hasPublisher(456)); ASSERT_FALSE(dispatcher.hasPublisher(456));
@@ -319,9 +316,7 @@ TEST(Dispatcher, Spin)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(poolmgr); uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock, out_trans_reg);
ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID)); ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
@@ -365,9 +360,7 @@ TEST(Dispatcher, Loopback)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(poolmgr); uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock, out_trans_reg);
ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID));
{ {
+4 -10
View File
@@ -34,12 +34,10 @@ TEST(TransferSender, Basic)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(poolmgr);
static const uavcan::NodeID TX_NODE_ID(64); static const uavcan::NodeID TX_NODE_ID(64);
static const uavcan::NodeID RX_NODE_ID(65); static const uavcan::NodeID RX_NODE_ID(65);
uavcan::Dispatcher dispatcher_tx(driver, poolmgr, clockmock, out_trans_reg); uavcan::Dispatcher dispatcher_tx(driver, poolmgr, clockmock);
uavcan::Dispatcher dispatcher_rx(driver, poolmgr, clockmock, out_trans_reg); uavcan::Dispatcher dispatcher_rx(driver, poolmgr, clockmock);
ASSERT_TRUE(dispatcher_tx.setNodeID(TX_NODE_ID)); ASSERT_TRUE(dispatcher_tx.setNodeID(TX_NODE_ID));
ASSERT_TRUE(dispatcher_rx.setNodeID(RX_NODE_ID)); ASSERT_TRUE(dispatcher_rx.setNodeID(RX_NODE_ID));
@@ -195,10 +193,8 @@ TEST(TransferSender, Loopback)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(poolmgr);
static const uavcan::NodeID TX_NODE_ID(64); static const uavcan::NodeID TX_NODE_ID(64);
uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock, out_trans_reg); uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
ASSERT_TRUE(dispatcher.setNodeID(TX_NODE_ID)); ASSERT_TRUE(dispatcher.setNodeID(TX_NODE_ID));
uavcan::DataTypeDescriptor desc = makeDataType(uavcan::DataTypeKindMessage, 1, "Foobar"); uavcan::DataTypeDescriptor desc = makeDataType(uavcan::DataTypeKindMessage, 1, "Foobar");
@@ -236,9 +232,7 @@ TEST(TransferSender, PassiveMode)
SystemClockMock clockmock(100); SystemClockMock clockmock(100);
CanDriverMock driver(2, clockmock); CanDriverMock driver(2, clockmock);
uavcan::OutgoingTransferRegistry out_trans_reg(poolmgr); uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock, out_trans_reg);
uavcan::TransferSender sender(dispatcher, makeDataType(uavcan::DataTypeKindMessage, 123), uavcan::TransferSender sender(dispatcher, makeDataType(uavcan::DataTypeKindMessage, 123),
uavcan::CanTxQueue::Volatile); uavcan::CanTxQueue::Volatile);