grblHAL core  20261008
nuts_bolts.h
Go to the documentation of this file.
1 /*
2  nuts_bolts.h - Header file for shared definitions, variables, and functions
3 
4  Part of grblHAL
5 
6  Copyright (c) 2017-2026 Terje Io
7  Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC
8  Copyright (c) 2009-2011 Simen Svale Skogsrud
9 
10  grblHAL is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  grblHAL is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 #ifndef _NUTS_BOLTS_H_
25 #define _NUTS_BOLTS_H_
26 
27 #include "grbl.h"
28 #include "real.h"
29 #include "errors.h"
30 
31 #ifndef true
32 #define false 0
33 #define true 1
34 #endif
35 
36 #define Off 0
37 #define On 1
38 
39 #define SOME_LARGE_VALUE 1.0E+38f
40 #ifndef M_PI
41 #define M_PI 3.14159265358979323846f
42 #endif
43 
44 #define TOLERANCE_EQUAL 0.0001f
45 
46 #define RADDEG 0.01745329251994329577f // Radians per degree
47 #define DEGRAD 57.29577951308232087680f // Degrees per radians
48 #define SQRT3 1.73205080756887729353f
49 #define SIN120 0.86602540378443864676f
50 #define COS120 -0.5f
51 #define TAN60 1.73205080756887729353f
52 #define SIN30 0.5f
53 #define TAN30 0.57735026918962576451f
54 #define TAN30_2 0.28867513459481288225f
55 
56 #define ABORTED (sys.abort || sys.cancel)
57 #define IS_AXIS_LETTER(c) (AXIS3_LETTER == c || AXIS4_LETTER == c || AXIS5_LETTER == c || AXIS6_LETTER == c || AXIS7_LETTER == c)
58 #define IS_AXIS_LETTER_VALID(c) (c == 'A' || c == 'B' || c == 'C' || c == 'U' || c == 'V' || c == 'W')
59 //#define AXIS_LETTER_FN_IDX(c) ((c >= 'X' && c <= 'Z') ? ((c - 'X') << 1) : ((c >= 'A' && c <= 'C') ? c - 'A' + 6 : ((c >= 'U' && c <= 'W') ? c - 'U' + 9 : -1)))
60 
61 // Convert character to uppercase
62 #define CAPS(c) ((c >= 'a' && c <= 'z') ? (c & 0x5F) : c)
63 #define LCAPS(c) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
64 
65 #if !(defined(STM32F103xB) || defined(STM32F303xC) || defined(STM32F756xx) || defined(STM32F765xx))
66 #ifndef UNUSED
67 #define UNUSED(x) (void)(x)
68 #endif
69 #endif
70 
71 // Axis array index values. Must start with 0 and be continuous.
72 #define X_AXIS 0 // Axis indexing value.
73 #define Y_AXIS 1
74 #define Z_AXIS 2
75 #define X_AXIS_BIT bit(X_AXIS)
76 #define Y_AXIS_BIT bit(Y_AXIS)
77 #define Z_AXIS_BIT bit(Z_AXIS)
78 #if N_AXIS > 3
79 #define AXIS3_IDX 3
80 #define AXIS3_BIT bit(AXIS3_IDX)
81 #endif
82 #if N_AXIS > 4
83 #define AXIS4_IDX 4
84 #define AXIS4_BIT bit(AXIS4_IDX)
85 #endif
86 #if N_AXIS > 5
87 #define AXIS5_IDX 5
88 #define AXIS5_BIT bit(AXIS5_IDX)
89 #endif
90 #if N_AXIS > 6
91 #define AXIS6_IDX 6
92 #define AXIS6_BIT bit(AXIS6_IDX)
93 #endif
94 #if N_AXIS == 8
95 #define AXIS7_IDX 7
96 #define AXIS7_BIT bit(AXIS7_IDX)
97 #endif
98 
99 #if N_AXIS == 3
100 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT)
101 #elif N_AXIS == 4
102 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT)
103 #elif N_AXIS == 5
104 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT)
105 #elif N_AXIS == 6
106 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT)
107 #elif N_AXIS == 7
108 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT|AXIS6_BIT)
109 #else
110 #define AXES_BITMASK (X_AXIS_BIT|Y_AXIS_BIT|Z_AXIS_BIT|AXIS3_BIT|AXIS4_BIT|AXIS5_BIT|AXIS6_BIT|AXIS7_BIT)
111 #endif
112 
113 #ifdef AXIS7_IDX
114 #define N_ABC_AXIS 5
115 #elif defined(AXIS6_IDX)
116 #define N_ABC_AXIS 4
117 #elif defined(AXIS5_IDX)
118 #define N_ABC_AXIS 3
119 #elif defined(AXIS4_IDX)
120 #define N_ABC_AXIS 2
121 #elif defined(AXIS3_IDX)
122 #define N_ABC_AXIS 1
123 #else
124 #define N_ABC_AXIS 0
125 #endif
126 
127 #define AXIS0_LETTER 'X'
128 #define AXIS1_LETTER 'Y'
129 #define AXIS2_LETTER 'Z'
130 
131 #if N_AXIS > 3
132  #if AXIS_REMAP_ABC2UVW
133  #define AXIS3_LETTER 'U'
134  #elif !defined(AXIS3_LETTER)
135  #define AXIS3_LETTER 'A'
136  #elif !IS_AXIS_LETTER_VALID(AXIS3_LETTER)
137  #error "Illegal axis letter assigned!"
138  #endif
139 #else
140  #define AXIS3_LETTER 0
141 #endif
142 
143 #if N_AXIS > 4
144  #if AXIS_REMAP_ABC2UVW
145  #define AXIS4_LETTER 'V'
146  #elif !defined(AXIS4_LETTER)
147  #define AXIS4_LETTER 'B'
148  #elif !IS_AXIS_LETTER_VALID(AXIS4_LETTER)
149  #error "Illegal axis letter assigned!"
150  #endif
151 #else
152  #define AXIS4_LETTER 0
153 #endif
154 
155 #if N_AXIS > 5
156  #if AXIS_REMAP_ABC2UVW
157  #define AXIS5_LETTER 'W'
158  #elif !defined(AXIS5_LETTER)
159  #define AXIS5_LETTER 'C'
160  #elif !IS_AXIS_LETTER_VALID(AXIS5_LETTER)
161  #error "Illegal axis letter assigned!"
162  #endif
163 #else
164  #define AXIS5_LETTER 0
165 #endif
166 
167 #if N_AXIS > 6
168  #if !defined(AXIS6_LETTER)
169  #define AXIS6_LETTER 'U'
170  #elif !IS_AXIS_LETTER_VALID(AXIS6_LETTER)
171  #error "Illegal axis letter assigned!"
172  #endif
173 #else
174  #define AXIS6_LETTER 0
175 #endif
176 
177 #if N_AXIS > 7
178  #if !defined(AXIS7_LETTER)
179  #define AXIS7_LETTER 'V'
180  #elif !IS_AXIS_LETTER_VALID(AXIS7_LETTER)
181  #error "Illegal axis letter assigned!"
182  #endif
183 #else
184  #define AXIS7_LETTER 0
185 #endif
186 
187 #if N_AXIS == 4
188 #define AXIS_LETTER_TO_IDX(c) AXIS3_IDX
189 #elif N_AXIS == 5
190 #define AXIS_LETTER_TO_IDX(c) \
191 (c == AXIS3_LETTER ? AXIS3_IDX : \
192 (c == AXIS4_LETTER ? AXIS4_IDX : -1))
193 #elif N_AXIS == 6
194 #define AXIS_LETTER_TO_IDX(c) \
195 (c == AXIS3_LETTER ? AXIS3_IDX : \
196 (c == AXIS4_LETTER ? AXIS4_IDX : \
197 (c == AXIS5_LETTER ? AXIS5_IDX : -1)))
198 #elif N_AXIS == 7
199 #define AXIS_LETTER_TO_IDX(c) \
200 (c == AXIS3_LETTER ? AXIS3_IDX : \
201 (c == AXIS4_LETTER ? AXIS4_IDX : \
202 (c == AXIS5_LETTER ? AXIS5_IDX : \
203 (c == AXIS6_LETTER ? AXIS6_IDX : -1))))
204 #elif N_AXIS == 8
205 #define AXIS_LETTER_TO_IDX(c) \
206 (c == AXIS3_LETTER ? AXIS3_IDX : \
207 (c == AXIS4_LETTER ? AXIS4_IDX : \
208 (c == AXIS5_LETTER ? AXIS5_IDX : \
209 (c == AXIS6_LETTER ? AXIS6_IDX : \
210 (c == AXIS7_LETTER ? AXIS7_IDX : -1)))))
211 #endif
212 
213 #if IS_AXIS_LETTER('A')
214 #define A_AXIS AXIS_LETTER_TO_IDX('A')
215 #define A_AXIS_BIT bit(A_AXIS)
216 #endif
217 
218 #if IS_AXIS_LETTER('B')
219 #define B_AXIS AXIS_LETTER_TO_IDX('B')
220 #define B_AXIS_BIT bit(B_AXIS)
221 #endif
222 
223 #if IS_AXIS_LETTER('C')
224 #define C_AXIS AXIS_LETTER_TO_IDX('C')
225 #define C_AXIS_BIT bit(C_AXIS)
226 #endif
227 
228 #if !LATHE_UVW_OPTION
229 
230 #if IS_AXIS_LETTER('U')
231 #define U_AXIS AXIS_LETTER_TO_IDX('U')
232 #define U_AXIS_BIT bit(U_AXIS)
233 #endif
234 
235 #if IS_AXIS_LETTER('V')
236 #define V_AXIS AXIS_LETTER_TO_IDX('V')
237 #define V_AXIS_BIT bit(V_AXIS)
238 #endif
239 
240 #if IS_AXIS_LETTER('W')
241 #define W_AXIS AXIS_LETTER_TO_IDX('W')
242 #define W_AXIS_BIT bit(W_AXIS)
243 #endif
244 
245 #endif
246 
247 typedef uint32_t line_number_t;
248 
249 typedef union {
250  uint8_t mask;
251  uint8_t bits;
252  uint8_t value;
253  struct {
254  uint8_t x :1,
255  y :1,
256  z :1
257 #if N_AXIS > 3
258  #ifdef A_AXIS
259  , a :1
260  #endif
261  #ifdef B_AXIS
262  , b :1
263  #endif
264  #ifdef C_AXIS
265  , c :1
266  #endif
267  #ifdef U_AXIS
268  , u :1
269  #endif
270  #ifdef V_AXIS
271  , v :1
272  #endif
273  #ifdef W_AXIS
274  , w :1
275  #endif
276 #endif
277 ;
278  };
279  struct {
280  uint8_t a0 :1,
281  a1 :1,
282  a2 :1,
283  a3 :1,
284  a4 :1,
285  a5 :1,
286  a6 :1,
287  a7 :1;
288  };
290 
292 typedef union {
293  float values[N_AXIS];
294  struct {
295  float x;
296  float y;
297  float z;
298 #if N_AXIS > 3
299  #ifdef A_AXIS
300  float a;
301  #endif
302  #ifdef B_AXIS
303  float b;
304  #endif
305  #ifdef C_AXIS
306  float c;
307  #endif
308  #ifdef U_AXIS
309  float u;
310  #endif
311  #ifdef V_AXIS
312  float v;
313  #endif
314  #ifdef W_AXIS
315  float w;
316  #endif
317 #endif
318  };
319 } coord_data_t;
320 
322 typedef struct {
324 #ifdef ROTATION_ENABLE
325  float rotation;
326 #endif
328 
329 typedef union {
330  int32_t values[N_AXIS];
331  struct {
332  int32_t x;
333  int32_t y;
334  int32_t z;
335 #if N_AXIS > 3
336  #ifdef B_AXIS
337  int32_t a;
338  #endif
339  #ifdef B_AXIS
340  int32_t b;
341  #endif
342  #ifdef C_AXIS
343  int32_t c;
344  #endif
345  #ifdef U_AXIS
346  int32_t u;
347  #endif
348  #ifdef V_AXIS
349  int32_t v;
350  #endif
351  #ifdef W_AXIS
352  int32_t w;
353  #endif
354 #endif
355  };
356 } mpos_t;
357 
358 typedef union {
359  real_t values[2];
360  struct {
363  };
364  struct {
366  real_t x;
367  } g18;
368 /* struct {
369  real_t y;
370  real_t z;
371  } g19; */
372 } point_2d_t;
373 
374 typedef struct {
377 } bbox_2d_t;
378 
379 typedef union {
380  real_t values[3];
381  struct {
385  };
386 } point_3d_t;
387 
388 typedef struct {
391 } bbox_3d_t;
392 
394 typedef union {
395  uint8_t axis[3];
396  struct {
397  uint8_t axis_0;
398  uint8_t axis_1;
399  uint8_t axis_linear;
400  };
401 } plane_t;
402 
403 #pragma pack(push, 1)
404 
406 typedef union {
407  uint32_t bits;
408  struct {
413  };
415 
417 typedef struct {
421 
423 typedef union {
424  uint16_t state;
425  home_signals_t details; // Stepper driver signals states.
427 
429 typedef struct {
433 
434 #pragma pack(pop)
435 
436 // NOTE: the pin_function_t enum must be kept in sync with any changes!
437 typedef union {
438  uint16_t bits;
439  uint16_t mask;
440  uint16_t value;
441  struct {
442  uint16_t reset :1,
448  e_stop :1,
458  };
460 
461 typedef enum {
465 
466 // Conversions
467 #define MM_PER_INCH (25.40f)
468 #define INCH_PER_MM (0.0393701f)
469 
470 #define MAX_INT_DIGITS 9 // Maximum number of digits in int32 (and float)
471 #define STRLEN_COORDVALUE (MAX_INT_DIGITS + N_DECIMAL_COORDVALUE_INCH + 1) // 8.4 format - excluding terminating null
472 
473 // Useful macros
474 #ifndef max
475 #define max(a,b) (((a) > (b)) ? (a) : (b))
476 #endif
477 #ifndef min
478 #define min(a,b) (((a) < (b)) ? (a) : (b))
479 #endif
480 #ifndef constrain
481 #define constrain(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
482 #endif
483 #define clear_vector(a) memset(a, 0, sizeof(a))
484 #define isequal_position_vector(a, b) !memcmp(a, b, sizeof(coord_data_t))
485 #define is0_position_vector(a) !memcmp(a, &((coord_data_t){0}), sizeof(coord_data_t))
486 
487 // Bit field and masking macros
488 #ifndef bit
489 #define bit(n) (1UL << (n))
490 #endif
491 #define bit_true(x, mask) (x) |= (mask)
492 #define bit_false(x, mask) (x) &= ~(mask)
493 #define BIT_SET(x, bit, v) { if (v) { x |= (bit); } else { x &= ~(bit); } }
494 
495 #define bit_istrue(x, mask) (((x) & (mask)) != 0)
496 #define bit_isfalse(x, mask) (((x) & (mask)) == 0)
497 
498 extern char const *const axis_letter[];
499 extern const coord_data_t null_vector;
500 
501 // Converts an uint32 variable to string.
502 char *uitoa (uint32_t n);
503 
504 // Converts a float variable to string with the specified number of decimal places.
505 char *ftoa (float n, uint8_t decimal_places);
506 
507 // Trim trailing zeros and possibly decimal point
508 char *trim_float (char *s);
509 
510 // Returns true if float value is a whole number (integer)
511 bool isintf (float value);
512 
513 status_code_t read_uint (const char *line, uint_fast8_t *char_counter, uint32_t *uint_ptr);
514 
515 // Read a floating point value from a string. Line points to the input buffer, char_counter
516 // is the indexer pointing to the current character of the line, while float_ptr is
517 // a pointer to the result variable. Returns true when it succeeds
518 bool read_float (const char *line, uint_fast8_t *char_counter, float *float_ptr);
519 
520 // Non-blocking delay function used for general operation and suspend features.
521 bool delay_sec (float seconds, delaymode_t mode);
522 
523 float convert_delta_vector_to_unit_vector(float *vector);
524 
525 void rotate (coord_data_t *pt, plane_t plane, float angle /*rad*/);
526 
527 // parse ISO8601 datetime
528 struct tm *get_datetime (const char *s);
529 
530 char *strcaps (char *s);
531 
532 uint_fast8_t bit_count (uint32_t bits);
533 
534 void dummy_handler (void);
535 
536 #ifdef _WIN32
537 
538 static inline int ffs (int i)
539 {
540  int idx = 0;
541 
542  while(i) {
543  idx++;
544  if(i & 1)
545  break;
546  i >>= 1;
547  }
548 
549  return idx;
550 }
551 
552 #endif // _WIN32
553 
554 #endif
#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
uint32_t line_number_t
Definition: nuts_bolts.h:247
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:461
@ DelayMode_SysSuspend
Definition: nuts_bolts.h:463
@ DelayMode_Dwell
Definition: nuts_bolts.h:462
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
float real_t
Definition: real.h:48
Definition: nuts_bolts.h:374
point_2d_t max
Definition: nuts_bolts.h:376
point_2d_t min
Definition: nuts_bolts.h:375
Definition: nuts_bolts.h:388
point_3d_t max
Definition: nuts_bolts.h:390
point_3d_t min
Definition: nuts_bolts.h:389
Coordinate system data.
Definition: nuts_bolts.h:322
coord_data_t coord
Definition: nuts_bolts.h:323
Home switches struct, consists of two packed axes_signals_t structs.
Definition: nuts_bolts.h:417
axes_signals_t a
Primary home switches status, optional. Limit signals are used for homing if not available.
Definition: nuts_bolts.h:418
axes_signals_t b
Secondary home switch(es) status, required for auto squaring enabled axes if primary switches are ava...
Definition: nuts_bolts.h:419
// Stepper driver warning and fault signal states, consists of two packed stepper_state_t structs in ...
Definition: nuts_bolts.h:429
stepper_state_t warning
Stepper drivers warning states.
Definition: nuts_bolts.h:430
stepper_state_t fault
Stepper drivers fault states.
Definition: nuts_bolts.h:431
Definition: vfs.h:50
Definition: nuts_bolts.h:249
uint8_t x
Definition: nuts_bolts.h:254
uint8_t y
Definition: nuts_bolts.h:255
uint8_t bits
Definition: nuts_bolts.h:251
uint8_t a1
Definition: nuts_bolts.h:281
uint8_t a5
Definition: nuts_bolts.h:285
uint8_t a7
Definition: nuts_bolts.h:287
uint8_t value
Definition: nuts_bolts.h:252
uint8_t a4
Definition: nuts_bolts.h:284
uint8_t mask
Definition: nuts_bolts.h:250
uint8_t a0
Definition: nuts_bolts.h:280
uint8_t z
Definition: nuts_bolts.h:277
uint8_t a2
Definition: nuts_bolts.h:282
uint8_t a6
Definition: nuts_bolts.h:286
uint8_t a3
Definition: nuts_bolts.h:283
Definition: nuts_bolts.h:437
uint16_t probe_overtravel
used for probe (toolsetter) protection
Definition: nuts_bolts.h:455
uint16_t bits
Definition: nuts_bolts.h:438
uint16_t stop_disable
Definition: nuts_bolts.h:447
uint16_t limits_override
Definition: nuts_bolts.h:452
uint16_t cycle_start
Definition: nuts_bolts.h:444
uint16_t feed_hold
Definition: nuts_bolts.h:443
uint16_t probe_disconnected
Definition: nuts_bolts.h:449
uint16_t reset
Definition: nuts_bolts.h:442
uint16_t safety_door_ajar
Definition: nuts_bolts.h:445
uint16_t motor_fault
Definition: nuts_bolts.h:450
uint16_t motor_warning
Definition: nuts_bolts.h:451
uint16_t deasserted
used for probe protection
Definition: nuts_bolts.h:457
uint16_t mask
Definition: nuts_bolts.h:439
uint16_t e_stop
M1.
Definition: nuts_bolts.h:448
uint16_t block_delete
Definition: nuts_bolts.h:446
uint16_t value
Definition: nuts_bolts.h:440
uint16_t probe_triggered
used for probe protection
Definition: nuts_bolts.h:456
uint16_t tls_overtravel
Definition: nuts_bolts.h:454
uint16_t single_block
Definition: nuts_bolts.h:453
Coordinate data.
Definition: nuts_bolts.h:292
float y
Definition: nuts_bolts.h:296
float x
Definition: nuts_bolts.h:295
float z
Definition: nuts_bolts.h:297
Limit switches struct, consists of four packed axes_signals_t structs in 32 bits.
Definition: nuts_bolts.h:406
axes_signals_t min
Min limit switches status, required.
Definition: nuts_bolts.h:409
axes_signals_t min2
Secondary min limit switch(es) status, required for auto squaring enabled axes.
Definition: nuts_bolts.h:411
axes_signals_t max2
Secondary max limit switches status, optional (of no practical use?).
Definition: nuts_bolts.h:412
axes_signals_t max
Max limit switches status, optional.
Definition: nuts_bolts.h:410
uint32_t bits
Definition: nuts_bolts.h:407
Definition: nuts_bolts.h:329
int32_t z
Definition: nuts_bolts.h:334
int32_t y
Definition: nuts_bolts.h:333
int32_t x
Definition: nuts_bolts.h:332
Axis index to plane assignment.
Definition: nuts_bolts.h:394
uint8_t axis_linear
Definition: nuts_bolts.h:399
uint8_t axis_0
Definition: nuts_bolts.h:397
uint8_t axis_1
Definition: nuts_bolts.h:398
Definition: nuts_bolts.h:358
real_t y
Definition: nuts_bolts.h:362
real_t x
Definition: nuts_bolts.h:361
real_t z
Definition: nuts_bolts.h:365
Definition: nuts_bolts.h:379
real_t y
Definition: nuts_bolts.h:383
real_t x
Definition: nuts_bolts.h:382
real_t z
Definition: nuts_bolts.h:384
Stepper driver states struct.
Definition: nuts_bolts.h:423
home_signals_t details
Definition: nuts_bolts.h:425
uint16_t state
Definition: nuts_bolts.h:424