25 daq::BoardHeartbeatPacket hb_in;
26 memset(hb_in.firmware_hash, 0xAB, 32);
31 const uint32_t ts = 99999u;
34 TEST_ASSERT_GREATER_THAN(0,
n);
36 daq::PacketHeader hdr_out;
37 daq::BoardHeartbeatPacket hb_out;
42 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
43 TEST_ASSERT_EQUAL(42, hb_out.board_id);
46 TEST_ASSERT_EQUAL_MEMORY(hb_in.firmware_hash, hb_out.firmware_hash, 32);
50 daq::BoardHeartbeatPacket hb_in{};
59 daq::BoardHeartbeatPacket hb_in{};
62 TEST_ASSERT_GREATER_THAN(0,
n);
65 daq::PacketHeader hdr;
66 daq::BoardHeartbeatPacket hb_out;
76 daq::PacketHeader hdr;
79 hdr.timestamp = 12345;
80 daq::ServerHeartbeatPacket srv;
84 memcpy(buf, &hdr,
sizeof(hdr));
85 memcpy(buf +
sizeof(hdr), &srv,
sizeof(srv));
86 size_t total =
sizeof(hdr) +
sizeof(srv);
88 daq::PacketHeader hdr_out;
89 daq::ServerHeartbeatPacket srv_out;
93 (
int)srv_out.engine_state);
94 TEST_ASSERT_EQUAL(12345, hdr_out.timestamp);
102 const uint8_t num_sensors = 3;
103 std::vector<daq::SensorDataChunkCollection>
chunks;
117 const uint32_t hdr_ts = 5555u;
121 TEST_ASSERT_GREATER_THAN(0,
n);
123 daq::PacketHeader hdr_out;
124 std::vector<daq::SensorDataChunkCollection> chunks_out;
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);
141 std::vector<daq::SensorDataChunkCollection>
chunks;
157 std::vector<daq::ActuatorCommand> cmds;
158 cmds.push_back({1, 1});
159 cmds.push_back({3, 0});
160 cmds.push_back({7, 1});
162 const uint32_t ts = 7777u;
165 TEST_ASSERT_GREATER_THAN(0,
n);
167 daq::PacketHeader hdr_out;
168 std::vector<daq::ActuatorCommand> cmds_out;
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);
183 std::vector<daq::ActuatorCommand> cmds;
194 std::vector<daq::PWMActuatorCommand> cmds;
195 daq::PWMActuatorCommand cmd;
198 cmd.duty_cycle = 0.75f;
199 cmd.frequency = 100.0f;
202 const uint32_t ts = 8888u;
205 TEST_ASSERT_GREATER_THAN(0,
n);
207 daq::PacketHeader hdr_out;
208 std::vector<daq::PWMActuatorCommand> cmds_out;
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);
224 std::vector<uint8_t> sensor_ids = {1, 3, 5, 7};
225 uint8_t ref_voltage = 1;
226 bool necessary_for_abort =
true;
227 uint32_t controller_ip = 0xC0A80232;
228 uint8_t enable_serial = 1;
230 const uint32_t ts = 11111u;
233 sensor_ids, ref_voltage, necessary_for_abort, controller_ip,
234 enable_serial, ts, buf,
sizeof(buf));
235 TEST_ASSERT_GREATER_THAN(0,
n);
237 daq::PacketHeader hdr_out;
238 std::vector<uint8_t> ids_out;
244 buf,
n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
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);
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;
262 const uint32_t ts = 11112u;
265 sensor_ids, ref_voltage, necessary_for_abort, controller_ip, 0, ts, buf,
267 TEST_ASSERT_GREATER_THAN(0,
n);
269 daq::PacketHeader hdr_out;
270 std::vector<uint8_t> ids_out;
273 uint32_t ip_out = 0xFFFFFFFF;
276 buf,
n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
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);
286 std::vector<uint8_t> sensor_ids;
289 11113u, buf,
sizeof(buf));
290 TEST_ASSERT_GREATER_THAN(0,
n);
292 daq::PacketHeader hdr_out;
293 std::vector<uint8_t> ids_out;
294 uint8_t ref_out, serial_out;
298 buf,
n, hdr_out, ids_out, ref_out, abort_out, ip_out, serial_out));
299 TEST_ASSERT_EQUAL(0, ids_out.size());
307 std::vector<daq::AbortActuatorLocation> actuators;
308 actuators.push_back({0xC0A80201, 1, 1, 0});
309 actuators.push_back({0xC0A80202, 3, 0, 1});
311 std::vector<daq::AbortPTLocation> pts;
312 pts.push_back({0xC0A80203, 2, 500000});
317 TEST_ASSERT_GREATER_THAN(0,
n);
319 daq::PacketHeader hdr_out;
320 uint8_t is_controller;
321 std::vector<daq::AbortActuatorLocation> act_out;
322 std::vector<daq::AbortPTLocation> pt_out;
325 buf,
n, hdr_out, is_controller, act_out, pt_out, serial_out));
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);
341 std::vector<daq::AbortActuatorLocation> actuators;
342 actuators.push_back({0xC0A80201, 1, 1, 1});
343 std::vector<daq::AbortPTLocation> pts;
348 TEST_ASSERT_GREATER_THAN(0,
n);
350 daq::PacketHeader hdr_out;
351 uint8_t is_controller;
352 std::vector<daq::AbortActuatorLocation> act_out;
353 std::vector<daq::AbortPTLocation> pt_out;
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);
369 std::vector<daq::SelfTestResult> results;
370 results.push_back({1, 1});
371 results.push_back({2, 0});
372 results.push_back({5, 1});
374 const uint32_t ts = 33333u;
377 TEST_ASSERT_GREATER_THAN(0,
n);
379 daq::PacketHeader hdr_out;
380 uint8_t adc_good_out;
381 std::vector<daq::SelfTestResult> results_out;
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);
395 std::vector<daq::SelfTestResult> results;
396 results.push_back({1, 0});
401 TEST_ASSERT_GREATER_THAN(0,
n);
403 daq::PacketHeader hdr_out;
404 uint8_t adc_good_out;
405 std::vector<daq::SelfTestResult> results_out;
408 TEST_ASSERT_EQUAL(33334u, hdr_out.timestamp);
409 TEST_ASSERT_EQUAL(0, adc_good_out);
417 const uint32_t ts = 44444u;
420 TEST_ASSERT_GREATER_THAN(0,
n);
421 TEST_ASSERT_EQUAL(
sizeof(daq::PacketHeader),
n);
423 daq::PacketHeader hdr_out;
426 (
int)hdr_out.packet_type);
427 TEST_ASSERT_EQUAL(ts, hdr_out.timestamp);
440 daq::PacketHeader hdr;
441 daq::BoardHeartbeatPacket hb;
444 std::vector<daq::SensorDataChunkCollection>
chunks;
447 std::vector<daq::ActuatorCommand> cmds;
457 const char* text =
"line1\nline2\n";
458 const uint16_t text_len = (uint16_t)strlen(text);
461 0xDEADBEEFu, buf,
sizeof(buf));
462 const size_t hdr =
sizeof(daq::PacketHeader);
463 TEST_ASSERT_EQUAL(hdr + 3 + text_len,
n);
466 memcpy(&ts, buf + 2, 4);
467 TEST_ASSERT_EQUAL_UINT32(0xDEADBEEFu, ts);
468 TEST_ASSERT_EQUAL_UINT8(0x01, buf[hdr]);
470 memcpy(&tl, buf + hdr + 1, 2);
471 TEST_ASSERT_EQUAL_UINT16(text_len, tl);
472 TEST_ASSERT_EQUAL_MEMORY(text, buf + hdr + 3, text_len);
476 const char* text =
"hello";
483 const char* text =
"ONLINE board=3\nstate=IDLE\n";
484 const uint16_t text_len = (uint16_t)strlen(text);
487 0x12345678u, buf,
sizeof(buf));
488 TEST_ASSERT_NOT_EQUAL(0,
n);
490 daq::PacketHeader hdr;
492 const uint8_t* out_text =
nullptr;
493 uint16_t out_len = 0;
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);
504 const char* text =
"hello";
508 TEST_ASSERT_NOT_EQUAL(0,
n);
510 daq::PacketHeader hdr;
512 const uint8_t* out_text =
nullptr;
513 uint16_t out_len = 0;
522 daq::BoardHeartbeatPacket hb{};
524 TEST_ASSERT_NOT_EQUAL(0,
n);
526 daq::PacketHeader hdr;
528 const uint8_t* out_text =
nullptr;
529 uint16_t out_len = 0;
543int main(
int argc,
char** argv) {
std::vector< daq::SensorDataChunkCollection > chunks
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
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.
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 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 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()