diff --git a/libuavcan/test/transport/dispatcher.cpp b/libuavcan/test/transport/dispatcher.cpp index 1eb2cf4962..95bc5c359b 100644 --- a/libuavcan/test/transport/dispatcher.cpp +++ b/libuavcan/test/transport/dispatcher.cpp @@ -100,16 +100,16 @@ TEST(Dispatcher, Reception) const Transfer transfers[9] = { - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 10, DATA[0], TYPES[0]), - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 11, DATA[1], TYPES[1]), - emulator.makeTransfer(uavcan::TransferTypeServiceRequest, 12, DATA[2], TYPES[2]), - emulator.makeTransfer(uavcan::TransferTypeServiceResponse, 13, DATA[4], TYPES[3]), - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 14, DATA[3], TYPES[0]), - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 15, DATA[5], TYPES[1]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 10, DATA[0], TYPES[0]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 11, DATA[1], TYPES[1]), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceRequest, 12, DATA[2], TYPES[2]), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceResponse, 13, DATA[4], TYPES[3]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 14, DATA[3], TYPES[0]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 15, DATA[5], TYPES[1]), // Wrongly addressed: - emulator.makeTransfer(uavcan::TransferTypeServiceResponse, 10, DATA[0], TYPES[3], 100), - emulator.makeTransfer(uavcan::TransferTypeServiceRequest, 11, DATA[4], TYPES[2], 101), - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 12, DATA[2], TYPES[1], 102) + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceResponse, 10, DATA[0], TYPES[3], 100), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceRequest, 11, DATA[4], TYPES[2], 101), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 12, DATA[2], TYPES[1], 102) }; /* diff --git a/libuavcan/test/transport/transfer_listener.cpp b/libuavcan/test/transport/transfer_listener.cpp index 42e9facb28..59d20e3374 100644 --- a/libuavcan/test/transport/transfer_listener.cpp +++ b/libuavcan/test/transport/transfer_listener.cpp @@ -22,9 +22,10 @@ public: void sendOneFrame(const uavcan::RxFrame& frame) { target_.handleFrame(frame); } - Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload) + Transfer makeTransfer(uavcan::TransferPriority priority, uavcan::TransferType transfer_type, + uint8_t source_node_id, const std::string& payload) { - return IncomingTransferEmulatorBase::makeTransfer(transfer_type, source_node_id, payload, data_type_); + return IncomingTransferEmulatorBase::makeTransfer(priority, transfer_type, source_node_id, payload, data_type_); } }; @@ -69,11 +70,11 @@ TEST(TransferListener, BasicMFT) TransferListenerEmulator emulator(subscriber, type); const Transfer transfers[] = { - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 1, DATA[0]), - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 1, DATA[1]), // Same NID - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, DATA[2]), - emulator.makeTransfer(uavcan::TransferTypeServiceRequest, 3, DATA[3]), - emulator.makeTransfer(uavcan::TransferTypeServiceResponse, 4, DATA[4]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 1, DATA[0]), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 1, DATA[1]), // Same NID + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, DATA[2]), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceRequest, 3, DATA[3]), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceResponse, 4, DATA[4]), }; /* @@ -104,8 +105,8 @@ TEST(TransferListener, CrcFailure) * Generating transfers with damaged payload (CRC is not valid) */ TransferListenerEmulator emulator(subscriber, type); - const Transfer tr_mft = emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 42, "123456789abcdefghik"); - const Transfer tr_sft = emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 11, "abcd"); + const Transfer tr_mft = emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 42, "123456789abcdefghik"); + const Transfer tr_sft = emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 11, "abcd"); std::vector ser_mft = serializeTransfer(tr_mft); std::vector ser_sft = serializeTransfer(tr_sft); @@ -146,15 +147,15 @@ TEST(TransferListener, BasicSFT) TransferListenerEmulator emulator(subscriber, type); const Transfer transfers[] = { - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 1, "123"), - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 1, "456"), // Same NID - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, ""), - emulator.makeTransfer(uavcan::TransferTypeServiceRequest, 3, "abc"), - emulator.makeTransfer(uavcan::TransferTypeServiceResponse, 4, ""), - emulator.makeTransfer(uavcan::TransferTypeServiceResponse, 2, ""), // New TT, ignored due to OOM - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, "foo"), // Same as 2, not ignored - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, "123456789abc"), // Same as 2, not SFT - ignore - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, "bar"), // Same as 2, not ignored + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 1, "123"), + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 1, "456"), // Same NID + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, ""), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceRequest, 3, "abc"), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceResponse, 4, ""), + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceResponse, 2, ""), // New TT, ignored due to OOM + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, "foo"), // Same as 2, not ignored + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, "123456789abc"), // Same as 2, not SFT - ignore + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, "bar"), // Same as 2, not ignored }; emulator.send(transfers); @@ -183,8 +184,8 @@ TEST(TransferListener, Cleanup) * Generating transfers */ TransferListenerEmulator emulator(subscriber, type); - const Transfer tr_mft = emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 42, "123456789abcdefghik"); - const Transfer tr_sft = emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 11, "abcd"); + const Transfer tr_mft = emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 42, "123456789abcdefghik"); + const Transfer tr_sft = emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 11, "abcd"); const std::vector ser_mft = serializeTransfer(tr_mft); const std::vector ser_sft = serializeTransfer(tr_sft); @@ -237,11 +238,11 @@ TEST(TransferListener, MaximumTransferLength) TransferListenerEmulator emulator(subscriber, type); const Transfer transfers[] = { - emulator.makeTransfer(uavcan::TransferTypeServiceRequest, 1, + emulator.makeTransfer(uavcan::TransferPriorityService, uavcan::TransferTypeServiceRequest, 1, std::string(uavcan::MaxServiceTransferPayloadLen, 'z')), // Longer - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 2, + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 2, std::string(uavcan::MaxMessageUnicastTransferPayloadLen, 'z')), // Shorter - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 3, + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 3, std::string(uavcan::MaxMessageBroadcastTransferPayloadLen, 'z')) // Same as above }; @@ -266,10 +267,10 @@ TEST(TransferListener, AnonymousTransfers) TransferListenerEmulator emulator(subscriber, type); const Transfer transfers[] = { - emulator.makeTransfer(uavcan::TransferTypeMessageUnicast, 0, "12345678"), // Invalid - not broadcast - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "12345678"), // Valid - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "123456789"), // Invalid - not SFT - emulator.makeTransfer(uavcan::TransferTypeMessageBroadcast, 0, "") // Valid + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageUnicast, 0, "12345678"), // Invalid - not broadcast + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 0, "12345678"), // Valid + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 0, "123456789"), // Invalid - not SFT + emulator.makeTransfer(uavcan::TransferPriorityNormal, uavcan::TransferTypeMessageBroadcast, 0, "") // Valid }; emulator.send(transfers); diff --git a/libuavcan/test/transport/transfer_sender.cpp b/libuavcan/test/transport/transfer_sender.cpp index 1fe2e22dbc..5073824658 100644 --- a/libuavcan/test/transport/transfer_sender.cpp +++ b/libuavcan/test/transport/transfer_sender.cpp @@ -8,7 +8,6 @@ #include "can/can.hpp" #include - static int sendOne(uavcan::TransferSender& sender, const std::string& data, uint64_t monotonic_tx_deadline, uint64_t monotonic_blocking_deadline, uavcan::TransferType transfer_type, uavcan::NodeID dst_node_id) @@ -75,8 +74,13 @@ TEST(TransferSender, Basic) */ static const uint64_t TX_DEADLINE = 1000000; + // Normal priority sendOne(senders[0], DATA[0], TX_DEADLINE, 0, uavcan::TransferTypeMessageBroadcast, 0); + // Low priority + senders[0].setPriority(uavcan::TransferPriorityLow); sendOne(senders[0], DATA[1], TX_DEADLINE, 0, uavcan::TransferTypeMessageUnicast, RX_NODE_ID); + // High priority + senders[0].setPriority(uavcan::TransferPriorityHigh); sendOne(senders[0], "123", TX_DEADLINE, 0, uavcan::TransferTypeMessageBroadcast, 0); sendOne(senders[0], "456", TX_DEADLINE, 0, uavcan::TransferTypeMessageUnicast, RX_NODE_ID); @@ -85,17 +89,18 @@ TEST(TransferSender, Basic) sendOne(senders[1], "", TX_DEADLINE, 0, uavcan::TransferTypeServiceRequest, RX_NODE_ID); sendOne(senders[1], "", TX_DEADLINE, 0, uavcan::TransferTypeServiceResponse, RX_NODE_ID, 2); + using namespace uavcan; static const Transfer TRANSFERS[8] = { - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeMessageBroadcast, 0, TX_NODE_ID, 0, DATA[0], TYPES[0]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeMessageUnicast, 0, TX_NODE_ID, RX_NODE_ID, DATA[1], TYPES[0]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeMessageBroadcast, 1, TX_NODE_ID, 0, "123", TYPES[0]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeMessageUnicast, 1, TX_NODE_ID, RX_NODE_ID, "456", TYPES[0]), + Transfer(TX_DEADLINE, 0, TransferPriorityNormal, TransferTypeMessageBroadcast, 0, TX_NODE_ID, 0, DATA[0], TYPES[0]), + Transfer(TX_DEADLINE, 0, TransferPriorityLow, TransferTypeMessageUnicast, 0, TX_NODE_ID, RX_NODE_ID, DATA[1], TYPES[0]), + Transfer(TX_DEADLINE, 0, TransferPriorityHigh, TransferTypeMessageBroadcast, 1, TX_NODE_ID, 0, "123", TYPES[0]), + Transfer(TX_DEADLINE, 0, TransferPriorityHigh, TransferTypeMessageUnicast, 1, TX_NODE_ID, RX_NODE_ID, "456", TYPES[0]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeServiceRequest, 0, TX_NODE_ID, RX_NODE_ID, DATA[2], TYPES[1]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeServiceResponse, 1, TX_NODE_ID, RX_NODE_ID, DATA[3], TYPES[1]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeServiceRequest, 1, TX_NODE_ID, RX_NODE_ID, "", TYPES[1]), - Transfer(TX_DEADLINE, 0, uavcan::TransferTypeServiceResponse, 2, TX_NODE_ID, RX_NODE_ID, "", TYPES[1]) + Transfer(TX_DEADLINE, 0, TransferPriorityService, TransferTypeServiceRequest, 0, TX_NODE_ID, RX_NODE_ID, DATA[2], TYPES[1]), + Transfer(TX_DEADLINE, 0, TransferPriorityService, TransferTypeServiceResponse, 1, TX_NODE_ID, RX_NODE_ID, DATA[3], TYPES[1]), + Transfer(TX_DEADLINE, 0, TransferPriorityService, TransferTypeServiceRequest, 1, TX_NODE_ID, RX_NODE_ID, "", TYPES[1]), + Transfer(TX_DEADLINE, 0, TransferPriorityService, TransferTypeServiceResponse, 2, TX_NODE_ID, RX_NODE_ID, "", TYPES[1]) }; /* diff --git a/libuavcan/test/transport/transfer_test_helpers.cpp b/libuavcan/test/transport/transfer_test_helpers.cpp index 97f4c1e655..49f6da6c3f 100644 --- a/libuavcan/test/transport/transfer_test_helpers.cpp +++ b/libuavcan/test/transport/transfer_test_helpers.cpp @@ -37,7 +37,8 @@ TEST(TransferTestHelpers, MFTSerialization) uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "Foo"); 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::TransferTypeMessageUnicast, 2, 42, 127, DATA, type); + const Transfer transfer(1, 100000, uavcan::TransferPriorityNormal, + uavcan::TransferTypeMessageUnicast, 2, 42, 127, DATA, type); const std::vector ser = serializeTransfer(transfer); @@ -70,25 +71,29 @@ TEST(TransferTestHelpers, SFTSerialization) uavcan::DataTypeDescriptor type(uavcan::DataTypeKindMessage, 123, uavcan::DataTypeSignature(123456789), "Foo"); { - const Transfer transfer(1, 100000, uavcan::TransferTypeMessageBroadcast, 7, 42, 0, "Nvrfrget", type); + const Transfer transfer(1, 100000, uavcan::TransferPriorityNormal, + uavcan::TransferTypeMessageBroadcast, 7, 42, 0, "Nvrfrget", type); const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TransferTypeServiceRequest, 7, 42, 127, "7-chars", type); + const Transfer transfer(1, 100000, uavcan::TransferPriorityService, + uavcan::TransferTypeServiceRequest, 7, 42, 127, "7-chars", type); const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TransferTypeMessageBroadcast, 7, 42, 0, "", type); + const Transfer transfer(1, 100000, uavcan::TransferPriorityNormal, + uavcan::TransferTypeMessageBroadcast, 7, 42, 0, "", type); const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; } { - const Transfer transfer(1, 100000, uavcan::TransferTypeServiceResponse, 7, 42, 127, "", type); + const Transfer transfer(1, 100000, uavcan::TransferPriorityService, + uavcan::TransferTypeServiceResponse, 7, 42, 127, "", type); const std::vector ser = serializeTransfer(transfer); ASSERT_EQ(1, ser.size()); std::cout << "Serialized transfer:\n\t" << ser[0].toString() << "\n"; diff --git a/libuavcan/test/transport/transfer_test_helpers.hpp b/libuavcan/test/transport/transfer_test_helpers.hpp index c5252da303..5a67bf31c2 100644 --- a/libuavcan/test/transport/transfer_test_helpers.hpp +++ b/libuavcan/test/transport/transfer_test_helpers.hpp @@ -17,6 +17,7 @@ struct Transfer { uavcan::MonotonicTime ts_monotonic; uavcan::UtcTime ts_utc; + uavcan::TransferPriority priority; uavcan::TransferType transfer_type; uavcan::TransferID transfer_id; uavcan::NodeID src_node_id; @@ -27,6 +28,7 @@ struct Transfer Transfer(const uavcan::IncomingTransfer& tr, const uavcan::DataTypeDescriptor& data_type) : ts_monotonic(tr.getMonotonicTimestamp()) , ts_utc(tr.getUtcTimestamp()) + , priority(tr.getPriority()) , transfer_type(tr.getTransferType()) , transfer_id(tr.getTransferID()) , src_node_id(tr.getSrcNodeID()) @@ -52,11 +54,12 @@ struct Transfer } } - Transfer(uavcan::MonotonicTime ts_monotonic, uavcan::UtcTime ts_utc, uavcan::TransferType transfer_type, - uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, uavcan::NodeID dst_node_id, - const std::string& payload, const uavcan::DataTypeDescriptor& data_type) + Transfer(uavcan::MonotonicTime ts_monotonic, uavcan::UtcTime ts_utc, uavcan::TransferPriority priority, + uavcan::TransferType transfer_type, uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, + uavcan::NodeID dst_node_id, const std::string& payload, const uavcan::DataTypeDescriptor& data_type) : ts_monotonic(ts_monotonic) , ts_utc(ts_utc) + , priority(priority) , transfer_type(transfer_type) , transfer_id(transfer_id) , src_node_id(src_node_id) @@ -65,11 +68,12 @@ struct Transfer , payload(payload) { } - Transfer(uint64_t ts_monotonic, uint64_t ts_utc, uavcan::TransferType transfer_type, - uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, uavcan::NodeID dst_node_id, - const std::string& payload, const uavcan::DataTypeDescriptor& data_type) + Transfer(uint64_t ts_monotonic, uint64_t ts_utc, uavcan::TransferPriority priority, + uavcan::TransferType transfer_type, uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, + uavcan::NodeID dst_node_id, const std::string& payload, const uavcan::DataTypeDescriptor& data_type) : ts_monotonic(uavcan::MonotonicTime::fromUSec(ts_monotonic)) , ts_utc(uavcan::UtcTime::fromUSec(ts_utc)) + , priority(priority) , transfer_type(transfer_type) , transfer_id(transfer_id) , src_node_id(src_node_id) @@ -83,6 +87,7 @@ struct Transfer return (ts_monotonic == rhs.ts_monotonic) && ((!ts_utc.isZero() && !rhs.ts_utc.isZero()) ? (ts_utc == rhs.ts_utc) : true) && + (priority == rhs.priority) && (transfer_type == rhs.transfer_type) && (transfer_id == rhs.transfer_id) && (src_node_id == rhs.src_node_id) && @@ -96,6 +101,7 @@ struct Transfer std::ostringstream os; os << "ts_m=" << ts_monotonic << " ts_utc=" << ts_utc + << " prio=" << priority << " tt=" << transfer_type << " tid=" << int(transfer_id.get()) << " snid=" << int(src_node_id.get()) @@ -264,8 +270,8 @@ public: virtual ~IncomingTransferEmulatorBase() { } - Transfer makeTransfer(uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string& payload, - const uavcan::DataTypeDescriptor& type, + Transfer makeTransfer(uavcan::TransferPriority priority, uavcan::TransferType transfer_type, + uint8_t source_node_id, const std::string& payload, const uavcan::DataTypeDescriptor& type, uavcan::NodeID dst_node_id_override = uavcan::NodeID()) { ts_ += uavcan::MonotonicDuration::fromUSec(100); @@ -273,7 +279,7 @@ public: const uavcan::NodeID dst_node_id = (transfer_type == uavcan::TransferTypeMessageBroadcast) ? uavcan::NodeID::Broadcast : (dst_node_id_override.isValid() ? dst_node_id_override : dst_node_id_); - const Transfer tr(ts_, utc, transfer_type, tid_, source_node_id, dst_node_id, payload, type); + const Transfer tr(ts_, utc, priority, transfer_type, tid_, source_node_id, dst_node_id, payload, type); tid_.increment(); return tr; }