mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-19 00:30:34 +08:00
Tests: refectored IncomingTransferEmulator, CAN iface mock supports pushRx(RxFrame)
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <vector>
|
||||
#include <gtest/gtest.h>
|
||||
#include <uavcan/internal/transport/can_io.hpp>
|
||||
#include <uavcan/internal/transport/transfer.hpp>
|
||||
#include "../../common.hpp"
|
||||
|
||||
|
||||
@@ -41,11 +42,18 @@ public:
|
||||
, clockmock(clockmock)
|
||||
{ }
|
||||
|
||||
void pushRx(uavcan::CanFrame frame)
|
||||
void pushRx(const uavcan::CanFrame& frame)
|
||||
{
|
||||
rx.push(FrameWithTime(frame, clockmock.monotonic));
|
||||
}
|
||||
|
||||
void pushRx(const uavcan::RxFrame& frame)
|
||||
{
|
||||
uavcan::CanFrame can_frame;
|
||||
EXPECT_TRUE(frame.compile(can_frame));
|
||||
rx.push(FrameWithTime(can_frame, frame.getMonotonicTimestamp()));
|
||||
}
|
||||
|
||||
bool matchAndPopTx(const uavcan::CanFrame& frame, uint64_t tx_deadline)
|
||||
{
|
||||
if (tx.empty())
|
||||
|
||||
@@ -6,67 +6,18 @@
|
||||
#include "transfer_test_helpers.hpp"
|
||||
|
||||
|
||||
class Emulator
|
||||
class Emulator : public IncomingTransferEmulatorBase
|
||||
{
|
||||
uavcan::TransferListenerBase& target_;
|
||||
const uavcan::DataTypeDescriptor type_;
|
||||
uint64_t ts_;
|
||||
uavcan::TransferID tid_;
|
||||
uavcan::NodeID dst_node_id_;
|
||||
|
||||
public:
|
||||
Emulator(uavcan::TransferListenerBase& target, const uavcan::DataTypeDescriptor& type,
|
||||
uavcan::NodeID dst_node_id = 127)
|
||||
: target_(target)
|
||||
, type_(type)
|
||||
, ts_(0)
|
||||
, dst_node_id_(dst_node_id)
|
||||
: IncomingTransferEmulatorBase(type, dst_node_id)
|
||||
, target_(target)
|
||||
{ }
|
||||
|
||||
Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload)
|
||||
{
|
||||
ts_ += 100;
|
||||
const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST)
|
||||
? uavcan::NodeID::BROADCAST : dst_node_id_;
|
||||
const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload);
|
||||
tid_.increment();
|
||||
return tr;
|
||||
}
|
||||
|
||||
void send(const std::vector<std::vector<uavcan::RxFrame> >& sers)
|
||||
{
|
||||
unsigned int index = 0;
|
||||
while (true)
|
||||
{
|
||||
// Sending all transfers concurrently
|
||||
bool all_empty = true;
|
||||
for (std::vector<std::vector<uavcan::RxFrame> >::const_iterator it = sers.begin(); it != sers.end(); ++it)
|
||||
{
|
||||
if (it->size() <= index)
|
||||
continue;
|
||||
all_empty = false;
|
||||
std::cout << "Emulator: Sending: " << it->at(index).toString() << std::endl;
|
||||
target_.handleFrame(it->at(index));
|
||||
}
|
||||
index++;
|
||||
if (all_empty)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void send(const Transfer* transfers, unsigned int num_transfers)
|
||||
{
|
||||
std::vector<std::vector<uavcan::RxFrame> > sers;
|
||||
while (num_transfers--)
|
||||
sers.push_back(serializeTransfer(*transfers++, type_));
|
||||
send(sers);
|
||||
}
|
||||
|
||||
template <int SIZE>
|
||||
void send(const Transfer (&transfers)[SIZE])
|
||||
{
|
||||
send(transfers, SIZE);
|
||||
}
|
||||
void sendOneFrame(const uavcan::RxFrame& frame) { target_.handleFrame(frame); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -205,3 +205,64 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer, const u
|
||||
|
||||
}
|
||||
|
||||
|
||||
class IncomingTransferEmulatorBase
|
||||
{
|
||||
const uavcan::DataTypeDescriptor type_;
|
||||
uint64_t ts_;
|
||||
uavcan::TransferID tid_;
|
||||
uavcan::NodeID dst_node_id_;
|
||||
|
||||
public:
|
||||
IncomingTransferEmulatorBase(const uavcan::DataTypeDescriptor& type, uavcan::NodeID dst_node_id = 127)
|
||||
: type_(type)
|
||||
, ts_(0)
|
||||
, dst_node_id_(dst_node_id)
|
||||
{ }
|
||||
|
||||
virtual ~IncomingTransferEmulatorBase() { }
|
||||
|
||||
Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload)
|
||||
{
|
||||
ts_ += 100;
|
||||
const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST)
|
||||
? uavcan::NodeID::BROADCAST : dst_node_id_;
|
||||
const Transfer tr(ts_, ts_ + 1000000000ul, transfer_type, tid_, source_node_id, dst_node_id, payload);
|
||||
tid_.increment();
|
||||
return tr;
|
||||
}
|
||||
|
||||
virtual void sendOneFrame(const uavcan::RxFrame& frame) = 0;
|
||||
|
||||
void send(const std::vector<std::vector<uavcan::RxFrame> >& sers)
|
||||
{
|
||||
unsigned int index = 0;
|
||||
while (true)
|
||||
{
|
||||
// Sending all transfers concurrently
|
||||
bool all_empty = true;
|
||||
for (std::vector<std::vector<uavcan::RxFrame> >::const_iterator it = sers.begin(); it != sers.end(); ++it)
|
||||
{
|
||||
if (it->size() <= index)
|
||||
continue;
|
||||
all_empty = false;
|
||||
std::cout << "Incoming Transfer Emulator: Sending: " << it->at(index).toString() << std::endl;
|
||||
sendOneFrame(it->at(index));
|
||||
}
|
||||
index++;
|
||||
if (all_empty)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void send(const Transfer* transfers, unsigned int num_transfers)
|
||||
{
|
||||
std::vector<std::vector<uavcan::RxFrame> > sers;
|
||||
while (num_transfers--)
|
||||
sers.push_back(serializeTransfer(*transfers++, type_));
|
||||
send(sers);
|
||||
}
|
||||
|
||||
template <int SIZE> void send(const Transfer (&transfers)[SIZE]) { send(transfers, SIZE); }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user