mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-13 11:10:35 +08:00
Added TransferBufferAccessor, saves few bytes on stack/heap
This commit is contained in:
@@ -242,6 +242,27 @@ public:
|
||||
virtual void remove(const TransferBufferManagerKey& key) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convinience class.
|
||||
*/
|
||||
class TransferBufferAccessor
|
||||
{
|
||||
ITransferBufferManager* const bufmgr_;
|
||||
const TransferBufferManagerKey key_;
|
||||
|
||||
public:
|
||||
TransferBufferAccessor(ITransferBufferManager* bufmgr, TransferBufferManagerKey key)
|
||||
: bufmgr_(bufmgr)
|
||||
, key_(key)
|
||||
{
|
||||
assert(bufmgr);
|
||||
assert(!key.isEmpty());
|
||||
}
|
||||
TransferBufferBase* access() { return bufmgr_->access(key_); }
|
||||
TransferBufferBase* create() { return bufmgr_->create(key_); }
|
||||
void remove() { bufmgr_->remove(key_); }
|
||||
};
|
||||
|
||||
/**
|
||||
* Buffer manager implementation.
|
||||
*/
|
||||
|
||||
@@ -29,7 +29,6 @@ private:
|
||||
uint64_t this_transfer_ts_monotonic_;
|
||||
uint64_t first_frame_ts_utc_;
|
||||
uint32_t transfer_interval_;
|
||||
ITransferBufferManager* bufmgr_;
|
||||
TransferID tid_;
|
||||
uint8_t iface_index_;
|
||||
uint8_t next_frame_index_;
|
||||
@@ -42,7 +41,7 @@ private:
|
||||
void prepareForNextTransfer();
|
||||
|
||||
bool validate(const RxFrame& frame) const;
|
||||
ResultCode receive(const RxFrame& frame, const TransferBufferManagerKey& bufmgr_key);
|
||||
ResultCode receive(const RxFrame& frame, TransferBufferAccessor& tba);
|
||||
|
||||
TransferReceiver(const TransferReceiver&); // = delete (not needed)
|
||||
|
||||
@@ -52,26 +51,13 @@ public:
|
||||
, this_transfer_ts_monotonic_(0)
|
||||
, first_frame_ts_utc_(0)
|
||||
, transfer_interval_(DEFAULT_TRANSFER_INTERVAL)
|
||||
, bufmgr_(NULL)
|
||||
, iface_index_(IFACE_INDEX_NOTSET)
|
||||
, next_frame_index_(0)
|
||||
{ }
|
||||
|
||||
TransferReceiver(ITransferBufferManager* bufmgr)
|
||||
: prev_transfer_ts_monotonic_(0)
|
||||
, this_transfer_ts_monotonic_(0)
|
||||
, first_frame_ts_utc_(0)
|
||||
, transfer_interval_(DEFAULT_TRANSFER_INTERVAL)
|
||||
, bufmgr_(bufmgr)
|
||||
, iface_index_(IFACE_INDEX_NOTSET)
|
||||
, next_frame_index_(0)
|
||||
{
|
||||
assert(bufmgr);
|
||||
}
|
||||
|
||||
bool isTimedOut(uint64_t ts_monotonic) const;
|
||||
|
||||
ResultCode addFrame(const RxFrame& frame, const TransferBufferManagerKey& bufmgr_key);
|
||||
ResultCode addFrame(const RxFrame& frame, TransferBufferAccessor& tba);
|
||||
|
||||
uint64_t getLastTransferTimestampMonotonic() const { return prev_transfer_ts_monotonic_; }
|
||||
uint64_t getLastTransferTimestampUtc() const { return first_frame_ts_utc_; }
|
||||
|
||||
@@ -86,8 +86,7 @@ bool TransferReceiver::validate(const RxFrame& frame) const
|
||||
return true;
|
||||
}
|
||||
|
||||
TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame,
|
||||
const TransferBufferManagerKey& bufmgr_key)
|
||||
TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, TransferBufferAccessor& tba)
|
||||
{
|
||||
if (frame.frame_index == 0)
|
||||
{
|
||||
@@ -97,15 +96,15 @@ TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame,
|
||||
|
||||
if ((frame.frame_index == 0) && frame.last_frame) // Single-frame transfer
|
||||
{
|
||||
bufmgr_->remove(bufmgr_key);
|
||||
tba.remove();
|
||||
updateTransferTimings();
|
||||
prepareForNextTransfer();
|
||||
return RESULT_SINGLE_FRAME;
|
||||
}
|
||||
|
||||
TransferBufferBase* buf = bufmgr_->access(bufmgr_key);
|
||||
TransferBufferBase* buf = tba.access();
|
||||
if (buf == NULL)
|
||||
buf = bufmgr_->create(bufmgr_key);
|
||||
buf = tba.create();
|
||||
if (buf == NULL)
|
||||
{
|
||||
UAVCAN_TRACE("TransferReceiver", "Failed to access the buffer, %s", frame.toString().c_str());
|
||||
@@ -117,7 +116,7 @@ TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame,
|
||||
if (res != frame.payload_len)
|
||||
{
|
||||
UAVCAN_TRACE("TransferReceiver", "Buffer write failure [%i], %s", res, frame.toString().c_str());
|
||||
bufmgr_->remove(bufmgr_key);
|
||||
tba.remove();
|
||||
prepareForNextTransfer();
|
||||
return RESULT_NOT_COMPLETE;
|
||||
}
|
||||
@@ -141,13 +140,8 @@ bool TransferReceiver::isTimedOut(uint64_t ts_monotonic) const
|
||||
return (ts_monotonic - ts) > (uint64_t(transfer_interval_) * INTERVAL_MULT);
|
||||
}
|
||||
|
||||
TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame,
|
||||
const TransferBufferManagerKey& bufmgr_key)
|
||||
TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, TransferBufferAccessor& tba)
|
||||
{
|
||||
assert(bufmgr_);
|
||||
assert(bufmgr_key.getNodeID() == frame.source_node_id);
|
||||
assert(bufmgr_key.getTransferType() == frame.transfer_type);
|
||||
|
||||
if ((frame.ts_monotonic == 0) ||
|
||||
(frame.ts_monotonic < prev_transfer_ts_monotonic_) ||
|
||||
(frame.ts_monotonic < this_transfer_ts_monotonic_))
|
||||
@@ -174,7 +168,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame,
|
||||
"Restart [not_inited=%i, iface_timeout=%i, recv_timeout=%i, same_iface=%i, first_frame=%i, tid_rel=%i], %s",
|
||||
int(not_initialized), int(iface_timed_out), int(receiver_timed_out), int(same_iface), int(first_fame),
|
||||
int(tid_rel), frame.toString().c_str());
|
||||
bufmgr_->remove(bufmgr_key);
|
||||
tba.remove();
|
||||
iface_index_ = frame.iface_index;
|
||||
tid_ = frame.transfer_id;
|
||||
next_frame_index_ = 0;
|
||||
@@ -188,7 +182,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame,
|
||||
if (!validate(frame))
|
||||
return RESULT_NOT_COMPLETE;
|
||||
|
||||
return receive(frame, bufmgr_key);
|
||||
return receive(frame, tba);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,7 +62,6 @@ struct Context
|
||||
: bufmgr(&poolmgr)
|
||||
{
|
||||
assert(poolmgr.allocate(1) == NULL);
|
||||
receiver = uavcan::TransferReceiver(&bufmgr);
|
||||
}
|
||||
|
||||
~Context()
|
||||
@@ -101,10 +100,10 @@ TEST(TransferReceiver, Basic)
|
||||
{
|
||||
using uavcan::TransferReceiver;
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
/*
|
||||
* Empty
|
||||
@@ -218,10 +217,10 @@ TEST(TransferReceiver, Basic)
|
||||
TEST(TransferReceiver, OutOfBufferSpace_32bytes)
|
||||
{
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
/*
|
||||
* Simple transfer, maximum buffer length
|
||||
@@ -252,10 +251,10 @@ TEST(TransferReceiver, OutOfBufferSpace_32bytes)
|
||||
TEST(TransferReceiver, UnterminatedTransfer)
|
||||
{
|
||||
Context<256> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
std::string content;
|
||||
for (int i = 0; i <= uavcan::Frame::FRAME_INDEX_MAX; i++)
|
||||
@@ -272,10 +271,10 @@ TEST(TransferReceiver, UnterminatedTransfer)
|
||||
TEST(TransferReceiver, OutOfOrderFrames)
|
||||
{
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 10, 100000000), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 3, false, 10, 100000100), bk)); // Out of order
|
||||
@@ -292,10 +291,10 @@ TEST(TransferReceiver, OutOfOrderFrames)
|
||||
TEST(TransferReceiver, IntervalMeasurement)
|
||||
{
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
static const int INTERVAL = 1000;
|
||||
uavcan::TransferID tid;
|
||||
@@ -321,10 +320,10 @@ TEST(TransferReceiver, IntervalMeasurement)
|
||||
TEST(TransferReceiver, Restart)
|
||||
{
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
/*
|
||||
* This transfer looks complete, but must be ignored because of large delay after the first frame
|
||||
@@ -361,10 +360,10 @@ TEST(TransferReceiver, Restart)
|
||||
TEST(TransferReceiver, UtcTransferTimestamping)
|
||||
{
|
||||
Context<32> context;
|
||||
const uavcan::TransferBufferManagerKey bk = RxFrameGenerator::DEFAULT_KEY;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, RxFrameGenerator::DEFAULT_KEY);
|
||||
|
||||
/*
|
||||
* Zero UTC timestamp must be preserved
|
||||
|
||||
Reference in New Issue
Block a user