From 0462c97dc919eb040fd96dd91a09d5ef8a8e8033 Mon Sep 17 00:00:00 2001 From: Terje Io Date: Sun, 26 Jan 2025 07:13:37 +0100 Subject: [PATCH] Changed core tool change routine to play nice with plugins subscribing to probe event. --- changelog.md | 18 ++++++++++++++++++ grbl.h | 2 +- pin_bits_masks.h | 34 +++++++++++++++++----------------- planner.c | 2 +- spindle_control.c | 3 +++ stepper.c | 2 +- tool_change.c | 15 ++++++++++----- 7 files changed, 51 insertions(+), 25 deletions(-) diff --git a/changelog.md b/changelog.md index 4c39814..260e599 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,23 @@ ## grblHAL changelog +Build 20250126 + +Core: + +* Changed core tool change routine to play nice with plugins subscribing to probe event. + +* Fixed typos in PR [#660](https://github.com/grblHAL/core/pull/660). + +Drivers: + +* STM32F4xx: updated the SuperLongBoard map. + +Plugins: + +* BLTouch: added `$BLRESET` command to reset the probe and stow of probe on soft reset. + +--- + Build 20250124 Core: diff --git a/grbl.h b/grbl.h index 899f49c..88ee33b 100644 --- a/grbl.h +++ b/grbl.h @@ -42,7 +42,7 @@ #else #define GRBL_VERSION "1.1f" #endif -#define GRBL_BUILD 20250124 +#define GRBL_BUILD 20250126 #define GRBL_URL "https://github.com/grblHAL" diff --git a/pin_bits_masks.h b/pin_bits_masks.h index d5ad4a5..88c2dca 100644 --- a/pin_bits_masks.h +++ b/pin_bits_masks.h @@ -219,27 +219,27 @@ static aux_ctrl_t aux_ctrl[] = { // The following pins are bound explicitly to aux input pins #if PROBE_ENABLE && defined(PROBE_PIN) && defined(AUX_DEVICES) #ifdef PROBE_PORT - { .function = Input_Probe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = PROBE_PIN, .port = PROBE_PORT }, + { .function = Input_Probe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = PROBE_PIN, .port = (void *)PROBE_PORT }, #else { .function = Input_Probe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = PROBE_PIN, .port = NULL }, #endif #endif #if SAFETY_DOOR_ENABLE && defined(SAFETY_DOOR_PIN) #ifdef SAFETY_DOOR_PORT - { .function = Input_SafetyDoor, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .safety_door_ajar = On }, .pin = SAFETY_DOOR_PIN, .port = SAFETY_DOOR_PORT }, + { .function = Input_SafetyDoor, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .safety_door_ajar = On }, .pin = SAFETY_DOOR_PIN, .port = (void *)SAFETY_DOOR_PORT }, #else { .function = Input_SafetyDoor, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .safety_door_ajar = On }, .pin = SAFETY_DOOR_PIN, .port = NULL }, #endif #endif #if MOTOR_FAULT_ENABLE && defined(MOTOR_FAULT_PIN) #ifdef MOTOR_FAULT_PORT - { .function = Input_MotorFault, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_fault = On }, .pin = MOTOR_FAULT_PIN, .port = MOTOR_FAULT_PORT }, + { .function = Input_MotorFault, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_fault = On }, .pin = MOTOR_FAULT_PIN, .port = (void *)MOTOR_FAULT_PORT }, #else { .function = Input_MotorFault, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_fault = On }, .pin = MOTOR_FAULT_PIN, .port = NULL }, #endif #if MOTOR_WARNING_ENABLE && defined(MOTOR_WARNING_PIN) #ifdef MOTOR_WARNING_PORT - { .function = Input_MotorWarning, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_fault = On }, .pin = MOTOR_WARNING_PIN, .port = MOTOR_WARNING_PORT }, + { .function = Input_MotorWarning, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_fault = On }, .pin = MOTOR_WARNING_PIN, .port = (void *)MOTOR_WARNING_PORT }, #else { .function = Input_MotorWarning, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .motor_warning = On }, .pin = MOTOR_WARNING_PIN, .port = NULL }, #endif @@ -247,21 +247,21 @@ static aux_ctrl_t aux_ctrl[] = { #endif #if I2C_STROBE_ENABLE && defined(I2C_STROBE_PIN) && defined(AUX_DEVICES) #ifdef I2C_STROBE_PORT - { .function = Input_I2CStrobe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = I2C_STROBE_PIN, .port = I2C_STROBE_PORT }, + { .function = Input_I2CStrobe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = I2C_STROBE_PIN, .port = (void *)I2C_STROBE_PORT }, #else { .function = Input_I2CStrobe, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = I2C_STROBE_PIN, .port = NULL }, #endif #endif #if MPG_ENABLE == 1 && defined(MPG_MODE_PIN) && defined(AUX_DEVICES) #ifdef MPG_MODE_PORT - { .function = Input_MPGSelect, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = MPG_MODE_PIN, .port = MPG_MODE_PORT }, + { .function = Input_MPGSelect, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = MPG_MODE_PIN, .port = (void *)MPG_MODE_PORT }, #else { .function = Input_MPGSelect, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Change), .cap = { .value = 0 }, .pin = MPG_MODE_PIN, .port = NULL }, #endif #endif #if QEI_SELECT_ENABLE && defined(QEI_SELECT_PIN) && defined(AUX_DEVICES) #ifdef QEI_SELECT_PORT - { .function = Input_QEI_Select, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = QEI_SELECT_PIN, .port = QEI_SELECT_PORT }, + { .function = Input_QEI_Select, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = QEI_SELECT_PIN, .port = (void *)QEI_SELECT_PORT }, #else { .function = Input_QEI_Select, .aux_port = 0xFF, .irq_mode = (pin_irq_mode_t)(IRQ_Mode_Rising|IRQ_Mode_Falling), .cap = { .value = 0 }, .pin = QEI_SELECT_PIN, .port = NULL }, #endif @@ -415,38 +415,38 @@ static aux_ctrl_out_t aux_ctrl_out[] = { #ifndef SPINDLE_ENABLE_PORT #define SPINDLE_ENABLE_PORT NULL #endif - { .function = Output_SpindleOn, .aux_port = 0xFF, .pin = SPINDLE_ENABLE_PIN, .port = SPINDLE_ENABLE_PORT }, + { .function = Output_SpindleOn, .aux_port = 0xFF, .pin = SPINDLE_ENABLE_PIN, .port = (void *)SPINDLE_ENABLE_PORT }, #endif #ifdef SPINDLE_PWM_PIN #ifndef SPINDLE_PWM_PORT #define SPINDLE_PWM_PORT NULL #endif - { .function = Output_SpindlePWM, .aux_port = 0xFF, .pin = SPINDLE_PWM_PIN, .port = SPINDLE_PWM_PORT }, + { .function = Output_SpindlePWM, .aux_port = 0xFF, .pin = SPINDLE_PWM_PIN, .port = (void *)SPINDLE_PWM_PORT }, #endif #ifdef SPINDLE_DIRECTION_PIN #ifndef SPINDLE_DIRECTION_PORT #define SPINDLE_DIRECTION_PORT NULL #endif - { .function = Output_SpindleDir, .aux_port = 0xFF, .pin = SPINDLE_DIRECTION_PIN, .port = SPINDLE_DIRECTION_PORT }, + { .function = Output_SpindleDir, .aux_port = 0xFF, .pin = SPINDLE_DIRECTION_PIN, .port = (void *)SPINDLE_DIRECTION_PORT }, #endif #ifdef SPINDLE1_ENABLE_PIN #ifndef SPINDLE1_ENABLE_PORT #define SPINDLE1_ENABLE_PORT NULL #endif - { .function = Output_Spindle1On, .aux_port = 0xFF, .pin = SPINDLE1_ENABLE_PIN, .port = SPINDLE1_ENABLE_PORT }, + { .function = Output_Spindle1On, .aux_port = 0xFF, .pin = SPINDLE1_ENABLE_PIN, .port = (void *)SPINDLE1_ENABLE_PORT }, #endif #ifdef SPINDLE1_PWM_PIN #ifndef SPINDLE1_PWM_PORT #define SPINDLE1_PWM_PORT NULL #endif - { .function = Output_Spindle1PWM, .aux_port = 0xFF, .pin = SPINDLE1_PWM_PIN, .port = SPINDLE1_PWM_PORT }, + { .function = Output_Spindle1PWM, .aux_port = 0xFF, .pin = SPINDLE1_PWM_PIN, .port = (void *)SPINDLE1_PWM_PORT }, #endif #ifdef SPINDLE1_DIRECTION_PIN #ifndef SPINDLE1_DIRECTION_PORT #define SPINDLE1_DIRECTION_PORT NULL #endif - { .function = Output_Spindle1Dir, .aux_port = 0xFF, .pin = SPINDLE1_DIRECTION_PIN, .port = SPINDLE1_DIRECTION_PORT }, + { .function = Output_Spindle1Dir, .aux_port = 0xFF, .pin = SPINDLE1_DIRECTION_PIN, .port = (void *)SPINDLE1_DIRECTION_PORT }, #endif #endif // SPINDLES @@ -455,13 +455,13 @@ static aux_ctrl_out_t aux_ctrl_out[] = { #ifndef COOLANT_FLOOD_PORT #define COOLANT_FLOOD_PORT NULL #endif - { .function = Output_CoolantFlood, .aux_port = 0xFF, .pin = COOLANT_FLOOD_PIN, .port = COOLANT_FLOOD_PORT }, + { .function = Output_CoolantFlood, .aux_port = 0xFF, .pin = COOLANT_FLOOD_PIN, .port = (void *)COOLANT_FLOOD_PORT }, #endif #ifdef COOLANT_MIST_PIN #ifndef COOLANT_MIST_PORT #define COOLANT_MIST_PORT NULL #endif - { .function = Output_CoolantMist, .aux_port = 0xFF, .pin = COOLANT_MIST_PIN, .port = COOLANT_MIST_PORT }, + { .function = Output_CoolantMist, .aux_port = 0xFF, .pin = COOLANT_MIST_PIN, .port = (void *)COOLANT_MIST_PORT }, #endif #endif // COOLANT @@ -469,13 +469,13 @@ static aux_ctrl_out_t aux_ctrl_out[] = { #ifndef COPROC_RESET_PORT #define COPROC_RESET_PORT NULL #endif - { .function = Output_CoProc_Reset, .aux_port = 0xFF, .pin = COPROC_RESET_PIN, .port = COPROC_RESET_PORT }, + { .function = Output_CoProc_Reset, .aux_port = 0xFF, .pin = COPROC_RESET_PIN, .port = (void *)COPROC_RESET_PORT }, #endif #ifdef COPROC_BOOT0_PIN #ifndef COPROC_BOOT0_PORT #define COPROC_BOOT0_PORT NULL #endif - { .function = Output_CoProc_Boot0, .aux_port = 0xFF, .pin = COPROC_BOOT0_PIN, .port = COPROC_BOOT0_PORT }, + { .function = Output_CoProc_Boot0, .aux_port = 0xFF, .pin = COPROC_BOOT0_PIN, .port = (void *)COPROC_BOOT0_PORT }, #endif }; diff --git a/planner.c b/planner.c index 0a9492c..4d605f8 100644 --- a/planner.c +++ b/planner.c @@ -556,7 +556,7 @@ bool plan_buffer_line (float *target, plan_line_data_t *pl_data) // Profiles are calculated as symmetrical (calculate to 1/2 programmed rate, then double) float time_to_max_accel = block->max_acceleration / block->jerk; // unit: min - time it takes to reach max acceleration float speed_after_jerkramp = 0.5f * block->jerk * time_to_max_accel * time_to_max_accel; // unit: mm / min - velocity after one completed jerk ramp up - Vt = V0 + A0T + 1/2 jerk*T - if (0.5*block->programmed_rate > speed_after_jerkramp) + if(0.5f * block->programmed_rate > speed_after_jerkramp) // Profile time = 2x (1 complete jerk ramp + additional time at max_accel to reach desired speed) block->acceleration = block->programmed_rate / (2.0f *(time_to_max_accel + (0.5f * block->programmed_rate - speed_after_jerkramp) / block->max_acceleration)); else diff --git a/spindle_control.c b/spindle_control.c index 23e0438..62b8e94 100644 --- a/spindle_control.c +++ b/spindle_control.c @@ -23,6 +23,9 @@ #include #include +#if ENABLE_SPINDLE_LINEARIZATION +#include +#endif #include "hal.h" #include "protocol.h" diff --git a/stepper.c b/stepper.c index ffe04f4..0a2f963 100644 --- a/stepper.c +++ b/stepper.c @@ -875,7 +875,7 @@ void st_prep_buffer (void) float speed_var; // Speed worker variable float mm_remaining = pl_block->millimeters; // New segment distance from end of block. float minimum_mm = mm_remaining - prep.req_mm_increment; // Guarantee at least one step. -#if ENABLE_ACCELERATION_PROFILES +#if ENABLE_JERK_ACCELERATION float time_to_jerk; // time needed for jerk ramp float jerk_rampdown; // calculated startpoint of jerk rampdown #endif diff --git a/tool_change.c b/tool_change.c index e179a2a..7002d73 100644 --- a/tool_change.c +++ b/tool_change.c @@ -48,6 +48,7 @@ static driver_reset_ptr driver_reset = NULL; static enqueue_realtime_command_ptr enqueue_realtime_command = NULL; static control_signals_callback_ptr control_interrupt_callback = NULL; static on_homing_completed_ptr on_homing_completed = NULL; +static on_probe_completed_ptr on_probe_completed; // Clear tool length offset on homing static void tc_on_homing_complete (axes_signals_t homing_cycle, bool success) @@ -61,7 +62,7 @@ static void tc_on_homing_complete (axes_signals_t homing_cycle, bool success) // Set tool offset on successful $TPW probe, prompt for retry on failure. // Called via probe completed event. -static void on_probe_completed (void) +static void onProbeCompleted (void) { if(!sys.flags.probe_succeeded) grbl.report.feedback_message(Message_ProbeFailedRetry); @@ -92,7 +93,9 @@ static void change_completed (void) if(probe_toolsetter) grbl.on_probe_toolsetter(¤t_tool, NULL, true, false); - grbl.on_probe_completed = NULL; + if(grbl.on_probe_completed == onProbeCompleted) + grbl.on_probe_completed = on_probe_completed; + gc_state.tool_change = probe_toolsetter = false; #ifndef NO_SAFETY_DOOR_SUPPORT @@ -358,8 +361,10 @@ static status_code_t tool_change (parser_state_t *parser_state) if((sys.homed.mask & homed_req) != homed_req) return Status_HomingRequired; - if(settings.tool_change.mode != ToolChange_SemiAutomatic) - grbl.on_probe_completed = on_probe_completed; + if(settings.tool_change.mode != ToolChange_SemiAutomatic && grbl.on_probe_completed != onProbeCompleted) { + on_probe_completed = grbl.on_probe_completed; + grbl.on_probe_completed = onProbeCompleted; + } block_cycle_start = settings.tool_change.mode != ToolChange_SemiAutomatic; @@ -474,7 +479,7 @@ void tc_init (void) } // Perform a probe cycle: set tool length offset and restart job if successful. -// Note: tool length offset is set by the on_probe_completed event handler. +// Note: tool length offset is set by the onProbeCompleted event handler. // Called by the $TPW system command. status_code_t tc_probe_workpiece (void) {