libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers can_driver.cpp Source File

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 }