diff --git a/README.md b/README.md index d9058b05..3729e26e 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ It has been written to complement grblHAL and has features such as proper keyboa --- -Latest build date is 20201205, see the [changelog](changelog.md) for details. +Latest build date is 20201212, see the [changelog](changelog.md) for details. --- diff --git a/changelog.md b/changelog.md index 98ac1d33..84eda541 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,15 @@ ## grblHAL changelog +Build 20201212 (test only): +* Error 7 is no longer issued on startup if non-volatile storage \(Flash/EEPROM/FRAM\) for settings is not available. +* [Alarm substate](https://github.com/terjeio/grblHAL/wiki/Report-extensions#realtime-report) \(if available\) is always added to the real-time report if a complete report is requested by sending `0x87`. +* Added input signal and handling for limit switches override. +The pin is pulled high and requires a normally open \(NO\) push switch for operation. When closed limit pins are excluded from the status report and alarm 12 will not be raised if a limit switch is asserted _on a soft reset_ when "Hard limits" and "Strict mode" is enabled with `$21`. +This allows normal operation so that a manual pull-off can be done before e.g. homing the machine. +Currently only the iMXRT1062 \(Teensy 4.x\) driver has support for this, for now by reassigning the safety door input when this is not used for its intended purpose. +__NOTE:__ A override will _not_ affect handling of homing and limit switch events elsewhere. +* Now adds `ODO` to `NEWOPT` tag values if odometer data is available. + Build 20201205 (test only): * Updated _[my_plugin.c](templates/my_plugin.c)_ [template](templates/README.md) with settings details for `$HELP` and `$ES`/`$EG` enumerations. * Settings/setting groups handling enhanced, moved some to plugins and added sorting (requres enough heap). diff --git a/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.c b/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.c index f774dcba..7b56821e 100644 --- a/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.c +++ b/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.c @@ -74,6 +74,15 @@ static void ppi_timeout_isr (void); #include "usb_serial_pjrc.h" #endif +#if defined(ENABLE_SAFETY_DOOR_INPUT_PIN) && defined(SAFETY_DOOR_PIN) +#define SAFETY_DOOR_ENABLE 1 +#else +#define SAFETY_DOOR_ENABLE 0 +#ifdef SAFETY_DOOR_PIN +//#define LIMITS_OVERRIDE_PIN SAFETY_DOOR_PIN +#endif +#endif + #define DEBOUNCE_QUEUE 8 // Must be a power of 2 #define F_BUS_MHZ (F_BUS_ACTUAL / 1000000) @@ -145,9 +154,12 @@ static gpio_t spindleEnable, spindleDir; #endif // Optional I/O -#ifdef SAFETY_DOOR_PIN +#if SAFETY_DOOR_ENABLE static gpio_t SafetyDoor; #endif +#ifdef LIMITS_OVERRIDE_PIN +static gpio_t LimitsOverride; +#endif #ifdef A_AXIS static gpio_t stepA, dirA, LimitA; #endif @@ -235,51 +247,54 @@ static gpio_t QEI_A, QEI_B; static input_signal_t inputpin[] = { #if ESTOP_ENABLE - { .id = Input_EStop, .port = &Reset, .pin = RESET_PIN, .group = INPUT_GROUP_CONTROL }, + { .id = Input_EStop, .port = &Reset, .pin = RESET_PIN, .group = INPUT_GROUP_CONTROL }, #else - { .id = Input_Reset, .port = &Reset, .pin = RESET_PIN, .group = INPUT_GROUP_CONTROL }, + { .id = Input_Reset, .port = &Reset, .pin = RESET_PIN, .group = INPUT_GROUP_CONTROL }, #endif - { .id = Input_FeedHold, .port = &FeedHold, .pin = FEED_HOLD_PIN, .group = INPUT_GROUP_CONTROL }, - { .id = Input_CycleStart, .port = &CycleStart, .pin = CYCLE_START_PIN, .group = INPUT_GROUP_CONTROL }, -#ifdef SAFETY_DOOR_PIN - { .id = Input_SafetyDoor, .port = &SafetyDoor , .pin = SAFETY_DOOR_PIN, .group = INPUT_GROUP_CONTROL }, + { .id = Input_FeedHold, .port = &FeedHold, .pin = FEED_HOLD_PIN, .group = INPUT_GROUP_CONTROL }, + { .id = Input_CycleStart, .port = &CycleStart, .pin = CYCLE_START_PIN, .group = INPUT_GROUP_CONTROL }, +#if SAFETY_DOOR_ENABLE + { .id = Input_SafetyDoor, .port = &SafetyDoor, .pin = SAFETY_DOOR_PIN, .group = INPUT_GROUP_CONTROL }, +#endif +#if defined(LIMITS_OVERRIDE_PIN) + { .id = Input_LimitsOverride, .port = &LimitsOverride, .pin = LIMITS_OVERRIDE_PIN, .group = INPUT_GROUP_CONTROL }, #endif - { .id = Input_Probe, .port = &Probe, .pin = PROBE_PIN, .group = INPUT_GROUP_PROBE }, - { .id = Input_LimitX, .port = &LimitX, .pin = X_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, + { .id = Input_Probe, .port = &Probe, .pin = PROBE_PIN, .group = INPUT_GROUP_PROBE }, + { .id = Input_LimitX, .port = &LimitX, .pin = X_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, #ifdef X2_LIMIT_PIN - { .id = Input_LimitX_Max, .port = &LimitX2, .pin = X2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, + { .id = Input_LimitX_Max, .port = &LimitX2, .pin = X2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, #endif - { .id = Input_LimitY, .port = &LimitY, .pin = Y_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, + { .id = Input_LimitY, .port = &LimitY, .pin = Y_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, #ifdef Y2_LIMIT_PIN - { .id = Input_LimitY_Max, .port = &LimitY2, .pin = Y2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, + { .id = Input_LimitY_Max, .port = &LimitY2, .pin = Y2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT }, #endif - { .id = Input_LimitZ, .port = &LimitZ, .pin = Z_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } + { .id = Input_LimitZ, .port = &LimitZ, .pin = Z_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } #ifdef Z2_LIMIT_PIN - , { .id = Input_LimitZ_Max, .port = &LimitZ2, .pin = Z2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } + , { .id = Input_LimitZ_Max, .port = &LimitZ2, .pin = Z2_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } #endif #ifdef A_LIMIT_PIN - , { .id = Input_LimitA, .port = &LimitA, .pin = A_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } + , { .id = Input_LimitA, .port = &LimitA, .pin = A_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } #endif #ifdef B_LIMIT_PIN - , { .id = Input_LimitB, .port = &LimitB, .pin = B_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } + , { .id = Input_LimitB, .port = &LimitB, .pin = B_LIMIT_PIN, .group = INPUT_GROUP_LIMIT } #endif #if MPG_MODE_ENABLE - , { .id = Input_ModeSelect, .port = &ModeSelect, .pin = MODE_PIN, .group = INPUT_GROUP_MPG } + , { .id = Input_ModeSelect, .port = &ModeSelect, .pin = MODE_PIN, .group = INPUT_GROUP_MPG } #endif #if KEYPAD_ENABLE && defined(KEYPAD_STROBE_PIN) - , { .id = Input_KeypadStrobe, .port = &KeypadStrobe, .pin = KEYPAD_STROBE_PIN, .group = INPUT_GROUP_KEYPAD } + , { .id = Input_KeypadStrobe, .port = &KeypadStrobe, .pin = KEYPAD_STROBE_PIN, .group = INPUT_GROUP_KEYPAD } #endif #ifdef SPINDLE_INDEX_PIN - , { .id = Input_SpindleIndex, .port = &SpindleIndex, .pin = SPINDLE_INDEX_PIN, .group = INPUT_GROUP_SPINDLE_INDEX } + , { .id = Input_SpindleIndex, .port = &SpindleIndex, .pin = SPINDLE_INDEX_PIN, .group = INPUT_GROUP_SPINDLE_INDEX } #endif #if QEI_ENABLE - , { .id = Input_QEI_A, .port = &QEI_A, .pin = QEI_A_PIN, .group = INPUT_GROUP_QEI } - , { .id = Input_QEI_B, .port = &QEI_B, .pin = QEI_B_PIN, .group = INPUT_GROUP_QEI } + , { .id = Input_QEI_A, .port = &QEI_A, .pin = QEI_A_PIN, .group = INPUT_GROUP_QEI } + , { .id = Input_QEI_B, .port = &QEI_B, .pin = QEI_B_PIN, .group = INPUT_GROUP_QEI } #if QEI_SELECT_ENABLED - , { .id = Input_QEI_Select, .port = &QEI_Select, .pin = QEI_SELECT_PIN, .group = INPUT_GROUP_QEI_SELECT } + , { .id = Input_QEI_Select, .port = &QEI_Select, .pin = QEI_SELECT_PIN, .group = INPUT_GROUP_QEI_SELECT } #endif #if QEI_INDEX_ENABLED - , { .id = Input_QEI_Index, .port = &QEI_Index, .pin = QEI_INDEX_PIN, .group = INPUT_GROUP_QEI } + , { .id = Input_QEI_Index, .port = &QEI_Index, .pin = QEI_INDEX_PIN, .group = INPUT_GROUP_QEI } #endif #endif }; @@ -1016,13 +1031,17 @@ inline static control_signals_t systemGetState (void) #endif signals.feed_hold = (FeedHold.reg->DR & FeedHold.bit) != 0; signals.cycle_start = (CycleStart.reg->DR & CycleStart.bit) != 0; -#if defined(ENABLE_SAFETY_DOOR_INPUT_PIN) && defined(SAFETY_DOOR_PIN) +#if SAFETY_DOOR_ENABLE signals.safety_door_ajar = (SafetyDoor.reg->DR & SafetyDoor.bit) != 0; #endif if(settings.control_invert.value) signals.value ^= settings.control_invert.value; +#ifdef LIMITS_OVERRIDE_PIN + signals.limits_override = (LimitsOverride.reg->DR & LimitsOverride.bit) == 0; +#endif + return signals; } @@ -1479,12 +1498,19 @@ static void settings_changed (settings_t *settings) signal->irq_mode = control_fei.cycle_start ? IRQ_Mode_Falling : IRQ_Mode_Rising; break; +#if SAFETY_DOOR_ENABLE case Input_SafetyDoor: pullup = !settings->control_disable_pullup.safety_door_ajar; signal->debounce = hal.driver_cap.software_debounce; signal->irq_mode = control_fei.safety_door_ajar ? IRQ_Mode_Falling : IRQ_Mode_Rising; break; - +#endif +#ifdef LIMITS_OVERRIDE_PIN + case Input_LimitsOverride: + pullup = true; + signal->debounce = false; + break; +#endif case Input_Probe: pullup = hal.driver_cap.probe_pull_up; break; @@ -2042,7 +2068,7 @@ bool driver_init (void) options[strlen(options) - 1] = '\0'; hal.info = "iMXRT1062"; - hal.driver_version = "201025"; + hal.driver_version = "201212"; #ifdef BOARD_NAME hal.board = BOARD_NAME; #endif @@ -2162,8 +2188,11 @@ bool driver_init (void) #if ESTOP_ENABLE hal.driver_cap.e_stop = On; #endif -#ifdef SAFETY_DOOR_PIN +#if SAFETY_DOOR_ENABLE hal.driver_cap.safety_door = On; +#endif +#ifdef LIMITS_OVERRIDE_PIN + hal.driver_cap.limits_override = On; #endif hal.driver_cap.software_debounce = On; hal.driver_cap.step_pulse_delay = On; diff --git a/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.h b/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.h index 4cfdf404..ed4e1ff6 100644 --- a/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.h +++ b/drivers/IMXRT1062/grblHAL_Teensy4/src/driver.h @@ -241,6 +241,7 @@ typedef enum { Input_FeedHold, Input_CycleStart, Input_SafetyDoor, + Input_LimitsOverride, Input_EStop, Input_ModeSelect, Input_LimitX, diff --git a/drivers/MSP432/driver.c b/drivers/MSP432/driver.c index 0f55efc3..445818f9 100644 --- a/drivers/MSP432/driver.c +++ b/drivers/MSP432/driver.c @@ -460,11 +460,6 @@ inline static axes_signals_t limitsGetState() if (settings.limits.invert.mask) signals.value ^= settings.limits.invert.mask; -#if LIMITS_OVERRIDE_ENABLE - if(!BITBAND_PERI(LIMITS_OVERRIDE_PORT->IN, LIMITS_OVERRIDE_SWITCH_PIN)) - signals.value = 0; -#endif - return signals; } @@ -529,6 +524,10 @@ static control_signals_t systemGetState (void) if(settings.control_invert.mask) signals.value ^= settings.control_invert.mask; +#if LIMITS_OVERRIDE_ENABLE + signals.limits_override = BITBAND_PERI(LIMITS_OVERRIDE_PORT->IN, LIMITS_OVERRIDE_SWITCH_PIN) == 0; +#endif + return signals; } @@ -1415,7 +1414,7 @@ bool driver_init (void) #endif hal.info = "MSP432"; - hal.driver_version = "201125"; + hal.driver_version = "201212"; #ifdef BOARD_NAME hal.board = BOARD_NAME; #endif @@ -1498,6 +1497,9 @@ bool driver_init (void) hal.driver_cap.e_stop = On; #endif hal.driver_cap.safety_door = On; +#if LIMITS_OVERRIDE_ENABLE + hal.driver_cap.limits_override = On; +#endif hal.driver_cap.control_pull_up = On; hal.driver_cap.limits_pull_up = On; hal.driver_cap.probe_pull_up = On; diff --git a/drivers/MSP432/driver.h b/drivers/MSP432/driver.h index 6c573f6a..272b172b 100644 --- a/drivers/MSP432/driver.h +++ b/drivers/MSP432/driver.h @@ -77,6 +77,9 @@ #ifndef CNC_BOOSTERPACK_A4998 #define CNC_BOOSTERPACK_A4998 0 #endif +#ifndef LIMITS_OVERRIDE_ENABLE +#define LIMITS_OVERRIDE_ENABLE 0 +#endif #define CNC_BOOSTERPACK 0 diff --git a/grbl/grbl.h b/grbl/grbl.h index a5849250..d0ca8e02 100644 --- a/grbl/grbl.h +++ b/grbl/grbl.h @@ -34,7 +34,7 @@ #else #define GRBL_VERSION "1.1f" #endif -#define GRBL_VERSION_BUILD "20201205" +#define GRBL_VERSION_BUILD "20201212" // The following symbols are set here if not already set by the compiler or in config.h // Do NOT change here! diff --git a/grbl/hal.h b/grbl/hal.h index 14052c3a..999f4128 100644 --- a/grbl/hal.h +++ b/grbl/hal.h @@ -69,7 +69,9 @@ typedef union { atc :1, no_gcode_message_handling :1, dual_spindle :1, - unassigned :3; + limits_override :1, + odometers :1, + unassigned :1; }; } driver_cap_t; diff --git a/grbl/nvs_buffer.c b/grbl/nvs_buffer.c index c8e0a857..871c03d4 100644 --- a/grbl/nvs_buffer.c +++ b/grbl/nvs_buffer.c @@ -229,7 +229,8 @@ bool nvs_buffer_init (void) physical_nvs.memcpy_to_flash(nvsbuffer); else if(physical_nvs.memcpy_to_nvs) physical_nvs.memcpy_to_nvs(0, nvsbuffer, GRBL_NVS_SIZE + hal.nvs.driver_area.size, false); - grbl.report.status_message(Status_SettingReadFail); + if(physical_nvs.type != NVS_None) + grbl.report.status_message(Status_SettingReadFail); } } else protocol_enqueue_rt_command(nvs_warning); diff --git a/grbl/protocol.c b/grbl/protocol.c index 541fb970..66ead288 100644 --- a/grbl/protocol.c +++ b/grbl/protocol.c @@ -110,9 +110,13 @@ bool protocol_main_loop (void) system_raise_alarm(Alarm_HomingRequried); grbl.report.feedback_message(Message_HomingCycleRequired); } else if (settings.limits.flags.hard_enabled && settings.limits.flags.check_at_init && hal.limits.get_state().value) { - // Check that no limit switches are engaged to make sure everything is good to go. - system_raise_alarm(Alarm_LimitsEngaged); - grbl.report.feedback_message(Message_CheckLimits); + if(sys.alarm == Alarm_LimitsEngaged && hal.control.get_state().limits_override) + set_state(STATE_IDLE); // Clear alarm state to enable limit switch pulloff. + else { + // Check that no limit switches are engaged to make sure everything is good to go. + system_raise_alarm(Alarm_LimitsEngaged); + grbl.report.feedback_message(Message_CheckLimits); + } } else if(sys.cold_start && (settings.flags.force_initialization_alarm || hal.control.get_state().reset)) { set_state(STATE_ALARM); // Ensure alarm state is set. grbl.report.feedback_message(Message_AlarmLock); diff --git a/grbl/report.c b/grbl/report.c index ae91d175..2a26b15d 100644 --- a/grbl/report.c +++ b/grbl/report.c @@ -508,7 +508,7 @@ void report_grbl_settings (bool all) if(all) report_uint_setting(Setting_StatusReportMask, (uint32_t)settings.status_report.mask); else - report_uint_setting(Setting_StatusReportMask, settings.status_report.mask & 0x3); + report_uint_setting(Setting_StatusReportMask, settings.status_report.mask & ~0b11); report_float_setting(Setting_JunctionDeviation, settings.junction_deviation, N_DECIMAL_SETTINGVALUE); report_float_setting(Setting_ArcTolerance, settings.arc_tolerance, N_DECIMAL_SETTINGVALUE); report_uint_setting(Setting_ReportInches, settings.flags.report_inches); @@ -1151,6 +1151,9 @@ void report_build_info (char *line, bool extended) if(hal.driver_cap.spindle_sync) strcat(buf, "SS,"); + if(hal.driver_cap.odometers) + strcat(buf, "ODO,"); + #ifdef PID_LOG strcat(buf, "PID,"); #endif @@ -1352,7 +1355,7 @@ void report_realtime_status (void) if(!probe_state.connected) *append++ = 'O'; - if (lim_pin_state.value) + if (lim_pin_state.value && !hal.control.get_state().limits_override) append = axis_signals_tostring(append, lim_pin_state); if (ctrl_pin_state.value) { diff --git a/grbl/settings.c b/grbl/settings.c index da6f3b22..fc7dfe58 100644 --- a/grbl/settings.c +++ b/grbl/settings.c @@ -293,7 +293,11 @@ static const setting_detail_t setting_detail[] = { { Setting_InvertStepperEnable, Group_Stepper, "Invert step enable pin(s)", NULL, Format_AxisMask, NULL, NULL, NULL }, { Setting_LimitPinsInvertMask, Group_Limits, "Invert limit pins", NULL, Format_AxisMask, NULL, NULL, NULL }, { Setting_InvertProbePin, Group_Probing, "Invert probe pin", NULL, Format_Bool, NULL, NULL, NULL }, +#if COMPATIBILITY_LEVEL <= 1 { Setting_StatusReportMask, Group_General, "Status report options", NULL, Format_Bitfield, "Position in machine coordinate,Buffer state,Line numbers,Feed & speed,Pin state,Work coordinate offset,Overrides,Probe coordinates,Buffer sync on WCO change,Parser state,Alarm substatus,Run substatus", NULL, NULL }, +#else + { Setting_StatusReportMask, Group_General, "Status report options", NULL, Format_Bitfield, "Position in machine coordinate,Buffer state", NULL, NULL }, +#endif { Setting_JunctionDeviation, Group_General, "Junction deviation", "mm", Format_Decimal, "#####0.000", NULL, NULL }, { Setting_ArcTolerance, Group_General, "Arc tolerance", "mm", Format_Decimal, "#####0.000", NULL, NULL }, { Setting_ReportInches, Group_General, "Report in inches", NULL, Format_Bool, NULL, NULL, NULL }, @@ -304,8 +308,16 @@ static const setting_detail_t setting_detail[] = { { Setting_LimitPullUpDisableMask, Group_Limits, "Pullup disable limit pins", NULL, Format_AxisMask, NULL, NULL, NULL }, { Setting_ProbePullUpDisable, Group_Probing, "Pullup disable probe pin", NULL, Format_Bool, NULL, NULL, NULL }, { Setting_SoftLimitsEnable, Group_Limits, "Soft limits enable", NULL, Format_Bool, NULL, NULL, NULL }, +#if COMPATIBILITY_LEVEL <= 1 { Setting_HardLimitsEnable, Group_Limits, "Hard limits enable", NULL, Format_XBitfield, "Enable,Strict mode", NULL, NULL }, +#else + { Setting_HardLimitsEnable, Group_Limits, "Hard limits enable", NULL, Format_Bool, NULL, NULL, NULL }, +#endif +#if COMPATIBILITY_LEVEL <= 1 { Setting_HomingEnable, Group_Homing, "Homing cycle", NULL, Format_XBitfield, "Enable,Enable single axis commands,Homing on startup required,Set machine origin to 0,Two switches shares one input pin,Allow manual,Override locks", NULL, NULL }, +#else + { Setting_HomingEnable, Group_Homing, "Homing cycle enable", NULL, Format_Bool, NULL, NULL, NULL }, +#endif { Setting_HomingDirMask, Group_Homing, "Homing direction invert", NULL, Format_AxisMask, NULL, NULL, NULL }, { Setting_HomingFeedRate, Group_Homing, "Homing locate feed rate", "mm/min", Format_Decimal, "#####0.0", NULL, NULL }, { Setting_HomingSeekRate, Group_Homing, "Homing search seek rate", "mm/min", Format_Decimal, "#####0.0", NULL, NULL }, @@ -870,8 +882,8 @@ status_code_t settings_store_global_setting (setting_type_t setting, char *svalu #if COMPATIBILITY_LEVEL <= 1 settings.status_report.mask = int_value; #else - int_value &= 0b111; - settings.status_report.mask = (settings.status_report.mask & ~0b111) | int_value; + int_value &= 0b11; + settings.status_report.mask = (settings.status_report.mask & ~0b11) | int_value; #endif break; @@ -1243,7 +1255,8 @@ void settings_init() { if(!read_global_settings()) { settings_restore_t settings = settings_all; settings.defaults = 1; // Ensure global settings get restored - grbl.report.status_message(Status_SettingReadFail); + if(hal.nvs.type != NVS_None) + grbl.report.status_message(Status_SettingReadFail); settings_restore(settings); // Force restore all non-volatile storage data. report_init(); #if COMPATIBILITY_LEVEL <= 1 diff --git a/grbl/stream.h b/grbl/stream.h index a8c53e86..1ad060bb 100644 --- a/grbl/stream.h +++ b/grbl/stream.h @@ -47,7 +47,7 @@ #endif #ifndef BLOCK_TX_BUFFER_SIZE -#define BLOCK_TX_BUFFER_SIZE 200 +#define BLOCK_TX_BUFFER_SIZE 256 #endif // Serial baud rate diff --git a/grbl/system.h b/grbl/system.h index 5e3b77e2..5483e6e8 100644 --- a/grbl/system.h +++ b/grbl/system.h @@ -125,7 +125,8 @@ typedef union { probe_disconnected :1, motor_fault :1, motor_warning :1, - unassigned :4, + limits_override :1, + unassigned :3, probe_triggered :1, // used for probe protection deasserted :1; // this flag is set if signals are deasserted. Note: do NOT pass on to Grbl control_interrupt_handler if set. };