12 struct BAP_Frame* vw_bap_frame_alloc(void)
14 struct BAP_Frame* bap_frame;
16 bap_frame = calloc(1, sizeof(struct BAP_Frame));
22 void vw_bap_frame_free(struct BAP_Frame *bap_frame)
31 void vw_bap_frame_dump(struct BAP_Frame *bap_frame)
35 printf("%u. %2i/%-2i .%02i --",
41 for (i = 0; i < bap_frame->len; i++) {
45 printf("%02x", (unsigned char)(bap_frame->data[i]));
49 for (i = 0; i < bap_frame->len; i++) {
50 unsigned char c = bap_frame->data[i];
51 if (!isprint(c) || c == '\n' || c == '\r') {
67 struct BAP_Frame* vw_bap_handle_can_frame(struct BAP_RXer *bap, struct can_frame *frame)
69 struct BAP_Frame *bap_frame = NULL;
70 unsigned short header;
73 //printf("Received BAP frame from CAN ID %03x\n", frame->can_id);
75 if (frame->can_dlc < 2) {
76 printf("Error: Frame too short\n");
79 if (frame->data[0] & 0x80) {
80 /* This is a multi-frame BAP message */
81 int mfchannel = (frame->data[0] >> 4) & 0x3;
83 if (!(frame->data[0] & 0x40)) {
86 unsigned short header;
89 if (frame->can_dlc < 4) {
90 printf("Error: Frame too short\n");
93 if (bap->mfchannel[mfchannel]) {
94 printf("bap_handle_can_frame: new start frame for open channel\n");
96 bap->mfchannel[mfchannel] = NULL;
98 bap_frame = vw_bap_frame_alloc();
100 printf("bap_handle_can_frame: Failed to allocate new frame\n");
104 bap_frame->is_multiframe = 1;
106 header = (frame->data[2] << 8) | frame->data[3];
107 bap_frame->opcode = (header >> 12) & 0x7;
108 bap_frame->node = (header >> 6) & 0x3F;
109 bap_frame->function = (header >> 0) & 0x3F;
111 bap_frame->len = ((frame->data[0] & 0xF) << 8) | frame->data[1];
113 this_len = frame->can_dlc - 4;
115 if (this_len > bap_frame->len) {
116 printf("bap_handle_can_frame: this_len > len\n");
119 bap->mfchannel[mfchannel] = NULL;
124 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
125 bap->len_done[mfchannel] = this_len;
127 if (bap->len_done[mfchannel] == bap_frame->len) {
128 /* Frame is complete, remove from buffer */
129 bap->mfchannel[mfchannel] = NULL;
132 /* Frame is incomplete, don't emit it yet */
133 bap->mfchannel[mfchannel] = bap_frame;
137 /* Continuation frame */
139 bap_frame = bap->mfchannel[mfchannel];
142 printf("bap_handle_can_frame: continuation frame for unknown mf channel %d\n",
146 this_len = frame->can_dlc - 1;
148 if ((bap->len_done[mfchannel] + this_len) > bap_frame->len) {
149 printf("bap_handle_can_frame: len_done + this_len > len\n");
152 bap->mfchannel[mfchannel] = NULL;
157 memcpy(&bap_frame->data[bap->len_done[mfchannel]],
158 &frame->data[frame->can_dlc - this_len],
160 bap->len_done[mfchannel] += this_len;
162 if (bap->len_done[mfchannel] == bap_frame->len) {
163 /* Frame is complete, remove from buffer */
164 bap->mfchannel[mfchannel] = NULL;
167 /* Frame is incomplete, don't emit it yet */
172 /* Single-frame BAP message */
174 bap_frame = calloc(1, sizeof(struct BAP_Frame));
176 printf("bap_handle_can_frame: Failed to allocate new frame\n");
180 bap_frame->is_multiframe = 0;
182 header = (frame->data[0] << 8) | frame->data[1];
183 bap_frame->opcode = (header >> 12) & 0x7;
184 bap_frame->node = (header >> 6) & 0x3F;
185 bap_frame->function = (header >> 0) & 0x3F;
187 this_len = frame->can_dlc - 2;
189 bap_frame->len = this_len;
191 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
201 struct BAP_RXer* vw_bap_rxer_alloc()
203 struct BAP_RXer *bap;
205 bap = calloc(1, sizeof(*bap));
216 void vw_bap_rxer_free(struct BAP_RXer *bap)
220 for (i = 0; i < 8; i++) {
221 if (bap->mfchannel[i]) {
222 vw_bap_frame_free(bap->mfchannel[i]);