1 | #ifdef __cplusplus
|
---|
2 | extern "C" {
|
---|
3 | #endif
|
---|
4 |
|
---|
5 | #ifndef _CHECKSUM_H_
|
---|
6 | #define _CHECKSUM_H_
|
---|
7 |
|
---|
8 | // Visual Studio versions before 2010 don't have stdint.h, so we just error out.
|
---|
9 | #if (defined _MSC_VER) && (_MSC_VER < 1600)
|
---|
10 | #error "The C-MAVLink implementation requires Visual Studio 2010 or greater"
|
---|
11 | #endif
|
---|
12 |
|
---|
13 | #include <stdint.h>
|
---|
14 |
|
---|
15 | /**
|
---|
16 | *
|
---|
17 | * CALCULATE THE CHECKSUM
|
---|
18 | *
|
---|
19 | */
|
---|
20 |
|
---|
21 | #define X25_INIT_CRC 0xffff
|
---|
22 | #define X25_VALIDATE_CRC 0xf0b8
|
---|
23 |
|
---|
24 | #ifndef HAVE_CRC_ACCUMULATE
|
---|
25 | /**
|
---|
26 | * @brief Accumulate the X.25 CRC by adding one char at a time.
|
---|
27 | *
|
---|
28 | * The checksum function adds the hash of one char at a time to the
|
---|
29 | * 16 bit checksum (uint16_t).
|
---|
30 | *
|
---|
31 | * @param data new char to hash
|
---|
32 | * @param crcAccum the already accumulated checksum
|
---|
33 | **/
|
---|
34 | static inline void crc_accumulate(uint8_t data, uint16_t *crcAccum)
|
---|
35 | {
|
---|
36 | /*Accumulate one byte of data into the CRC*/
|
---|
37 | uint8_t tmp;
|
---|
38 |
|
---|
39 | tmp = data ^ (uint8_t)(*crcAccum &0xff);
|
---|
40 | tmp ^= (tmp<<4);
|
---|
41 | *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
|
---|
42 | }
|
---|
43 | #endif
|
---|
44 |
|
---|
45 |
|
---|
46 | /**
|
---|
47 | * @brief Initiliaze the buffer for the X.25 CRC
|
---|
48 | *
|
---|
49 | * @param crcAccum the 16 bit X.25 CRC
|
---|
50 | */
|
---|
51 | static inline void crc_init(uint16_t* crcAccum)
|
---|
52 | {
|
---|
53 | *crcAccum = X25_INIT_CRC;
|
---|
54 | }
|
---|
55 |
|
---|
56 |
|
---|
57 | /**
|
---|
58 | * @brief Calculates the X.25 checksum on a byte buffer
|
---|
59 | *
|
---|
60 | * @param pBuffer buffer containing the byte array to hash
|
---|
61 | * @param length length of the byte array
|
---|
62 | * @return the checksum over the buffer bytes
|
---|
63 | **/
|
---|
64 | static inline uint16_t crc_calculate(const uint8_t* pBuffer, uint16_t length)
|
---|
65 | {
|
---|
66 | uint16_t crcTmp;
|
---|
67 | crc_init(&crcTmp);
|
---|
68 | while (length--) {
|
---|
69 | crc_accumulate(*pBuffer++, &crcTmp);
|
---|
70 | }
|
---|
71 | return crcTmp;
|
---|
72 | }
|
---|
73 |
|
---|
74 |
|
---|
75 | /**
|
---|
76 | * @brief Accumulate the X.25 CRC by adding an array of bytes
|
---|
77 | *
|
---|
78 | * The checksum function adds the hash of one char at a time to the
|
---|
79 | * 16 bit checksum (uint16_t).
|
---|
80 | *
|
---|
81 | * @param data new bytes to hash
|
---|
82 | * @param crcAccum the already accumulated checksum
|
---|
83 | **/
|
---|
84 | static inline void crc_accumulate_buffer(uint16_t *crcAccum, const char *pBuffer, uint16_t length)
|
---|
85 | {
|
---|
86 | const uint8_t *p = (const uint8_t *)pBuffer;
|
---|
87 | while (length--) {
|
---|
88 | crc_accumulate(*p++, crcAccum);
|
---|
89 | }
|
---|
90 | }
|
---|
91 |
|
---|
92 | #endif /* _CHECKSUM_H_ */
|
---|
93 |
|
---|
94 | #ifdef __cplusplus
|
---|
95 | }
|
---|
96 | #endif
|
---|