blob: 84938f074bdcb4d074ec1cb093ac3cb29e01f46f [file] [log] [blame]
Brian Silverman246cb222019-02-02 16:38:18 -08001#include "y2019/jevois/spi.h"
2
3#include <stdint.h>
4
5#include "gtest/gtest.h"
6
7namespace frc971 {
8namespace jevois {
9namespace testing {
10
11// Tests packing and then unpacking an empty message.
12TEST(SpiToRoborioPackTest, Empty) {
13 TeensyToRoborio input_message;
14 const SpiTransfer transfer = SpiPackToRoborio(input_message);
15 const auto output_message = SpiUnpackToRoborio(transfer);
16 ASSERT_TRUE(output_message);
17 EXPECT_EQ(input_message, output_message.value());
18}
19
20// Tests that unpacking after the message has been modified results in a
21// checksum failure.
22TEST(SpiToRoborioPackTest, CorruptChecksum) {
23 TeensyToRoborio input_message;
24 {
25 SpiTransfer transfer = SpiPackToRoborio(input_message);
26 transfer[0]++;
27 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
28 }
29 {
30 SpiTransfer transfer = SpiPackToRoborio(input_message);
31 transfer[0] ^= 0xFF;
32 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
33 }
34 {
35 SpiTransfer transfer = SpiPackToRoborio(input_message);
36 transfer[transfer.size() - 1]++;
37 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
38 }
39 input_message.frames.push_back({});
40 {
41 SpiTransfer transfer = SpiPackToRoborio(input_message);
42 transfer[0]++;
43 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
44 }
45 {
46 SpiTransfer transfer = SpiPackToRoborio(input_message);
47 transfer[3]++;
48 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
49 }
50 input_message.frames.back().targets.push_back({});
51 {
52 SpiTransfer transfer = SpiPackToRoborio(input_message);
53 transfer[3]++;
54 ASSERT_FALSE(SpiUnpackToRoborio(transfer));
55 }
56}
57
58// Tests packing and then unpacking a full message.
59TEST(SpiToRoborioPackTest, Full) {
60 TeensyToRoborio input_message;
61 input_message.frames.push_back({});
62 input_message.frames.back().age = camera_duration(9);
Brian Silvermanc41fb862019-03-02 21:14:46 -080063 input_message.frames.back().camera_index = 2;
Brian Silverman246cb222019-02-02 16:38:18 -080064 input_message.frames.push_back({});
65 input_message.frames.back().age = camera_duration(7);
Brian Silvermanc41fb862019-03-02 21:14:46 -080066 input_message.frames.back().camera_index = 5;
Brian Silverman246cb222019-02-02 16:38:18 -080067 input_message.frames.push_back({});
68 input_message.frames.back().age = camera_duration(1);
Brian Silvermanc41fb862019-03-02 21:14:46 -080069 input_message.frames.back().camera_index = 4;
Brian Silverman246cb222019-02-02 16:38:18 -080070
71 const SpiTransfer transfer = SpiPackToRoborio(input_message);
72 const auto output_message = SpiUnpackToRoborio(transfer);
73 ASSERT_TRUE(output_message);
74 EXPECT_EQ(input_message, output_message.value());
75}
76
77// Tests that packing and unpacking a target results in values close to before.
78TEST(SpiToRoborioPackTest, Target) {
79 TeensyToRoborio input_message;
80 input_message.frames.push_back({});
81 input_message.frames.back().targets.push_back({});
82 input_message.frames.back().targets.back().distance = 9;
83 input_message.frames.back().targets.back().height = 1;
84 input_message.frames.back().targets.back().heading = 0.5;
85 input_message.frames.back().targets.back().skew = -0.5;
Brian Silvermanc41fb862019-03-02 21:14:46 -080086 input_message.frames.back().camera_index = 0;
Brian Silverman246cb222019-02-02 16:38:18 -080087 input_message.frames.push_back({});
88 input_message.frames.back().targets.push_back({});
89 input_message.frames.back().targets.push_back({});
Brian Silvermanc41fb862019-03-02 21:14:46 -080090 input_message.frames.back().camera_index = 2;
Brian Silverman246cb222019-02-02 16:38:18 -080091 input_message.frames.push_back({});
92 input_message.frames.back().targets.push_back({});
93 input_message.frames.back().targets.push_back({});
94 input_message.frames.back().targets.push_back({});
Brian Silvermanc41fb862019-03-02 21:14:46 -080095 input_message.frames.back().camera_index = 3;
Brian Silverman246cb222019-02-02 16:38:18 -080096
97 const SpiTransfer transfer = SpiPackToRoborio(input_message);
98 const auto output_message = SpiUnpackToRoborio(transfer);
99 ASSERT_TRUE(output_message);
100 ASSERT_EQ(3u, output_message->frames.size());
101 ASSERT_EQ(1u, output_message->frames[0].targets.size());
102 ASSERT_EQ(2u, output_message->frames[1].targets.size());
103 ASSERT_EQ(3u, output_message->frames[2].targets.size());
104 EXPECT_NEAR(input_message.frames.back().targets.back().distance,
105 output_message->frames.back().targets.back().distance, 0.1);
106 EXPECT_NEAR(input_message.frames.back().targets.back().height,
107 output_message->frames.back().targets.back().height, 0.1);
108 EXPECT_NEAR(input_message.frames.back().targets.back().heading,
109 output_message->frames.back().targets.back().heading, 0.1);
110 EXPECT_NEAR(input_message.frames.back().targets.back().skew,
111 output_message->frames.back().targets.back().skew, 0.1);
Brian Silvermanc41fb862019-03-02 21:14:46 -0800112 for (int i = 0; i < 3; ++i) {
113 EXPECT_EQ(input_message.frames[i].camera_index,
114 output_message->frames[i].camera_index);
115 }
116}
117
118// Tests that packing and unpacking two targets results in the same number on
119// the other side.
120TEST(SpiToRoborioPackTest, TwoTargets) {
121 TeensyToRoborio input_message;
122 input_message.frames.push_back({});
123 input_message.frames.back().targets.push_back({});
124 input_message.frames.back().targets.back().distance = 9;
125 input_message.frames.back().targets.back().height = 1;
126 input_message.frames.back().targets.back().heading = 0.5;
127 input_message.frames.back().targets.back().skew = -0.5;
128 input_message.frames.back().targets.push_back({});
129 input_message.frames.back().targets.back().distance = 1;
130 input_message.frames.back().targets.back().height = 0.9;
131 input_message.frames.back().targets.back().heading = 0.4;
132 input_message.frames.back().targets.back().skew = -0.4;
133 input_message.frames.back().age = camera_duration(9);
134 input_message.frames.back().camera_index = 2;
135
136 const SpiTransfer transfer = SpiPackToRoborio(input_message);
137 const auto output_message = SpiUnpackToRoborio(transfer);
138 ASSERT_TRUE(output_message);
139 ASSERT_EQ(1u, output_message->frames.size());
140 ASSERT_EQ(2u, output_message->frames[0].targets.size());
141 for (int i = 0; i < 2; ++i) {
142 EXPECT_NEAR(input_message.frames.back().targets[i].distance,
143 output_message->frames.back().targets[i].distance, 0.1);
144 EXPECT_NEAR(input_message.frames.back().targets[i].height,
145 output_message->frames.back().targets[i].height, 0.1);
146 EXPECT_NEAR(input_message.frames.back().targets[i].heading,
147 output_message->frames.back().targets[i].heading, 0.1);
148 EXPECT_NEAR(input_message.frames.back().targets[i].skew,
149 output_message->frames.back().targets[i].skew, 0.1);
150 EXPECT_EQ(input_message.frames.back().age,
151 output_message->frames.back().age);
152 EXPECT_EQ(input_message.frames.back().camera_index,
153 output_message->frames.back().camera_index);
154 }
155}
156
157// Tests that packing and unpacking three targets results in the same number on
158// the other side.
159TEST(SpiToRoborioPackTest, ThreeTargets) {
160 TeensyToRoborio input_message;
161 input_message.frames.push_back({});
162 input_message.frames.back().targets.push_back({});
163 input_message.frames.back().targets.back().distance = 9;
164 input_message.frames.back().targets.back().height = 1;
165 input_message.frames.back().targets.back().heading = 0.5;
166 input_message.frames.back().targets.back().skew = -0.5;
167 input_message.frames.back().targets.push_back({});
168 input_message.frames.back().targets.back().distance = 1;
169 input_message.frames.back().targets.back().height = 0.9;
170 input_message.frames.back().targets.back().heading = 0.4;
171 input_message.frames.back().targets.back().skew = -0.4;
172 input_message.frames.back().targets.push_back({});
173 input_message.frames.back().targets.back().distance = 2;
174 input_message.frames.back().targets.back().height = 0.7;
175 input_message.frames.back().targets.back().heading = 0.3;
176 input_message.frames.back().targets.back().skew = -0.3;
177 input_message.frames.back().age = camera_duration(1);
178 input_message.frames.back().camera_index = 1;
179
180 const SpiTransfer transfer = SpiPackToRoborio(input_message);
181 const auto output_message = SpiUnpackToRoborio(transfer);
182 ASSERT_TRUE(output_message);
183 ASSERT_EQ(1u, output_message->frames.size());
184 ASSERT_EQ(3u, output_message->frames[0].targets.size());
185 for (int i = 0; i < 3; ++i) {
186 EXPECT_NEAR(input_message.frames.back().targets[i].distance,
187 output_message->frames.back().targets[i].distance, 0.1);
188 EXPECT_NEAR(input_message.frames.back().targets[i].height,
189 output_message->frames.back().targets[i].height, 0.1);
190 EXPECT_NEAR(input_message.frames.back().targets[i].heading,
191 output_message->frames.back().targets[i].heading, 0.1);
192 EXPECT_NEAR(input_message.frames.back().targets[i].skew,
193 output_message->frames.back().targets[i].skew, 0.1);
194 EXPECT_EQ(input_message.frames.back().age,
195 output_message->frames.back().age);
196 EXPECT_EQ(input_message.frames.back().camera_index,
197 output_message->frames.back().camera_index);
198 }
Brian Silverman246cb222019-02-02 16:38:18 -0800199}
200
Brian Silvermana10b87e2019-02-24 15:20:07 -0800201// Tests packing and then unpacking an empty message.
202TEST(SpiToTeensyPackTest, Empty) {
Brian Silvermane9924fd2019-03-02 15:20:42 -0800203 RoborioToTeensy input_message{};
204 const SpiTransfer transfer = SpiPackToTeensy(input_message);
205 const auto output_message = SpiUnpackToTeensy(transfer);
206 ASSERT_TRUE(output_message);
207 EXPECT_EQ(input_message, output_message.value());
208}
209
210// Tests packing and then unpacking a message with all the fields set.
211TEST(SpiToTeensyPackTest, Full) {
Brian Silvermana10b87e2019-02-24 15:20:07 -0800212 RoborioToTeensy input_message;
Brian Silvermane9924fd2019-03-02 15:20:42 -0800213 input_message.beacon_brightness[0] = 9;
214 input_message.beacon_brightness[1] = 7;
215 input_message.beacon_brightness[2] = 1;
216 input_message.light_rings[0] = 1;
217 input_message.light_rings[1] = 0;
218 input_message.light_rings[2] = 0;
219 input_message.light_rings[3] = 1;
220 input_message.light_rings[4] = 0;
221 input_message.realtime_now =
222 aos::realtime_clock::epoch() + std::chrono::seconds(971254);
223 input_message.camera_command = CameraCommand::kUsb;
224
Brian Silvermana10b87e2019-02-24 15:20:07 -0800225 const SpiTransfer transfer = SpiPackToTeensy(input_message);
226 const auto output_message = SpiUnpackToTeensy(transfer);
227 ASSERT_TRUE(output_message);
228 EXPECT_EQ(input_message, output_message.value());
229}
230
Brian Silverman246cb222019-02-02 16:38:18 -0800231} // namespace testing
232} // namespace jevois
233} // namespace frc971