can_driver.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
6 #include "can.hpp"
7 #include <uavcan/driver/can.hpp>
8 
9 TEST(CanFrame, FrameProperties)
10 {
11  EXPECT_TRUE(makeCanFrame(0, "", EXT).isExtended());
12  EXPECT_FALSE(makeCanFrame(0, "", STD).isExtended());
13  EXPECT_FALSE(makeCanFrame(0, "", EXT).isRemoteTransmissionRequest());
14  EXPECT_FALSE(makeCanFrame(0, "", STD).isRemoteTransmissionRequest());
15 
18  EXPECT_TRUE(frame.isRemoteTransmissionRequest());
19  EXPECT_FALSE(frame.isErrorFrame());
21  EXPECT_TRUE(frame.isErrorFrame());
22 }
23 
24 TEST(CanFrame, Arbitration)
25 {
26  using uavcan::CanFrame;
27 
28  CanFrame a;
29  CanFrame b;
30 
31  /*
32  * Simple
33  */
34  a.id = 123;
35  b.id = 122;
36  ASSERT_TRUE(a.priorityLowerThan(b));
37  ASSERT_TRUE(b.priorityHigherThan(a));
38 
39  a.id = 123 | CanFrame::FlagEFF;
40  b.id = 122 | CanFrame::FlagEFF;
41  ASSERT_TRUE(a.priorityLowerThan(b));
42  ASSERT_TRUE(b.priorityHigherThan(a));
43 
44  a.id = 8;
45  b.id = 8;
46  ASSERT_FALSE(a.priorityLowerThan(b));
47  ASSERT_FALSE(b.priorityHigherThan(a));
48 
49  /*
50  * EXT vs STD
51  */
52  a.id = 1000; // 1000
53  b.id = 2000 | CanFrame::FlagEFF; // 2000 >> 18, wins
54  ASSERT_TRUE(a.priorityLowerThan(b));
55  ASSERT_TRUE(b.priorityHigherThan(a));
56 
57  a.id = 0x400;
58  b.id = 0x10000000 | CanFrame::FlagEFF; // (0x400 << 18), 11 most significant bits are the same --> EFF loses
59  ASSERT_TRUE(a.priorityHigherThan(b));
60  ASSERT_TRUE(b.priorityLowerThan(a));
61 
62  /*
63  * RTR vs Data
64  */
65  a.id = 123 | CanFrame::FlagRTR; // On the same ID, RTR loses
66  b.id = 123;
67  ASSERT_TRUE(a.priorityLowerThan(b));
68  ASSERT_TRUE(b.priorityHigherThan(a));
69 
70  a.id = CanFrame::MaskStdID | CanFrame::FlagRTR; // RTR is STD, so it wins
71  b.id = CanFrame::MaskExtID | CanFrame::FlagEFF; // Lowest possible priority for data frame
72  ASSERT_TRUE(a.priorityHigherThan(b));
73  ASSERT_TRUE(b.priorityLowerThan(a));
74 
75  a.id = 123 | CanFrame::FlagRTR; // Both RTR arbitrate as usually
76  b.id = 122 | CanFrame::FlagRTR;
77  ASSERT_TRUE(a.priorityLowerThan(b));
78  ASSERT_TRUE(b.priorityHigherThan(a));
79 }
80 
81 TEST(CanFrame, ToString)
82 {
83  uavcan::CanFrame frame = makeCanFrame(123, "\x01\x02\x03\x04" "1234", EXT);
84  EXPECT_EQ("0x0000007b 01 02 03 04 31 32 33 34 '....1234'", frame.toString());
85  EXPECT_TRUE(frame.toString() == frame.toString(uavcan::CanFrame::StrAligned));
86 
87  frame = makeCanFrame(123, "z", EXT);
88  EXPECT_EQ("0x0000007b 7a 'z'", frame.toString(uavcan::CanFrame::StrAligned));
89  EXPECT_EQ("0x0000007b 7a 'z'", frame.toString());
90 
91  EXPECT_EQ(" 0x141 61 62 63 64 aa bb cc dd 'abcd....'",
92  makeCanFrame(321, "abcd" "\xaa\xbb\xcc\xdd", STD).toString(uavcan::CanFrame::StrAligned));
93 
94  EXPECT_EQ(" 0x100 ''",
95  makeCanFrame(256, "", STD).toString(uavcan::CanFrame::StrAligned));
96 
97  EXPECT_EQ("0x100 ''",
98  makeCanFrame(256, "", STD).toString());
99 
100  EXPECT_EQ("0x141 61 62 63 64 aa bb cc dd 'abcd....'",
101  makeCanFrame(321, "abcd" "\xaa\xbb\xcc\xdd", STD).toString());
102 }
can.hpp
uavcan::CanFrame::FlagERR
static const uint32_t FlagERR
Error frame.
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:30
makeCanFrame
uavcan::CanFrame makeCanFrame(uint32_t id, const std::string &str_data, FrameType type)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:278
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
uavcan::CanFrame::id
uint32_t id
CAN ID with flags (above)
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:34
uavcan::CanFrame::isErrorFrame
bool isErrorFrame() const
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:72
toString
static std::string toString(long x)
Definition: multiset.cpp:16
uavcan::CanFrame::isRemoteTransmissionRequest
bool isRemoteTransmissionRequest() const
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:71
STD
@ STD
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:277
frame
uavcan::CanFrame frame
Definition: can.cpp:78
EXT
@ EXT
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:277
TEST
TEST(CanFrame, FrameProperties)
Definition: can_driver.cpp:9
uavcan::CanFrame::FlagRTR
static const uint32_t FlagRTR
Remote transmission request.
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:29


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02