From 390c11bb7ef58d8c8d32e936f01b85d9709a0d84 Mon Sep 17 00:00:00 2001 From: Terje Io Date: Fri, 25 Apr 2025 17:13:42 +0200 Subject: [PATCH] Updated $N0 and $N1 startup commands to allow multi-block (line) gcode commands by using | (vertical bar) as the separator. No longer configures auxiliary output pins claimed for basic functions in order to avoid affecting any previously set alternate pin function. --- README.md | 4 ++-- changelog.md | 19 +++++++++++++++++-- grbl.h | 2 +- ioports.c | 6 +++--- motion_control.c | 2 +- system.c | 33 ++++++++++++++++++++++++++------- 6 files changed, 50 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 2da641e..c346e87 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## grblHAL ## -Latest build date is 20250424, see the [changelog](changelog.md) for details. +Latest build date is 20250425, see the [changelog](changelog.md) for details. > [!NOTE] > A settings reset will be performed on an update of builds prior to 20241208. Backup and restore of settings is recommended. @@ -89,4 +89,4 @@ G/M-codes not supported by [legacy Grbl](https://github.com/gnea/grbl/wiki) are Some [plugins](https://github.com/grblHAL/plugins) implements additional M-codes. --- -20250424 +20250425 diff --git a/changelog.md b/changelog.md index 9fee029..cc0aa81 100644 --- a/changelog.md +++ b/changelog.md @@ -1,17 +1,32 @@ ## grblHAL changelog +20250425 + +Core: + +* Updated `$N0` and `$N1` startup commands to allow multi-block \(line\) gcode commands by using `|` \(vertical bar\) as the separator. + +* No longer configures auxiliary output pins claimed for basic functions in order to avoid affecting any previously set alternate pin function. + +Drivers: + +* iMXRT1062: fix for issue [#95](https://github.com/grblHAL/iMXRT1062/issues/95), spindle PWM output missing. + +--- + 20250424 Core: -* Moved part of the driver based spindle sync code to the core. Spindle sync now has to be enabled in _grbl/config.h_. +* Moved part of the driver based spindle sync code to the core. +Spindle sync now has to be enabled in [grbl/config.h}(https://github.com/grblHAL/core/blob/b41018543b35b0f14f9ab29d9ccc43bd0e4045dc/config.h#L526-L534). Drivers: * iMXRT1062, MSP432P401R, STM32F4xx, STM32F7xx: removed spindle sync code now in the core. * RP2040: Added tentative support for spindle sync, board maps has to be updated for spindle encoder inputs - not all can be due to pin restrictions. -Fixed regression causing the Pico CNC board to lose spindle PWM output. +Fixed regression causing the PicoCNC board to lose spindle PWM output. * LPC176x, ESP32, TM4C123, STM32F1xx: replaced deprecated code. diff --git a/grbl.h b/grbl.h index cd29444..6b8ffa3 100644 --- a/grbl.h +++ b/grbl.h @@ -42,7 +42,7 @@ #else #define GRBL_VERSION "1.1f" #endif -#define GRBL_BUILD 20250424 +#define GRBL_BUILD 20250425 #define GRBL_URL "https://github.com/grblHAL" diff --git a/ioports.c b/ioports.c index b42840f..b35be10 100644 --- a/ioports.c +++ b/ioports.c @@ -351,7 +351,7 @@ bool ioport_set_function (xbar_t *pin, pin_function_t function, driver_caps_t ca { bool ok = false; io_ports_list_t *io_port = ports; - io_ports_private_t *cfg = get_port_data(!pin->mode.analog, pin->mode.output); + io_ports_private_t *cfg = get_port_data((io_port_type_t)!pin->mode.analog, (io_port_direction_t)pin->mode.output); if(io_port) do { if(io_port->ports_id == pin->ports_id && (ok = pin->set_function && pin->set_function(pin, function))) { @@ -1382,13 +1382,13 @@ static void ioports_configure (settings_t *settings) if(cfg->ports && (port = cfg->n_ports)) do { if((xbar = hal.port.get_pin_info(Port_Digital, Port_Output, map_reverse(cfg, --port)))) { - if(xbar->config && !(xbar->mode.pwm || xbar->mode.servo_pwm)) { + if(xbar->config && (cfg->bus.mask & (1 << port)) && !(xbar->mode.pwm || xbar->mode.servo_pwm)) { out_config.inverted = (settings->ioport.invert_out.mask & (1 << port)) && is_aux(cfg, xbar->function); out_config.open_drain = !!(settings->ioport.od_enable_out.mask & (1 << port)); xbar->config(xbar, &out_config, false); } else { // TODO: same for inputs? ioport_bus_t bus; - bus.mask = cfg->bus.mask & ~(1 << port); + bus.mask = cfg->bus.mask & (1 << port); setting_remove_elements(Settings_IoPort_InvertOut, bus.mask); } } diff --git a/motion_control.c b/motion_control.c index 0c7b6d0..aee25bd 100644 --- a/motion_control.c +++ b/motion_control.c @@ -55,7 +55,7 @@ void mc_backlash_init (axes_signals_t axes) if(bit_istrue(axes.mask, bit(idx))) { if((steps = lroundf(settings.axis[idx].backlash * settings.axis[idx].steps_per_mm))) { backlash_comp.values[idx] = (float)steps / settings.axis[idx].steps_per_mm; - BIT_SET(backlash_enabled.mask, bit(idx), settings.axis[idx].backlash > 0.0001f); + bit_true(backlash_enabled.mask, bit(idx)); BIT_SET(dir_negative.mask, bit(idx), bit_isfalse(settings.homing.dir_mask.mask, bit(idx))); } } diff --git a/system.c b/system.c index cb62964..ef8e91b 100644 --- a/system.c +++ b/system.c @@ -135,14 +135,18 @@ void system_execute_startup (void *data) { if(hal.nvs.type != NVS_None) { + uint_fast8_t idx; char line[sizeof(stored_line_t)]; - uint_fast8_t n; - for (n = 0; n < N_STARTUP_LINE; n++) { - if (!settings_read_startup_line(n, line)) + for(idx = 0; idx < N_STARTUP_LINE; idx++) { + if(!settings_read_startup_line(idx, line)) report_execute_startup_message(line, Status_SettingReadFail); - else if (*line != '\0') - report_execute_startup_message(line, gc_execute_block(line)); + else if(*line != '\0') { + char *block = strtok(line, "|"); + do { + report_execute_startup_message(block, gc_execute_block(block)); + } while((block = strtok(NULL, "|"))); + } } } } @@ -703,8 +707,23 @@ static status_code_t set_startup_line (sys_state_t state, char *args, uint_fast8 if(retval == Status_OK) { if(strlen(args) >= (sizeof(stored_line_t) - 1)) retval = Status_Overflow; - else if ((retval = gc_execute_block(args)) == Status_OK) // Execute gcode block to ensure block is valid. - settings_write_startup_line(lnr, args); + else { + + if(*args) { + + char line[sizeof(stored_line_t)], *block; + + strcpy(line, args); + block = strtok(line, "|"); + + do { + retval = gc_execute_block(block); // Execute gcode block to ensure block is valid. + } while(retval == Status_OK && (block = strtok(NULL, "|"))); + } + + if(retval == Status_OK) + settings_write_startup_line(lnr, args); + } } return retval;