From a934f401d983320d2b65b04768ff1c58df2bdca7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Oct 2024 14:13:24 -0500 Subject: [PATCH] G-code and menu item --- Marlin/Configuration.h | 3 + Marlin/src/core/language.h | 32 ++++--- Marlin/src/core/types.h | 2 + Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/gcode/config/M210.cpp | 100 +++++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 6 ++ Marlin/src/gcode/parser.h | 3 + Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_en.h | 4 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_fr_na.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 31 +++++++ Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 2 +- Marlin/src/module/settings.cpp | 33 +++++++ buildroot/tests/mega1280 | 2 +- ini/features.ini | 1 + 25 files changed, 221 insertions(+), 26 deletions(-) create mode 100644 Marlin/src/gcode/config/M210.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index abdc654da210..90a93dee9f0a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2305,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 diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 2736a7833ed5..67830ac95cfb 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -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 R T)" +#define STR_HOMING_FEEDRATE "Homing Feedrate" #define STR_TOOL_CHANGING "Tool-changing" #define STR_HOTEND_OFFSETS "Hotend offsets" #define STR_SERVO_ANGLES "Servo Angles" @@ -358,24 +359,33 @@ #define STR_CALIBRATION "calibration" // General axis names -#define STR_X "X" -#define STR_Y "Y" -#define STR_Z "Z" +#if HAS_X_AXIS + #define AXIS1_NAME 'X' + #define STR_X "X" +#endif +#if HAS_Y_AXIS + #define AXIS2_NAME 'Y' + #define STR_Y "Y" +#endif +#if HAS_Z_AXIS + #define AXIS3_NAME 'Z' + #define STR_Z "Z" +#endif #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" + #define STR_A STR_X + #define STR_B STR_Y + #define STR_C STR_Z #endif -#define STR_X2 "X2" -#define STR_Y2 "Y2" -#define STR_Z2 "Z2" -#define STR_Z3 "Z3" -#define STR_Z4 "Z4" +#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" // Extra Axis and Endstop Names #if HAS_I_AXIS diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 7793f1f99561..9e6ff7ee163a 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -51,6 +51,8 @@ template struct IF { typedef L type; }; #define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W) #define MAIN_AXIS_NAMES_LC NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w) #define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W) +#define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES) +#define MAIN_AXIS_MAP_LC(F) MAP(F, MAIN_AXIS_NAMES_LC) #define LOGICAL_AXIS_GANG(N,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(N) #define LOGICAL_AXIS_CODE(N,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(N) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 6211ef0a2820..3d0ff1aea5c7 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -237,7 +237,7 @@ void GcodeSuite::G28() { return; } - #if ENABLED(G28_F_TEMPORARY_FEEDRATE) + #if ENABLED(EDITABLE_HOMING_FEEDRATE) REMEMBER(fr, homing_feedrate_mm_m); if (parser.floatval('F') > 0) homing_feedrate_mm_m.x = TERN_(HAS_Y_AXIS, homing_feedrate_mm_m.y =) parser.value_linear_units(); // mm/min diff --git a/Marlin/src/gcode/config/M210.cpp b/Marlin/src/gcode/config/M210.cpp new file mode 100644 index 000000000000..c51fca54888c --- /dev/null +++ b/Marlin/src/gcode/config/M210.cpp @@ -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 . + * + */ + +#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 + * I[feedrate] Set I axis homing feedrate + * J[feedrate] Set J axis homing feedrate + * K[feedrate] Set K axis homing feedrate + * U[feedrate] Set U axis homing feedrate + * V[feedrate] Set V axis homing feedrate + * W[feedrate] Set W axis homing feedrate + * + * 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 diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 9e1a330974aa..2afaffbb974a 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -743,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 diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 421dda9aec0f..611ce85295f9 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -195,6 +195,7 @@ * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (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 P R". (Requires SINGLENOZZLE) * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) @@ -897,6 +898,11 @@ class GcodeSuite { #endif #endif + #if ENABLED(EDITABLE_HOMING_FEEDRATE) + static void M210(); + static void M210_report(const bool forReplay=true); + #endif + static void M211(); static void M211_report(const bool forReplay=true); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 94c5b284e06f..9a51fca83402 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -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)) diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 828a44bf5206..10ad8c6badcc 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -61,7 +61,7 @@ namespace LanguageNarrow_de { LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); LSTR MSG_HOMING = _UxGT("Homing"); LSTR MSG_AUTO_HOME = _UxGT("Auto Home"); - LSTR MSG_AUTO_HOME_A = _UxGT("Home @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Home @"); LSTR MSG_AUTO_HOME_X = _UxGT("Home X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 286c386a44a0..c00920d931f4 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -99,9 +99,11 @@ 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 Feed Rate"); + LSTR MSG_HOMING_FEEDRATE_N = _UxGT("@ Homing Feed Rate"); LSTR MSG_AUTO_HOME = _UxGT("Auto Home"); LSTR MSG_HOME_ALL = _UxGT("Home All"); - LSTR MSG_AUTO_HOME_A = _UxGT("Home @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Home @"); LSTR MSG_AUTO_HOME_X = _UxGT("Home X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 029e9744a025..7390930cd802 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -58,7 +58,7 @@ namespace LanguageNarrow_fr { LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); LSTR MSG_HOMING = _UxGT("Origine"); LSTR MSG_AUTO_HOME = _UxGT("Origine auto"); - LSTR MSG_AUTO_HOME_A = _UxGT("Origine @ auto"); + LSTR MSG_AUTO_HOME_N = _UxGT("Origine @ auto"); LSTR MSG_AUTO_HOME_X = _UxGT("Origine X auto"); LSTR MSG_AUTO_HOME_Y = _UxGT("Origine Y auto"); LSTR MSG_AUTO_HOME_Z = _UxGT("Origine Z auto"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 8fb7b6802606..1d9af9b22c02 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -58,7 +58,7 @@ namespace LanguageNarrow_fr_na { LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); LSTR MSG_HOMING = _UxGT("Origine"); LSTR MSG_AUTO_HOME = _UxGT("Origine auto"); - LSTR MSG_AUTO_HOME_A = _UxGT("Origine @ auto"); + LSTR MSG_AUTO_HOME_N = _UxGT("Origine @ auto"); LSTR MSG_AUTO_HOME_X = _UxGT("Origine X auto"); LSTR MSG_AUTO_HOME_Y = _UxGT("Origine Y auto"); LSTR MSG_AUTO_HOME_Z = _UxGT("Origine Z auto"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index f7e98ff8e5df..adb6d54a2689 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -62,7 +62,7 @@ namespace LanguageNarrow_hu { LSTR MSG_DEBUG_MENU = _UxGT("Hiba Menü"); LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); LSTR MSG_AUTO_HOME = _UxGT("X-Y-Z auto kezdöpont"); - LSTR MSG_AUTO_HOME_A = _UxGT("Kezdö @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Kezdö @"); LSTR MSG_AUTO_HOME_X = _UxGT("X kezdöpont"); LSTR MSG_AUTO_HOME_Y = _UxGT("Y kezdöpont"); LSTR MSG_AUTO_HOME_Z = _UxGT("Z kezdöpont"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 4d7f1fdc4df6..a945d94a4ffa 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -77,7 +77,7 @@ namespace LanguageNarrow_it { LSTR MSG_Z_PROBE = _UxGT("Sonda Z"); LSTR MSG_HOMING = _UxGT("Azzeramento"); LSTR MSG_AUTO_HOME = _UxGT("Auto home"); - LSTR MSG_AUTO_HOME_A = _UxGT("Home @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Home @"); LSTR MSG_AUTO_HOME_X = _UxGT("Home X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 430a68601953..9b441e14843b 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -58,7 +58,7 @@ namespace LanguageNarrow_ru { LSTR MSG_DEBUG_MENU = _UxGT("Меню отладки"); LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Тест индикатора"); LSTR MSG_AUTO_HOME = _UxGT("Парковка XYZ"); - LSTR MSG_AUTO_HOME_A = _UxGT("Парковка @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Парковка @"); LSTR MSG_AUTO_HOME_X = _UxGT("Парковка X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Парковка Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Парковка Z"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 97463290154a..e3007b12aee3 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -74,7 +74,7 @@ namespace LanguageNarrow_sk { LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu"); LSTR MSG_HOMING = _UxGT("Parkovanie"); LSTR MSG_AUTO_HOME = _UxGT("Domovská pozícia"); - LSTR MSG_AUTO_HOME_A = _UxGT("Domov os @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Domov os @"); LSTR MSG_AUTO_HOME_X = _UxGT("Domov os X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 6b50ddfd3b01..544383f18846 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -76,7 +76,7 @@ namespace LanguageNarrow_tr { LSTR MSG_Z_PROBE = _UxGT("Z Probe"); LSTR MSG_HOMING = _UxGT("Sıfırlanıyor"); LSTR MSG_AUTO_HOME = _UxGT("Eksenleri Sıfırla"); - LSTR MSG_AUTO_HOME_A = _UxGT("@ Sıfırla"); + LSTR MSG_AUTO_HOME_N = _UxGT("@ Sıfırla"); LSTR MSG_AUTO_HOME_X = _UxGT("X Sıfırla"); LSTR MSG_AUTO_HOME_Y = _UxGT("Y Sıfırla"); LSTR MSG_AUTO_HOME_Z = _UxGT("Z Sıfırla"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 5010aff70351..e223a815a081 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -59,7 +59,7 @@ namespace LanguageNarrow_uk { LSTR MSG_DEBUG_MENU = _UxGT("Меню Debug"); LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Тест лінії прогр."); LSTR MSG_AUTO_HOME = _UxGT("Авто паркування"); - LSTR MSG_AUTO_HOME_A = _UxGT("Паркування @"); + LSTR MSG_AUTO_HOME_N = _UxGT("Паркування @"); LSTR MSG_AUTO_HOME_X = _UxGT("Паркування X"); LSTR MSG_AUTO_HOME_Y = _UxGT("Паркування Y"); LSTR MSG_AUTO_HOME_Z = _UxGT("Паркування Z"); diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index bd5ed492a17f..6b7f03e0a327 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -397,6 +397,33 @@ void menu_advanced_settings(); #endif +#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); + + #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(float61, 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); + + MAIN_AXIS_MAP(_EDIT_HOMING_FR); + + END_MENU(); + } + +#endif + #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS) void _menu_configuration_preheat_settings() { @@ -629,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 diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 926d64ccca1a..f356d62e543f 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -296,7 +296,7 @@ void menu_move() { END_MENU(); } -#define _HOME_ITEM(N) GCODES_ITEM_N(N##_AXIS, MSG_AUTO_HOME_A, F("G28" STR_##N)); +#define _HOME_ITEM(N) GCODES_ITEM_N(N##_AXIS, MSG_AUTO_HOME_N, F("G28" STR_##N)); #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) // diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 31530fd87d98..bd74fa8afe9c 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -141,7 +141,7 @@ 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(G28_F_TEMPORARY_FEEDRATE) +#if ENABLED(EDITABLE_HOMING_FEEDRATE) xyz_feedrate_t homing_feedrate_mm_m = HOMING_FEEDRATE_MM_M; #endif diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index fa9abf6a79f2..ad78d83515d4 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -79,7 +79,7 @@ extern xyz_pos_t cartes; * Feed rates are often configured with mm/m * but the planner and stepper like mm/s units. */ -#if ENABLED(G28_F_TEMPORARY_FEEDRATE) +#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; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 52057ceab51e..00924a15ec5b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -462,6 +462,13 @@ typedef struct SettingsDataStruct { fwretract_settings_t fwretract_settings; // M207 S F Z W, M208 S F W R bool autoretract_enabled; // M209 S + // + // EDITABLE_HOMING_FEEDRATE + // + #if ENABLED(EDITABLE_HOMING_FEEDRATE) + xyz_feedrate_t homing_feedrate_mm_m; // M210 X Y Z I J K U V W + #endif + // // !NO_VOLUMETRIC // @@ -1333,6 +1340,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(TERN(FWRETRACT_AUTORETRACT, fwretract.autoretract_enabled, autoretract_enabled)); } + // + // Homing Feedrate + // + #if ENABLED(EDITABLE_HOMING_FEEDRATE) + _FIELD_TEST(homing_feedrate_mm_m); + EEPROM_WRITE(homing_feedrate_mm_m); + #endif + // // Volumetric & Filament Size // @@ -2421,6 +2436,14 @@ void MarlinSettings::postprocess() { #endif } + // + // Homing Feedrate + // + #if ENABLED(EDITABLE_HOMING_FEEDRATE) + _FIELD_TEST(homing_feedrate_mm_m); + EEPROM_READ(homing_feedrate_mm_m); + #endif + // // Volumetric & Filament Size // @@ -3649,6 +3672,11 @@ void MarlinSettings::reset() { // TERN_(FWRETRACT, fwretract.reset()); + // + // Homing Feedrate + // + TERN_(EDITABLE_HOMING_FEEDRATE, homing_feedrate_mm_m = xyz_feedrate_t(HOMING_FEEDRATE_MM_M)); + // // Volumetric & Filament Size // @@ -4049,6 +4077,11 @@ void MarlinSettings::reset() { TERN_(FWRETRACT_AUTORETRACT, gcode.M209_report(forReplay)); #endif + // + // Homing Feedrate + // + TERN_(EDITABLE_HOMING_FEEDRATE, gcode.M210_report(forReplay)); + // // Probe Offset // diff --git a/buildroot/tests/mega1280 b/buildroot/tests/mega1280 index 7e99ee4a60f6..73bbd1385e52 100755 --- a/buildroot/tests/mega1280 +++ b/buildroot/tests/mega1280 @@ -19,7 +19,7 @@ restore_configs opt_set LCD_LANGUAGE an \ POWER_MONITOR_CURRENT_PIN 14 POWER_MONITOR_VOLTAGE_PIN 15 \ CLOSED_LOOP_ENABLE_PIN 44 CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ +opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING EDITABLE_HOMING_FEEDRATE \ EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ diff --git a/ini/features.ini b/ini/features.ini index a502808f095e..ea06319644f8 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -287,6 +287,7 @@ SKEW_CORRECTION_GCODE = build_src_filter=+ + PINS_DEBUGGING = build_src_filter=+ EDITABLE_STEPS_PER_UNIT = build_src_filter=+ +EDITABLE_HOMING_FEEDRATE = build_src_filter=+ HAS_MULTI_EXTRUDER = build_src_filter=+ HAS_HOTEND_OFFSET = build_src_filter=+ EDITABLE_SERVO_ANGLES = build_src_filter=+