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