Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Marlin/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -1610,7 +1610,8 @@
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
#define PROBING_MARGIN 10

// X and Y axis travel speed (mm/min) between probes
// X and Y axis travel speed (mm/min) between probes.
// Leave undefined to use the average of the current XY homing feedrate.
#define XY_PROBE_FEEDRATE (133*60)

// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
Expand Down Expand Up @@ -2304,6 +2305,9 @@
// Homing speeds (linear=mm/min, rotational=°/min)
#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }

// Edit homing feedrates with M210 and MarlinUI menu items
//#define EDITABLE_HOMING_FEEDRATE

// Validate that endstops are triggered on homing moves
#define VALIDATE_HOMING_ENDSTOPS

Expand Down
53 changes: 32 additions & 21 deletions Marlin/src/core/language.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@
#define STR_MAX_ACCELERATION "Max Acceleration (units/s2)"
#define STR_MAX_FEEDRATES "Max feedrates (units/s)"
#define STR_ACCELERATION_P_R_T "Acceleration (units/s2) (P<print-accel> R<retract-accel> T<travel-accel>)"
#define STR_HOMING_FEEDRATE "Homing Feedrate"
#define STR_TOOL_CHANGING "Tool-changing"
#define STR_HOTEND_OFFSETS "Hotend offsets"
#define STR_SERVO_ANGLES "Servo Angles"
Expand Down Expand Up @@ -323,6 +324,37 @@
#define STR_USER_THERMISTORS "User thermistors"
#define STR_DELAYED_POWEROFF "Delayed poweroff"

//
// General axis names
//
#if HAS_X_AXIS
#define AXIS1_NAME 'X'
#endif
#if HAS_Y_AXIS
#define AXIS2_NAME 'Y'
#endif
#if HAS_Z_AXIS
#define AXIS3_NAME 'Z'
#endif
#define STR_X "X"
#define STR_Y "Y"
#define STR_Z "Z"
#define STR_E "E"
#if IS_KINEMATIC
#define STR_A "A"
#define STR_B "B"
#define STR_C "C"
#else
#define STR_A STR_X
#define STR_B STR_Y
#define STR_C STR_Z
#endif
#define STR_X2 STR_A "2"
#define STR_Y2 STR_B "2"
#define STR_Z2 STR_C "2"
#define STR_Z3 STR_C "3"
#define STR_Z4 STR_C "4"

//
// Endstop Names used by Endstops::report_states
//
Expand Down Expand Up @@ -354,29 +386,8 @@
#define STR_Z_PROBE "z_probe"
#define STR_PROBE_EN "probe_en"
#define STR_FILAMENT "filament"

#define STR_CALIBRATION "calibration"

// General axis names
#define STR_X "X"
#define STR_Y "Y"
#define STR_Z "Z"
#define STR_E "E"
#if IS_KINEMATIC
#define STR_A "A"
#define STR_B "B"
#define STR_C "C"
#else
#define STR_A "X"
#define STR_B "Y"
#define STR_C "Z"
#endif
#define STR_X2 "X2"
#define STR_Y2 "Y2"
#define STR_Z2 "Z2"
#define STR_Z3 "Z3"
#define STR_Z4 "Z4"

// Extra Axis and Endstop Names
#if HAS_I_AXIS
#if AXIS4_NAME == 'A'
Expand Down
11 changes: 5 additions & 6 deletions Marlin/src/gcode/calibrate/G28.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,9 +322,9 @@ void GcodeSuite::G28() {

#else // !DELTA && !AXEL_TPARA

#define _UNSAFE(A) TERN0(Z_SAFE_HOMING, homeZ && axis_should_home(_AXIS(A)))
#define _UNSAFE(A) TERN0(Z_SAFE_HOMING, homeZZ && axis_should_home(_AXIS(A)))

const bool homeZ = TERN0(HAS_Z_AXIS, parser.seen_test('Z')),
const bool homeZZ = TERN0(HAS_Z_AXIS, parser.seen_test('Z')),
NUM_AXIS_LIST_( // Other axes should be homed before Z safe-homing
needX = _UNSAFE(X), needY = _UNSAFE(Y), needZ = false, // UNUSED
needI = _UNSAFE(I), needJ = _UNSAFE(J), needK = _UNSAFE(K),
Expand All @@ -333,7 +333,7 @@ void GcodeSuite::G28() {
NUM_AXIS_LIST_( // Home each axis if needed or flagged
homeX = needX || parser.seen_test('X'),
homeY = needY || parser.seen_test('Y'),
homeZZ = homeZ,
homeZ = homeZZ,
homeI = needI || parser.seen_test(AXIS4_NAME), homeJ = needJ || parser.seen_test(AXIS5_NAME),
homeK = needK || parser.seen_test(AXIS6_NAME), homeU = needU || parser.seen_test(AXIS7_NAME),
homeV = needV || parser.seen_test(AXIS8_NAME), homeW = needW || parser.seen_test(AXIS9_NAME)
Expand All @@ -355,7 +355,7 @@ void GcodeSuite::G28() {

#if HAS_Z_AXIS

UNUSED(needZ); UNUSED(homeZZ);
UNUSED(needZ);

// Z may home first, e.g., when homing away from the bed.
// This is also permitted when homing with a Z endstop.
Expand Down Expand Up @@ -439,8 +439,7 @@ void GcodeSuite::G28() {

#if HAS_Y_AXIS
// Home Y (after X)
if (DISABLED(HOME_Y_BEFORE_X) && doY)
homeaxis(Y_AXIS);
if (DISABLED(HOME_Y_BEFORE_X) && doY) homeaxis(Y_AXIS);
#endif

#if ALL(FOAMCUTTER_XYUV, HAS_J_AXIS)
Expand Down
100 changes: 100 additions & 0 deletions Marlin/src/gcode/config/M210.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program 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.
*
* This program 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/

#include "../../inc/MarlinConfigPre.h"

#if ENABLED(EDITABLE_HOMING_FEEDRATE)

#include "../gcode.h"
#include "../../module/motion.h"

/**
* M210 - Set homing feedrate for one or more axes
* in current units (in/mm) per minute
*
* X[feedrate] Set X axis homing feedrate
* Y[feedrate] Set Y axis homing feedrate
* Z[feedrate] Set Z axis homing feedrate
* A[feedrate] Set I axis homing feedrate (configured axis name applies)
* B[feedrate] Set J axis homing feedrate (configured axis name applies)
* C[feedrate] Set K axis homing feedrate (configured axis name applies)
* U[feedrate] Set U axis homing feedrate (configured axis name applies)
* V[feedrate] Set V axis homing feedrate (configured axis name applies)
* W[feedrate] Set W axis homing feedrate (configured axis name applies)
*
* With no arguments, report the current offsets.
*/
void GcodeSuite::M210() {
if (!parser.seen_any())
return M210_report();

#if HAS_X_AXIS
if (parser.floatval('X') > 0) homing_feedrate_mm_m.x = parser.value_axis_units(X_AXIS);
#endif
#if HAS_Y_AXIS
if (parser.floatval('Y') > 0) homing_feedrate_mm_m.y = parser.value_axis_units(Y_AXIS);
#endif
#if HAS_Z_AXIS
if (parser.floatval('Z') > 0) homing_feedrate_mm_m.z = parser.value_axis_units(Z_AXIS);
#endif
#if HAS_I_AXIS
if (parser.floatval(AXIS4_NAME) > 0) homing_feedrate_mm_m.i = parser.value_axis_units(I_AXIS);
#endif
#if HAS_J_AXIS
if (parser.floatval(AXIS5_NAME) > 0) homing_feedrate_mm_m.j = parser.value_axis_units(J_AXIS);
#endif
#if HAS_K_AXIS
if (parser.floatval(AXIS6_NAME) > 0) homing_feedrate_mm_m.k = parser.value_axis_units(K_AXIS);
#endif
#if HAS_U_AXIS
if (parser.floatval(AXIS7_NAME) > 0) homing_feedrate_mm_m.u = parser.value_axis_units(U_AXIS);
#endif
#if HAS_V_AXIS
if (parser.floatval(AXIS8_NAME) > 0) homing_feedrate_mm_m.v = parser.value_axis_units(V_AXIS);
#endif
#if HAS_W_AXIS
if (parser.floatval(AXIS9_NAME) > 0) homing_feedrate_mm_m.w = parser.value_axis_units(W_AXIS);
#endif
}

void GcodeSuite::M210_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);

report_heading_etc(forReplay, F(STR_HOMING_FEEDRATE));

SERIAL_ECHOPGM(" M210");
SERIAL_ECHOLNPGM_P(
LIST_N(DOUBLE(NUM_AXES)
, SP_X_STR, X_AXIS_UNIT(homing_feedrate_mm_m.x)
, SP_Y_STR, Y_AXIS_UNIT(homing_feedrate_mm_m.y)
, SP_Z_STR, Z_AXIS_UNIT(homing_feedrate_mm_m.z)
, SP_I_STR, I_AXIS_UNIT(homing_feedrate_mm_m.i)
, SP_J_STR, J_AXIS_UNIT(homing_feedrate_mm_m.j)
, SP_K_STR, K_AXIS_UNIT(homing_feedrate_mm_m.k)
, SP_U_STR, U_AXIS_UNIT(homing_feedrate_mm_m.u)
, SP_V_STR, V_AXIS_UNIT(homing_feedrate_mm_m.v)
, SP_W_STR, W_AXIS_UNIT(homing_feedrate_mm_m.w)
)
);
}

#endif // EDITABLE_HOMING_FEEDRATE
9 changes: 7 additions & 2 deletions Marlin/src/gcode/gcode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,10 @@ void GcodeSuite::get_destination_from_command() {
#endif

if (parser.floatval('F') > 0) {
feedrate_mm_s = parser.value_feedrate();
const float fr_mm_min = parser.value_linear_units();
feedrate_mm_s = MMM_TO_MMS(fr_mm_min);
// Update the cutter feed rate for use by M4 I set inline moves.
TERN_(LASER_FEATURE, cutter.feedrate_mm_m = MMS_TO_MMM(feedrate_mm_s));
TERN_(LASER_FEATURE, cutter.feedrate_mm_m = fr_mm_min);
}

#if ALL(PRINTCOUNTER, HAS_EXTRUDERS)
Expand Down Expand Up @@ -742,6 +743,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
#endif
#endif

#if ENABLED(EDITABLE_HOMING_FEEDRATE)
case 210: M210(); break; // M210: Set the homing feedrate
#endif

#if HAS_SOFTWARE_ENDSTOPS
case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops
#endif
Expand Down
12 changes: 10 additions & 2 deletions Marlin/src/gcode/gcode.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@
* M208 - Set Recover (unretract) Additional (!) Length: S<length> and Feedrate: F<units/min>. (Requires FWRETRACT)
* M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT_AUTORETRACT)
Every normal extrude-only move will be classified as retract depending on the direction.
* M210 - Set or Report the homing feedrate (Requires EDITABLE_HOMING_FEEDRATE)
* M211 - Enable, Disable, and/or Report software endstops: S<0|1> (Requires MIN_SOFTWARE_ENDSTOPS or MAX_SOFTWARE_ENDSTOPS)
* M217 - Set filament swap parameters: "M217 S<length> P<feedrate> R<feedrate>". (Requires SINGLENOZZLE)
* M218 - Set/get a tool offset: "M218 T<index> X<offset> Y<offset>". (Requires 2 or more extruders)
Expand Down Expand Up @@ -897,8 +898,15 @@ class GcodeSuite {
#endif
#endif

static void M211();
static void M211_report(const bool forReplay=true);
#if ENABLED(EDITABLE_HOMING_FEEDRATE)
static void M210();
static void M210_report(const bool forReplay=true);
#endif

#if HAS_SOFTWARE_ENDSTOPS
static void M211();
static void M211_report(const bool forReplay=true);
#endif

#if HAS_MULTI_EXTRUDER
static void M217();
Expand Down
3 changes: 3 additions & 0 deletions Marlin/src/gcode/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,9 @@ class GCodeParser {
#define LINEAR_UNIT(V) parser.mm_to_linear_unit(V)
#define VOLUMETRIC_UNIT(V) parser.mm_to_volumetric_unit(V)

#define X_AXIS_UNIT LINEAR_UNIT
#define Y_AXIS_UNIT LINEAR_UNIT
#define Z_AXIS_UNIT LINEAR_UNIT
#define I_AXIS_UNIT(V) TERN(AXIS4_ROTATES, (V), LINEAR_UNIT(V))
#define J_AXIS_UNIT(V) TERN(AXIS5_ROTATES, (V), LINEAR_UNIT(V))
#define K_AXIS_UNIT(V) TERN(AXIS6_ROTATES, (V), LINEAR_UNIT(V))
Expand Down
3 changes: 3 additions & 0 deletions Marlin/src/lcd/language/language_en.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ namespace LanguageNarrow_en {
LSTR MSG_ENDSTOP_TEST = _UxGT("Endstop Test");
LSTR MSG_Z_PROBE = _UxGT("Z Probe");
LSTR MSG_HOMING = _UxGT("Homing");
LSTR MSG_HOMING_FEEDRATE = _UxGT("Homing Feedrate");
LSTR MSG_HOMING_FEEDRATE_N = _UxGT("@ Homing FR");
LSTR MSG_AUTO_HOME = _UxGT("Auto Home");
LSTR MSG_HOME_ALL = _UxGT("Home All");
LSTR MSG_AUTO_HOME_N = _UxGT("Home @");
Expand Down Expand Up @@ -1094,6 +1096,7 @@ namespace LanguageWide_en {
LSTR MSG_INFO_PRINT_TIME = _UxGT("Print Time");
LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time");
LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total");
LSTR MSG_HOMING_FEEDRATE_N = _UxGT("@ Homing Feedrate");
#endif
}

Expand Down
41 changes: 39 additions & 2 deletions Marlin/src/lcd/menu/menu_configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,40 @@ void menu_advanced_settings();
END_MENU();
}

#endif
#endif // FWRETRACT

#if ENABLED(EDITABLE_HOMING_FEEDRATE)

#include "../../module/motion.h"
#include "../../module/planner.h"
#include "../../gcode/parser.h"

// Edit homing feedrates in inches- or degrees- or mm-per-minute
void menu_homing_feedrate() {
START_MENU();
BACK_ITEM(MSG_HOMING_FEEDRATE);

#if ENABLED(MENUS_ALLOW_INCH_UNITS)
#define _EDIT_HOMING_FR(A) do{ \
const float maxfr = MMS_TO_MMM(planner.settings.max_feedrate_mm_s[_AXIS(A)]); \
editable.decimal = A##_AXIS_UNIT(homing_feedrate_mm_m.A); \
EDIT_ITEM(float5, MSG_HOMING_FEEDRATE_N, &editable.decimal, \
A##_AXIS_UNIT(10), A##_AXIS_UNIT(maxfr), []{ \
homing_feedrate_mm_m.A = parser.axis_value_to_mm(_AXIS(A), editable.decimal); \
}); \
}while(0);
#else
#define _EDIT_HOMING_FR(A) do{ \
EDIT_ITEM(float5, MSG_HOMING_FEEDRATE_N, &homing_feedrate_mm_m.A, 10, MMS_TO_MMM(planner.settings.max_feedrate_mm_s[_AXIS(A)])); \
}while(0);
#endif

MAIN_AXIS_MAP(_EDIT_HOMING_FR);

END_MENU();
}

#endif // EDITABLE_HOMING_FEEDRATE

#if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS)

Expand Down Expand Up @@ -424,7 +457,7 @@ void menu_advanced_settings();
END_MENU();
}

#endif
#endif // HAS_PREHEAT && !SLIM_LCD_MENUS

#if ENABLED(CUSTOM_MENU_CONFIG)

Expand Down Expand Up @@ -623,6 +656,10 @@ void menu_configuration() {
#endif
#endif

#if ENABLED(EDITABLE_HOMING_FEEDRATE)
SUBMENU(MSG_HOMING_FEEDRATE, menu_homing_feedrate);
#endif

#if ENABLED(FWRETRACT)
SUBMENU(MSG_RETRACT, menu_config_retract);
#endif
Expand Down
3 changes: 3 additions & 0 deletions Marlin/src/module/motion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,9 @@ xyze_pos_t destination; // {0}
#endif
feedRate_t feedrate_mm_s = MMM_TO_MMS(DEFAULT_FEEDRATE_MM_M);
int16_t feedrate_percentage = 100;
#if ENABLED(EDITABLE_HOMING_FEEDRATE)
xyz_feedrate_t homing_feedrate_mm_m = HOMING_FEEDRATE_MM_M;
#endif

// Cartesian conversion result goes here:
xyz_pos_t cartes;
Expand Down
7 changes: 6 additions & 1 deletion Marlin/src/module/motion.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ extern xyz_pos_t cartes;
* Feed rates are often configured with mm/m
* but the planner and stepper like mm/s units.
*/
constexpr xyz_feedrate_t homing_feedrate_mm_m = HOMING_FEEDRATE_MM_M;
#if ENABLED(EDITABLE_HOMING_FEEDRATE)
extern xyz_feedrate_t homing_feedrate_mm_m;
#else
constexpr xyz_feedrate_t homing_feedrate_mm_m = HOMING_FEEDRATE_MM_M;
#endif

FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) {
float v = TERN0(HAS_Z_AXIS, homing_feedrate_mm_m.z);
#if DISABLED(DELTA)
Expand Down
Loading