40e0ccb3cdafb84ee3bceafebbe155c88c2cc87c
[clinton/Smoothieware.git] / src / libs / checksumm.h
1 /*
2 Copyright 2013 Adam Green (https://github.com/adamgreen)
3
4 This file is part of Smoothie (http://smoothieware.org/)
5 The motion control part is heavily based on Grbl (https://github.com/simen/grbl)
6
7 Smoothie is free software: you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation, either version 3 of the License, or (at your option)
10 any later version.
11
12 Smoothie is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 details.
16
17 You should have received a copy of the GNU General Public License along
18 with Smoothie. If not, see <http://www.gnu.org/licenses/>.
19 */
20 /* Calculates Fletcher Checksum at compile time using recursive macros. */
21 #ifndef _CHECKSUM_MACRO_H_
22 #define _CHECKSUM_MACRO_H_
23
24 /* Recursively define SUM1, the basic checksum % 255 */
25 #define SUM1_1(X) ((X)[0] % 255)
26 #define SUM1_2(X) ((SUM1_1(X) + (X)[1]) % 255)
27 #define SUM1_3(X) ((SUM1_2(X) + (X)[2]) % 255)
28 #define SUM1_4(X) ((SUM1_3(X) + (X)[3]) % 255)
29 #define SUM1_5(X) ((SUM1_4(X) + (X)[4]) % 255)
30 #define SUM1_6(X) ((SUM1_5(X) + (X)[5]) % 255)
31 #define SUM1_7(X) ((SUM1_6(X) + (X)[6]) % 255)
32 #define SUM1_8(X) ((SUM1_7(X) + (X)[7]) % 255)
33 #define SUM1_9(X) ((SUM1_8(X) + (X)[8]) % 255)
34 #define SUM1_10(X) ((SUM1_9(X) + (X)[9]) % 255)
35 #define SUM1_11(X) ((SUM1_10(X) + (X)[10]) % 255)
36 #define SUM1_12(X) ((SUM1_11(X) + (X)[11]) % 255)
37 #define SUM1_13(X) ((SUM1_12(X) + (X)[12]) % 255)
38 #define SUM1_14(X) ((SUM1_13(X) + (X)[13]) % 255)
39 #define SUM1_15(X) ((SUM1_14(X) + (X)[14]) % 255)
40 #define SUM1_16(X) ((SUM1_15(X) + (X)[15]) % 255)
41 #define SUM1_17(X) ((SUM1_16(X) + (X)[16]) % 255)
42 #define SUM1_18(X) ((SUM1_17(X) + (X)[17]) % 255)
43 #define SUM1_19(X) ((SUM1_18(X) + (X)[18]) % 255)
44 #define SUM1_20(X) ((SUM1_19(X) + (X)[19]) % 255)
45 #define SUM1_21(X) ((SUM1_20(X) + (X)[20]) % 255)
46 #define SUM1_22(X) ((SUM1_21(X) + (X)[21]) % 255)
47 #define SUM1_23(X) ((SUM1_22(X) + (X)[22]) % 255)
48 #define SUM1_24(X) ((SUM1_23(X) + (X)[23]) % 255)
49 #define SUM1_25(X) ((SUM1_24(X) + (X)[24]) % 255)
50 #define SUM1_26(X) ((SUM1_25(X) + (X)[25]) % 255)
51 #define SUM1_27(X) ((SUM1_26(X) + (X)[26]) % 255)
52 #define SUM1_28(X) ((SUM1_27(X) + (X)[27]) % 255)
53 #define SUM1_29(X) ((SUM1_28(X) + (X)[28]) % 255)
54 #define SUM1_30(X) ((SUM1_29(X) + (X)[29]) % 255)
55 #define SUM1_31(X) ((SUM1_30(X) + (X)[30]) % 255)
56 #define SUM1_32(X) ((SUM1_31(X) + (X)[31]) % 255)
57
58 /* Recursively define SUM2, the sum of SUM1s % 255 */
59 #define SUM2_1(X) (SUM1_1(X) % 255)
60 #define SUM2_2(X) ((SUM2_1(X) + SUM1_2(X)) % 255)
61 #define SUM2_3(X) ((SUM2_2(X) + SUM1_3(X)) % 255)
62 #define SUM2_4(X) ((SUM2_3(X) + SUM1_4(X)) % 255)
63 #define SUM2_5(X) ((SUM2_4(X) + SUM1_5(X)) % 255)
64 #define SUM2_6(X) ((SUM2_5(X) + SUM1_6(X)) % 255)
65 #define SUM2_7(X) ((SUM2_6(X) + SUM1_7(X)) % 255)
66 #define SUM2_8(X) ((SUM2_7(X) + SUM1_8(X)) % 255)
67 #define SUM2_9(X) ((SUM2_8(X) + SUM1_9(X)) % 255)
68 #define SUM2_10(X) ((SUM2_9(X) + SUM1_10(X)) % 255)
69 #define SUM2_11(X) ((SUM2_10(X) + SUM1_11(X)) % 255)
70 #define SUM2_12(X) ((SUM2_11(X) + SUM1_12(X)) % 255)
71 #define SUM2_13(X) ((SUM2_12(X) + SUM1_13(X)) % 255)
72 #define SUM2_14(X) ((SUM2_13(X) + SUM1_14(X)) % 255)
73 #define SUM2_15(X) ((SUM2_14(X) + SUM1_15(X)) % 255)
74 #define SUM2_16(X) ((SUM2_15(X) + SUM1_16(X)) % 255)
75 #define SUM2_17(X) ((SUM2_16(X) + SUM1_17(X)) % 255)
76 #define SUM2_18(X) ((SUM2_17(X) + SUM1_18(X)) % 255)
77 #define SUM2_19(X) ((SUM2_18(X) + SUM1_19(X)) % 255)
78 #define SUM2_20(X) ((SUM2_19(X) + SUM1_20(X)) % 255)
79 #define SUM2_21(X) ((SUM2_20(X) + SUM1_21(X)) % 255)
80 #define SUM2_22(X) ((SUM2_21(X) + SUM1_22(X)) % 255)
81 #define SUM2_23(X) ((SUM2_22(X) + SUM1_23(X)) % 255)
82 #define SUM2_24(X) ((SUM2_23(X) + SUM1_24(X)) % 255)
83 #define SUM2_25(X) ((SUM2_24(X) + SUM1_25(X)) % 255)
84 #define SUM2_26(X) ((SUM2_25(X) + SUM1_26(X)) % 255)
85 #define SUM2_27(X) ((SUM2_26(X) + SUM1_27(X)) % 255)
86 #define SUM2_28(X) ((SUM2_27(X) + SUM1_28(X)) % 255)
87 #define SUM2_29(X) ((SUM2_28(X) + SUM1_29(X)) % 255)
88 #define SUM2_30(X) ((SUM2_29(X) + SUM1_30(X)) % 255)
89 #define SUM2_31(X) ((SUM2_30(X) + SUM1_31(X)) % 255)
90 #define SUM2_32(X) ((SUM2_31(X) + SUM1_32(X)) % 255)
91
92 /* Define overall checksum as 16-bit combination of SUM1 in lower 8-bits and SUM2 in upper 8-bits. */
93 #define CHECKSUM_(SUM1,SUM2) (SUM1) | (SUM2 << 8)
94 #define CHECKSUM_1(X) CHECKSUM_(SUM1_1(X),SUM2_1(X))
95 #define CHECKSUM_2(X) CHECKSUM_(SUM1_2(X),SUM2_2(X))
96 #define CHECKSUM_3(X) CHECKSUM_(SUM1_3(X),SUM2_3(X))
97 #define CHECKSUM_4(X) CHECKSUM_(SUM1_4(X),SUM2_4(X))
98 #define CHECKSUM_5(X) CHECKSUM_(SUM1_5(X),SUM2_5(X))
99 #define CHECKSUM_6(X) CHECKSUM_(SUM1_6(X),SUM2_6(X))
100 #define CHECKSUM_7(X) CHECKSUM_(SUM1_7(X),SUM2_7(X))
101 #define CHECKSUM_8(X) CHECKSUM_(SUM1_8(X),SUM2_8(X))
102 #define CHECKSUM_9(X) CHECKSUM_(SUM1_9(X),SUM2_9(X))
103 #define CHECKSUM_10(X) CHECKSUM_(SUM1_10(X),SUM2_10(X))
104 #define CHECKSUM_11(X) CHECKSUM_(SUM1_11(X),SUM2_11(X))
105 #define CHECKSUM_12(X) CHECKSUM_(SUM1_12(X),SUM2_12(X))
106 #define CHECKSUM_13(X) CHECKSUM_(SUM1_13(X),SUM2_13(X))
107 #define CHECKSUM_14(X) CHECKSUM_(SUM1_14(X),SUM2_14(X))
108 #define CHECKSUM_15(X) CHECKSUM_(SUM1_15(X),SUM2_15(X))
109 #define CHECKSUM_16(X) CHECKSUM_(SUM1_16(X),SUM2_16(X))
110 #define CHECKSUM_17(X) CHECKSUM_(SUM1_17(X),SUM2_17(X))
111 #define CHECKSUM_18(X) CHECKSUM_(SUM1_18(X),SUM2_18(X))
112 #define CHECKSUM_19(X) CHECKSUM_(SUM1_19(X),SUM2_19(X))
113 #define CHECKSUM_20(X) CHECKSUM_(SUM1_20(X),SUM2_20(X))
114 #define CHECKSUM_21(X) CHECKSUM_(SUM1_21(X),SUM2_21(X))
115 #define CHECKSUM_22(X) CHECKSUM_(SUM1_22(X),SUM2_22(X))
116 #define CHECKSUM_23(X) CHECKSUM_(SUM1_23(X),SUM2_23(X))
117 #define CHECKSUM_24(X) CHECKSUM_(SUM1_24(X),SUM2_24(X))
118 #define CHECKSUM_25(X) CHECKSUM_(SUM1_25(X),SUM2_25(X))
119 #define CHECKSUM_26(X) CHECKSUM_(SUM1_26(X),SUM2_26(X))
120 #define CHECKSUM_27(X) CHECKSUM_(SUM1_27(X),SUM2_27(X))
121 #define CHECKSUM_28(X) CHECKSUM_(SUM1_28(X),SUM2_28(X))
122 #define CHECKSUM_29(X) CHECKSUM_(SUM1_29(X),SUM2_29(X))
123 #define CHECKSUM_30(X) CHECKSUM_(SUM1_30(X),SUM2_30(X))
124 #define CHECKSUM_31(X) CHECKSUM_(SUM1_31(X),SUM2_31(X))
125 #define CHECKSUM_32(X) CHECKSUM_(SUM1_32(X),SUM2_32(X))
126
127 #define CHECKSUM(X) (sizeof(X) == 0 ? 0 : \
128 sizeof(X) == 1 ? 0 : \
129 sizeof(X) == 2 ? CHECKSUM_1(X) : \
130 sizeof(X) == 3 ? CHECKSUM_2(X) : \
131 sizeof(X) == 4 ? CHECKSUM_3(X) : \
132 sizeof(X) == 5 ? CHECKSUM_4(X) : \
133 sizeof(X) == 6 ? CHECKSUM_5(X) : \
134 sizeof(X) == 7 ? CHECKSUM_6(X) : \
135 sizeof(X) == 8 ? CHECKSUM_7(X) : \
136 sizeof(X) == 9 ? CHECKSUM_8(X) : \
137 sizeof(X) == 10 ? CHECKSUM_9(X) : \
138 sizeof(X) == 11 ? CHECKSUM_10(X) : \
139 sizeof(X) == 12 ? CHECKSUM_11(X) : \
140 sizeof(X) == 13 ? CHECKSUM_12(X) : \
141 sizeof(X) == 14 ? CHECKSUM_13(X) : \
142 sizeof(X) == 15 ? CHECKSUM_14(X) : \
143 sizeof(X) == 16 ? CHECKSUM_15(X) : \
144 sizeof(X) == 17 ? CHECKSUM_16(X) : \
145 sizeof(X) == 18 ? CHECKSUM_17(X) : \
146 sizeof(X) == 19 ? CHECKSUM_18(X) : \
147 sizeof(X) == 20 ? CHECKSUM_19(X) : \
148 sizeof(X) == 21 ? CHECKSUM_20(X) : \
149 sizeof(X) == 22 ? CHECKSUM_21(X) : \
150 sizeof(X) == 23 ? CHECKSUM_22(X) : \
151 sizeof(X) == 24 ? CHECKSUM_23(X) : \
152 sizeof(X) == 25 ? CHECKSUM_24(X) : \
153 sizeof(X) == 26 ? CHECKSUM_25(X) : \
154 sizeof(X) == 27 ? CHECKSUM_26(X) : \
155 sizeof(X) == 28 ? CHECKSUM_27(X) : \
156 sizeof(X) == 29 ? CHECKSUM_28(X) : \
157 sizeof(X) == 30 ? CHECKSUM_29(X) : \
158 sizeof(X) == 31 ? CHECKSUM_30(X) : \
159 sizeof(X) == 32 ? CHECKSUM_31(X) : \
160 sizeof(X) == 33 ? CHECKSUM_32(X) : \
161 0xFFFF)
162
163 #endif /* _CHECKSUM_MACRO_H_ */