Branch data MC/DC data Line data Source code
1 : : : #include <stdint.h>
2 : : : #include <string.h>
3 : : :
4 : : : #include "common.h"
5 : : :
6 : : : #include "can.h"
7 : : : #include "message_types.h"
8 : : : #include "msg_common.h"
9 : : : #include "msg_stream.h"
10 : : :
11 : : : // Fields are 24-bit big-endian.
12 : : : #define STREAM_SIZE_MAX 0xFFFFFFu
13 : : :
14 : : 2 : void build_stream_status_msg(can_msg_prio_t prio, uint16_t timestamp, uint32_t total_size,
15 : : : uint32_t tx_size, can_msg_t *output) {
16 [ + + ]: [ T F ]: 2 : w_assert(output);
17 [ + - ]: [ T f ]: 1 : w_assert(total_size <= STREAM_SIZE_MAX);
18 [ + - ]: [ T f ]: 1 : w_assert(tx_size <= STREAM_SIZE_MAX);
19 : : :
20 : : 1 : output->sid = build_sid(prio, MSG_STREAM_STATUS, 0);
21 : : 1 : write_timestamp(timestamp, output);
22 : : :
23 : : 1 : output->data[2] = (uint8_t)((total_size >> 16) & 0xFF);
24 : : 1 : output->data[3] = (uint8_t)((total_size >> 8) & 0xFF);
25 : : 1 : output->data[4] = (uint8_t)(total_size & 0xFF);
26 : : 1 : output->data[5] = (uint8_t)((tx_size >> 16) & 0xFF);
27 : : 1 : output->data[6] = (uint8_t)((tx_size >> 8) & 0xFF);
28 : : 1 : output->data[7] = (uint8_t)(tx_size & 0xFF);
29 : : 1 : output->data_len = 8;
30 : : 1 : }
31 : : :
32 : : 4 : void build_stream_data_msg(can_msg_prio_t prio, uint16_t timestamp, uint8_t seq_id,
33 : : : const uint8_t *payload, uint8_t payload_len, can_msg_t *output) {
34 [ + + ]: [ T F ]: 4 : w_assert(output);
35 [ + + ]: [ T F ]: 2 : w_assert(payload);
36 [ + - ]: [ T f ]: 1 : w_assert(payload_len <= STREAM_DATA_MAX_PAYLOAD_LEN);
37 : : :
38 : : 1 : output->sid = build_sid(prio, MSG_STREAM_DATA, seq_id);
39 : : 1 : write_timestamp(timestamp, output);
40 : : :
41 : : 1 : memcpy(&output->data[2], payload, payload_len);
42 : : :
43 : : 1 : output->data_len = (uint8_t)(payload_len + 2);
44 : : 1 : }
45 : : :
46 : : 2 : void build_stream_retry_msg(can_msg_prio_t prio, uint16_t timestamp, uint8_t seq_id,
47 : : : can_msg_t *output) {
48 [ + + ]: [ T F ]: 2 : w_assert(output);
49 : : :
50 : : 1 : output->sid = build_sid(prio, MSG_STREAM_RETRY, seq_id);
51 : : 1 : write_timestamp(timestamp, output);
52 : : :
53 : : 1 : output->data_len = 2;
54 : : 1 : }
55 : : :
56 : : 6 : w_status_t get_stream_status(const can_msg_t *msg, uint32_t *total_size, uint32_t *tx_size) {
57 [ + + ]: [ T F ]: 6 : w_assert(msg);
58 [ + + ]: [ T F ]: 4 : w_assert(total_size);
59 [ + + ]: [ T F ]: 3 : w_assert(tx_size);
60 : : :
61 : : 2 : *total_size = ((uint32_t)msg->data[2] << 16) | ((uint32_t)msg->data[3] << 8) | msg->data[4];
62 : : 2 : *tx_size = ((uint32_t)msg->data[5] << 16) | ((uint32_t)msg->data[6] << 8) | msg->data[7];
63 : : :
64 [ + + ]: [ T F ]: 2 : if (get_message_type(msg) != MSG_STREAM_STATUS) {
65 : : 1 : return W_INVALID_PARAM;
66 : : : }
67 : : :
68 [ - + ]: [ t F ]: 1 : if (msg->data_len != 8) {
69 : : 0 : return W_DATA_FORMAT_ERROR;
70 : : : }
71 : : :
72 : : 1 : return W_SUCCESS;
73 : : : }
74 : : :
75 : : 8 : w_status_t get_stream_data(const can_msg_t *msg, uint8_t *seq_id, uint8_t *payload,
76 : : : uint8_t *payload_len) {
77 [ + + ]: [ T F ]: 8 : w_assert(msg);
78 [ + + ]: [ T F ]: 6 : w_assert(seq_id);
79 [ + + ]: [ T F ]: 5 : w_assert(payload);
80 [ + + ]: [ T F ]: 4 : w_assert(payload_len);
81 : : :
82 : : 3 : uint8_t msg_payload_len = (uint8_t)(msg->data_len - 2);
83 : : 3 : memcpy(payload, &msg->data[2], msg_payload_len);
84 : : :
85 : : 3 : *seq_id = msg->sid & 0xff;
86 : : 3 : *payload_len = msg_payload_len;
87 : : :
88 [ + + ]: [ T F ]: 3 : if (get_message_type(msg) != MSG_STREAM_DATA) {
89 : : 1 : return W_INVALID_PARAM;
90 : : : }
91 : : :
92 [ + + - + ]:[ T F t F ]: 2 : if ((msg->data_len < 3) || (msg->data_len > (2 + STREAM_DATA_MAX_PAYLOAD_LEN))) {
93 : : 1 : return W_DATA_FORMAT_ERROR;
94 : : : }
95 : : :
96 : : 1 : return W_SUCCESS;
97 : : : }
98 : : :
99 : : 6 : w_status_t get_stream_retry_seq_id(const can_msg_t *msg, uint8_t *seq_id) {
100 [ + + ]: [ T F ]: 6 : w_assert(msg);
101 [ + + ]: [ T F ]: 4 : w_assert(seq_id);
102 : : :
103 : : 3 : *seq_id = get_message_metadata(msg);
104 : : :
105 [ + + ]: [ T F ]: 3 : if (get_message_type(msg) != MSG_STREAM_RETRY) {
106 : : 1 : return W_INVALID_PARAM;
107 : : : }
108 : : :
109 [ + + ]: [ T F ]: 2 : if (msg->data_len != 2) {
110 : : 1 : return W_DATA_FORMAT_ERROR;
111 : : : }
112 : : :
113 : : 1 : return W_SUCCESS;
114 : : : }
|