mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-17 06:23:34 +08:00
Refactoring: Frame Index field size increased, Trnasfer ID field size reduced. NodeID class added, Frame class rewritten with stricter runtime checks. All tests were updated accordingly.
This commit is contained in:
@@ -9,16 +9,13 @@
|
||||
|
||||
static uavcan::RxFrame makeFrame()
|
||||
{
|
||||
uavcan::RxFrame frame;
|
||||
frame.data_type_id = 123;
|
||||
frame.last_frame = true;
|
||||
frame.source_node_id = 42;
|
||||
frame.transfer_id.increment();
|
||||
frame.ts_monotonic = 123;
|
||||
frame.ts_utc = 456;
|
||||
frame.payload_len = uavcan::RxFrame::PAYLOAD_LEN_MAX;
|
||||
for (int i = 0; i < uavcan::RxFrame::PAYLOAD_LEN_MAX; i++)
|
||||
frame.payload[i] = i;
|
||||
uavcan::RxFrame frame(
|
||||
uavcan::Frame(123, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 1, uavcan::NodeID::BROADCAST, 0, 1, true),
|
||||
123, 456, 0);
|
||||
uint8_t data[8];
|
||||
for (unsigned int i = 0; i < sizeof(data); i++)
|
||||
data[i] = i;
|
||||
frame.setPayload(data, sizeof(data));
|
||||
return frame;
|
||||
}
|
||||
|
||||
@@ -27,11 +24,11 @@ static bool match(const uavcan::IncomingTransfer& it, const uavcan::RxFrame& fra
|
||||
const uint8_t* payload, unsigned int payload_len)
|
||||
{
|
||||
// Fields extracted from the frame struct
|
||||
EXPECT_EQ(it.getMonotonicTimestamp(), frame.ts_monotonic);
|
||||
EXPECT_EQ(it.getUtcTimestamp(), frame.ts_utc);
|
||||
EXPECT_EQ(it.getSourceNodeID(), frame.source_node_id);
|
||||
EXPECT_EQ(it.getTransferID(), frame.transfer_id);
|
||||
EXPECT_EQ(it.getTransferType(), frame.transfer_type);
|
||||
EXPECT_EQ(it.getMonotonicTimestamp(), frame.getMonotonicTimestamp());
|
||||
EXPECT_EQ(it.getUtcTimestamp(), frame.getUtcTimestamp());
|
||||
EXPECT_EQ(it.getSrcNodeID(), frame.getSrcNodeID());
|
||||
EXPECT_EQ(it.getTransferID(), frame.getTransferID());
|
||||
EXPECT_EQ(it.getTransferType(), frame.getTransferType());
|
||||
|
||||
// Payload comparison
|
||||
static const unsigned int BUFLEN = 1024;
|
||||
@@ -60,9 +57,9 @@ TEST(SingleFrameIncomingTransfer, Basic)
|
||||
using uavcan::SingleFrameIncomingTransfer;
|
||||
|
||||
const RxFrame frame = makeFrame();
|
||||
SingleFrameIncomingTransfer it(frame, frame.payload, frame.payload_len);
|
||||
SingleFrameIncomingTransfer it(frame);
|
||||
|
||||
ASSERT_TRUE(match(it, frame, frame.payload, frame.payload_len));
|
||||
ASSERT_TRUE(match(it, frame, frame.getPayloadPtr(), frame.getPayloadLen()));
|
||||
}
|
||||
|
||||
|
||||
@@ -75,10 +72,10 @@ TEST(MultiFrameIncomingTransfer, Basic)
|
||||
uavcan::TransferBufferManager<256, 1> bufmgr(&poolmgr);
|
||||
|
||||
const RxFrame frame = makeFrame();
|
||||
uavcan::TransferBufferManagerKey bufmgr_key(frame.source_node_id, frame.transfer_type);
|
||||
uavcan::TransferBufferManagerKey bufmgr_key(frame.getSrcNodeID(), frame.getTransferType());
|
||||
uavcan::TransferBufferAccessor tba(&bufmgr, bufmgr_key);
|
||||
|
||||
MultiFrameIncomingTransfer it(frame.ts_monotonic, frame.ts_utc, frame, tba);
|
||||
MultiFrameIncomingTransfer it(frame.getMonotonicTimestamp(), frame.getUtcTimestamp(), frame, tba);
|
||||
|
||||
/*
|
||||
* Empty read must fail
|
||||
|
||||
@@ -13,40 +13,29 @@ TEST(Transfer, TransferID)
|
||||
using uavcan::TransferID;
|
||||
|
||||
// Tests below are based on this assumption
|
||||
ASSERT_EQ(16, 1 << TransferID::BITLEN);
|
||||
ASSERT_EQ(8, 1 << TransferID::BITLEN);
|
||||
|
||||
/*
|
||||
* forwardDistance()
|
||||
*/
|
||||
EXPECT_EQ(0, TransferID(0).forwardDistance(0));
|
||||
EXPECT_EQ(1, TransferID(0).forwardDistance(1));
|
||||
EXPECT_EQ(15, TransferID(0).forwardDistance(15));
|
||||
EXPECT_EQ(7, TransferID(0).forwardDistance(7));
|
||||
|
||||
EXPECT_EQ(0, TransferID(7).forwardDistance(7));
|
||||
EXPECT_EQ(15, TransferID(7).forwardDistance(6));
|
||||
EXPECT_EQ(1, TransferID(7).forwardDistance(8));
|
||||
EXPECT_EQ(7, TransferID(7).forwardDistance(6));
|
||||
EXPECT_EQ(1, TransferID(7).forwardDistance(0));
|
||||
|
||||
EXPECT_EQ(9, TransferID(10).forwardDistance(3));
|
||||
EXPECT_EQ(7, TransferID(3).forwardDistance(10));
|
||||
|
||||
EXPECT_EQ(8, TransferID(6).forwardDistance(14));
|
||||
EXPECT_EQ(8, TransferID(14).forwardDistance(6));
|
||||
|
||||
EXPECT_EQ(1, TransferID(14).forwardDistance(15));
|
||||
EXPECT_EQ(2, TransferID(14).forwardDistance(0));
|
||||
EXPECT_EQ(4, TransferID(14).forwardDistance(2));
|
||||
|
||||
EXPECT_EQ(15, TransferID(15).forwardDistance(14));
|
||||
EXPECT_EQ(14, TransferID(0).forwardDistance(14));
|
||||
EXPECT_EQ(12, TransferID(2).forwardDistance(14));
|
||||
EXPECT_EQ(7, TransferID(7).forwardDistance(6));
|
||||
EXPECT_EQ(5, TransferID(0).forwardDistance(5));
|
||||
|
||||
/*
|
||||
* Misc
|
||||
*/
|
||||
EXPECT_TRUE(TransferID(2) == TransferID(2));
|
||||
EXPECT_FALSE(TransferID(2) != TransferID(2));
|
||||
EXPECT_FALSE(TransferID(2) == TransferID(8));
|
||||
EXPECT_TRUE(TransferID(2) != TransferID(8));
|
||||
EXPECT_FALSE(TransferID(2) == TransferID(0));
|
||||
EXPECT_TRUE(TransferID(2) != TransferID(0));
|
||||
|
||||
TransferID tid;
|
||||
for (int i = 0; i < 999; i++)
|
||||
@@ -55,7 +44,7 @@ TEST(Transfer, TransferID)
|
||||
const TransferID copy = tid;
|
||||
tid.increment();
|
||||
ASSERT_EQ(1, copy.forwardDistance(tid));
|
||||
ASSERT_EQ(15, tid.forwardDistance(copy));
|
||||
ASSERT_EQ(7, tid.forwardDistance(copy));
|
||||
ASSERT_EQ(0, tid.forwardDistance(tid));
|
||||
}
|
||||
}
|
||||
@@ -71,10 +60,10 @@ TEST(Transfer, FrameParseCompile)
|
||||
|
||||
const uint32_t can_id =
|
||||
(2 << 0) | // Transfer ID
|
||||
(1 << 4) | // Last Frame
|
||||
(29 << 5) | // Frame Index
|
||||
(1 << 3) | // Last Frame
|
||||
(29 << 4) | // Frame Index
|
||||
(42 << 10) | // Source Node ID
|
||||
(3 << 17) | // Transfer Type
|
||||
(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST << 17) |
|
||||
(456 << 19); // Data Type ID
|
||||
|
||||
const std::string payload_string = "hello";
|
||||
@@ -89,32 +78,24 @@ TEST(Transfer, FrameParseCompile)
|
||||
// Valid
|
||||
ASSERT_TRUE(frame.parse(makeCanFrame(can_id, payload_string, EXT)));
|
||||
|
||||
EXPECT_EQ(TransferID(2), frame.transfer_id);
|
||||
EXPECT_TRUE(frame.last_frame);
|
||||
EXPECT_EQ(29, frame.frame_index);
|
||||
EXPECT_EQ(42, frame.source_node_id);
|
||||
EXPECT_EQ(TransferType(3), frame.transfer_type);
|
||||
EXPECT_EQ(456, frame.data_type_id);
|
||||
EXPECT_EQ(TransferID(2), frame.getTransferID());
|
||||
EXPECT_TRUE(frame.isLastFrame());
|
||||
EXPECT_EQ(29, frame.getFrameIndex());
|
||||
EXPECT_EQ(uavcan::NodeID(42), frame.getSrcNodeID());
|
||||
EXPECT_EQ(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, frame.getTransferType());
|
||||
EXPECT_EQ(456, frame.getDataTypeID());
|
||||
|
||||
EXPECT_EQ(payload_string.length(), frame.payload_len);
|
||||
EXPECT_TRUE(std::equal(frame.payload, frame.payload + frame.payload_len, payload_string.begin()));
|
||||
|
||||
// Default
|
||||
ASSERT_TRUE(frame.parse(CanFrame(CanFrame::FLAG_EFF, (const uint8_t*)"", 0)));
|
||||
ASSERT_EQ(Frame(), frame);
|
||||
EXPECT_EQ(payload_string.length(), frame.getPayloadLen());
|
||||
EXPECT_TRUE(std::equal(frame.getPayloadPtr(), frame.getPayloadPtr() + frame.getPayloadLen(),
|
||||
payload_string.begin()));
|
||||
|
||||
/*
|
||||
* Compile
|
||||
*/
|
||||
// Default
|
||||
frame = Frame();
|
||||
CanFrame can_frame = frame.compile();
|
||||
ASSERT_EQ(can_frame.id, CanFrame::FLAG_EFF);
|
||||
|
||||
// Custom
|
||||
CanFrame can_frame;
|
||||
ASSERT_TRUE(frame.parse(makeCanFrame(can_id, payload_string, EXT)));
|
||||
|
||||
can_frame = frame.compile();
|
||||
ASSERT_TRUE(frame.compile(can_frame));
|
||||
ASSERT_EQ(can_frame, makeCanFrame(can_id, payload_string, EXT));
|
||||
|
||||
EXPECT_EQ(payload_string.length(), can_frame.dlc);
|
||||
@@ -144,26 +125,30 @@ TEST(Transfer, RxFrameParse)
|
||||
// Failure
|
||||
ASSERT_FALSE(rx_frame.parse(can_rx_frame));
|
||||
|
||||
// Default
|
||||
can_rx_frame.id = CanFrame::FLAG_EFF;
|
||||
ASSERT_TRUE(rx_frame.parse(can_rx_frame));
|
||||
ASSERT_EQ(0, rx_frame.ts_monotonic);
|
||||
ASSERT_EQ(0, rx_frame.iface_index);
|
||||
// Valid
|
||||
can_rx_frame.id = CanFrame::FLAG_EFF |
|
||||
(2 << 0) | // Transfer ID
|
||||
(1 << 3) | // Last Frame
|
||||
(29 << 4) | // Frame Index
|
||||
(42 << 10) | // Source Node ID
|
||||
(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST << 17) |
|
||||
(456 << 19); // Data Type ID
|
||||
|
||||
ASSERT_TRUE(rx_frame.parse(can_rx_frame));
|
||||
ASSERT_EQ(0, rx_frame.getMonotonicTimestamp());
|
||||
ASSERT_EQ(0, rx_frame.getIfaceIndex());
|
||||
|
||||
// Custom
|
||||
can_rx_frame.ts_monotonic = 123;
|
||||
can_rx_frame.iface_index = 2;
|
||||
|
||||
Frame frame;
|
||||
frame.data_type_id = 456;
|
||||
frame.transfer_type = uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST;
|
||||
*static_cast<CanFrame*>(&can_rx_frame) = frame.compile();
|
||||
Frame frame(456, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 1, uavcan::NodeID::BROADCAST, 0, 0);
|
||||
ASSERT_TRUE(frame.compile(can_rx_frame));
|
||||
|
||||
ASSERT_TRUE(rx_frame.parse(can_rx_frame));
|
||||
ASSERT_EQ(123, rx_frame.ts_monotonic);
|
||||
ASSERT_EQ(2, rx_frame.iface_index);
|
||||
ASSERT_EQ(456, rx_frame.data_type_id);
|
||||
ASSERT_EQ(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, rx_frame.transfer_type);
|
||||
ASSERT_EQ(123, rx_frame.getMonotonicTimestamp());
|
||||
ASSERT_EQ(2, rx_frame.getIfaceIndex());
|
||||
ASSERT_EQ(456, rx_frame.getDataTypeID());
|
||||
ASSERT_EQ(uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, rx_frame.getTransferType());
|
||||
}
|
||||
|
||||
|
||||
@@ -174,31 +159,28 @@ TEST(Transfer, FrameToString)
|
||||
|
||||
// RX frame default
|
||||
RxFrame rx_frame;
|
||||
EXPECT_EQ("dtid=0 tt=0 snid=0 idx=0 last=0 tid=0 payload=[] ts_m=0 ts_utc=0 iface=0", rx_frame.toString());
|
||||
EXPECT_EQ("dtid=0 tt=4 snid=255 dnid=255 idx=0 last=0 tid=0 payload=[] ts_m=0 ts_utc=0 iface=0", rx_frame.toString());
|
||||
|
||||
// RX frame max len
|
||||
rx_frame.data_type_id = Frame::DATA_TYPE_ID_MAX;
|
||||
rx_frame.transfer_type = uavcan::TransferType(uavcan::NUM_TRANSFER_TYPES - 1);
|
||||
rx_frame.source_node_id = uavcan::NODE_ID_MAX;
|
||||
rx_frame.frame_index = Frame::FRAME_INDEX_MAX;
|
||||
rx_frame.last_frame = true;
|
||||
rx_frame.transfer_id = uavcan::TransferID::MAX;
|
||||
rx_frame.payload_len = Frame::PAYLOAD_LEN_MAX;
|
||||
for (int i = 0; i < rx_frame.payload_len; i++)
|
||||
rx_frame.payload[i] = i;
|
||||
rx_frame.ts_monotonic = 0xFFFFFFFFFFFFFFFF;
|
||||
rx_frame.ts_utc = 0xFFFFFFFFFFFFFFFF;
|
||||
rx_frame.iface_index = 3;
|
||||
rx_frame = RxFrame(Frame(Frame::DATA_TYPE_ID_MAX, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST,
|
||||
uavcan::NodeID::MAX, uavcan::NodeID::MAX - 1, Frame::FRAME_INDEX_MAX,
|
||||
uavcan::TransferID::MAX, true),
|
||||
0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 3);
|
||||
|
||||
uint8_t data[8];
|
||||
for (unsigned int i = 0; i < sizeof(data); i++)
|
||||
data[i] = i;
|
||||
rx_frame.setPayload(data, sizeof(data));
|
||||
|
||||
EXPECT_EQ(
|
||||
"dtid=1023 tt=3 snid=127 idx=31 last=1 tid=15 payload=[00 01 02 03 04 05 06 07] ts_m=18446744073709551615 ts_utc=18446744073709551615 iface=3",
|
||||
"dtid=1023 tt=3 snid=127 dnid=126 idx=62 last=1 tid=7 payload=[00 01 02 03 04 05 06] ts_m=18446744073709551615 ts_utc=18446744073709551615 iface=3",
|
||||
rx_frame.toString());
|
||||
|
||||
// Plain frame default
|
||||
Frame frame;
|
||||
EXPECT_EQ("dtid=0 tt=0 snid=0 idx=0 last=0 tid=0 payload=[]", frame.toString());
|
||||
EXPECT_EQ("dtid=0 tt=4 snid=255 dnid=255 idx=0 last=0 tid=0 payload=[]", frame.toString());
|
||||
|
||||
// Plain frame max len
|
||||
frame = rx_frame;
|
||||
EXPECT_EQ("dtid=1023 tt=3 snid=127 idx=31 last=1 tid=15 payload=[00 01 02 03 04 05 06 07]", frame.toString());
|
||||
EXPECT_EQ("dtid=1023 tt=3 snid=127 dnid=126 idx=62 last=1 tid=7 payload=[00 01 02 03 04 05 06]", frame.toString());
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ TEST(TransferBufferManager, Basic)
|
||||
|
||||
// Empty
|
||||
ASSERT_FALSE(mgr->access(TransferBufferManagerKey(0, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST)));
|
||||
ASSERT_FALSE(mgr->access(TransferBufferManagerKey(uavcan::NODE_ID_MAX, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST)));
|
||||
ASSERT_FALSE(mgr->access(TransferBufferManagerKey(127, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST)));
|
||||
|
||||
TransferBufferBase* tbb = NULL;
|
||||
|
||||
|
||||
@@ -12,10 +12,11 @@ class Emulator
|
||||
const uavcan::DataTypeDescriptor type_;
|
||||
uint64_t ts_;
|
||||
uavcan::TransferID tid_;
|
||||
uint8_t target_node_id_;
|
||||
uavcan::NodeID target_node_id_;
|
||||
|
||||
public:
|
||||
Emulator(uavcan::TransferListenerBase& target, const uavcan::DataTypeDescriptor& type, uint8_t target_node_id = 127)
|
||||
Emulator(uavcan::TransferListenerBase& target, const uavcan::DataTypeDescriptor& type,
|
||||
uavcan::NodeID target_node_id = 127)
|
||||
: target_(target)
|
||||
, type_(type)
|
||||
, ts_(0)
|
||||
@@ -55,7 +56,11 @@ public:
|
||||
{
|
||||
std::vector<std::vector<uavcan::RxFrame> > sers;
|
||||
while (num_transfers--)
|
||||
sers.push_back(serializeTransfer(*transfers++, target_node_id_, type_));
|
||||
{
|
||||
const uavcan::NodeID dnid = (transfers->transfer_type == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST)
|
||||
? uavcan::NodeID::BROADCAST : target_node_id_;
|
||||
sers.push_back(serializeTransfer(*transfers++, dnid, type_));
|
||||
}
|
||||
send(sers);
|
||||
}
|
||||
|
||||
@@ -146,8 +151,9 @@ TEST(TransferListener, CrcFailure)
|
||||
ASSERT_TRUE(ser_mft.size() > 1);
|
||||
ASSERT_TRUE(ser_sft.size() == 1);
|
||||
|
||||
ser_mft[1].payload[0] = ~ser_mft[1].payload[0]; // CRC is no longer valid
|
||||
ser_sft[0].payload[2] = ~ser_sft[0].payload[2]; // SFT has no CRC, so the corruption will be undetected
|
||||
// Fuck my brain.
|
||||
const_cast<uint8_t*>(ser_mft[1].getPayloadPtr())[1] = ~ser_mft[1].getPayloadPtr()[1];// CRC is no longer valid
|
||||
const_cast<uint8_t*>(ser_sft[0].getPayloadPtr())[2] = ~ser_sft[0].getPayloadPtr()[2];// no CRC - will be undetected
|
||||
|
||||
/*
|
||||
* Sending and making sure that MFT was not received, but SFT was.
|
||||
@@ -161,7 +167,7 @@ TEST(TransferListener, CrcFailure)
|
||||
emulator.send(sers);
|
||||
|
||||
Transfer tr_sft_damaged = tr_sft;
|
||||
tr_sft_damaged.payload[1] = ~tr_sft.payload[1]; // Damaging the data similarly, so that it can be matched
|
||||
tr_sft_damaged.payload[2] = ~tr_sft.payload[2]; // Damaging the data similarly, so that it can be matched
|
||||
|
||||
ASSERT_TRUE(subscriber.matchAndPop(tr_sft_damaged));
|
||||
ASSERT_TRUE(subscriber.isEmpty());
|
||||
@@ -185,7 +191,6 @@ TEST(TransferListener, BasicSFT)
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, ""),
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_SERVICE_REQUEST, 3, "abc"),
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 4, ""),
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 5, ""), // New NID, ignored due to OOM
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 2, ""), // New TT, ignored due to OOM
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, "foo"), // Same as 2, not ignored
|
||||
emulator.makeTransfer(uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, "123456789abc"),// Same as 2, not SFT - ignore
|
||||
@@ -199,8 +204,8 @@ TEST(TransferListener, BasicSFT)
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[2]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[3]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[4]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[7]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[9]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[6]));
|
||||
ASSERT_TRUE(subscriber.matchAndPop(transfers[8]));
|
||||
|
||||
ASSERT_TRUE(subscriber.isEmpty());
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
struct RxFrameGenerator
|
||||
{
|
||||
static const uavcan::TransferBufferManagerKey DEFAULT_KEY;
|
||||
enum { TARGET_NODE_ID = 126 };
|
||||
|
||||
uint16_t data_type_id;
|
||||
uavcan::TransferBufferManagerKey bufmgr_key;
|
||||
@@ -27,28 +28,16 @@ struct RxFrameGenerator
|
||||
uavcan::RxFrame operator()(int iface_index, const std::string& data, uint8_t frame_index, bool last,
|
||||
uint8_t transfer_id, uint64_t ts_monotonic, uint64_t ts_utc = 0)
|
||||
{
|
||||
if (data.length() > uavcan::Frame::PAYLOAD_LEN_MAX)
|
||||
{
|
||||
std::cerr << "RxFrameGenerator(): Data is too long" << std::endl;
|
||||
std::exit(1);
|
||||
}
|
||||
const uavcan::NodeID dst_nid =
|
||||
(bufmgr_key.getTransferType() == uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST) ?
|
||||
uavcan::NodeID::BROADCAST : TARGET_NODE_ID;
|
||||
|
||||
uavcan::RxFrame frm;
|
||||
uavcan::Frame frame(data_type_id, bufmgr_key.getTransferType(), bufmgr_key.getNodeID(),
|
||||
dst_nid, frame_index, transfer_id, last);
|
||||
|
||||
frm.iface_index = iface_index;
|
||||
frm.ts_monotonic = ts_monotonic;
|
||||
frm.ts_utc = ts_utc;
|
||||
EXPECT_EQ(data.length(), frame.setPayload(reinterpret_cast<const uint8_t*>(data.c_str()), data.length()));
|
||||
|
||||
frm.data_type_id = data_type_id;
|
||||
frm.frame_index = frame_index;
|
||||
frm.last_frame = last;
|
||||
std::copy(data.begin(), data.end(), frm.payload);
|
||||
frm.payload_len = data.length();
|
||||
frm.source_node_id = bufmgr_key.getNodeID();
|
||||
frm.transfer_id = uavcan::TransferID(transfer_id);
|
||||
frm.transfer_type = bufmgr_key.getTransferType();
|
||||
|
||||
return frm;
|
||||
return uavcan::RxFrame(frame, ts_monotonic, ts_utc, iface_index);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -171,37 +160,37 @@ TEST(TransferReceiver, Basic)
|
||||
ASSERT_EQ(2500, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "", 0, true, 0, 3000), bk)); // Old TID
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "", 0, true, 15,3100), bk)); // Old TID
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "", 0, true, 1, 3100), bk)); // Old TID
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "", 0, true, 3, 3200), bk)); // Old TID
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "", 0, true, 0, 3300), bk)); // Old TID, wrong iface
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "", 0, true, 15,3400), bk)); // Old TID, wrong iface
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "", 0, true, 2, 3400), bk)); // Old TID, wrong iface
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "", 0, true, 3, 3500), bk)); // Old TID, wrong iface
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "", 0, true, 8, 3600), bk));
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "", 0, true, 4, 3600), bk));
|
||||
ASSERT_EQ(3600, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
/*
|
||||
* Timeouts
|
||||
*/
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwe", 0, true, 9, 100000), bk)); // Wrong iface - ignored
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(1, "qwe", 0, true, 10, 600000), bk)); // Accepted due to iface timeout
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwe", 0, true, 1, 100000), bk)); // Wrong iface - ignored
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(1, "qwe", 0, true, 6, 600000), bk)); // Accepted due to iface timeout
|
||||
ASSERT_EQ(600000, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "qwe", 0, true, 11, 600100), bk));// Ignored - old iface 0
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(1, "qwe", 0, true, 11, 600100), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "qwe", 0, true, 7, 600100), bk));// Ignored - old iface 0
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(1, "qwe", 0, true, 7, 600100), bk));
|
||||
ASSERT_EQ(600100, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwe", 0, true, 11, 600100), bk));// Old TID
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "qwe", 0, true, 11, 100000000), bk));// Accepted - global timeout
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwe", 0, true, 7, 600100), bk)); // Old TID
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "qwe", 0, true, 7, 100000000), bk));// Accepted - global timeout
|
||||
ASSERT_EQ(100000000, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "qwe", 0, true, 12, 100000100), bk));
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(gen(0, "qwe", 0, true, 0, 100000100), bk));
|
||||
ASSERT_EQ(100000100, rcv.getLastTransferTimestampMonotonic());
|
||||
|
||||
ASSERT_TRUE(rcv.isTimedOut(900000000));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "\x78\x56" "345678", 0, false, 11, 900000000), bk));// Global timeout
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "12345678", 0, false, 11, 900000100), bk));// Wrong iface
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "qwe", 1, true, 11, 900000200), bk));// Wrong iface
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "qwe", 1, true, 11, 900000200), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "\x78\x56" "345678", 0, false, 0, 900000000), bk));// Global timeout
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "12345678", 0, false, 0, 900000100), bk));// Wrong iface
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "qwe", 1, true, 0, 900000200), bk));// Wrong iface
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "qwe", 1, true, 0, 900000200), bk));
|
||||
ASSERT_EQ(900000000, rcv.getLastTransferTimestampMonotonic());
|
||||
ASSERT_FALSE(rcv.isTimedOut(1000));
|
||||
ASSERT_FALSE(rcv.isTimedOut(900000200));
|
||||
@@ -232,11 +221,11 @@ TEST(TransferReceiver, OutOfBufferSpace_32bytes)
|
||||
/*
|
||||
* Simple transfer, maximum buffer length
|
||||
*/
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 10, 100000000), bk)); // 6
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 10, 100000100), bk)); // 14
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 2, false, 10, 100000200), bk)); // 22
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 3, false, 10, 100000300), bk)); // 30
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "12", 4, true, 10, 100000400), bk)); // 32
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 1, 100000000), bk)); // 6
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 1, 100000100), bk)); // 14
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 2, false, 1, 100000200), bk)); // 22
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 3, false, 1, 100000300), bk)); // 30
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "12", 4, true, 1, 100000400), bk)); // 32
|
||||
|
||||
ASSERT_EQ(100000000, rcv.getLastTransferTimestampMonotonic());
|
||||
ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.bufmgr_key), "34567812345678123456781234567812"));
|
||||
@@ -245,11 +234,11 @@ TEST(TransferReceiver, OutOfBufferSpace_32bytes)
|
||||
/*
|
||||
* Transfer longer than available buffer space
|
||||
*/
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 11, 100001000), bk)); // 6
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 11, 100001100), bk)); // 14
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 2, false, 11, 100001200), bk)); // 22
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 3, false, 11, 100001200), bk)); // 30
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 4, true, 11, 100001300), bk)); // 38 // EOT, ignored - lost sync
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 2, 100001000), bk)); // 6
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 2, 100001100), bk)); // 14
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 2, false, 2, 100001200), bk)); // 22
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 3, false, 2, 100001200), bk)); // 30
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 4, true, 2, 100001300), bk)); // 38 // EOT, ignored - lost sync
|
||||
|
||||
ASSERT_EQ(100000000, rcv.getLastTransferTimestampMonotonic()); // Timestamp will not be overriden
|
||||
ASSERT_FALSE(bufmgr.access(gen.bufmgr_key)); // Buffer should be removed
|
||||
@@ -258,7 +247,7 @@ TEST(TransferReceiver, OutOfBufferSpace_32bytes)
|
||||
|
||||
TEST(TransferReceiver, UnterminatedTransfer)
|
||||
{
|
||||
Context<256> context;
|
||||
Context<512> context;
|
||||
RxFrameGenerator gen(789, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferReceiver& rcv = context.receiver;
|
||||
uavcan::ITransferBufferManager& bufmgr = context.bufmgr;
|
||||
@@ -285,12 +274,12 @@ TEST(TransferReceiver, OutOfOrderFrames)
|
||||
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
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 2, true, 10, 100000200), bk)); // Out of order
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwertyui", 1, false, 10, 100000300), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 4, true, 10, 100000200), bk)); // Out of order
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "abcd", 2, true, 10, 100000400), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 7, 100000000), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 3, false, 7, 100000100), bk)); // Out of order
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 2, true, 7, 100000200), bk)); // Out of order
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "qwertyui", 1, false, 7, 100000300), bk));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "--------", 4, true, 7, 100000200), bk)); // Out of order
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "abcd", 2, true, 7, 100000400), bk));
|
||||
|
||||
ASSERT_EQ(100000000, rcv.getLastTransferTimestampMonotonic());
|
||||
ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.bufmgr_key), "345678qwertyuiabcd"));
|
||||
@@ -347,8 +336,8 @@ TEST(TransferReceiver, Restart)
|
||||
* Begins immediately after, gets an iface timeout but completes OK
|
||||
*/
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 0, false, 0, 10000300), bk));// Begin
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 0, 13000300), bk));// 3 sec later, iface timeout
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "12345678", 2, true, 0, 13000400), bk));// OK nevertheless
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(1, "12345678", 1, false, 0, 12000300), bk));// 2 sec later, iface timeout
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(1, "12345678", 2, true, 0, 12000400), bk));// OK nevertheless
|
||||
|
||||
ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.bufmgr_key), "3456781234567812345678"));
|
||||
ASSERT_EQ(0x3231, rcv.getLastTransferCrc());
|
||||
@@ -465,11 +454,11 @@ TEST(TransferReceiver, HeaderParsing)
|
||||
|
||||
const uint64_t ts_monotonic = i + 10;
|
||||
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "12345678", 0, false, tid.get(), ts_monotonic), bk2));
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(0, "abcd", 1, true, tid.get(), ts_monotonic), bk2));
|
||||
CHECK_NOT_COMPLETE(rcv.addFrame(gen(0, "1234567", 0, false, tid.get(), ts_monotonic), bk2));
|
||||
CHECK_COMPLETE( rcv.addFrame(gen(0, "abcd", 1, true, tid.get(), ts_monotonic), bk2));
|
||||
|
||||
ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.bufmgr_key), "45678abcd"));
|
||||
ASSERT_EQ(0x3332, rcv.getLastTransferCrc()); // Second and third bytes
|
||||
ASSERT_TRUE(matchBufferContent(bufmgr.access(gen.bufmgr_key), "34567abcd"));
|
||||
ASSERT_EQ(0x3231, rcv.getLastTransferCrc());
|
||||
|
||||
tid.increment();
|
||||
bk2.remove();
|
||||
@@ -478,24 +467,21 @@ TEST(TransferReceiver, HeaderParsing)
|
||||
/*
|
||||
* SFT, message broadcasting
|
||||
*/
|
||||
static const std::string SFT_PAYLOAD = "12345678";
|
||||
static const std::string SFT_PAYLOAD_BROADCAST = "12345678";
|
||||
static const std::string SFT_PAYLOAD_UNICAST = "1234567";
|
||||
|
||||
{
|
||||
gen.bufmgr_key =
|
||||
uavcan::TransferBufferManagerKey(gen.bufmgr_key.getNodeID(), uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST);
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, gen.bufmgr_key);
|
||||
|
||||
const uavcan::RxFrame frame = gen(0, SFT_PAYLOAD, 0, true, tid.get(), 1000);
|
||||
const uavcan::RxFrame frame = gen(0, SFT_PAYLOAD_BROADCAST, 0, true, tid.get(), 1000);
|
||||
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(frame, bk));
|
||||
ASSERT_EQ(0x0000, rcv.getLastTransferCrc()); // Default value - zero
|
||||
|
||||
uint8_t payload[uavcan::Frame::PAYLOAD_LEN_MAX];
|
||||
unsigned int payload_len = 0xFFFF;
|
||||
ASSERT_TRUE(uavcan::TransferReceiver::extractSingleFrameTransferPayload(frame, payload, payload_len));
|
||||
|
||||
// All bytes are payload, zero overhead
|
||||
ASSERT_TRUE(std::equal(SFT_PAYLOAD.begin(), SFT_PAYLOAD.end(), payload));
|
||||
ASSERT_TRUE(std::equal(SFT_PAYLOAD_BROADCAST.begin(), SFT_PAYLOAD_BROADCAST.end(), frame.getPayloadPtr()));
|
||||
|
||||
tid.increment();
|
||||
}
|
||||
@@ -509,17 +495,13 @@ TEST(TransferReceiver, HeaderParsing)
|
||||
uavcan::TransferBufferManagerKey(gen.bufmgr_key.getNodeID(), ADDRESSED_TRANSFER_TYPES[i]);
|
||||
uavcan::TransferBufferAccessor bk(&context.bufmgr, gen.bufmgr_key);
|
||||
|
||||
const uavcan::RxFrame frame = gen(0, SFT_PAYLOAD, 0, true, tid.get(), i + 10000);
|
||||
const uavcan::RxFrame frame = gen(0, SFT_PAYLOAD_UNICAST, 0, true, tid.get(), i + 10000);
|
||||
|
||||
CHECK_SINGLE_FRAME(rcv.addFrame(frame, bk));
|
||||
ASSERT_EQ(0x0000, rcv.getLastTransferCrc()); // Default value - zero
|
||||
|
||||
uint8_t payload[uavcan::Frame::PAYLOAD_LEN_MAX];
|
||||
unsigned int payload_len = 0xFFFF;
|
||||
ASSERT_TRUE(uavcan::TransferReceiver::extractSingleFrameTransferPayload(frame, payload, payload_len));
|
||||
|
||||
// First byte must be ignored
|
||||
ASSERT_TRUE(std::equal(SFT_PAYLOAD.begin() + 1, SFT_PAYLOAD.end(), payload));
|
||||
ASSERT_TRUE(std::equal(SFT_PAYLOAD_UNICAST.begin(), SFT_PAYLOAD_UNICAST.end(), frame.getPayloadPtr()));
|
||||
|
||||
tid.increment();
|
||||
}
|
||||
|
||||
@@ -15,8 +15,7 @@ TEST(TransferTestHelpers, Transfer)
|
||||
uavcan::TransferBufferManager<128, 1> mgr(&poolmgr);
|
||||
uavcan::TransferBufferAccessor tba(&mgr, uavcan::TransferBufferManagerKey(0, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST));
|
||||
|
||||
uavcan::RxFrame frame;
|
||||
frame.last_frame = true;
|
||||
uavcan::RxFrame frame(uavcan::Frame(123, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 1, 0, 0, 0, true), 0, 0, 0);
|
||||
uavcan::MultiFrameIncomingTransfer mfit(10, 1000, frame, tba);
|
||||
|
||||
// Filling the buffer with data
|
||||
@@ -38,7 +37,7 @@ TEST(TransferTestHelpers, MFTSerialization)
|
||||
type.hash.value[i] = i;
|
||||
|
||||
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::TRANSFER_TYPE_MESSAGE_UNICAST, 12, 42, DATA);
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_UNICAST, 2, 42, DATA);
|
||||
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 127, type);
|
||||
|
||||
@@ -49,9 +48,9 @@ TEST(TransferTestHelpers, MFTSerialization)
|
||||
for (std::vector<uavcan::RxFrame>::const_iterator it = ser.begin(); it != ser.end(); ++it)
|
||||
{
|
||||
std::cout << "\t'";
|
||||
for (int i = 0; i < it->payload_len; i++)
|
||||
for (int i = 0; i < it->getPayloadLen(); i++)
|
||||
{
|
||||
uint8_t ch = it->payload[i];
|
||||
uint8_t ch = it->getPayloadPtr()[i];
|
||||
if (ch < 0x20 || ch > 0x7E)
|
||||
ch = '.';
|
||||
std::cout << static_cast<char>(ch);
|
||||
@@ -69,25 +68,25 @@ TEST(TransferTestHelpers, SFTSerialization)
|
||||
type.hash.value[i] = i;
|
||||
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 12, 42, "Nvrfrget");
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, "Nvrfrget");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 0, type);
|
||||
ASSERT_EQ(1, ser.size());
|
||||
std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n";
|
||||
}
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_REQUEST, 7, 42, "7-chars");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 127, type);
|
||||
ASSERT_EQ(1, ser.size());
|
||||
std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n";
|
||||
}
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_REQUEST, 12, 42, "7-chars");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 127, type);
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 7, 42, "");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 0, type);
|
||||
ASSERT_EQ(1, ser.size());
|
||||
std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n";
|
||||
}
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST, 12, 42, "");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 127, type);
|
||||
ASSERT_EQ(1, ser.size());
|
||||
std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n";
|
||||
}
|
||||
{
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 12, 42, "");
|
||||
const Transfer transfer(1, 100000, uavcan::TRANSFER_TYPE_SERVICE_RESPONSE, 7, 42, "");
|
||||
const std::vector<uavcan::RxFrame> ser = serializeTransfer(transfer, 127, type);
|
||||
ASSERT_EQ(1, ser.size());
|
||||
std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n";
|
||||
|
||||
@@ -17,7 +17,7 @@ struct Transfer
|
||||
uint64_t ts_utc;
|
||||
uavcan::TransferType transfer_type;
|
||||
uavcan::TransferID transfer_id;
|
||||
uint8_t source_node_id;
|
||||
uavcan::NodeID source_node_id;
|
||||
std::string payload;
|
||||
|
||||
Transfer(const uavcan::IncomingTransfer& tr)
|
||||
@@ -25,7 +25,7 @@ struct Transfer
|
||||
, ts_utc(tr.getUtcTimestamp())
|
||||
, transfer_type(tr.getTransferType())
|
||||
, transfer_id(tr.getTransferID())
|
||||
, source_node_id(tr.getSourceNodeID())
|
||||
, source_node_id(tr.getSrcNodeID())
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
while (true)
|
||||
@@ -45,7 +45,7 @@ struct Transfer
|
||||
}
|
||||
|
||||
Transfer(uint64_t ts_monotonic, uint64_t ts_utc, uavcan::TransferType transfer_type,
|
||||
uavcan::TransferID transfer_id, uint8_t source_node_id, const std::string& payload)
|
||||
uavcan::TransferID transfer_id, uavcan::NodeID source_node_id, const std::string& payload)
|
||||
: ts_monotonic(ts_monotonic)
|
||||
, ts_utc(ts_utc)
|
||||
, transfer_type(transfer_type)
|
||||
@@ -72,7 +72,7 @@ struct Transfer
|
||||
<< " ts_utc=" << ts_utc
|
||||
<< " tt=" << transfer_type
|
||||
<< " tid=" << int(transfer_id.get())
|
||||
<< " snid=" << int(source_node_id)
|
||||
<< " snid=" << int(source_node_id.get())
|
||||
<< "\n\t'" << payload << "'";
|
||||
return os.str();
|
||||
}
|
||||
@@ -131,38 +131,34 @@ public:
|
||||
namespace
|
||||
{
|
||||
|
||||
std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer, uint8_t target_node_id,
|
||||
std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer, uavcan::NodeID dst_node_id,
|
||||
const uavcan::DataTypeDescriptor& type)
|
||||
{
|
||||
uavcan::Crc16 payload_crc(type.hash.value, uavcan::DataTypeHash::NUM_BYTES);
|
||||
payload_crc.add(reinterpret_cast<const uint8_t*>(transfer.payload.c_str()), transfer.payload.length());
|
||||
|
||||
std::vector<uint8_t> raw_payload;
|
||||
bool need_crc = false;
|
||||
|
||||
switch (transfer.transfer_type)
|
||||
{
|
||||
case uavcan::TRANSFER_TYPE_MESSAGE_BROADCAST:
|
||||
need_crc = transfer.payload.length() > uavcan::Frame::PAYLOAD_LEN_MAX;
|
||||
need_crc = transfer.payload.length() > sizeof(uavcan::CanFrame::data);
|
||||
break;
|
||||
case uavcan::TRANSFER_TYPE_SERVICE_RESPONSE:
|
||||
case uavcan::TRANSFER_TYPE_SERVICE_REQUEST:
|
||||
case uavcan::TRANSFER_TYPE_MESSAGE_UNICAST:
|
||||
need_crc = transfer.payload.length() > (uavcan::Frame::PAYLOAD_LEN_MAX - 1);
|
||||
raw_payload.push_back(target_node_id);
|
||||
need_crc = transfer.payload.length() > (sizeof(uavcan::CanFrame::data) - 1);
|
||||
break;
|
||||
default:
|
||||
std::cerr << "X_X" << std::endl;
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> raw_payload;
|
||||
if (need_crc)
|
||||
{
|
||||
uavcan::Crc16 payload_crc(type.hash.value, uavcan::DataTypeHash::NUM_BYTES);
|
||||
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);
|
||||
raw_payload.push_back((payload_crc.get() >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
raw_payload.insert(raw_payload.end(), transfer.payload.begin(), transfer.payload.end());
|
||||
|
||||
std::vector<uavcan::RxFrame> output;
|
||||
@@ -173,34 +169,30 @@ std::vector<uavcan::RxFrame> serializeTransfer(const Transfer& transfer, uint8_t
|
||||
|
||||
while (true)
|
||||
{
|
||||
int bytes_left = raw_payload.size() - offset;
|
||||
const int bytes_left = raw_payload.size() - offset;
|
||||
EXPECT_TRUE(bytes_left >= 0);
|
||||
if (bytes_left <= 0 && !raw_payload.empty())
|
||||
break;
|
||||
|
||||
uavcan::RxFrame frm;
|
||||
uavcan::Frame frm(type.id, transfer.transfer_type, transfer.source_node_id, dst_node_id, frame_index,
|
||||
transfer.transfer_id);
|
||||
const int spres = frm.setPayload(&*(raw_payload.begin() + offset), bytes_left);
|
||||
if (spres < 0)
|
||||
{
|
||||
std::cerr << ">_<" << std::endl;
|
||||
std::exit(1);
|
||||
}
|
||||
if (spres == bytes_left)
|
||||
frm.makeLast();
|
||||
|
||||
frm.data_type_id = type.id;
|
||||
frm.frame_index = frame_index++;
|
||||
offset += spres;
|
||||
frame_index++;
|
||||
EXPECT_TRUE(uavcan::Frame::FRAME_INDEX_MAX >= frame_index);
|
||||
|
||||
frm.iface_index = 0;
|
||||
frm.last_frame = bytes_left <= uavcan::Frame::PAYLOAD_LEN_MAX;
|
||||
frm.payload_len = std::min(int(uavcan::Frame::PAYLOAD_LEN_MAX), bytes_left);
|
||||
std::copy(raw_payload.begin() + offset, raw_payload.begin() + offset + frm.payload_len, frm.payload);
|
||||
offset += frm.payload_len;
|
||||
|
||||
frm.source_node_id = transfer.source_node_id;
|
||||
frm.transfer_id = transfer.transfer_id;
|
||||
frm.transfer_type = transfer.transfer_type;
|
||||
|
||||
frm.ts_monotonic = ts_monotonic;
|
||||
frm.ts_utc = ts_utc;
|
||||
const uavcan::RxFrame rxfrm(frm, ts_monotonic, ts_utc, 0);
|
||||
ts_monotonic += 1;
|
||||
ts_utc += 1;
|
||||
|
||||
output.push_back(frm);
|
||||
if (raw_payload.empty())
|
||||
output.push_back(rxfrm);
|
||||
if (frm.isLastFrame())
|
||||
break;
|
||||
}
|
||||
return output;
|
||||
|
||||
Reference in New Issue
Block a user