libuav original
Dependents: UAVCAN UAVCAN_Subscriber
can_driver.cpp
00001 /* 00002 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com> 00003 */ 00004 00005 #include <gtest/gtest.h> 00006 #include "can.hpp" 00007 #include <uavcan/driver/can.hpp> 00008 00009 TEST(CanFrame, FrameProperties) 00010 { 00011 EXPECT_TRUE(makeCanFrame(0, "", EXT).isExtended()); 00012 EXPECT_FALSE(makeCanFrame(0, "", STD).isExtended()); 00013 EXPECT_FALSE(makeCanFrame(0, "", EXT).isRemoteTransmissionRequest()); 00014 EXPECT_FALSE(makeCanFrame(0, "", STD).isRemoteTransmissionRequest()); 00015 00016 uavcan::CanFrame frame = makeCanFrame(123, "", STD); 00017 frame.id |= uavcan::CanFrame::FlagRTR; 00018 EXPECT_TRUE(frame.isRemoteTransmissionRequest()); 00019 EXPECT_FALSE(frame.isErrorFrame()); 00020 frame.id |= uavcan::CanFrame::FlagERR; 00021 EXPECT_TRUE(frame.isErrorFrame()); 00022 } 00023 00024 TEST(CanFrame, Arbitration) 00025 { 00026 using uavcan::CanFrame; 00027 00028 CanFrame a; 00029 CanFrame b; 00030 00031 /* 00032 * Simple 00033 */ 00034 a.id = 123; 00035 b.id = 122; 00036 ASSERT_TRUE(a.priorityLowerThan(b)); 00037 ASSERT_TRUE(b.priorityHigherThan(a)); 00038 00039 a.id = 123 | CanFrame::FlagEFF; 00040 b.id = 122 | CanFrame::FlagEFF; 00041 ASSERT_TRUE(a.priorityLowerThan(b)); 00042 ASSERT_TRUE(b.priorityHigherThan(a)); 00043 00044 a.id = 8; 00045 b.id = 8; 00046 ASSERT_FALSE(a.priorityLowerThan(b)); 00047 ASSERT_FALSE(b.priorityHigherThan(a)); 00048 00049 /* 00050 * EXT vs STD 00051 */ 00052 a.id = 1000; // 1000 00053 b.id = 2000 | CanFrame::FlagEFF; // 2000 >> 18, wins 00054 ASSERT_TRUE(a.priorityLowerThan(b)); 00055 ASSERT_TRUE(b.priorityHigherThan(a)); 00056 00057 a.id = 0x400; 00058 b.id = 0x10000000 | CanFrame::FlagEFF; // (0x400 << 18), 11 most significant bits are the same --> EFF loses 00059 ASSERT_TRUE(a.priorityHigherThan(b)); 00060 ASSERT_TRUE(b.priorityLowerThan(a)); 00061 00062 /* 00063 * RTR vs Data 00064 */ 00065 a.id = 123 | CanFrame::FlagRTR; // On the same ID, RTR loses 00066 b.id = 123; 00067 ASSERT_TRUE(a.priorityLowerThan(b)); 00068 ASSERT_TRUE(b.priorityHigherThan(a)); 00069 00070 a.id = CanFrame::MaskStdID | CanFrame::FlagRTR; // RTR is STD, so it wins 00071 b.id = CanFrame::MaskExtID | CanFrame::FlagEFF; // Lowest possible priority for data frame 00072 ASSERT_TRUE(a.priorityHigherThan(b)); 00073 ASSERT_TRUE(b.priorityLowerThan(a)); 00074 00075 a.id = 123 | CanFrame::FlagRTR; // Both RTR arbitrate as usually 00076 b.id = 122 | CanFrame::FlagRTR; 00077 ASSERT_TRUE(a.priorityLowerThan(b)); 00078 ASSERT_TRUE(b.priorityHigherThan(a)); 00079 } 00080 00081 TEST(CanFrame, ToString) 00082 { 00083 uavcan::CanFrame frame = makeCanFrame(123, "\x01\x02\x03\x04" "1234", EXT); 00084 EXPECT_EQ("0x0000007b 01 02 03 04 31 32 33 34 '....1234'", frame.toString()); 00085 EXPECT_TRUE(frame.toString() == frame.toString(uavcan::CanFrame::StrAligned)); 00086 00087 frame = makeCanFrame(123, "z", EXT); 00088 EXPECT_EQ("0x0000007b 7a 'z'", frame.toString(uavcan::CanFrame::StrAligned)); 00089 EXPECT_EQ("0x0000007b 7a 'z'", frame.toString()); 00090 00091 EXPECT_EQ(" 0x141 61 62 63 64 aa bb cc dd 'abcd....'", 00092 makeCanFrame(321, "abcd" "\xaa\xbb\xcc\xdd", STD).toString(uavcan::CanFrame::StrAligned)); 00093 00094 EXPECT_EQ(" 0x100 ''", 00095 makeCanFrame(256, "", STD).toString(uavcan::CanFrame::StrAligned)); 00096 00097 EXPECT_EQ("0x100 ''", 00098 makeCanFrame(256, "", STD).toString()); 00099 00100 EXPECT_EQ("0x141 61 62 63 64 aa bb cc dd 'abcd....'", 00101 makeCanFrame(321, "abcd" "\xaa\xbb\xcc\xdd", STD).toString()); 00102 }
Generated on Tue Jul 12 2022 17:17:30 by 1.7.2