STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_packet_roundtrip.cpp
Go to the documentation of this file.
1/**
2 * Packet round-trip unit tests — DAQv2-Comms serialization / parsing
3 *
4 * For each packet type: create → parse → verify all fields match.
5 * Also tests buffer-too-small and edge cases.
6 */
7#include <unity.h>
8
9#include <cstring>
10#include <vector>
11
12// DAQv2-Comms (uses our Arduino.h stub via -I stubs)
13#include "DiabloEnums.h"
14#include "DiabloPacketUtils.h"
15#include "DiabloPackets.h"
16
17// Pull in the implementation
18#include "DiabloPacketUtils.cpp"
19
20// ---------------------------------------------------------------------------
21// Board Heartbeat
22// ---------------------------------------------------------------------------
23
25 daq::BoardHeartbeatPacket hb_in;
26 memset(hb_in.firmware_hash, 0xAB, 32);
27 hb_in.board_id = 42;
28 hb_in.engine_state = daq::EngineState::FIRING;
29 hb_in.board_state = daq::BoardState::ACTIVE;
30
31 const uint32_t ts = 99999u;
32 uint8_t buf[512];
33 size_t n = daq::create_board_heartbeat_packet(hb_in, ts, buf, sizeof(buf));
34 TEST_ASSERT_GREATER_THAN(0, n);
35
36 daq::PacketHeader hdr_out;
37 daq::BoardHeartbeatPacket hb_out;
38 TEST_ASSERT_TRUE(
39 daq::parse_board_heartbeat_packet(buf, n, hdr_out, hb_out));
40
41 TEST_ASSERT_EQUAL(daq::PacketType::BOARD_HEARTBEAT, hdr_out.packet_type);
42 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
43 TEST_ASSERT_EQUAL(42, hb_out.board_id);
44 TEST_ASSERT_EQUAL((int)daq::EngineState::FIRING, (int)hb_out.engine_state);
45 TEST_ASSERT_EQUAL((int)daq::BoardState::ACTIVE, (int)hb_out.board_state);
46 TEST_ASSERT_EQUAL_MEMORY(hb_in.firmware_hash, hb_out.firmware_hash, 32);
47}
48
50 daq::BoardHeartbeatPacket hb_in{};
51 uint8_t buf[2]; // way too small
52 TEST_ASSERT_EQUAL(
53 0, daq::create_board_heartbeat_packet(hb_in, 0u, buf, sizeof(buf)));
54}
55
57 // Construct a buffer with SENSOR_DATA type but try to parse as heartbeat
58 uint8_t buf[512];
59 daq::BoardHeartbeatPacket hb_in{};
60 hb_in.board_id = 1;
61 size_t n = daq::create_board_heartbeat_packet(hb_in, 1u, buf, sizeof(buf));
62 TEST_ASSERT_GREATER_THAN(0, n);
63 // Corrupt the packet type
64 buf[0] = (uint8_t)daq::PacketType::SENSOR_DATA;
65 daq::PacketHeader hdr;
66 daq::BoardHeartbeatPacket hb_out;
67 TEST_ASSERT_FALSE(daq::parse_board_heartbeat_packet(buf, n, hdr, hb_out));
68}
69
70// ---------------------------------------------------------------------------
71// Server Heartbeat
72// ---------------------------------------------------------------------------
73
75 // Create a server heartbeat manually (no create function, build raw)
76 daq::PacketHeader hdr;
77 hdr.packet_type = daq::PacketType::SERVER_HEARTBEAT;
78 hdr.version = 0;
79 hdr.timestamp = 12345;
80 daq::ServerHeartbeatPacket srv;
81 srv.engine_state = daq::EngineState::LOX_FILL;
82
83 uint8_t buf[64];
84 memcpy(buf, &hdr, sizeof(hdr));
85 memcpy(buf + sizeof(hdr), &srv, sizeof(srv));
86 size_t total = sizeof(hdr) + sizeof(srv);
87
88 daq::PacketHeader hdr_out;
89 daq::ServerHeartbeatPacket srv_out;
90 TEST_ASSERT_TRUE(
91 daq::parse_server_heartbeat_packet(buf, total, hdr_out, srv_out));
92 TEST_ASSERT_EQUAL((int)daq::EngineState::LOX_FILL,
93 (int)srv_out.engine_state);
94 TEST_ASSERT_EQUAL(12345, hdr_out.timestamp);
95}
96
97// ---------------------------------------------------------------------------
98// Sensor Data (variable-length)
99// ---------------------------------------------------------------------------
100
102 const uint8_t num_sensors = 3;
103 std::vector<daq::SensorDataChunkCollection> chunks;
104
105 daq::SensorDataChunkCollection c1(1000, num_sensors);
106 c1.add_datapoint(1, 0xDEAD);
107 c1.add_datapoint(2, 0xBEEF);
108 c1.add_datapoint(3, 0xCAFE);
109 chunks.push_back(c1);
110
111 daq::SensorDataChunkCollection c2(2000, num_sensors);
112 c2.add_datapoint(1, 100);
113 c2.add_datapoint(2, 200);
114 c2.add_datapoint(3, 300);
115 chunks.push_back(c2);
116
117 const uint32_t hdr_ts = 5555u;
118 uint8_t buf[512];
119 size_t n = daq::create_sensor_data_packet(chunks, num_sensors, hdr_ts, buf,
120 sizeof(buf));
121 TEST_ASSERT_GREATER_THAN(0, n);
122
123 daq::PacketHeader hdr_out;
124 std::vector<daq::SensorDataChunkCollection> chunks_out;
125 TEST_ASSERT_TRUE(
126 daq::parse_sensor_data_packet(buf, n, hdr_out, chunks_out));
127
128 TEST_ASSERT_EQUAL(hdr_ts, hdr_out.timestamp);
129 TEST_ASSERT_EQUAL(2, chunks_out.size());
130 TEST_ASSERT_EQUAL(1000, chunks_out[0].timestamp);
131 TEST_ASSERT_EQUAL(2000, chunks_out[1].timestamp);
132 TEST_ASSERT_EQUAL(3, chunks_out[0].datapoints.size());
133 TEST_ASSERT_EQUAL(1, chunks_out[0].datapoints[0].sensor_id);
134 TEST_ASSERT_EQUAL(0xDEAD, chunks_out[0].datapoints[0].data);
135 TEST_ASSERT_EQUAL(2, chunks_out[0].datapoints[1].sensor_id);
136 TEST_ASSERT_EQUAL(0xBEEF, chunks_out[0].datapoints[1].data);
137 TEST_ASSERT_EQUAL(300, chunks_out[1].datapoints[2].data);
138}
139
141 std::vector<daq::SensorDataChunkCollection> chunks;
143 c1.add_datapoint(1, 100);
144 c1.add_datapoint(2, 200);
145 chunks.push_back(c1);
146
147 uint8_t buf[4]; // too small
148 TEST_ASSERT_EQUAL(
149 0, daq::create_sensor_data_packet(chunks, 2, 0u, buf, sizeof(buf)));
150}
151
152// ---------------------------------------------------------------------------
153// Actuator Command
154// ---------------------------------------------------------------------------
155
157 std::vector<daq::ActuatorCommand> cmds;
158 cmds.push_back({1, 1}); // actuator 1 ON
159 cmds.push_back({3, 0}); // actuator 3 OFF
160 cmds.push_back({7, 1}); // actuator 7 ON
161
162 const uint32_t ts = 7777u;
163 uint8_t buf[512];
164 size_t n = daq::create_actuator_command_packet(cmds, ts, buf, sizeof(buf));
165 TEST_ASSERT_GREATER_THAN(0, n);
166
167 daq::PacketHeader hdr_out;
168 std::vector<daq::ActuatorCommand> cmds_out;
169 TEST_ASSERT_TRUE(
170 daq::parse_actuator_command_packet(buf, n, hdr_out, cmds_out));
171
172 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
173 TEST_ASSERT_EQUAL(3, cmds_out.size());
174 TEST_ASSERT_EQUAL(1, cmds_out[0].actuator_id);
175 TEST_ASSERT_EQUAL(1, cmds_out[0].actuator_state);
176 TEST_ASSERT_EQUAL(3, cmds_out[1].actuator_id);
177 TEST_ASSERT_EQUAL(0, cmds_out[1].actuator_state);
178 TEST_ASSERT_EQUAL(7, cmds_out[2].actuator_id);
179 TEST_ASSERT_EQUAL(1, cmds_out[2].actuator_state);
180}
181
183 std::vector<daq::ActuatorCommand> cmds; // empty
184 uint8_t buf[512];
185 TEST_ASSERT_EQUAL(
186 0, daq::create_actuator_command_packet(cmds, 0u, buf, sizeof(buf)));
187}
188
189// ---------------------------------------------------------------------------
190// PWM Actuator Command
191// ---------------------------------------------------------------------------
192
194 std::vector<daq::PWMActuatorCommand> cmds;
195 daq::PWMActuatorCommand cmd;
196 cmd.actuator_id = 5;
197 cmd.duration = 3000;
198 cmd.duty_cycle = 0.75f;
199 cmd.frequency = 100.0f;
200 cmds.push_back(cmd);
201
202 const uint32_t ts = 8888u;
203 uint8_t buf[512];
204 size_t n = daq::create_pwm_actuator_packet(cmds, ts, buf, sizeof(buf));
205 TEST_ASSERT_GREATER_THAN(0, n);
206
207 daq::PacketHeader hdr_out;
208 std::vector<daq::PWMActuatorCommand> cmds_out;
209 TEST_ASSERT_TRUE(daq::parse_pwm_actuator_packet(buf, n, hdr_out, cmds_out));
210
211 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
212 TEST_ASSERT_EQUAL(1, cmds_out.size());
213 TEST_ASSERT_EQUAL(5, cmds_out[0].actuator_id);
214 TEST_ASSERT_EQUAL(3000, cmds_out[0].duration);
215 TEST_ASSERT_FLOAT_WITHIN(0.001f, 0.75f, cmds_out[0].duty_cycle);
216 TEST_ASSERT_FLOAT_WITHIN(0.1f, 100.0f, cmds_out[0].frequency);
217}
218
219// ---------------------------------------------------------------------------
220// Sensor Config (conditional controller_ip field)
221// ---------------------------------------------------------------------------
222
224 std::vector<uint8_t> sensor_ids = {1, 3, 5, 7};
225 uint8_t ref_voltage = 1; // VDD
226 bool necessary_for_abort = true;
227 uint32_t controller_ip = 0xC0A80232; // 192.168.2.50
228 uint8_t enable_serial = 1;
229
230 const uint32_t ts = 11111u;
231 uint8_t buf[512];
233 sensor_ids, ref_voltage, necessary_for_abort, controller_ip,
234 enable_serial, ts, buf, sizeof(buf));
235 TEST_ASSERT_GREATER_THAN(0, n);
236
237 daq::PacketHeader hdr_out;
238 std::vector<uint8_t> ids_out;
239 uint8_t ref_out;
240 bool abort_out;
241 uint32_t ip_out;
242 uint8_t serial_out;
243 TEST_ASSERT_TRUE(daq::parse_sensor_config_packet(
244 buf, n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
245
246 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
247 TEST_ASSERT_EQUAL(4, ids_out.size());
248 TEST_ASSERT_EQUAL(1, ids_out[0]);
249 TEST_ASSERT_EQUAL(7, ids_out[3]);
250 TEST_ASSERT_EQUAL(1, ref_out);
251 TEST_ASSERT_TRUE(abort_out);
252 TEST_ASSERT_EQUAL_HEX32(0xC0A80232, ip_out);
253 TEST_ASSERT_EQUAL(1, serial_out);
254}
255
257 std::vector<uint8_t> sensor_ids = {2};
258 uint8_t ref_voltage = 0;
259 bool necessary_for_abort = false;
260 uint32_t controller_ip = 0; // should not be written
261
262 const uint32_t ts = 11112u;
263 uint8_t buf[512];
265 sensor_ids, ref_voltage, necessary_for_abort, controller_ip, 0, ts, buf,
266 sizeof(buf));
267 TEST_ASSERT_GREATER_THAN(0, n);
268
269 daq::PacketHeader hdr_out;
270 std::vector<uint8_t> ids_out;
271 uint8_t ref_out;
272 bool abort_out;
273 uint32_t ip_out = 0xFFFFFFFF;
274 uint8_t serial_out;
275 TEST_ASSERT_TRUE(daq::parse_sensor_config_packet(
276 buf, n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
277
278 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
279 TEST_ASSERT_EQUAL(1, ids_out.size());
280 TEST_ASSERT_EQUAL(2, ids_out[0]);
281 TEST_ASSERT_FALSE(abort_out);
282 TEST_ASSERT_EQUAL(0, ip_out); // parser should zero it
283}
284
286 std::vector<uint8_t> sensor_ids; // empty
287 uint8_t buf[512];
288 size_t n = daq::create_sensor_config_packet(sensor_ids, 0, false, 0, 1,
289 11113u, buf, sizeof(buf));
290 TEST_ASSERT_GREATER_THAN(0, n);
291
292 daq::PacketHeader hdr_out;
293 std::vector<uint8_t> ids_out;
294 uint8_t ref_out, serial_out;
295 bool abort_out;
296 uint32_t ip_out;
297 TEST_ASSERT_TRUE(daq::parse_sensor_config_packet(
298 buf, n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
299 TEST_ASSERT_EQUAL(0, ids_out.size());
300}
301
302// ---------------------------------------------------------------------------
303// Actuator Config (complex layout)
304// ---------------------------------------------------------------------------
305
307 std::vector<daq::AbortActuatorLocation> actuators;
308 actuators.push_back({0xC0A80201, 1, 1, 0}); // IP, id, vent=on, abort=off
309 actuators.push_back({0xC0A80202, 3, 0, 1}); // different board
310
311 std::vector<daq::AbortPTLocation> pts;
312 pts.push_back({0xC0A80203, 2, 500000}); // IP, sensor_id, threshold
313
314 uint8_t buf[512];
315 size_t n = daq::create_actuator_config_packet(1, actuators, pts, 1, 22222u,
316 buf, sizeof(buf));
317 TEST_ASSERT_GREATER_THAN(0, n);
318
319 daq::PacketHeader hdr_out;
320 uint8_t is_controller;
321 std::vector<daq::AbortActuatorLocation> act_out;
322 std::vector<daq::AbortPTLocation> pt_out;
323 uint8_t serial_out;
324 TEST_ASSERT_TRUE(daq::parse_actuator_config_packet(
325 buf, n, hdr_out, is_controller, act_out, pt_out, serial_out));
326
327 TEST_ASSERT_EQUAL(22222u, hdr_out.timestamp);
328 TEST_ASSERT_EQUAL(1, is_controller);
329 TEST_ASSERT_EQUAL(2, act_out.size());
330 TEST_ASSERT_EQUAL_HEX32(0xC0A80201, act_out[0].ip_address);
331 TEST_ASSERT_EQUAL(1, act_out[0].actuator_id);
332 TEST_ASSERT_EQUAL(1, act_out[0].vent_state);
333 TEST_ASSERT_EQUAL(0, act_out[0].abort_state);
334 TEST_ASSERT_EQUAL(1, pt_out.size());
335 TEST_ASSERT_EQUAL(2, pt_out[0].sensor_id);
336 TEST_ASSERT_EQUAL(500000, pt_out[0].pressure_threshold_adc);
337 TEST_ASSERT_EQUAL(1, serial_out);
338}
339
341 std::vector<daq::AbortActuatorLocation> actuators;
342 actuators.push_back({0xC0A80201, 1, 1, 1});
343 std::vector<daq::AbortPTLocation> pts; // empty
344
345 uint8_t buf[512];
346 size_t n = daq::create_actuator_config_packet(0, actuators, pts, 0, 22223u,
347 buf, sizeof(buf));
348 TEST_ASSERT_GREATER_THAN(0, n);
349
350 daq::PacketHeader hdr_out;
351 uint8_t is_controller;
352 std::vector<daq::AbortActuatorLocation> act_out;
353 std::vector<daq::AbortPTLocation> pt_out;
354 uint8_t serial_out;
355 TEST_ASSERT_TRUE(daq::parse_actuator_config_packet(
356 buf, n, hdr_out, is_controller, act_out, pt_out, serial_out));
357 TEST_ASSERT_EQUAL(22223u, hdr_out.timestamp);
358 TEST_ASSERT_EQUAL(0, is_controller);
359 TEST_ASSERT_EQUAL(1, act_out.size());
360 TEST_ASSERT_EQUAL(0, pt_out.size());
361 TEST_ASSERT_EQUAL(0, serial_out);
362}
363
364// ---------------------------------------------------------------------------
365// Self Test
366// ---------------------------------------------------------------------------
367
369 std::vector<daq::SelfTestResult> results;
370 results.push_back({1, 1}); // sensor 1 good
371 results.push_back({2, 0}); // sensor 2 bad
372 results.push_back({5, 1}); // sensor 5 good
373
374 const uint32_t ts = 33333u;
375 uint8_t buf[512];
376 size_t n = daq::create_self_test_packet(1, results, ts, buf, sizeof(buf));
377 TEST_ASSERT_GREATER_THAN(0, n);
378
379 daq::PacketHeader hdr_out;
380 uint8_t adc_good_out;
381 std::vector<daq::SelfTestResult> results_out;
382 TEST_ASSERT_TRUE(daq::parse_self_test_packet(buf, n, hdr_out, adc_good_out,
383 results_out));
384
385 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
386 TEST_ASSERT_EQUAL(1, adc_good_out);
387 TEST_ASSERT_EQUAL(3, results_out.size());
388 TEST_ASSERT_EQUAL(1, results_out[0].sensor_id);
389 TEST_ASSERT_EQUAL(1, results_out[0].result);
390 TEST_ASSERT_EQUAL(2, results_out[1].sensor_id);
391 TEST_ASSERT_EQUAL(0, results_out[1].result);
392}
393
395 std::vector<daq::SelfTestResult> results;
396 results.push_back({1, 0});
397
398 uint8_t buf[512];
399 size_t n =
400 daq::create_self_test_packet(0, results, 33334u, buf, sizeof(buf));
401 TEST_ASSERT_GREATER_THAN(0, n);
402
403 daq::PacketHeader hdr_out;
404 uint8_t adc_good_out;
405 std::vector<daq::SelfTestResult> results_out;
406 TEST_ASSERT_TRUE(daq::parse_self_test_packet(buf, n, hdr_out, adc_good_out,
407 results_out));
408 TEST_ASSERT_EQUAL(33334u, hdr_out.timestamp);
409 TEST_ASSERT_EQUAL(0, adc_good_out);
410}
411
412// ---------------------------------------------------------------------------
413// Abort Done (header-only)
414// ---------------------------------------------------------------------------
415
417 const uint32_t ts = 44444u;
418 uint8_t buf[64];
419 size_t n = daq::create_abort_done_packet(ts, buf, sizeof(buf));
420 TEST_ASSERT_GREATER_THAN(0, n);
421 TEST_ASSERT_EQUAL(sizeof(daq::PacketHeader), n);
422
423 daq::PacketHeader hdr_out;
424 TEST_ASSERT_TRUE(daq::parse_abort_done_packet(buf, n, hdr_out));
425 TEST_ASSERT_EQUAL((int)daq::PacketType::ABORT_DONE,
426 (int)hdr_out.packet_type);
427 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
428}
429
431 uint8_t buf[2];
432 TEST_ASSERT_EQUAL(0, daq::create_abort_done_packet(0u, buf, sizeof(buf)));
433}
434
435// ---------------------------------------------------------------------------
436// Parse with null buffer
437// ---------------------------------------------------------------------------
438
440 daq::PacketHeader hdr;
441 daq::BoardHeartbeatPacket hb;
442 TEST_ASSERT_FALSE(daq::parse_board_heartbeat_packet(nullptr, 100, hdr, hb));
443
444 std::vector<daq::SensorDataChunkCollection> chunks;
445 TEST_ASSERT_FALSE(daq::parse_sensor_data_packet(nullptr, 100, hdr, chunks));
446
447 std::vector<daq::ActuatorCommand> cmds;
448 TEST_ASSERT_FALSE(
449 daq::parse_actuator_command_packet(nullptr, 100, hdr, cmds));
450}
451
452// ---------------------------------------------------------------------------
453// LOGS packet (type 15).
454// ---------------------------------------------------------------------------
455
457 const char* text = "line1\nline2\n";
458 const uint16_t text_len = (uint16_t)strlen(text);
459 uint8_t buf[64];
460 size_t n = daq::create_log_packet(0x01, (const uint8_t*)text, text_len,
461 0xDEADBEEFu, buf, sizeof(buf));
462 const size_t hdr = sizeof(daq::PacketHeader);
463 TEST_ASSERT_EQUAL(hdr + 3 + text_len, n);
464 TEST_ASSERT_EQUAL_UINT8((uint8_t)daq::PacketType::LOGS, buf[0]);
465 uint32_t ts;
466 memcpy(&ts, buf + 2, 4);
467 TEST_ASSERT_EQUAL_UINT32(0xDEADBEEFu, ts); // timestamp (u32 LE)
468 TEST_ASSERT_EQUAL_UINT8(0x01, buf[hdr]); // flags: TRUNCATED
469 uint16_t tl;
470 memcpy(&tl, buf + hdr + 1, 2);
471 TEST_ASSERT_EQUAL_UINT16(text_len, tl); // text_len (u16 LE)
472 TEST_ASSERT_EQUAL_MEMORY(text, buf + hdr + 3, text_len);
473}
474
476 const char* text = "hello";
477 uint8_t buf[4]; // smaller than the header alone
478 TEST_ASSERT_EQUAL(0, daq::create_log_packet(0, (const uint8_t*)text, 5, 0u,
479 buf, sizeof(buf)));
480}
481
483 const char* text = "ONLINE board=3\nstate=IDLE\n";
484 const uint16_t text_len = (uint16_t)strlen(text);
485 uint8_t buf[128];
486 size_t n = daq::create_log_packet(0x01, (const uint8_t*)text, text_len,
487 0x12345678u, buf, sizeof(buf));
488 TEST_ASSERT_NOT_EQUAL(0, n);
489
490 daq::PacketHeader hdr;
491 uint8_t flags = 0;
492 const uint8_t* out_text = nullptr;
493 uint16_t out_len = 0;
494 TEST_ASSERT_TRUE(
495 daq::parse_log_packet(buf, n, hdr, flags, out_text, out_len));
496 TEST_ASSERT_EQUAL_UINT8((uint8_t)daq::PacketType::LOGS, hdr.packet_type);
497 TEST_ASSERT_EQUAL_UINT32(0x12345678u, hdr.timestamp);
498 TEST_ASSERT_EQUAL_UINT8(0x01, flags);
499 TEST_ASSERT_EQUAL_UINT16(text_len, out_len);
500 TEST_ASSERT_EQUAL_MEMORY(text, out_text, text_len);
501}
502
504 const char* text = "hello";
505 uint8_t buf[64];
506 size_t n = daq::create_log_packet(0, (const uint8_t*)text, 5, 0u, buf,
507 sizeof(buf));
508 TEST_ASSERT_NOT_EQUAL(0, n);
509
510 daq::PacketHeader hdr;
511 uint8_t flags = 0;
512 const uint8_t* out_text = nullptr;
513 uint16_t out_len = 0;
514 // Claim one fewer byte than the text needs -> must fail.
515 TEST_ASSERT_FALSE(
516 daq::parse_log_packet(buf, n - 1, hdr, flags, out_text, out_len));
517}
518
520 // A heartbeat packet must not parse as LOGS.
521 uint8_t buf[64];
522 daq::BoardHeartbeatPacket hb{};
523 size_t n = daq::create_board_heartbeat_packet(hb, 0u, buf, sizeof(buf));
524 TEST_ASSERT_NOT_EQUAL(0, n);
525
526 daq::PacketHeader hdr;
527 uint8_t flags = 0;
528 const uint8_t* out_text = nullptr;
529 uint16_t out_len = 0;
530 TEST_ASSERT_FALSE(
531 daq::parse_log_packet(buf, n, hdr, flags, out_text, out_len));
532}
533
534// ---------------------------------------------------------------------------
535// Unity runner
536// ---------------------------------------------------------------------------
537
538void setUp() {
539}
540void tearDown() {
541}
542
543int main(int argc, char** argv) {
544 UNITY_BEGIN();
545
546 // Board Heartbeat
550
551 // Server Heartbeat
553
554 // Sensor Data
557
558 // Actuator Command
561
562 // PWM Actuator Command
564
565 // Sensor Config
569
570 // Actuator Config
573
574 // Self Test
575 RUN_TEST(test_self_test_roundtrip);
576 RUN_TEST(test_self_test_adc_bad);
577
578 // Abort Done
581
582 RUN_TEST(test_log_packet_layout);
587
588 // Null buffer
589 RUN_TEST(test_parse_null_buffer);
590
591 return UNITY_END();
592}
std::vector< daq::SensorDataChunkCollection > chunks
Definition main.cpp:55
json_pointer result
Definition json.hpp:14064
bool parse_self_test_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, uint8_t &adc_good_out, std::vector< SelfTestResult > &results_out)
Parses a Self Test packet from buffer.
size_t create_sensor_data_packet(const std::vector< SensorDataChunkCollection > &chunks, const uint8_t num_sensors, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Sensor Data packet in the provided buffer.
bool parse_server_heartbeat_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, ServerHeartbeatPacket &data_out)
Parses a Server Heartbeat packet from buffer.
bool parse_log_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, uint8_t &flags_out, const uint8_t *&text_out, uint16_t &text_len_out)
Parses a LOGS packet (type 15) from buffer.
size_t create_abort_done_packet(uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a simple Abort Done packet.
bool parse_sensor_config_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, std::vector< uint8_t > &sensor_ids_out, uint8_t &reference_voltage_out, bool &necessary_for_abort_out, uint32_t &controller_ip_out, uint8_t &enable_serial_printing_out)
Parses a Sensor Config packet from buffer.
size_t create_log_packet(uint8_t flags, const uint8_t *text, uint16_t text_len, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a LOGS packet (type 15): buffered board log text for the server.
bool parse_board_heartbeat_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, BoardHeartbeatPacket &data_out)
Parses a Board Heartbeat packet from buffer.
size_t create_board_heartbeat_packet(const BoardHeartbeatPacket &data, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Board Heartbeat packet in the provided buffer.
bool parse_pwm_actuator_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, std::vector< PWMActuatorCommand > &commands_out)
Parses a PWM Actuator Command packet from buffer.
size_t create_pwm_actuator_packet(const std::vector< PWMActuatorCommand > &commands, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete PWM Actuator Command packet in the provided buffer.
bool parse_actuator_command_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, std::vector< ActuatorCommand > &commands_out)
Parses an Actuator Command packet from buffer.
size_t create_sensor_config_packet(const std::vector< uint8_t > &sensor_ids, uint8_t reference_voltage, bool necessary_for_abort, uint32_t controller_ip, uint8_t enable_serial_printing, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Sensor Config packet in the provided buffer.
size_t create_self_test_packet(uint8_t adc_good, const std::vector< SelfTestResult > &results, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Self Test packet in the provided buffer.
bool parse_abort_done_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out)
Parses an Abort Done packet from buffer.
size_t create_actuator_config_packet(uint8_t is_abort_controller, const std::vector< AbortActuatorLocation > &abort_actuators, const std::vector< AbortPTLocation > &abort_pts, uint8_t enable_serial_printing, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Actuator Config packet in the provided buffer.
bool parse_actuator_config_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, uint8_t &is_abort_controller_out, std::vector< AbortActuatorLocation > &abort_actuators_out, std::vector< AbortPTLocation > &abort_pts_out, uint8_t &enable_serial_printing_out)
Parses an Actuator Config packet from buffer.
bool parse_sensor_data_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, std::vector< SensorDataChunkCollection > &chunks_out)
Parses a Sensor Data packet from buffer into chunk collections.
size_t create_actuator_command_packet(const std::vector< ActuatorCommand > &commands, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Actuator Command packet in the provided buffer.
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
Represents a single data chunk with timestamp and sensor datapoints.
bool add_datapoint(uint8_t sensor_id, uint32_t data)
Add a sensor datapoint to this chunk.
int main()
void test_actuator_config_no_pts()
void test_log_packet_parse_truncated()
void test_actuator_config_roundtrip()
void test_sensor_data_buffer_too_small()
void test_board_heartbeat_parse_wrong_type()
void test_log_packet_parse_wrong_type()
void test_board_heartbeat_buffer_too_small()
void test_sensor_config_roundtrip_without_abort()
void test_sensor_config_empty_sensors()
void test_board_heartbeat_roundtrip()
Packet round-trip unit tests — DAQv2-Comms serialization / parsing.
void test_self_test_roundtrip()
void setUp()
void test_log_packet_layout()
void test_parse_null_buffer()
void test_server_heartbeat_roundtrip()
void test_actuator_command_roundtrip()
void test_abort_done_roundtrip()
void test_log_packet_roundtrip()
void test_log_packet_buffer_too_small()
void tearDown()
void test_self_test_adc_bad()
void test_sensor_data_roundtrip()
void test_pwm_actuator_roundtrip()
void test_sensor_config_roundtrip_with_abort()
void test_abort_done_buffer_too_small()
void test_actuator_command_empty_list()