24 #ifndef _NUTS_BOLTS_H_
25 #define _NUTS_BOLTS_H_
38 #define SOME_LARGE_VALUE 1.0E+38f
40 #define M_PI 3.14159265358979323846f
43 #define TOLERANCE_EQUAL 0.0001f
45 #define RADDEG 0.01745329251994329577f
46 #define DEGRAD 57.29577951308232087680f
47 #define SQRT3 1.73205080756887729353f
48 #define SIN120 0.86602540378443864676f
50 #define TAN60 1.73205080756887729353f
52 #define TAN30 0.57735026918962576451f
53 #define TAN30_2 0.28867513459481288225f
55 #define ABORTED (sys.abort || sys.cancel)
56 #define IS_AXIS_LETTER(c) (AXIS3_LETTER == c || AXIS4_LETTER == c || AXIS5_LETTER == c || AXIS6_LETTER == c || AXIS7_LETTER == c)
57 #define IS_AXIS_LETTER_VALID(c) (c == 'A' || c == 'B' || c == 'C' || c == 'U' || c == 'V' || c == 'W')
61 #define CAPS(c) ((c >= 'a' && c <= 'z') ? (c & 0x5F) : c)
62 #define LCAPS(c) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
64 #if !(defined(STM32F103xB) || defined(STM32F303xC))
66 #define UNUSED(x) (void)(x)
74 #define X_AXIS_BIT bit(X_AXIS)
75 #define Y_AXIS_BIT bit(Y_AXIS)
76 #define Z_AXIS_BIT bit(Z_AXIS)
79 #define AXIS3_BIT bit(AXIS3_IDX)
83 #define AXIS4_BIT bit(AXIS4_IDX)
87 #define AXIS5_BIT bit(AXIS5_IDX)
91 #define AXIS6_BIT bit(AXIS6_IDX)
95 #define AXIS7_BIT bit(AXIS7_IDX)
99 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT)
101 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT)
103 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT)
105 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT)
107 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT|AXIS6_BIT)
109 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT|AXIS6_BIT|AXIS7_BIT)
114 #elif defined(AXIS6_IDX)
116 #elif defined(AXIS5_IDX)
118 #elif defined(AXIS4_IDX)
120 #elif defined(AXIS3_IDX)
126 #define AXIS0_LETTER 'X'
127 #define AXIS1_LETTER 'Y'
128 #define AXIS2_LETTER 'Z'
131 #if AXIS_REMAP_ABC2UVW
132 #define AXIS3_LETTER 'U'
133 #elif !defined(AXIS3_LETTER)
134 #define AXIS3_LETTER 'A'
135 #elif !IS_AXIS_LETTER_VALID(AXIS3_LETTER)
136 #error "Illegal axis letter assigned!"
139 #define AXIS3_LETTER 0
143 #if AXIS_REMAP_ABC2UVW
144 #define AXIS4_LETTER 'V'
145 #elif !defined(AXIS4_LETTER)
146 #define AXIS4_LETTER 'B'
147 #elif !IS_AXIS_LETTER_VALID(AXIS4_LETTER)
148 #error "Illegal axis letter assigned!"
151 #define AXIS4_LETTER 0
155 #if AXIS_REMAP_ABC2UVW
156 #define AXIS5_LETTER 'W'
157 #elif !defined(AXIS5_LETTER)
158 #define AXIS5_LETTER 'C'
159 #elif !IS_AXIS_LETTER_VALID(AXIS5_LETTER)
160 #error "Illegal axis letter assigned!"
163 #define AXIS5_LETTER 0
167 #if !defined(AXIS6_LETTER)
168 #define AXIS6_LETTER 'U'
169 #elif !IS_AXIS_LETTER_VALID(AXIS6_LETTER)
170 #error "Illegal axis letter assigned!"
173 #define AXIS6_LETTER 0
177 #if !defined(AXIS7_LETTER)
178 #define AXIS7_LETTER 'V'
179 #elif !IS_AXIS_LETTER_VALID(AXIS7_LETTER)
180 #error "Illegal axis letter assigned!"
183 #define AXIS7_LETTER 0
187 #define AXIS_LETTER_TO_IDX(c) AXIS3_IDX
189 #define AXIS_LETTER_TO_IDX(c) \
190 (c == AXIS3_LETTER ? AXIS3_IDX : \
191 (c == AXIS4_LETTER ? AXIS4_IDX : -1))
193 #define AXIS_LETTER_TO_IDX(c) \
194 (c == AXIS3_LETTER ? AXIS3_IDX : \
195 (c == AXIS4_LETTER ? AXIS4_IDX : \
196 (c == AXIS5_LETTER ? AXIS5_IDX : -1)))
198 #define AXIS_LETTER_TO_IDX(c) \
199 (c == AXIS3_LETTER ? AXIS3_IDX : \
200 (c == AXIS4_LETTER ? AXIS4_IDX : \
201 (c == AXIS5_LETTER ? AXIS5_IDX : \
202 (c == AXIS6_LETTER ? AXIS6_IDX : -1))))
204 #define AXIS_LETTER_TO_IDX(c) \
205 (c == AXIS3_LETTER ? AXIS3_IDX : \
206 (c == AXIS4_LETTER ? AXIS4_IDX : \
207 (c == AXIS5_LETTER ? AXIS5_IDX : \
208 (c == AXIS6_LETTER ? AXIS6_IDX : \
209 (c == AXIS7_LETTER ? AXIS7_IDX : -1)))))
212 #if IS_AXIS_LETTER('A')
213 #define A_AXIS AXIS_LETTER_TO_IDX('A')
214 #define A_AXIS_BIT bit(A_AXIS)
217 #if IS_AXIS_LETTER('B')
218 #define B_AXIS AXIS_LETTER_TO_IDX('B')
219 #define B_AXIS_BIT bit(B_AXIS)
222 #if IS_AXIS_LETTER('C')
223 #define C_AXIS AXIS_LETTER_TO_IDX('C')
224 #define C_AXIS_BIT bit(C_AXIS)
227 #if !LATHE_UVW_OPTION
229 #if IS_AXIS_LETTER('U')
230 #define U_AXIS AXIS_LETTER_TO_IDX('U')
231 #define U_AXIS_BIT bit(U_AXIS)
234 #if IS_AXIS_LETTER('V')
235 #define V_AXIS AXIS_LETTER_TO_IDX('V')
236 #define V_AXIS_BIT bit(V_AXIS)
239 #if IS_AXIS_LETTER('W')
240 #define W_AXIS AXIS_LETTER_TO_IDX('W')
241 #define W_AXIS_BIT bit(W_AXIS)
321 #ifdef ROTATION_ENABLE
382 #pragma pack(push, 1)
446 #define MM_PER_INCH (25.40f)
447 #define INCH_PER_MM (0.0393701f)
449 #define MAX_INT_DIGITS 9
450 #define STRLEN_COORDVALUE (MAX_INT_DIGITS + N_DECIMAL_COORDVALUE_INCH + 1)
454 #define max(a,b) (((a) > (b)) ? (a) : (b))
457 #define min(a,b) (((a) < (b)) ? (a) : (b))
460 #define constrain(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
462 #define clear_vector(a) memset(a, 0, sizeof(a))
463 #define isequal_position_vector(a, b) !memcmp(a, b, sizeof(coord_data_t))
464 #define is0_position_vector(a) !memcmp(a, &((coord_data_t){0}), sizeof(coord_data_t))
468 #define bit(n) (1UL << (n))
470 #define bit_true(x, mask) (x) |= (mask)
471 #define bit_false(x, mask) (x) &= ~(mask)
472 #define BIT_SET(x, bit, v) { if (v) { x |= (bit); } else { x &= ~(bit); } }
474 #define bit_istrue(x, mask) (((x) & (mask)) != 0)
475 #define bit_isfalse(x, mask) (((x) & (mask)) == 0)
481 char *
uitoa (uint32_t n);
484 char *
ftoa (
float n, uint8_t decimal_places);
490 bool isintf (
float value);
497 bool read_float (
const char *line, uint_fast8_t *char_counter,
float *float_ptr);
517 static int ffs (
int i)
#define N_AXIS
Defines number of axes supported - minimum 3, maximum 8. If more than 3 axes are configured a complia...
Definition: config.h:42
status_code_t
Definition: errors.h:31
float convert_delta_vector_to_unit_vector(float *vector)
Definition: nuts_bolts.c:343
struct tm * get_datetime(const char *s)
Definition: nuts_bolts.c:375
char * strcaps(char *s)
Definition: nuts_bolts.c:436
bool isintf(float value)
Definition: nuts_bolts.c:318
void rotate(coord_data_t *pt, plane_t plane, float angle)
Definition: nuts_bolts.c:364
char const *const axis_letter[]
Definition: nuts_bolts.c:85
char * ftoa(float n, uint8_t decimal_places)
Definition: nuts_bolts.c:126
const coord_data_t null_vector
Definition: nuts_bolts.c:62
uint_fast8_t bit_count(uint32_t bits)
Definition: nuts_bolts.c:452
char * uitoa(uint32_t n)
Definition: nuts_bolts.c:107
delaymode_t
Definition: nuts_bolts.h:440
@ DelayMode_SysSuspend
Definition: nuts_bolts.h:442
@ DelayMode_Dwell
Definition: nuts_bolts.h:441
bool delay_sec(float seconds, delaymode_t mode)
Definition: nuts_bolts.c:324
bool read_float(const char *line, uint_fast8_t *char_counter, float *float_ptr)
Definition: nuts_bolts.c:253
char * trim_float(char *s)
Definition: nuts_bolts.c:181
status_code_t read_uint(const char *line, uint_fast8_t *char_counter, uint32_t *uint_ptr)
Definition: nuts_bolts.c:195
void dummy_handler(void)
Definition: nuts_bolts.c:464
Coordinate system data.
Definition: nuts_bolts.h:319
coord_data_t coord
Definition: nuts_bolts.h:320
Home switches struct, consists of two packed axes_signals_t structs.
Definition: nuts_bolts.h:396
axes_signals_t a
Primary home switches status, optional. Limit signals are used for homing if not available.
Definition: nuts_bolts.h:397
axes_signals_t b
Secondary home switch(es) status, required for auto squaring enabled axes if primary switches are ava...
Definition: nuts_bolts.h:398
// Stepper driver warning and fault signal states, consists of two packed stepper_state_t structs in ...
Definition: nuts_bolts.h:408
stepper_state_t warning
Stepper drivers warning states.
Definition: nuts_bolts.h:409
stepper_state_t fault
Stepper drivers fault states.
Definition: nuts_bolts.h:410
Definition: nuts_bolts.h:246
uint8_t x
Definition: nuts_bolts.h:251
uint8_t y
Definition: nuts_bolts.h:252
uint8_t bits
Definition: nuts_bolts.h:248
uint8_t a1
Definition: nuts_bolts.h:278
uint8_t a5
Definition: nuts_bolts.h:282
uint8_t a7
Definition: nuts_bolts.h:284
uint8_t value
Definition: nuts_bolts.h:249
uint8_t a4
Definition: nuts_bolts.h:281
uint8_t mask
Definition: nuts_bolts.h:247
uint8_t a0
Definition: nuts_bolts.h:277
uint8_t z
Definition: nuts_bolts.h:274
uint8_t a2
Definition: nuts_bolts.h:279
uint8_t a6
Definition: nuts_bolts.h:283
uint8_t a3
Definition: nuts_bolts.h:280
Definition: nuts_bolts.h:416
uint16_t probe_overtravel
used for probe (toolsetter) protection
Definition: nuts_bolts.h:434
uint16_t bits
Definition: nuts_bolts.h:417
uint16_t stop_disable
Definition: nuts_bolts.h:426
uint16_t limits_override
Definition: nuts_bolts.h:431
uint16_t cycle_start
Definition: nuts_bolts.h:423
uint16_t feed_hold
Definition: nuts_bolts.h:422
uint16_t probe_disconnected
Definition: nuts_bolts.h:428
uint16_t reset
Definition: nuts_bolts.h:421
uint16_t safety_door_ajar
Definition: nuts_bolts.h:424
uint16_t motor_fault
Definition: nuts_bolts.h:429
uint16_t motor_warning
Definition: nuts_bolts.h:430
uint16_t deasserted
used for probe protection
Definition: nuts_bolts.h:436
uint16_t mask
Definition: nuts_bolts.h:418
uint16_t e_stop
M1.
Definition: nuts_bolts.h:427
uint16_t block_delete
Definition: nuts_bolts.h:425
uint16_t value
Definition: nuts_bolts.h:419
uint16_t probe_triggered
used for probe protection
Definition: nuts_bolts.h:435
uint16_t tls_overtravel
Definition: nuts_bolts.h:433
uint16_t single_block
Definition: nuts_bolts.h:432
Coordinate data.
Definition: nuts_bolts.h:289
float y
Definition: nuts_bolts.h:293
float x
Definition: nuts_bolts.h:292
float z
Definition: nuts_bolts.h:294
Limit switches struct, consists of four packed axes_signals_t structs in 32 bits.
Definition: nuts_bolts.h:385
axes_signals_t min
Min limit switches status, required.
Definition: nuts_bolts.h:388
axes_signals_t min2
Secondary min limit switch(es) status, required for auto squaring enabled axes.
Definition: nuts_bolts.h:390
axes_signals_t max2
Secondary max limit switches status, optional (of no practical use?).
Definition: nuts_bolts.h:391
axes_signals_t max
Max limit switches status, optional.
Definition: nuts_bolts.h:389
uint32_t bits
Definition: nuts_bolts.h:386
Definition: nuts_bolts.h:326
int32_t z
Definition: nuts_bolts.h:331
int32_t y
Definition: nuts_bolts.h:330
int32_t x
Definition: nuts_bolts.h:329
Axis index to plane assignment.
Definition: nuts_bolts.h:373
uint8_t axis_linear
Definition: nuts_bolts.h:378
uint8_t axis_0
Definition: nuts_bolts.h:376
uint8_t axis_1
Definition: nuts_bolts.h:377
Definition: nuts_bolts.h:355
float y
Definition: nuts_bolts.h:359
float x
Definition: nuts_bolts.h:358
Definition: nuts_bolts.h:363
float y
Definition: nuts_bolts.h:367
float x
Definition: nuts_bolts.h:366
float z
Definition: nuts_bolts.h:368
Stepper driver states struct.
Definition: nuts_bolts.h:402
home_signals_t details
Definition: nuts_bolts.h:404
uint16_t state
Definition: nuts_bolts.h:403