forked from PSU-AVT/QuadLLFC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathafproto.c
111 lines (91 loc) · 2.63 KB
/
afproto.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (c) 2011 Gregory Haynes <[email protected]>
*
* Licensed under the BSD license. See LICENSE for more information.
*/
#include "afproto.h"
#include "crc8.h"
#ifdef TEST_GCC
#include <stdio.h>
#endif
uint8_t afproto_get_payload(const unsigned char *buffer,
uint8_t buff_length,
unsigned char *payload,
uint8_t *payload_length) {
uint8_t ndx = 0;
uint8_t start_ndx;
uint8_t crc = 0;
uint8_t length;
*payload_length = 0;
// Find frame start
while(ndx < buff_length && buffer[ndx] != AFPROTO_FRAME_START_BYTE) {
if(buffer[ndx] == AFPROTO_FRAME_ESCAPE_BYTE) ndx+=2;
else ++ndx;
}
// Set start ndx or return if not found
if(buffer[ndx] != AFPROTO_FRAME_START_BYTE) return 0;
else start_ndx = ndx;
++ndx;
length = buffer[ndx];
ndx += 2;
// Copy payload, gen crc, and unescape
uint8_t end_ndx = length + ndx;
uint8_t payload_ndx = 0;
for(;ndx < end_ndx && ndx < buff_length;++ndx) {
if(buffer[ndx] == AFPROTO_FRAME_ESCAPE_BYTE) {
crc = crc_8_update(crc, buffer[ndx]);
++ndx;
if(ndx == end_ndx)
break;
}
crc = crc_8_update(crc, buffer[ndx]);
payload[payload_ndx++] = buffer[ndx];
}
// Check end byte
if(buffer[ndx++] != AFPROTO_FRAME_END_BYTE) return 0;
// Check length
if(ndx - start_ndx != length + 4) return 0;
// Check crc
if(crc != buffer[start_ndx+2]) return 0;
*payload_length = length;
return ndx;
}
uint8_t afproto_serialize_payload(const unsigned char *payload,
uint8_t length,
unsigned char *dest) {
uint8_t crc = 0;
uint8_t ndx = 3;
uint8_t payload_ndx = 0;
for(;payload_ndx<length;++payload_ndx) {
if(payload[payload_ndx] == AFPROTO_FRAME_START_BYTE ||
payload[payload_ndx] == AFPROTO_FRAME_ESCAPE_BYTE ||
payload[payload_ndx] == AFPROTO_FRAME_END_BYTE) {
crc = crc_8_update(crc, AFPROTO_FRAME_ESCAPE_BYTE);
dest[ndx++] = AFPROTO_FRAME_ESCAPE_BYTE;
}
crc = crc_8_update(crc, payload[payload_ndx]);
dest[ndx++] = payload[payload_ndx];
}
dest[0] = AFPROTO_FRAME_START_BYTE;
dest[1] = ndx-3;
dest[2] = crc;
dest[ndx++] = AFPROTO_FRAME_END_BYTE;
return ndx;
}
#if TEST_GCC
int main(int argc, char **argv) {
char buff[256];
char buff2[256];
uint8_t length;
int i;
length = afproto_serialize_payload("Hello", 5, buff);
for(i = 0;i < length;++i)
printf("%x ", (uint8_t)buff[i]);
printf("\n");
afproto_get_payload("\xa3\x0e\x09\x04\x00\x00\x00\x00\x1a\xdf\x85\xa3\xc\x00\x00\x00\x00\x59", 18, buff2, &length);
printf("%d: ", length);
for(i = 0;i < length;i++)
printf("%c", buff2[i]);
printf("\n");
}
#endif