Limited tool change probe moves to be within machine limits. Ref. issue #542.

Added setting $358 to enable experimental functionality for fast rotary 'rewind' to stored G28 position.
Return move should complete in half a rotation or less.
For developers: added option to redirect debug via driver provided function when DEBUGOUT is set to -1 in config.h. Ref. issue #545.
This commit is contained in:
Terje Io
2024-07-19 09:49:46 +02:00
parent 5cff12e660
commit 8b9b7859ee
13 changed files with 214 additions and 50 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ It has been written to complement grblHAL and has features such as proper keyboa
---
Latest build date is 20240704, see the [changelog](changelog.md) for details.
Latest build date is 20240719, see the [changelog](changelog.md) for details.
__NOTE:__ Build 20240222 has moved the probe input to the ioPorts pool of inputs and will be allocated from it when configured.
The change is major and _potentially dangerous_, it may damage your probe, so please _verify correct operation_ after installing this, or later, builds.
+22
View File
@@ -1,5 +1,27 @@
## grblHAL changelog
<a name="20240715">Build 20240719
Core:
* Limited tool change probe moves to be within machine limits. Ref. [issue #542](https://github.com/grblHAL/core/issues/542).
* Added setting `$358` to enable experimental functionality for fast rotary 'rewind' to stored G28 position. Return move should complete in half a rotation or less.
To use program:
```
G91G28<axisletter>0
G90
```
where \<axisletter\> is the axisletter of the rotary axis to move.
* For developers: added option to redirect debug via driver provided function when `DEBUGOUT` is set to `-1` in _config.h_. Can be used to send debug output to debugger interfaces.
Plugins:
* WebUI: fix for crash when settings page is opened with macros plugin enabled. Ref. [issue #14](https://github.com/grblHAL/Plugin_WebUI/issues/14).
---
<a name="20240709"/>Build 20240709
Core:
+12
View File
@@ -1783,6 +1783,18 @@ Timezone offset from UTC in hours, allowed range is -12.0 - 12.0.
#endif
///@}
/*! @name $538 - Setting_RotaryWrap
Enable fast return to G28 position for rotary axes by \ref axismask.
Use:
G91G28<axisletter>0
G90
*/
///@{
#if !defined DEFAULT_AXIS_ROTARY_WRAP_MASK || defined __DOXYGEN__
#define DEFAULT_AXIS_ROTARY_WRAP_MASK 0
#endif
///@}
// Axis settings (Group_XAxis - Group_VAxis)
/*! @name $10x - Setting_AxisStepsPerMM
+51 -3
View File
@@ -1287,7 +1287,7 @@ status_code_t gc_execute_block (char *block)
case 56:
if(!settings.parking.flags.enable_override_control) // TODO: check if enabled?
FAIL(Status_GcodeUnsupportedCommand); // [Unsupported M command]
// no break;
// no break
case 48: case 49: case 50: case 51: case 53:
word_bit.modal_group.M9 = On;
gc_block.override_command = (override_mode_t)int_value;
@@ -1979,7 +1979,7 @@ status_code_t gc_execute_block (char *block)
if (gc_block.modal.units_imperial) do { // Axes indices are consistent, so loop may be used.
idx--;
#if N_AXIS > 3
if (bit_istrue(axis_words.mask, bit(idx)) && bit_isfalse(settings.steppers.is_rotational.mask, bit(idx))) {
if (bit_istrue(axis_words.mask, bit(idx)) && bit_isfalse(settings.steppers.is_rotary.mask, bit(idx))) {
#else
if (bit_istrue(axis_words.mask, bit(idx))) {
#endif
@@ -3408,12 +3408,60 @@ status_code_t gc_execute_block (char *block)
break;
case NonModal_GoHome_0:
#if N_AXIS > 3
{
axes_signals_t wrap = { (axis_words.mask & settings.steppers.is_rotary.mask) & settings.steppers.rotary_wrap.mask };
if(gc_state.modal.distance_incremental && wrap.mask) {
for(idx = Z_AXIS + 1; idx < N_AXIS; idx++) {
if(bit_istrue(wrap.mask, bit(idx)) && gc_block.values.xyz[idx] == gc_state.position[idx])
gc_block.rotary_wrap.mask |= bit(idx);
}
}
}
// no break
#endif
case NonModal_GoHome_1:
// Move to intermediate position before going home. Obeys current coordinate system and offsets
// and absolute and incremental modes.
plan_data.condition.rapid_motion = On; // Set rapid motion condition flag.
if (axis_command)
if(axis_command)
mc_line(gc_block.values.xyz, &plan_data);
#if N_AXIS > 3
if(gc_block.rotary_wrap.mask) {
coord_system_t wrap_target;
protocol_buffer_synchronize();
memcpy(wrap_target.xyz, gc_block.values.coord_data.xyz, sizeof(coord_system_t));
for(idx = Z_AXIS + 1; idx < N_AXIS; idx++) {
if(bit_istrue(gc_block.rotary_wrap.mask, bit(idx))) {
float position, delta;
if((wrap_target.xyz[idx] = fmodf(wrap_target.xyz[idx], 360.0f)) < 0.0f)
wrap_target.xyz[idx] = 360.0f + wrap_target.xyz[idx];
if((position = fmodf(gc_state.position[idx], 360.0f)) < 0.0)
position = 360.0f + position;
if((delta = position - wrap_target.xyz[idx]) < -180.0f)
position += 360.0f;
else if(delta > 180.0f)
position -= 360.0f;
sys.position[idx] = lroundf(position * settings.axis[idx].steps_per_mm);
}
}
sync_position();
mc_line(wrap_target.xyz, &plan_data);
protocol_buffer_synchronize();
for(idx = Z_AXIS + 1; idx < N_AXIS; idx++) {
if(bit_istrue(gc_block.rotary_wrap.mask, bit(idx)))
sys.position[idx] = lroundf(gc_block.values.coord_data.xyz[idx] * settings.axis[idx].steps_per_mm);
}
sync_position();
} else
#endif
mc_line(gc_block.values.coord_data.xyz, &plan_data);
memcpy(gc_state.position, gc_block.values.coord_data.xyz, sizeof(gc_state.position));
set_scaling(1.0f);
+3
View File
@@ -624,6 +624,9 @@ typedef struct {
#if NGC_PARAMETERS_ENABLE
modal_state_action_t state_action; //!< M70-M73 modal state action
#endif
#if N_AXIS > 3
axes_signals_t rotary_wrap;
#endif
} parser_block_t;
// Initialize the parser
+1 -1
View File
@@ -42,7 +42,7 @@
#else
#define GRBL_VERSION "1.1f"
#endif
#define GRBL_BUILD 20240709
#define GRBL_BUILD 20240719
#define GRBL_URL "https://github.com/grblHAL"
+1 -1
View File
@@ -296,7 +296,7 @@ static bool homing_cycle (axes_signals_t cycle, axes_signals_t auto_square)
// NOTE: settings.axis[].max_travel is stored as a negative value.
if(bit_istrue(cycle.mask, bit(idx))) {
#if N_AXIS > 3
if(bit_istrue(settings.steppers.is_rotational.mask, bit(idx)))
if(bit_istrue(settings.steppers.is_rotary.mask, bit(idx)))
max_travel = max(max_travel, (-HOMING_AXIS_SEARCH_SCALAR) * (settings.axis[idx].max_travel < -0.0f ? settings.axis[idx].max_travel : -360.0f));
else
#endif
+3 -3
View File
@@ -469,13 +469,13 @@ bool plan_buffer_line (float *target, plan_line_data_t *pl_data)
if(!block->condition.inverse_time &&
!block->condition.rapid_motion &&
(motion.mask & settings.steppers.is_rotational.mask) &&
(motion.mask & ~settings.steppers.is_rotational.mask)) {
(motion.mask & settings.steppers.is_rotary.mask) &&
(motion.mask & ~settings.steppers.is_rotary.mask)) {
float linear_magnitude = 0.0f;
idx = 0;
motion.mask &= ~settings.steppers.is_rotational.mask;
motion.mask &= ~settings.steppers.is_rotary.mask;
while(motion.mask) {
if(motion.mask & 0x01)
+1 -1
View File
@@ -118,7 +118,7 @@ static char *get_axis_values_inches (float *axis_values)
if(idx == X_AXIS && gc_state.modal.diameter_mode)
strcat(buf, ftoa(axis_values[idx] * INCH_PER_MM * 2.0f, N_DECIMAL_COORDVALUE_INCH));
#if N_AXIS > 3
else if(idx > Z_AXIS && bit_istrue(settings.steppers.is_rotational.mask, bit(idx)))
else if(idx > Z_AXIS && bit_istrue(settings.steppers.is_rotary.mask, bit(idx)))
strcat(buf, ftoa(axis_values[idx], N_DECIMAL_COORDVALUE_MM));
#endif
else
+65 -30
View File
@@ -103,7 +103,8 @@ PROGMEM const settings_t defaults = {
#endif
.steppers.deenergize.mask = DEFAULT_STEPPER_DEENERGIZE_MASK,
#if N_AXIS > 3
.steppers.is_rotational.mask = (DEFAULT_AXIS_ROTATIONAL_MASK & AXES_BITMASK) & 0b11111000,
.steppers.is_rotary.mask = (DEFAULT_AXIS_ROTATIONAL_MASK & AXES_BITMASK) & 0b11111000,
.steppers.rotary_wrap.mask = (DEFAULT_AXIS_ROTARY_WRAP_MASK & AXES_BITMASK) & 0b11111000,
#endif
#if DEFAULT_HOMING_ENABLE
.homing.flags.enabled = DEFAULT_HOMING_ENABLE,
@@ -406,7 +407,8 @@ static status_code_t set_linear_piece (setting_id_t id, char *svalue);
static char *get_linear_piece (setting_id_t id);
#endif
#if N_AXIS > 3
static status_code_t set_rotational_axes (setting_id_t id, uint_fast16_t int_value);
static status_code_t set_rotary_axes (setting_id_t id, uint_fast16_t int_value);
static status_code_t set_rotary_wrap_axes (setting_id_t id, uint_fast16_t int_value);
#endif
#if COMPATIBILITY_LEVEL > 2
static status_code_t set_enable_invert_mask (setting_id_t id, uint_fast16_t int_value);
@@ -434,6 +436,28 @@ static char control_signals[] = "Reset,Feed hold,Cycle start,Safety door,Block d
static char spindle_signals[] = "Spindle enable,Spindle direction,PWM";
static char coolant_signals[] = "Flood,Mist";
static char ganged_axes[] = "X-Axis,Y-Axis,Z-Axis";
#if !AXIS_REMAP_ABC2UVW
#if N_AXIS == 4
static const char rotary_axes[] = "A-Axis";
#elif N_AXIS == 5
static const char rotary_axes[] = "A-Axis,B-Axis";
#elif N_AXIS == 6
static const char rotary_axes[] = "A-Axis,B-Axis,C-Axis";
#elif N_AXIS == 7
static const char rotary_axes[] = "A-Axis,B-Axis,C-Axis,U-Axis";
#elif N_AXIS == 8
static const char rotary_axes[] = "A-Axis,B-Axis,C-Axis,U-Axis,V-Axis";
#endif
#else
#if N_AXIS == 4
static const char rotary_axes[] = "U-Axis";
#elif N_AXIS == 5
static const char rotary_axes[] = "U-Axis,V-Axis";
#elif N_AXIS == 6
static const char rotary_axes[] = "U-Axis,V-Axis,W-Axis";
#endif
#endif
static char fs_options[] = "Auto mount SD card,Hide LittleFS";
static char spindle_types[100] = "";
static char axis_dist[4] = "mm";
@@ -585,26 +609,8 @@ PROGMEM static const setting_detail_t setting_detail[] = {
#if COMPATIBILITY_LEVEL <= 1
{ Setting_DisableG92Persistence, Group_General, "Disable G92 persistence", NULL, Format_Bool, NULL, NULL, NULL, Setting_IsExtendedFn, set_g92_disable_persistence, get_int, NULL },
#endif
#if !AXIS_REMAP_ABC2UVW
#if N_AXIS == 4
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "A-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 5
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "A-Axis,B-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 6
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "A-Axis,B-Axis,C-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 7
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "A-Axis,B-Axis,C-Axis,U-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 8
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "A-Axis,B-Axis,C-Axis,U-Axis,V-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#endif
#else
#if N_AXIS == 4
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "U-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 5
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "U-Axis,V-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#elif N_AXIS == 6
{ Settings_Axis_Rotational, Group_Stepper, "Rotational axes", NULL, Format_Bitfield, "U-Axis,V-Axis,W-Axis", NULL, NULL, Setting_IsExtendedFn, set_rotational_axes, get_int, NULL },
#endif
#if N_AXIS > 3
{ Settings_RotaryAxes, Group_Stepper, "Rotary axes", NULL, Format_Bitfield, rotary_axes, NULL, NULL, Setting_IsExtendedFn, set_rotary_axes, get_int, NULL },
#endif
#ifndef NO_SAFETY_DOOR_SUPPORT
{ Setting_DoorSpindleOnDelay, Group_SafetyDoor, "Spindle on delay", "s", Format_Decimal, "#0.0", "0.5", "20", Setting_IsExtended, &settings.safety_door.spindle_on_delay, NULL, is_setting_available },
@@ -623,6 +629,9 @@ PROGMEM static const setting_detail_t setting_detail[] = {
{ Setting_OffsetLock, Group_General, "Lock coordinate systems", NULL, Format_Bitfield, "G59.1,G59.2,G59.3", NULL, NULL, Setting_IsExtendedFn, set_offset_lock, get_int, NULL },
#endif
{ Setting_EncoderSpindle, Group_Spindle, "Encoder spindle", NULL, Format_RadioButtons, spindle_types, NULL, NULL, Setting_IsExtendedFn, set_encoder_spindle, get_int, is_setting_available },
#if N_AXIS > 3
{ Setting_RotaryWrap, Group_Stepper, "Fast rotary go to G28", NULL, Format_Bitfield, rotary_axes, NULL, NULL, Setting_IsExtendedFn, set_rotary_wrap_axes, get_int, NULL },
#endif
{ Setting_FSOptions, Group_General, "File systems options", NULL, Format_Bitfield, fs_options, NULL, NULL, Setting_IsExtended, &settings.fs_options.mask, NULL, is_setting_available },
{ Setting_HomePinsInvertMask, Group_Limits, "Invert home pins", NULL, Format_AxisMask, NULL, NULL, NULL, Setting_IsExtended, &settings.home_invert.mask, NULL, is_setting_available },
{ Setting_HoldCoolantOnDelay, Group_Coolant, "Coolant on delay", "s", Format_Decimal, "#0.0", "0.5", "20", Setting_IsExtended, &settings.safety_door.coolant_on_delay, NULL, is_setting_available }
@@ -784,9 +793,12 @@ PROGMEM static const setting_descr_t setting_descr[] = {
#if COMPATIBILITY_LEVEL <= 1
{ Setting_DisableG92Persistence, "Disables save/restore of G92 offset to non-volatile storage (NVS)." },
#endif
#if N_AXIS > 3
{ Settings_RotaryAxes, "Designates axes as rotary, interpretation some other relevant axis settings is changed accordingly." },
#endif
#ifndef NO_SAFETY_DOOR_SUPPORT
{ Setting_DoorSpindleOnDelay, "Delay to allow spindle to spin up after safety door is opened or feed hold is canceled.." },
{ Setting_DoorCoolantOnDelay, "Delay to allow coolant to restart after safety door is opened or feed hold is canceled.." },
{ Setting_DoorSpindleOnDelay, "Delay to allow spindle to spin up after safety door is opened or feed hold is canceled." },
{ Setting_DoorCoolantOnDelay, "Delay to allow coolant to restart after safety door is opened or feed hold is canceled." },
#else
{ Setting_DoorSpindleOnDelay, "Delay to allow spindle to spin up when spindle at speed tolerance is > 0." },
#endif
@@ -803,6 +815,13 @@ PROGMEM static const setting_descr_t setting_descr[] = {
{ Setting_NGCDebugOut, "Example: (debug, metric mode: #<_metric>, coord system: #5220)" },
#endif
{ Setting_EncoderSpindle, "Specifies which spindle has the encoder attached." },
#if N_AXIS > 3
{ Setting_RotaryWrap, "Perform fast move to angle stored in G28 position.\\n"
"Use:\\n"
" G91G28<axisletter>0\\n"
" G90\\n"
},
#endif
{ Setting_FSOptions, "Auto mount SD card on startup." },
{ Setting_HomePinsInvertMask, "Inverts the axis home input signals." },
{ Setting_HoldCoolantOnDelay, "Delay to allow coolant to restart after feed hold is canceled." }
@@ -1128,7 +1147,7 @@ static inline void tmp_set_hard_limits (void)
sys.hard_limits.mask = settings.limits.flags.hard_enabled ? AXES_BITMASK : 0;
#if N_AXIS > 3
if(settings.limits.flags.hard_disabled_rotary)
sys.hard_limits.mask &= ~settings.steppers.is_rotational.mask;
sys.hard_limits.mask &= ~settings.steppers.is_rotary.mask;
#endif
}
@@ -1340,16 +1359,23 @@ static inline void set_axis_unit (const setting_detail_t *setting, const char *u
#if N_AXIS > 3
static status_code_t set_rotational_axes (setting_id_t id, uint_fast16_t int_value)
static status_code_t set_rotary_axes (setting_id_t id, uint_fast16_t int_value)
{
settings.steppers.is_rotational.mask = (int_value << 3) & AXES_BITMASK;
settings.steppers.is_rotary.mask = (int_value << 3) & AXES_BITMASK;
return Status_OK;
}
static status_code_t set_rotary_wrap_axes (setting_id_t id, uint_fast16_t int_value)
{
settings.steppers.rotary_wrap.mask = (int_value << 3) & AXES_BITMASK;
return Status_OK;
}
static inline bool axis_is_rotary (uint_fast8_t axis_idx)
{
return bit_istrue(settings.steppers.is_rotational.mask, bit(axis_idx));
return bit_istrue(settings.steppers.is_rotary.mask, bit(axis_idx));
}
static const char *set_axis_setting_unit (setting_id_t setting_id, uint_fast8_t axis_idx)
@@ -1730,8 +1756,12 @@ static uint32_t get_int (setting_id_t id)
break;
#if N_AXIS > 3
case Settings_Axis_Rotational:
value = (settings.steppers.is_rotational.mask & AXES_BITMASK) >> 3;
case Settings_RotaryAxes:
value = (settings.steppers.is_rotary.mask & AXES_BITMASK) >> 3;
break;
case Setting_RotaryWrap:
value = (settings.steppers.rotary_wrap.mask & AXES_BITMASK) >> 3;
break;
#endif
@@ -2184,6 +2214,7 @@ bool read_global_settings ()
bool ok = hal.nvs.type != NVS_None && SETTINGS_VERSION == hal.nvs.get_byte(0) && hal.nvs.memcpy_from_nvs((uint8_t *)&settings, NVS_ADDR_GLOBAL, sizeof(settings_t), true) == NVS_TransferResult_OK;
// Sanity check of settings, board map could have been changed...
#if LATHE_UVW_OPTION
settings.mode = Mode_Lathe;
#else
@@ -2209,6 +2240,10 @@ bool read_global_settings ()
settings.steppers.enable_invert.mask = AXES_BITMASK;
#endif
#if N_AXIS > 3
settings.steppers.rotary_wrap.mask &= settings.steppers.is_rotary.mask;
#endif
settings.control_invert.mask |= limits_override.mask;
settings.control_disable_pullup.mask &= ~limits_override.mask;
+8 -6
View File
@@ -7,18 +7,18 @@
Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC
Copyright (c) 2009-2011 Simen Svale Skogsrud
Grbl is free software: you can redistribute it and/or modify
grblHAL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Grbl is distributed in the hope that it will be useful,
grblHAL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SETTINGS_H_
@@ -247,7 +247,7 @@ typedef enum {
Settings_IoPort_OD_Enable = 373,
Settings_ModBus_BaudRate = 374,
Settings_ModBus_RXTimeout = 375,
Settings_Axis_Rotational = 376,
Settings_RotaryAxes = 376,
Setting_BlueToothInitOK = 377,
Setting_CoolantOnDelay = 378,
Setting_CoolantOffDelay = 379,
@@ -370,6 +370,7 @@ typedef enum {
Setting_NetworkMAC = 535,
Setting_RGB_StripLengt0 = 536,
Setting_RGB_StripLengt1 = 537,
Setting_RotaryWrap = 538,
Setting_Panel_SpindleSpeed = 540, // NOTE: Reserving settings values 540 to 579 for panel settings.
Setting_Panel_ModbusAddress = 541,
@@ -664,7 +665,8 @@ typedef struct {
axes_signals_t enable_invert;
axes_signals_t deenergize;
#if N_AXIS > 3
axes_signals_t is_rotational; // rotational axes distances are not scaled in imperial mode
axes_signals_t is_rotary; // rotary axes distances are not scaled in imperial mode
axes_signals_t rotary_wrap; // rotary axes that allows G28 wrap for faster move to home position
#endif
float pulse_microseconds;
float pulse_delay_microseconds;
+34 -2
View File
@@ -651,6 +651,38 @@ const io_stream_t *stream_null_init (uint32_t baud_rate)
#ifdef DEBUGOUT
#if DEBUGOUT == -1
__attribute__((weak)) void debug_write (const char *s)
{
// NOOP
}
void debug_writeln (const char *s)
{
debug_write(s);
debug_write(ASCII_EOL);
}
void debug_printf (const char *fmt, ...)
{
char debug_out[DEBUG_BUFFER];
va_list args;
va_start(args, fmt);
vsnprintf(debug_out, sizeof(debug_out) - 1, fmt, args);
va_end(args);
debug_writeln(debug_out);
}
bool debug_stream_init (void)
{
return true;
}
#else
static stream_write_ptr dbg_write = NULL;
void debug_write (const char *s)
@@ -682,8 +714,6 @@ void debug_printf (const char *fmt, ...)
va_end(args);
debug_writeln(debug_out);
while(hal.stream.get_tx_buffer_count()) // Wait until message is delivered
grbl.on_execute_realtime(state_get());
}
static bool debug_claim_stream (io_stream_properties_t const *stream)
@@ -716,6 +746,8 @@ bool debug_stream_init (void)
return hal.debug.write == debug_write;
}
#endif // DEBUGOUT
#elif defined(DEBUG)
void debug_printf (const char *fmt, ...)
+12 -2
View File
@@ -180,6 +180,15 @@ static void execute_restore (void *data)
system_set_exec_state_flag(EXEC_CYCLE_START);
}
// Set and limit probe travel to be within machine limits.
static void set_probe_target (coord_data_t *target, uint8_t axis)
{
target->values[axis] -= settings.tool_change.probing_distance;
if(bit_istrue(sys.homed.mask, bit(axis)) && settings.axis[axis].max_travel < -0.0f)
target->values[axis] = max(min(target->values[axis], sys.work_envelope.max.values[axis]), sys.work_envelope.min.values[axis]);
}
// Execute touch off on cycle start event from @ G59.3 position.
// Used in SemiAutomatic mode ($341=3) only. Called from the foreground process.
static void execute_probe (void *data)
@@ -213,7 +222,8 @@ static void execute_probe (void *data)
plan_data.feed_rate = settings.tool_change.seek_rate;
plan_data.condition.value = 0;
plan_data.spindle.state.value = 0;
target.values[plane.axis_linear] -= settings.tool_change.probing_distance;
set_probe_target(&target, plane.axis_linear);
if((ok = ok && mc_probe_cycle(target.values, &plan_data, flags) == GCProbe_Found))
{
@@ -485,7 +495,7 @@ status_code_t tc_probe_workpiece (void)
plan_data_init(&plan_data);
plan_data.feed_rate = settings.tool_change.seek_rate;
target.values[plane.axis_linear] -= settings.tool_change.probing_distance;
set_probe_target(&target, plane.axis_linear);
if((ok = mc_probe_cycle(target.values, &plan_data, flags) == GCProbe_Found))
{