Subversion Repositories MK-Marlin

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ron 1
/**
2
 * Marlin 3D Printer Firmware
3
 * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
 *
5
 * Based on Sprinter and grbl.
6
 * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 *
21
 */
22
 
23
#ifndef MACROS_H
24
#define MACROS_H
25
 
26
#define XYZ   3
27
#define XYZE  4
28
#define ABC   3
29
#define ABCD  4
30
#define ABCE  4
31
#define ABCDE 5
32
 
33
/**
34
 * For use in macros that take a single axis letter
35
 * The axis order in all axis related arrays is X, Y, Z, E
36
 * For Hangprinter it is A, B, C, D, E
37
 */
38
#define _AXIS(A) (A##_AXIS)
39
 
40
#define _XMIN_ 100
41
#define _YMIN_ 200
42
#define _ZMIN_ 300
43
#define _XMAX_ 101
44
#define _YMAX_ 201
45
#define _ZMAX_ 301
46
 
47
#define FORCE_INLINE __attribute__((always_inline)) inline
48
#define _UNUSED      __attribute__((unused))
49
#define _O0          __attribute__((optimize("O0")))
50
#define _Os          __attribute__((optimize("Os")))
51
#define _O1          __attribute__((optimize("O1")))
52
#define _O2          __attribute__((optimize("O2")))
53
#define _O3          __attribute__((optimize("O3")))
54
 
55
// Clock speed factors
56
#define CYCLES_PER_MICROSECOND (F_CPU / 1000000L) // 16 or 20
57
#define INT0_PRESCALER 8
58
 
59
// Nanoseconds per cycle
60
#define NANOSECONDS_PER_CYCLE (1000000000.0 / F_CPU)
61
 
62
// Remove compiler warning on an unused variable
63
#define UNUSED(x) (void) (x)
64
 
65
// Macros to make a string from a macro
66
#define STRINGIFY_(M) #M
67
#define STRINGIFY(M) STRINGIFY_(M)
68
 
69
#define A(CODE) " " CODE "\n\t"
70
#define L(CODE) CODE ":\n\t"
71
 
72
// Macros for bit masks
73
#undef _BV
74
#define _BV(b) (1 << (b))
75
#define TEST(n,b) !!((n)&_BV(b))
76
#define SBI(n,b) (n |= _BV(b))
77
#define CBI(n,b) (n &= ~_BV(b))
78
#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0)
79
 
80
#define _BV32(b) (1UL << (b))
81
#define TEST32(n,b) !!((n)&_BV32(b))
82
#define SBI32(n,b) (n |= _BV32(b))
83
#define CBI32(n,b) (n &= ~_BV32(b))
84
 
85
// Macro to check that a number if a power if 2
86
#define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1)))
87
 
88
// Macros for maths shortcuts
89
#undef M_PI
90
#define M_PI 3.14159265358979323846f
91
#define RADIANS(d) ((d)*M_PI/180.0f)
92
#define DEGREES(r) ((r)*180.0f/M_PI)
93
#define HYPOT2(x,y) (sq(x)+sq(y))
94
 
95
#define CIRCLE_AREA(R) (M_PI * sq(float(R)))
96
#define CIRCLE_CIRC(R) (2 * M_PI * (float(R)))
97
 
98
#define SIGN(a) ((a>0)-(a<0))
99
#define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1)))
100
 
101
// Macros to contrain values
102
#define NOLESS(v,n) do{ if (v < n) v = n; }while(0)
103
#define NOMORE(v,n) do{ if (v > n) v = n; }while(0)
104
#define LIMIT(v,n1,n2) do{ if (v < n1) v = n1; else if (v > n2) v = n2; }while(0)
105
 
106
// Macros to support option testing
107
#define _CAT(a, ...) a ## __VA_ARGS__
108
#define SWITCH_ENABLED_false 0
109
#define SWITCH_ENABLED_true  1
110
#define SWITCH_ENABLED_0     0
111
#define SWITCH_ENABLED_1     1
112
#define SWITCH_ENABLED_0x0   0
113
#define SWITCH_ENABLED_0x1   1
114
#define SWITCH_ENABLED_      1
115
#define ENABLED(b) _CAT(SWITCH_ENABLED_, b)
116
#define DISABLED(b) !ENABLED(b)
117
 
118
#define WITHIN(V,L,H) ((V) >= (L) && (V) <= (H))
119
#define NUMERIC(a) WITHIN(a, '0', '9')
120
#define DECIMAL(a) (NUMERIC(a) || a == '.')
121
#define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+')
122
#define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+')
123
#define COUNT(a) (sizeof(a)/sizeof(*a))
124
#define ZERO(a) memset(a,0,sizeof(a))
125
#define COPY(a,b) memcpy(a,b,MIN(sizeof(a),sizeof(b)))
126
 
127
// Macros for initializing arrays
128
#define ARRAY_6(v1, v2, v3, v4, v5, v6, ...) { v1, v2, v3, v4, v5, v6 }
129
#define ARRAY_5(v1, v2, v3, v4, v5, ...)     { v1, v2, v3, v4, v5 }
130
#define ARRAY_4(v1, v2, v3, v4, ...)         { v1, v2, v3, v4 }
131
#define ARRAY_3(v1, v2, v3, ...)             { v1, v2, v3 }
132
#define ARRAY_2(v1, v2, ...)                 { v1, v2 }
133
#define ARRAY_1(v1, ...)                     { v1 }
134
 
135
#define _ARRAY_N(N, ...) ARRAY_ ##N(__VA_ARGS__)
136
#define ARRAY_N(N, ...) _ARRAY_N(N, __VA_ARGS__)
137
 
138
// Macros for adding
139
#define INC_0 1
140
#define INC_1 2
141
#define INC_2 3
142
#define INC_3 4
143
#define INC_4 5
144
#define INC_5 6
145
#define INC_6 7
146
#define INC_7 8
147
#define INC_8 9
148
#define INCREMENT_(n) INC_ ##n
149
#define INCREMENT(n) INCREMENT_(n)
150
 
151
// Macros for subtracting
152
#define DEC_1 0
153
#define DEC_2 1
154
#define DEC_3 2
155
#define DEC_4 3
156
#define DEC_5 4
157
#define DEC_6 5
158
#define DEC_7 6
159
#define DEC_8 7
160
#define DEC_9 8
161
#define DECREMENT_(n) DEC_ ##n
162
#define DECREMENT(n) DECREMENT_(n)
163
 
164
#define PIN_EXISTS(PN) (defined(PN ##_PIN) && PN ##_PIN >= 0)
165
 
166
#define PENDING(NOW,SOON) ((long)(NOW-(SOON))<0)
167
#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON))
168
 
169
#define MMM_TO_MMS(MM_M) ((MM_M)/60.0f)
170
#define MMS_TO_MMM(MM_S) ((MM_S)*60.0f)
171
 
172
#define NOOP do{} while(0)
173
 
174
#define CEILING(x,y) (((x) + (y) - 1) / (y))
175
 
176
// Avoid double evaluation of arguments on MIN/MAX/ABS
177
#undef MIN
178
#undef MAX
179
#undef ABS
180
#ifdef __cplusplus
181
 
182
  // C++11 solution that is standards compliant. Return type is deduced automatically
183
  template <class L, class R> static inline constexpr auto MIN(const L lhs, const R rhs) -> decltype(lhs + rhs) {
184
    return lhs < rhs ? lhs : rhs;
185
  }
186
  template <class L, class R> static inline constexpr auto MAX(const L lhs, const R rhs) -> decltype(lhs + rhs){
187
    return lhs > rhs ? lhs : rhs;
188
  }
189
  template <class T> static inline constexpr const T ABS(const T v) {
190
    return v >= 0 ? v : -v;
191
  }
192
#else
193
 
194
  // Using GCC extensions, but Travis GCC version does not like it and gives
195
  //  "error: statement-expressions are not allowed outside functions nor in template-argument lists"
196
  #define MIN(a, b) \
197
    ({__typeof__(a) _a = (a); \
198
      __typeof__(b) _b = (b); \
199
      _a < _b ? _a : _b;})
200
 
201
  #define MAX(a, b) \
202
    ({__typeof__(a) _a = (a); \
203
      __typeof__(b) _b = (b); \
204
      _a > _b ? _a : _b;})
205
 
206
  #define ABS(a) \
207
    ({__typeof__(a) _a = (a); \
208
      _a >= 0 ? _a : -_a;})
209
 
210
#endif
211
 
212
#define MIN3(a, b, c)       MIN(MIN(a, b), c)
213
#define MIN4(a, b, c, d)    MIN(MIN3(a, b, c), d)
214
#define MIN5(a, b, c, d, e) MIN(MIN4(a, b, c, d), e)
215
#define MAX3(a, b, c)       MAX(MAX(a, b), c)
216
#define MAX4(a, b, c, d)    MAX(MAX3(a, b, c), d)
217
#define MAX5(a, b, c, d, e) MAX(MAX4(a, b, c, d), e)
218
 
219
#define UNEAR_ZERO(x) ((x) < 0.000001f)
220
#define NEAR_ZERO(x) WITHIN(x, -0.000001f, 0.000001f)
221
#define NEAR(x,y) NEAR_ZERO((x)-(y))
222
 
223
#define RECIPROCAL(x) (NEAR_ZERO(x) ? 0.0f : 1.0f / (x))
224
#define FIXFLOAT(f) (f + (f < 0.0f ? -0.00005f : 0.00005f))
225
 
226
//
227
// Maths macros that can be overridden by HAL
228
//
229
#define ATAN2(y, x) atan2f(y, x)
230
#define POW(x, y)   powf(x, y)
231
#define SQRT(x)     sqrtf(x)
232
#define RSQRT(x)    (1 / sqrtf(x))
233
#define CEIL(x)     ceilf(x)
234
#define FLOOR(x)    floorf(x)
235
#define LROUND(x)   lroundf(x)
236
#define FMOD(x, y)  fmodf(x, y)
237
#define HYPOT(x,y)  SQRT(HYPOT2(x,y))
238
 
239
#endif // MACROS_H