libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers publisher.cpp Source File

publisher.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/node/publisher.hpp>
00007 #include <root_ns_a/MavlinkMessage.hpp>
00008 #include "../clock.hpp"
00009 #include "../transport/can/can.hpp"
00010 #include "test_node.hpp"
00011 
00012 
00013 TEST(Publisher, Basic)
00014 {
00015     SystemClockMock clock_mock(100);
00016     CanDriverMock can_driver(2, clock_mock);
00017     TestNode node(can_driver, clock_mock, 1);
00018 
00019     uavcan::Publisher<root_ns_a::MavlinkMessage> publisher(node);
00020 
00021     ASSERT_FALSE(publisher.getTransferSender().isInitialized());
00022 
00023     std::cout <<
00024         "sizeof(uavcan::Publisher<root_ns_a::MavlinkMessage>): " <<
00025         sizeof(uavcan::Publisher<root_ns_a::MavlinkMessage>) << std::endl;
00026 
00027     // Manual type registration - we can't rely on the GDTR state
00028     uavcan::GlobalDataTypeRegistry::instance().reset();
00029     uavcan::DefaultDataTypeRegistrator<root_ns_a::MavlinkMessage> _registrator;
00030 
00031     /*
00032      * Message layout:
00033      * uint8 seq
00034      * uint8 sysid
00035      * uint8 compid
00036      * uint8 msgid
00037      * uint8[<256] payload
00038      */
00039     root_ns_a::MavlinkMessage msg;
00040     msg.seq = 0x42;
00041     msg.sysid = 0x72;
00042     msg.compid = 0x08;
00043     msg.msgid = 0xa5;
00044     msg.payload = "Msg";
00045 
00046     const uint8_t expected_transfer_payload[] = {0x42, 0x72, 0x08, 0xa5, 'M', 's', 'g'};
00047     const uint64_t tx_timeout_usec = uint64_t(publisher.getDefaultTxTimeout().toUSec());
00048 
00049     /*
00050      * Broadcast
00051      */
00052     {
00053         ASSERT_LT(0, publisher.broadcast(msg));
00054 
00055         // uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
00056         // uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false
00057         uavcan::Frame expected_frame(root_ns_a::MavlinkMessage::DefaultDataTypeID, uavcan::TransferTypeMessageBroadcast,
00058                                      node.getNodeID(), uavcan::NodeID::Broadcast, 0);
00059         expected_frame.setPayload(expected_transfer_payload, 7);
00060         expected_frame.setStartOfTransfer(true);
00061         expected_frame.setEndOfTransfer(true);
00062 
00063         uavcan::CanFrame expected_can_frame;
00064         ASSERT_TRUE(expected_frame.compile(expected_can_frame));
00065 
00066         ASSERT_TRUE(can_driver.ifaces[0].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
00067         ASSERT_TRUE(can_driver.ifaces[1].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
00068         ASSERT_TRUE(can_driver.ifaces[0].tx.empty());
00069         ASSERT_TRUE(can_driver.ifaces[1].tx.empty());
00070 
00071         // Second shot - checking the transfer ID
00072         publisher.setPriority(10);
00073         ASSERT_LT(0, publisher.broadcast(msg));
00074 
00075         expected_frame = uavcan::Frame(root_ns_a::MavlinkMessage::DefaultDataTypeID,
00076                                        uavcan::TransferTypeMessageBroadcast,
00077                                        node.getNodeID(), uavcan::NodeID::Broadcast, 1);
00078         expected_frame.setStartOfTransfer(true);
00079         expected_frame.setEndOfTransfer(true);
00080         expected_frame.setPayload(expected_transfer_payload, 7);
00081         expected_frame.setPriority(10);
00082         ASSERT_TRUE(expected_frame.compile(expected_can_frame));
00083 
00084         ASSERT_TRUE(can_driver.ifaces[0].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
00085         ASSERT_TRUE(can_driver.ifaces[1].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
00086         ASSERT_TRUE(can_driver.ifaces[0].tx.empty());
00087         ASSERT_TRUE(can_driver.ifaces[1].tx.empty());
00088     }
00089 
00090     clock_mock.advance(1000);
00091 
00092     /*
00093      * Misc
00094      */
00095     ASSERT_TRUE(uavcan::GlobalDataTypeRegistry::instance().isFrozen());
00096     ASSERT_TRUE(publisher.getTransferSender().isInitialized());
00097 }