Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Smoothie by
checksumm.h
00001 /* 00002 This file is part of Smoothie (http://smoothieware.org/) 00003 The motion control part is heavily based on Grbl (https://github.com/simen/grbl) 00004 00005 Smoothie is free software: you can redistribute it and/or modify it under 00006 the terms of the GNU General Public License as published by the Free 00007 Software Foundation, either version 3 of the License, or (at your option) 00008 any later version. 00009 00010 Smoothie is distributed in the hope that it will be useful, but WITHOUT ANY 00011 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00012 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 00013 details. 00014 00015 You should have received a copy of the GNU General Public License along 00016 with Smoothie. If not, see <http://www.gnu.org/licenses/>. 00017 */ 00018 /* Calculates Fletcher Checksum at compile time using recursive macros. */ 00019 #ifndef _CHECKSUM_MACRO_H_ 00020 #define _CHECKSUM_MACRO_H_ 00021 00022 /* There are two compile time checksumming approaches in this file. One uses 00023 the C preprocessor and the other uses new C++11 features. They should both 00024 do the same thing but my current compiler, GCC 4.7, doesn't always do the 00025 constant folding for the C++ approach and this causes code bloat. The C 00026 preprocessor approach can currently generate the exact same code in 00027 Checked/Release builds as the old method of pre-calculating checksums by 00028 hand and pasting them into the code. 00029 00030 Keeping both versions here: the active C version and the C++ version 00031 that we should switch to later if newer compilers do the required constant 00032 folding (maybe there are optimization flags to help here.) 00033 */ 00034 #ifdef CHECKSUM_USE_CPP 00035 00036 #include <type_traits> 00037 00038 /* Cool C++11 approach contributed by bgamari on #smoothieware IRC channel. 00039 * Unfortunately this will have to wait until after we switch to GCC 4.7. 00040 */ 00041 constexpr uint16_t checksum(const char* s, size_t n, size_t i, uint16_t sum1, uint16_t sum2) { 00042 return (i <= n) ? checksum(s, n, i+1, (sum1 + s[i]) % 255, (sum2 + sum1) % 255) : ((sum2 << 8) | sum1); 00043 } 00044 00045 constexpr uint16_t operator "" _checksum(const char* s, size_t n) { 00046 return checksum(s, n, 0, 0, 0); 00047 } 00048 00049 #define CHECKSUM(X) std::integral_constant<uint16_t, X##_checksum>::value 00050 00051 #else /* !CHECKSUM_USE_CPP */ 00052 00053 /* Adam Green's old and crusty C approach. */ 00054 /* Recursively define SUM1, the basic checksum % 255 */ 00055 #define SUM1_1(X) ((X)[0] % 255) 00056 #define SUM1_2(X) ((SUM1_1(X) + (X)[1]) % 255) 00057 #define SUM1_3(X) ((SUM1_2(X) + (X)[2]) % 255) 00058 #define SUM1_4(X) ((SUM1_3(X) + (X)[3]) % 255) 00059 #define SUM1_5(X) ((SUM1_4(X) + (X)[4]) % 255) 00060 #define SUM1_6(X) ((SUM1_5(X) + (X)[5]) % 255) 00061 #define SUM1_7(X) ((SUM1_6(X) + (X)[6]) % 255) 00062 #define SUM1_8(X) ((SUM1_7(X) + (X)[7]) % 255) 00063 #define SUM1_9(X) ((SUM1_8(X) + (X)[8]) % 255) 00064 #define SUM1_10(X) ((SUM1_9(X) + (X)[9]) % 255) 00065 #define SUM1_11(X) ((SUM1_10(X) + (X)[10]) % 255) 00066 #define SUM1_12(X) ((SUM1_11(X) + (X)[11]) % 255) 00067 #define SUM1_13(X) ((SUM1_12(X) + (X)[12]) % 255) 00068 #define SUM1_14(X) ((SUM1_13(X) + (X)[13]) % 255) 00069 #define SUM1_15(X) ((SUM1_14(X) + (X)[14]) % 255) 00070 #define SUM1_16(X) ((SUM1_15(X) + (X)[15]) % 255) 00071 #define SUM1_17(X) ((SUM1_16(X) + (X)[16]) % 255) 00072 #define SUM1_18(X) ((SUM1_17(X) + (X)[17]) % 255) 00073 #define SUM1_19(X) ((SUM1_18(X) + (X)[18]) % 255) 00074 #define SUM1_20(X) ((SUM1_19(X) + (X)[19]) % 255) 00075 #define SUM1_21(X) ((SUM1_20(X) + (X)[20]) % 255) 00076 #define SUM1_22(X) ((SUM1_21(X) + (X)[21]) % 255) 00077 #define SUM1_23(X) ((SUM1_22(X) + (X)[22]) % 255) 00078 #define SUM1_24(X) ((SUM1_23(X) + (X)[23]) % 255) 00079 #define SUM1_25(X) ((SUM1_24(X) + (X)[24]) % 255) 00080 #define SUM1_26(X) ((SUM1_25(X) + (X)[25]) % 255) 00081 #define SUM1_27(X) ((SUM1_26(X) + (X)[26]) % 255) 00082 #define SUM1_28(X) ((SUM1_27(X) + (X)[27]) % 255) 00083 #define SUM1_29(X) ((SUM1_28(X) + (X)[28]) % 255) 00084 #define SUM1_30(X) ((SUM1_29(X) + (X)[29]) % 255) 00085 #define SUM1_31(X) ((SUM1_30(X) + (X)[30]) % 255) 00086 #define SUM1_32(X) ((SUM1_31(X) + (X)[31]) % 255) 00087 00088 /* Recursively define SUM2, the sum of SUM1s % 255 */ 00089 #define SUM2_1(X) (SUM1_1(X) % 255) 00090 #define SUM2_2(X) ((SUM2_1(X) + SUM1_2(X)) % 255) 00091 #define SUM2_3(X) ((SUM2_2(X) + SUM1_3(X)) % 255) 00092 #define SUM2_4(X) ((SUM2_3(X) + SUM1_4(X)) % 255) 00093 #define SUM2_5(X) ((SUM2_4(X) + SUM1_5(X)) % 255) 00094 #define SUM2_6(X) ((SUM2_5(X) + SUM1_6(X)) % 255) 00095 #define SUM2_7(X) ((SUM2_6(X) + SUM1_7(X)) % 255) 00096 #define SUM2_8(X) ((SUM2_7(X) + SUM1_8(X)) % 255) 00097 #define SUM2_9(X) ((SUM2_8(X) + SUM1_9(X)) % 255) 00098 #define SUM2_10(X) ((SUM2_9(X) + SUM1_10(X)) % 255) 00099 #define SUM2_11(X) ((SUM2_10(X) + SUM1_11(X)) % 255) 00100 #define SUM2_12(X) ((SUM2_11(X) + SUM1_12(X)) % 255) 00101 #define SUM2_13(X) ((SUM2_12(X) + SUM1_13(X)) % 255) 00102 #define SUM2_14(X) ((SUM2_13(X) + SUM1_14(X)) % 255) 00103 #define SUM2_15(X) ((SUM2_14(X) + SUM1_15(X)) % 255) 00104 #define SUM2_16(X) ((SUM2_15(X) + SUM1_16(X)) % 255) 00105 #define SUM2_17(X) ((SUM2_16(X) + SUM1_17(X)) % 255) 00106 #define SUM2_18(X) ((SUM2_17(X) + SUM1_18(X)) % 255) 00107 #define SUM2_19(X) ((SUM2_18(X) + SUM1_19(X)) % 255) 00108 #define SUM2_20(X) ((SUM2_19(X) + SUM1_20(X)) % 255) 00109 #define SUM2_21(X) ((SUM2_20(X) + SUM1_21(X)) % 255) 00110 #define SUM2_22(X) ((SUM2_21(X) + SUM1_22(X)) % 255) 00111 #define SUM2_23(X) ((SUM2_22(X) + SUM1_23(X)) % 255) 00112 #define SUM2_24(X) ((SUM2_23(X) + SUM1_24(X)) % 255) 00113 #define SUM2_25(X) ((SUM2_24(X) + SUM1_25(X)) % 255) 00114 #define SUM2_26(X) ((SUM2_25(X) + SUM1_26(X)) % 255) 00115 #define SUM2_27(X) ((SUM2_26(X) + SUM1_27(X)) % 255) 00116 #define SUM2_28(X) ((SUM2_27(X) + SUM1_28(X)) % 255) 00117 #define SUM2_29(X) ((SUM2_28(X) + SUM1_29(X)) % 255) 00118 #define SUM2_30(X) ((SUM2_29(X) + SUM1_30(X)) % 255) 00119 #define SUM2_31(X) ((SUM2_30(X) + SUM1_31(X)) % 255) 00120 #define SUM2_32(X) ((SUM2_31(X) + SUM1_32(X)) % 255) 00121 00122 /* Define overall checksum as 16-bit combination of SUM1 in lower 8-bits and SUM2 in upper 8-bits. */ 00123 #define CHECKSUM_(SUM1,SUM2) (SUM1) | (SUM2 << 8) 00124 #define CHECKSUM_1(X) CHECKSUM_(SUM1_1(X),SUM2_1(X)) 00125 #define CHECKSUM_2(X) CHECKSUM_(SUM1_2(X),SUM2_2(X)) 00126 #define CHECKSUM_3(X) CHECKSUM_(SUM1_3(X),SUM2_3(X)) 00127 #define CHECKSUM_4(X) CHECKSUM_(SUM1_4(X),SUM2_4(X)) 00128 #define CHECKSUM_5(X) CHECKSUM_(SUM1_5(X),SUM2_5(X)) 00129 #define CHECKSUM_6(X) CHECKSUM_(SUM1_6(X),SUM2_6(X)) 00130 #define CHECKSUM_7(X) CHECKSUM_(SUM1_7(X),SUM2_7(X)) 00131 #define CHECKSUM_8(X) CHECKSUM_(SUM1_8(X),SUM2_8(X)) 00132 #define CHECKSUM_9(X) CHECKSUM_(SUM1_9(X),SUM2_9(X)) 00133 #define CHECKSUM_10(X) CHECKSUM_(SUM1_10(X),SUM2_10(X)) 00134 #define CHECKSUM_11(X) CHECKSUM_(SUM1_11(X),SUM2_11(X)) 00135 #define CHECKSUM_12(X) CHECKSUM_(SUM1_12(X),SUM2_12(X)) 00136 #define CHECKSUM_13(X) CHECKSUM_(SUM1_13(X),SUM2_13(X)) 00137 #define CHECKSUM_14(X) CHECKSUM_(SUM1_14(X),SUM2_14(X)) 00138 #define CHECKSUM_15(X) CHECKSUM_(SUM1_15(X),SUM2_15(X)) 00139 #define CHECKSUM_16(X) CHECKSUM_(SUM1_16(X),SUM2_16(X)) 00140 #define CHECKSUM_17(X) CHECKSUM_(SUM1_17(X),SUM2_17(X)) 00141 #define CHECKSUM_18(X) CHECKSUM_(SUM1_18(X),SUM2_18(X)) 00142 #define CHECKSUM_19(X) CHECKSUM_(SUM1_19(X),SUM2_19(X)) 00143 #define CHECKSUM_20(X) CHECKSUM_(SUM1_20(X),SUM2_20(X)) 00144 #define CHECKSUM_21(X) CHECKSUM_(SUM1_21(X),SUM2_21(X)) 00145 #define CHECKSUM_22(X) CHECKSUM_(SUM1_22(X),SUM2_22(X)) 00146 #define CHECKSUM_23(X) CHECKSUM_(SUM1_23(X),SUM2_23(X)) 00147 #define CHECKSUM_24(X) CHECKSUM_(SUM1_24(X),SUM2_24(X)) 00148 #define CHECKSUM_25(X) CHECKSUM_(SUM1_25(X),SUM2_25(X)) 00149 #define CHECKSUM_26(X) CHECKSUM_(SUM1_26(X),SUM2_26(X)) 00150 #define CHECKSUM_27(X) CHECKSUM_(SUM1_27(X),SUM2_27(X)) 00151 #define CHECKSUM_28(X) CHECKSUM_(SUM1_28(X),SUM2_28(X)) 00152 #define CHECKSUM_29(X) CHECKSUM_(SUM1_29(X),SUM2_29(X)) 00153 #define CHECKSUM_30(X) CHECKSUM_(SUM1_30(X),SUM2_30(X)) 00154 #define CHECKSUM_31(X) CHECKSUM_(SUM1_31(X),SUM2_31(X)) 00155 #define CHECKSUM_32(X) CHECKSUM_(SUM1_32(X),SUM2_32(X)) 00156 00157 #ifdef DEBUG 00158 00159 #include <utils.h> 00160 #define CHECKSUM(X) get_checksum(X) 00161 00162 #else /* !DEBUG */ 00163 00164 #define CHECKSUM(X) (sizeof(X) == 0 ? 0 : \ 00165 sizeof(X) == 1 ? 0 : \ 00166 sizeof(X) == 2 ? CHECKSUM_1(X) : \ 00167 sizeof(X) == 3 ? CHECKSUM_2(X) : \ 00168 sizeof(X) == 4 ? CHECKSUM_3(X) : \ 00169 sizeof(X) == 5 ? CHECKSUM_4(X) : \ 00170 sizeof(X) == 6 ? CHECKSUM_5(X) : \ 00171 sizeof(X) == 7 ? CHECKSUM_6(X) : \ 00172 sizeof(X) == 8 ? CHECKSUM_7(X) : \ 00173 sizeof(X) == 9 ? CHECKSUM_8(X) : \ 00174 sizeof(X) == 10 ? CHECKSUM_9(X) : \ 00175 sizeof(X) == 11 ? CHECKSUM_10(X) : \ 00176 sizeof(X) == 12 ? CHECKSUM_11(X) : \ 00177 sizeof(X) == 13 ? CHECKSUM_12(X) : \ 00178 sizeof(X) == 14 ? CHECKSUM_13(X) : \ 00179 sizeof(X) == 15 ? CHECKSUM_14(X) : \ 00180 sizeof(X) == 16 ? CHECKSUM_15(X) : \ 00181 sizeof(X) == 17 ? CHECKSUM_16(X) : \ 00182 sizeof(X) == 18 ? CHECKSUM_17(X) : \ 00183 sizeof(X) == 19 ? CHECKSUM_18(X) : \ 00184 sizeof(X) == 20 ? CHECKSUM_19(X) : \ 00185 sizeof(X) == 21 ? CHECKSUM_20(X) : \ 00186 sizeof(X) == 22 ? CHECKSUM_21(X) : \ 00187 sizeof(X) == 23 ? CHECKSUM_22(X) : \ 00188 sizeof(X) == 24 ? CHECKSUM_23(X) : \ 00189 sizeof(X) == 25 ? CHECKSUM_24(X) : \ 00190 sizeof(X) == 26 ? CHECKSUM_25(X) : \ 00191 sizeof(X) == 27 ? CHECKSUM_26(X) : \ 00192 sizeof(X) == 28 ? CHECKSUM_27(X) : \ 00193 sizeof(X) == 29 ? CHECKSUM_28(X) : \ 00194 sizeof(X) == 30 ? CHECKSUM_29(X) : \ 00195 sizeof(X) == 31 ? CHECKSUM_30(X) : \ 00196 sizeof(X) == 32 ? CHECKSUM_31(X) : \ 00197 sizeof(X) == 33 ? CHECKSUM_32(X) : \ 00198 0xFFFF) 00199 #endif /* DEBUG */ 00200 #endif /* CHECKSUM_USE_CPP */ 00201 00202 #endif /* _CHECKSUM_MACRO_H_ */
Generated on Tue Jul 12 2022 20:09:00 by
1.7.2
