Skip to content

Commit

Permalink
✨ EDITABLE_HOMING_FEEDRATE / M210 (#27456)
Browse files Browse the repository at this point in the history
  • Loading branch information
thinkyhead authored Oct 5, 2024
1 parent 30f5dd3 commit f5d5b0a
Show file tree
Hide file tree
Showing 14 changed files with 248 additions and 36 deletions.
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

0 comments on commit f5d5b0a

Please sign in to comment.