From 06c6c479dd048d18445097b04557a7d90ad1f4fa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Nov 2025 21:42:43 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20Immediate=20Buttons=20and=20Menu?= =?UTF-8?q?=20Items=20(#28180)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 13 +++ Marlin/src/HAL/HC32/inc/SanityCheck.h | 2 +- Marlin/src/HAL/HC32/sysclock.cpp | 2 +- Marlin/src/MarlinCore.cpp | 8 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 75 +++++++++-------- .../generic/custom_user_menus.cpp | 81 ++++++++++--------- .../generic/endstop_state_screen.cpp | 10 ++- Marlin/src/lcd/extui/mks_ui/draw_more.cpp | 13 +-- Marlin/src/lcd/extui/ui_api.h | 2 + Marlin/src/lcd/menu/menu.h | 4 + Marlin/src/lcd/menu/menu_configuration.cpp | 8 +- Marlin/src/lcd/menu/menu_item.h | 16 ++++ Marlin/src/lcd/menu/menu_main.cpp | 19 ++++- buildroot/tests/STM32F103RE_btt_USB | 6 +- 14 files changed, 157 insertions(+), 102 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2e0f7f14fb..c5ed503b4c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4123,22 +4123,27 @@ #define MAIN_MENU_ITEM_1_DESC "Home & UBL Info" #define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W" //#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + //#define MAIN_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed. #define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL #define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) //#define MAIN_MENU_ITEM_2_CONFIRM + //#define MAIN_MENU_ITEM_2_IMMEDIATE //#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL //#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) //#define MAIN_MENU_ITEM_3_CONFIRM + //#define MAIN_MENU_ITEM_3_IMMEDIATE //#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level" //#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" //#define MAIN_MENU_ITEM_4_CONFIRM + //#define MAIN_MENU_ITEM_4_IMMEDIATE //#define MAIN_MENU_ITEM_5_DESC "Home & Info" //#define MAIN_MENU_ITEM_5_GCODE "G28\nM503" //#define MAIN_MENU_ITEM_5_CONFIRM + //#define MAIN_MENU_ITEM_5_IMMEDIATE #endif // @section custom config menu @@ -4155,22 +4160,27 @@ #define CONFIG_MENU_ITEM_1_DESC "Wifi ON" #define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678" //#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + //#define CONFIG_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed. #define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON" #define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678" //#define CONFIG_MENU_ITEM_2_CONFIRM + //#define CONFIG_MENU_ITEM_2_IMMEDIATE //#define CONFIG_MENU_ITEM_3_DESC "Radio OFF" //#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678" //#define CONFIG_MENU_ITEM_3_CONFIRM + //#define CONFIG_MENU_ITEM_3_IMMEDIATE //#define CONFIG_MENU_ITEM_4_DESC "Wifi ????" //#define CONFIG_MENU_ITEM_4_GCODE "M118 ????" //#define CONFIG_MENU_ITEM_4_CONFIRM + //#define CONFIG_MENU_ITEM_4_IMMEDIATE //#define CONFIG_MENU_ITEM_5_DESC "Wifi ????" //#define CONFIG_MENU_ITEM_5_GCODE "M118 ????" //#define CONFIG_MENU_ITEM_5_CONFIRM + //#define CONFIG_MENU_ITEM_5_IMMEDIATE #endif // @section custom buttons @@ -4187,6 +4197,7 @@ #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? #define BUTTON1_GCODE "G28" #define BUTTON1_DESC "Homing" // Optional string to set the LCD status + //#define BUTTON1_IMMEDIATE // Skip the queue and run the G-code immediately. Rarely needed. #endif //#define BUTTON2_PIN -1 @@ -4195,6 +4206,7 @@ #define BUTTON2_WHEN_PRINTING false #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL + //#define BUTTON2_IMMEDIATE #endif //#define BUTTON3_PIN -1 @@ -4203,6 +4215,7 @@ #define BUTTON3_WHEN_PRINTING false #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL + //#define BUTTON3_IMMEDIATE #endif #endif diff --git a/Marlin/src/HAL/HC32/inc/SanityCheck.h b/Marlin/src/HAL/HC32/inc/SanityCheck.h index e38bce91e5..c6b3b221df 100644 --- a/Marlin/src/HAL/HC32/inc/SanityCheck.h +++ b/Marlin/src/HAL/HC32/inc/SanityCheck.h @@ -83,7 +83,7 @@ #error "POSTMORTEM_DEBUGGING requires CORE_DISABLE_FAULT_HANDLER to be set." #endif -#if defined(PANIC_ENABLE) +#ifdef PANIC_ENABLE #if defined(PANIC_USART1_TX_PIN) || defined(PANIC_USART2_TX_PIN) || defined(PANIC_USART3_TX_PIN) || defined(PANIC_USART3_TX_PIN) #error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN." #endif diff --git a/Marlin/src/HAL/HC32/sysclock.cpp b/Marlin/src/HAL/HC32/sysclock.cpp index 493515b0e8..e98395c42e 100644 --- a/Marlin/src/HAL/HC32/sysclock.cpp +++ b/Marlin/src/HAL/HC32/sysclock.cpp @@ -171,7 +171,7 @@ void core_hook_sysclock_init() { panic("HRC is not 16 MHz"); } - #if defined(BOARD_XTAL_FREQUENCY) + #ifdef BOARD_XTAL_FREQUENCY #warning "No valid XTAL frequency defined, falling back to HRC." #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 175fd0c315..cb81efc4bb 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -531,11 +531,15 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { constexpr millis_t CUB_DEBOUNCE_DELAY_##N = 250UL; \ static millis_t next_cub_ms_##N; \ if (BUTTON##N##_HIT_STATE == READ(BUTTON##N##_PIN) \ - && (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy)) { \ + && (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy) \ + ) { \ if (ELAPSED(ms, next_cub_ms_##N)) { \ next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \ CODE; \ - queue.inject(F(BUTTON##N##_GCODE)); \ + if (ENABLED(BUTTON##N##_IMMEDIATE)) \ + gcode.process_subcommands_now(F(BUTTON##N##_GCODE)); \ + else \ + queue.inject(F(BUTTON##N##_GCODE)); \ TERN_(HAS_MARLINUI_MENU, ui.quick_feedback()); \ } \ } \ diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 2870524dea..dbda3cd225 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -266,7 +266,7 @@ private: uint8_t tilt_grid = 1; void manualValueUpdate(bool undefined=false) { - gcode.process_subcommands_now( + queue.inject( TS(F("M421I"), mesh_x, 'J', mesh_y, 'Z', p_float_t(current_position.z, 3), undefined ? "N" : "") ); planner.synchronize(); @@ -313,7 +313,7 @@ private: #else void manualValueUpdate() { - gcode.process_subcommands_now( + queue.inject( TS(F("G29I"), mesh_x, 'J', mesh_y, 'Z', p_float_t(current_position.z, 3)) ); planner.synchronize(); @@ -1176,7 +1176,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra thermalManager.wait_for_hotend(0); } popupHandler(Popup_FilChange); - gcode.process_subcommands_now(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); + queue.inject(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); } #endif } @@ -1225,7 +1225,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_MoveX, GET_TEXT_F(MSG_AUTO_HOME_X)); else { popupHandler(Popup_Home); - gcode.process_subcommands_now(F("G28X")); + queue.inject(F("G28X")); planner.synchronize(); redrawMenu(); } @@ -1235,7 +1235,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_MoveY, GET_TEXT_F(MSG_AUTO_HOME_X)); else { popupHandler(Popup_Home); - gcode.process_subcommands_now(F("G28Y")); + queue.inject(F("G28Y")); planner.synchronize(); redrawMenu(); } @@ -1245,7 +1245,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_MoveZ, GET_TEXT_F(MSG_AUTO_HOME_X)); else { popupHandler(Popup_Home); - gcode.process_subcommands_now(F("G28Z")); + queue.inject(F("G28Z")); planner.synchronize(); redrawMenu(); } @@ -1254,7 +1254,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra if (draw) drawMenuItem(row, ICON_SetHome, F("Set Home Here")); else { - gcode.process_subcommands_now(F("G92X0Y0Z0")); + queue.inject(F("G92X0Y0Z0")); audioFeedback(); } break; @@ -1577,7 +1577,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Homing, GET_TEXT_F(MSG_AUTO_HOME_Z)); else { popupHandler(Popup_Home); - gcode.process_subcommands_now(F("G28Z")); + queue.inject(F("G28Z")); popupHandler(Popup_MoveWait); #if ENABLED(Z_SAFE_HOMING) planner.synchronize(); @@ -1809,8 +1809,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_1_DESC)); else { popupHandler(Popup_Custom); - //queue.inject(F(CONFIG_MENU_ITEM_1_GCODE)); // Old code - gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_1_GCODE)); + TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(CONFIG_MENU_ITEM_1_GCODE)); planner.synchronize(); redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) @@ -1829,7 +1828,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_2_DESC)); else { popupHandler(Popup_Custom); - gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_2_GCODE)); + TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(CONFIG_MENU_ITEM_2_GCODE)); planner.synchronize(); redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) @@ -1848,7 +1847,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_3_DESC)); else { popupHandler(Popup_Custom); - gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_3_GCODE)); + TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(CONFIG_MENU_ITEM_3_GCODE)); planner.synchronize(); redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) @@ -1867,7 +1866,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_4_DESC)); else { popupHandler(Popup_Custom); - gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_4_GCODE)); + TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(CONFIG_MENU_ITEM_4_GCODE)); planner.synchronize(); redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) @@ -1886,7 +1885,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_5_DESC)); else { popupHandler(Popup_Custom); - gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_5_GCODE)); + TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(CONFIG_MENU_ITEM_5_GCODE)); planner.synchronize(); redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) @@ -2127,7 +2126,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_HotendTemp, GET_TEXT_F(MSG_PID_AUTOTUNE)); else { popupHandler(Popup_PIDWait); - gcode.process_subcommands_now(TS(F("M303E0C"), PID_cycles, 'S', PID_e_temp, 'U')); + queue.inject(TS(F("M303E0C"), PID_cycles, 'S', PID_e_temp, 'U')); planner.synchronize(); redrawMenu(); } @@ -2193,7 +2192,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_HotendTemp, GET_TEXT_F(MSG_PID_AUTOTUNE)); else { popupHandler(Popup_PIDWait); - gcode.process_subcommands_now(TS(F("M303E-1C"), PID_cycles, 'S', PID_bed_temp, 'U')); + queue.inject(TS(F("M303E-1C"), PID_cycles, 'S', PID_bed_temp, 'U')); planner.synchronize(); redrawMenu(); } @@ -3037,7 +3036,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra if (draw) drawMenuItem(row, ICON_StepY, F("M48 Probe Test")); else { - gcode.process_subcommands_now( + queue.inject( TS(F("G28O\nM48X"), p_float_t((X_BED_SIZE + X_MIN_POS) / 2.0f, 3), 'Y', p_float_t((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 3), 'P', testcount) ); } @@ -3231,9 +3230,9 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra gcode.home_all_axes(true); popupHandler(Popup_Level); if (mesh_conf.tilt_grid > 1) - gcode.process_subcommands_now(TS(F("G29J"), mesh_conf.tilt_grid)); + queue.inject(TS(F("G29J"), mesh_conf.tilt_grid)); else - gcode.process_subcommands_now(F("G29J")); + queue.inject(F("G29J")); planner.synchronize(); redrawMenu(); } @@ -3268,7 +3267,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra #endif #elif HAS_BED_PROBE popupHandler(Popup_Level); - gcode.process_subcommands_now(F("G29")); + queue.inject(F("G29")); planner.synchronize(); popupHandler(Popup_SaveLevel); #else @@ -3276,7 +3275,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra set_bed_leveling_enabled(false); gridpoint = 1; popupHandler(Popup_MoveWait); - gcode.process_subcommands_now(F("G29")); + queue.inject(F("G29")); planner.synchronize(); drawMenu(ID_ManualMesh); #endif @@ -3359,7 +3358,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra popupHandler(Popup_MeshSlot); break; } - gcode.process_subcommands_now(F("G29 L")); + queue.inject(F("G29 L")); planner.synchronize(); audioFeedback(true); } @@ -3372,7 +3371,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra popupHandler(Popup_MeshSlot); break; } - gcode.process_subcommands_now(F("G29 S")); + queue.inject(F("G29 S")); planner.synchronize(); audioFeedback(true); } @@ -3576,7 +3575,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Axis, F("+0.01mm Up")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] < MAX_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] += 0.01; - gcode.process_subcommands_now(F("M290 Z0.01")); + queue.inject(F("M290 Z0.01")); planner.synchronize(); current_position.z += 0.01f; sync_plan_position(); @@ -3588,7 +3587,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_AxisD, F("-0.01mm Down")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] > MIN_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] -= 0.01; - gcode.process_subcommands_now(F("M290 Z-0.01")); + queue.inject(F("M290 Z-0.01")); planner.synchronize(); current_position.z -= 0.01f; sync_plan_position(); @@ -3659,7 +3658,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra mesh_conf.manual_mesh_move(); } else { - gcode.process_subcommands_now(F("G29 S")); + queue.inject(F("G29 S")); planner.synchronize(); audioFeedback(true); drawMenu(ID_Leveling, LEVELING_GET_MESH); @@ -3697,7 +3696,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Axis, F("+0.01mm Up")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] < MAX_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] += 0.01; - gcode.process_subcommands_now(F("M290 Z0.01")); + queue.inject(F("M290 Z0.01")); planner.synchronize(); current_position.z += 0.01f; sync_plan_position(); @@ -3709,7 +3708,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenuItem(row, ICON_Axis, F("-0.01mm Down")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] > MIN_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] -= 0.01; - gcode.process_subcommands_now(F("M290 Z-0.01")); + queue.inject(F("M290 Z-0.01")); planner.synchronize(); current_position.z -= 0.01f; sync_plan_position(); @@ -3751,13 +3750,13 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra } else if (gridpoint < GRID_MAX_POINTS) { popupHandler(Popup_MoveWait); - gcode.process_subcommands_now(F("G29")); + queue.inject(F("G29")); planner.synchronize(); gridpoint++; redrawMenu(); } else { - gcode.process_subcommands_now(F("G29")); + queue.inject(F("G29")); planner.synchronize(); audioFeedback(settings.save()); drawMenu(ID_Leveling, LEVELING_GET_MESH); @@ -4020,26 +4019,26 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra switch (last_menu) { case ID_Prepare: popupHandler(Popup_FilChange); - gcode.process_subcommands_now(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); + queue.inject(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); break; #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) case ID_ChangeFilament: switch (last_selection) { case CHANGEFIL_LOAD: popupHandler(Popup_FilLoad); - gcode.process_subcommands_now(F("M701")); + queue.inject(F("M701")); planner.synchronize(); redrawMenu(true, true, true); break; case CHANGEFIL_UNLOAD: popupHandler(Popup_FilLoad, true); - gcode.process_subcommands_now(F("M702")); + queue.inject(F("M702")); planner.synchronize(); redrawMenu(true, true, true); break; case CHANGEFIL_CHANGE: popupHandler(Popup_FilChange); - gcode.process_subcommands_now(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); + queue.inject(TS(F("M600 B1 R"), thermalManager.degTargetHotend(0))); break; } break; @@ -4614,10 +4613,10 @@ void JyersDWIN::printScreenControl() { TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); #else #if HAS_HEATED_BED - gcode.process_subcommands_now(TS(F("M140 S"), pausebed)); + queue.inject(TS(F("M140 S"), pausebed)); #endif #if HAS_EXTRUDERS - gcode.process_subcommands_now(TS(F("M109 S"), pausetemp)); + queue.inject(TS(F("M109 S"), pausetemp)); #endif TERN_(HAS_FAN, thermalManager.fan_speed[0] = pausefan); planner.synchronize(); @@ -4737,7 +4736,7 @@ void JyersDWIN::popupControl() { thermalManager.wait_for_hotend(0); } popupHandler(Popup_FilChange); - gcode.process_subcommands_now(TS(F("M600B1R"), thermalManager.degTargetHotend(0))); + queue.inject(TS(F("M600B1R"), thermalManager.degTargetHotend(0))); } } else @@ -4760,7 +4759,7 @@ void JyersDWIN::popupControl() { case Popup_SaveLevel: if (selection == 0) { #if ENABLED(AUTO_BED_LEVELING_UBL) - gcode.process_subcommands_now(F("G29 S")); + queue.inject(F("G29 S")); planner.synchronize(); audioFeedback(true); #else diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/custom_user_menus.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/custom_user_menus.cpp index 896de3fe56..d86946ca4f 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/custom_user_menus.cpp @@ -42,7 +42,7 @@ void CustomUserMenus::onRedraw(draw_mode_t what) { } #if ENABLED(TOUCH_UI_PORTRAIT) - #if defined(TOOLHEAD_Legacy_Universal) + #ifdef TOOLHEAD_Legacy_Universal #define GRID_ROWS 10 #else #define GRID_ROWS 7 @@ -61,10 +61,9 @@ void CustomUserMenus::onRedraw(draw_mode_t what) { #define BACK_POS BTN_POS(1,GRID_ROWS), BTN_SIZE(GRID_COLS,1) #endif -btn_colors thcolor[8] = {normal_btn}; + btn_colors thcolor[8] = {normal_btn}; + //.color(TH_color[1]) - -//.color(TH_color[1]) if (what & FOREGROUND) { CommandProcessor cmd; cmd.colors(normal_btn) @@ -72,42 +71,42 @@ btn_colors thcolor[8] = {normal_btn}; .tag(0).text(TOOLHEAD_LABL_POS, GET_TEXT_F(MSG_CUSTOM_MENU_MAIN_TITLE)); cmd.colors(accent_btn) .font(Theme::font_medium) - #if defined(MAIN_MENU_ITEM_1_DESC) + #ifdef MAIN_MENU_ITEM_1_DESC //_USER_ITEM(1) .tag(_ITEM_TAG(11)).button(USER_ITEM_POS(1), MAIN_MENU_ITEM_1_DESC) #endif .colors(thcolor[1]) - #if defined(MAIN_MENU_ITEM_2_DESC) + #ifdef MAIN_MENU_ITEM_2_DESC //_USER_ITEM(2) .tag(_ITEM_TAG(12)).button(USER_ITEM_POS(2), MAIN_MENU_ITEM_2_DESC) #endif .colors(thcolor[2]) - #if defined(MAIN_MENU_ITEM_3_DESC) + #ifdef MAIN_MENU_ITEM_3_DESC //_USER_ITEM(3) .tag(_ITEM_TAG(13)).button(USER_ITEM_POS(3), MAIN_MENU_ITEM_3_DESC) #endif .colors(thcolor[3]) - #if defined(MAIN_MENU_ITEM_4_DESC) + #ifdef MAIN_MENU_ITEM_4_DESC //_USER_ITEM(4) .tag(_ITEM_TAG(14)).button(USER_ITEM_POS(4), MAIN_MENU_ITEM_4_DESC) #endif .colors(thcolor[4]) - #if defined(MAIN_MENU_ITEM_5_DESC) + #ifdef MAIN_MENU_ITEM_5_DESC //_USER_ITEM(5) .tag(_ITEM_TAG(15)).button(USER_ITEM_POS(5), MAIN_MENU_ITEM_5_DESC) #endif .colors(thcolor[5]) - #if defined(MAIN_MENU_ITEM_6_DESC) + #ifdef MAIN_MENU_ITEM_6_DESC //_USER_ITEM(6) .tag(_ITEM_TAG(16)).button(USER_ITEM_POS(6), MAIN_MENU_ITEM_6_DESC) #endif .colors(thcolor[6]) - #if defined(MAIN_MENU_ITEM_7_DESC) + #ifdef MAIN_MENU_ITEM_7_DESC //_USER_ITEM(7) .tag(_ITEM_TAG(17)).button(USER_ITEM_POS(7), MAIN_MENU_ITEM_7_DESC) #endif .colors(thcolor[7]) - #if defined(MAIN_MENU_ITEM_8_DESC) + #ifdef MAIN_MENU_ITEM_8_DESC //_USER_ITEM(8) .tag(_ITEM_TAG(18)).button(USER_ITEM_POS(8), MAIN_MENU_ITEM_8_DESC) #endif @@ -123,41 +122,49 @@ btn_colors thcolor[8] = {normal_btn}; } } +#include "../../../../gcode/queue.h" + +template void _lcd_custom_menu_gcode(FSTR_P const fstr); + +FORCE_INLINE void _lcd_custom_menu_gcode_done() { + TERN_(CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(CUSTOM_MENU_MAIN_SCRIPT_RETURN, ui.return_to_status()); +} +template<> void _lcd_custom_menu_gcode(FSTR_P const fstr) { + gcode.process_subcommands_now(fstr); + _lcd_custom_menu_gcode_done(); +} +template<> void _lcd_custom_menu_gcode(FSTR_P const fstr) { + queue.inject(fstr); + _lcd_custom_menu_gcode_done(); +} + bool CustomUserMenus::onTouchEnd(uint8_t tag) { switch (tag) { - #if defined(MAIN_MENU_ITEM_1_DESC) - //_USER_ACTION(1) - case _ITEM_TAG(11): injectCommands_P(PSTR(MAIN_MENU_ITEM_1_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_1_DESC + case _ITEM_TAG(11): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_1_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_2_DESC) - //_USER_ACTION(2) - case _ITEM_TAG(12): injectCommands_P(PSTR(MAIN_MENU_ITEM_2_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_2_DESC + case _ITEM_TAG(12): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_2_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_3_DESC) - //_USER_ACTION(3) - case _ITEM_TAG(13): injectCommands_P(PSTR(MAIN_MENU_ITEM_3_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_3_DESC + case _ITEM_TAG(13): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_3_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_4_DESC) - //_USER_ACTION(4) - case _ITEM_TAG(14): injectCommands_P(PSTR(MAIN_MENU_ITEM_4_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_4_DESC + case _ITEM_TAG(14): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_4_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_5_DESC) - //_USER_ACTION(5) - case _ITEM_TAG(15): injectCommands_P(PSTR(MAIN_MENU_ITEM_5_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_5_DESC + case _ITEM_TAG(15): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_5_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_6_DESC) - //_USER_ACTION(6) - case _ITEM_TAG(16): injectCommands_P(PSTR(MAIN_MENU_ITEM_6_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen); break; + #ifdef MAIN_MENU_ITEM_6_DESC + case _ITEM_TAG(16): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_6_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_7_DESC) - //_USER_ACTION(7) - case _ITEM_TAG(17): injectCommands_P(PSTR(MAIN_MENU_ITEM_7_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen);break; + #ifdef MAIN_MENU_ITEM_7_DESC + case _ITEM_TAG(17): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_7_GCODE)); break; #endif - #if defined(MAIN_MENU_ITEM_8_DESC) - //_USER_ACTION(8) - case _ITEM_TAG(18): injectCommands_P(PSTR(MAIN_MENU_ITEM_8_GCODE));sound.play(chimes, PLAY_ASYNCHRONOUS); GOTO_SCREEN(StatusScreen);break; + #ifdef MAIN_MENU_ITEM_8_DESC + case _ITEM_TAG(18): _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_8_GCODE)); break; #endif - case 1: GOTO_PREVIOUS(); break; #ifdef PARKING_COMMAND_GCODE case 20: injectCommands(F(PARKING_COMMAND_GCODE)); break; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp index 8a935313a1..1552b6a496 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp @@ -94,10 +94,12 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #else PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) #endif - #if PIN_EXISTS(Z_MIN_PROBE) - PIN_ENABLED (5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE, Z_MIN_PROBE_ENDSTOP_HIT_STATE) - #else - PIN_DISABLED(5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE) + #if HAS_BED_PROBE + #if PIN_EXISTS(Z_MIN_PROBE) + PIN_ENABLED (5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE, Z_MIN_PROBE_ENDSTOP_HIT_STATE) + #else + PIN_DISABLED(5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE) + #endif #endif #if HAS_SOFTWARE_ENDSTOPS diff --git a/Marlin/src/lcd/extui/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/mks_ui/draw_more.cpp index 864a3e1d96..dd53374583 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_more.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_more.cpp @@ -29,6 +29,7 @@ #include "draw_set.h" #include "lv_conf.h" #include "draw_ui.h" +#include "../../../gcode/gcode.h" #include "../../../gcode/queue.h" extern lv_group_t * g; @@ -62,22 +63,22 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_GCODE: lv_clear_more(); lv_draw_gcode(true); break; #if HAS_USER_ITEM(1) - case ID_CUSTOM_1: queue.inject(F(MAIN_MENU_ITEM_1_GCODE)); break; + case ID_CUSTOM_1: TERN(CONFIG_MENU_ITEM_1_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_1_GCODE)); break; #endif #if HAS_USER_ITEM(2) - case ID_CUSTOM_2: queue.inject(F(MAIN_MENU_ITEM_2_GCODE)); break; + case ID_CUSTOM_2: TERN(CONFIG_MENU_ITEM_2_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_2_GCODE)); break; #endif #if HAS_USER_ITEM(3) - case ID_CUSTOM_3: queue.inject(F(MAIN_MENU_ITEM_3_GCODE)); break; + case ID_CUSTOM_3: TERN(CONFIG_MENU_ITEM_3_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_3_GCODE)); break; #endif #if HAS_USER_ITEM(4) - case ID_CUSTOM_4: queue.inject(F(MAIN_MENU_ITEM_4_GCODE)); break; + case ID_CUSTOM_4: TERN(CONFIG_MENU_ITEM_4_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_4_GCODE)); break; #endif #if HAS_USER_ITEM(5) - case ID_CUSTOM_5: queue.inject(F(MAIN_MENU_ITEM_5_GCODE)); break; + case ID_CUSTOM_5: TERN(CONFIG_MENU_ITEM_5_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_5_GCODE)); break; #endif #if HAS_USER_ITEM(6) - case ID_CUSTOM_6: queue.inject(F(MAIN_MENU_ITEM_6_GCODE)); break; + case ID_CUSTOM_6: TERN(CONFIG_MENU_ITEM_6_IMMEDIATE, gcode.process_subcommands_now, queue.inject)(F(MAIN_MENU_ITEM_6_GCODE)); break; #endif case ID_M_RETURN: lv_clear_more(); diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 88145621e5..f864f3d1cd 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -132,6 +132,8 @@ namespace ExtUI { inline void injectCommands(FSTR_P const fstr) { injectCommands_P(FTOP(fstr)); } void injectCommands(char * const); bool commandsInQueue(); + inline void executeCommands(FSTR_P const fstr) { gcode.process_subcommands_now(fstr); } + inline void executeCommands(char * const cstr) { gcode.process_subcommands_now(cstr); } #if ENABLED(HOST_KEEPALIVE_FEATURE) GcodeSuite::MarlinBusyState getHostKeepaliveState(); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 73f7a9dcc9..869b06828c 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -269,3 +269,7 @@ inline void clear_menu_history() { screen_history_depth = 0; } #if ANY(PROBE_MANUALLY, MESH_BED_LEVELING, X_AXIS_TWIST_COMPENSATION) extern uint8_t manual_probe_index; #endif + +#if ANY(CUSTOM_MENU_MAIN, CUSTOM_MENU_CONFIG) + template void _lcd_custom_menu_gcode(FSTR_P const fstr); +#endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 259a81fb0e..d2849ccd1b 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -464,12 +464,6 @@ void menu_advanced_settings(); #if ENABLED(CUSTOM_MENU_CONFIG) - void _lcd_custom_menus_configuration_gcode(FSTR_P const fstr) { - queue.inject(fstr); - TERN_(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); - TERN_(CUSTOM_MENU_CONFIG_SCRIPT_RETURN, ui.return_to_status()); - } - void custom_menus_configuration() { START_MENU(); BACK_ITEM(MSG_MAIN_MENU); @@ -481,7 +475,7 @@ void menu_advanced_settings(); #else #define _DONE_SCRIPT "" #endif - #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(F(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menu_gcode(F(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } #define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_F(F(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N)); #define _CUSTOM_ITEM_CONF_CONFIRM(N) \ SUBMENU_F(F(CONFIG_MENU_ITEM_##N##_DESC), []{ \ diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index d79956aea7..c3544f3c67 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -23,6 +23,7 @@ #include "menu.h" #include "../marlinui.h" +#include "../../gcode/gcode.h" // for process_subcommands_now #include "../../gcode/queue.h" // for inject #include "../../inc/MarlinConfigPre.h" @@ -70,6 +71,12 @@ class MenuItem_gcode : public MenuItem_button { static void action(FSTR_P const fstr, const uint8_t, FSTR_P const fgcode) { action(fstr, fgcode); } }; +class MenuItem_command : public MenuItem_gcode { + public: + static void action(FSTR_P const, FSTR_P const fgcode) { gcode.process_subcommands_now(fgcode); } + static void action(FSTR_P const fstr, const uint8_t, FSTR_P const fgcode) { action(fstr, fgcode); } +}; + //////////////////////////////////////////// ///////////// Edit Menu Items ////////////// //////////////////////////////////////////// @@ -479,6 +486,15 @@ class MenuItem_bool : public MenuEditItemBase { #define GCODES_ITEM_F(FLABEL, GCODES) MENU_ITEM_F(gcode, FLABEL, GCODES) #define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_F(GET_TEXT_F(LABEL), GCODES) +#define COMMAND_ITEM_N_S_F(N, S, FLABEL, GCODES) MENU_ITEM_N_S_F(command, N, S, FLABEL, GCODES) +#define COMMAND_ITEM_N_S(N, S, LABEL, GCODES) COMMAND_ITEM_N_S_F(N, S, GET_TEXT_F(LABEL), GCODES) +#define COMMAND_ITEM_S_F(S, FLABEL, GCODES) MENU_ITEM_S_F(command, S, FLABEL, GCODES) +#define COMMAND_ITEM_S(S, LABEL, GCODES) COMMAND_ITEM_S_F(S, GET_TEXT_F(LABEL), GCODES) +#define COMMAND_ITEM_N_F(N, FLABEL, GCODES) MENU_ITEM_N_F(command, N, FLABEL, GCODES) +#define COMMAND_ITEM_N(N, LABEL, GCODES) COMMAND_ITEM_N_F(N, GET_TEXT_F(LABEL), GCODES) +#define COMMAND_ITEM_F(FLABEL, GCODES) MENU_ITEM_F(command, FLABEL, GCODES) +#define COMMAND_ITEM(LABEL, GCODES) COMMAND_ITEM_F(GET_TEXT_F(LABEL), GCODES) + #define SUBMENU_N_S_F(N, S, FLABEL, DEST) MENU_ITEM_N_S_F(submenu, N, S, FLABEL, DEST) #define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_F(N, S, GET_TEXT_F(LABEL), DEST) #define SUBMENU_S_F(S, FLABEL, DEST) MENU_ITEM_S_F(submenu, S, FLABEL, DEST) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 401c59f5c0..13fe4e89e2 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -116,13 +116,24 @@ void menu_configuration(); void menu_language(); #endif -#if ENABLED(CUSTOM_MENU_MAIN) +#if ANY(CUSTOM_MENU_MAIN, CUSTOM_MENU_CONFIG) - void _lcd_custom_menu_main_gcode(FSTR_P const fstr) { - queue.inject(fstr); + FORCE_INLINE void _lcd_custom_menu_gcode_done() { TERN_(CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); TERN_(CUSTOM_MENU_MAIN_SCRIPT_RETURN, ui.return_to_status()); } + template<> void _lcd_custom_menu_gcode(FSTR_P const fstr) { + gcode.process_subcommands_now(fstr); + _lcd_custom_menu_gcode_done(); + } + template<> void _lcd_custom_menu_gcode(FSTR_P const fstr) { + queue.inject(fstr); + _lcd_custom_menu_gcode_done(); + } + +#endif + +#if ENABLED(CUSTOM_MENU_MAIN) void custom_menus_main() { START_MENU(); @@ -135,7 +146,7 @@ void menu_configuration(); #else #define _DONE_SCRIPT "" #endif - #define GCODE_LAMBDA_MAIN(N) []{ _lcd_custom_menu_main_gcode(F(MAIN_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define GCODE_LAMBDA_MAIN(N) []{ _lcd_custom_menu_gcode(F(MAIN_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } #define _CUSTOM_ITEM_MAIN(N) ACTION_ITEM_F(F(MAIN_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_MAIN(N)); #define _CUSTOM_ITEM_MAIN_CONFIRM(N) \ SUBMENU_F(F(MAIN_MENU_ITEM_##N##_DESC), []{ \ diff --git a/buildroot/tests/STM32F103RE_btt_USB b/buildroot/tests/STM32F103RE_btt_USB index ddf1903c9b..b74b8dd3a3 100755 --- a/buildroot/tests/STM32F103RE_btt_USB +++ b/buildroot/tests/STM32F103RE_btt_USB @@ -15,10 +15,12 @@ opt_enable SDSUPPORT EMERGENCY_PARSER exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 SERIAL_PORT -1 SERIAL_PORT_2 2 TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 SERIAL_PORT -1 SERIAL_PORT_2 2 TEMP_SENSOR_BED 1 BUTTON1_PIN PA12 opt_enable CR10_STOCKDISPLAY SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM \ NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING \ PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE \ - PROBING_HEATERS_OFF PREHEAT_BEFORE_PROBING + PROBING_HEATERS_OFF PREHEAT_BEFORE_PROBING CUSTOM_USER_BUTTONS BUTTON1_IMMEDIATE \ + CUSTOM_MENU_MAIN MAIN_MENU_ITEM_1_CONFIRM MAIN_MENU_ITEM_2_IMMEDIATE MAIN_MENU_ITEM_3_DESC MAIN_MENU_ITEM_3_GCODE \ + CUSTOM_MENU_CONFIG CONFIG_MENU_ITEM_1_CONFIRM CONFIG_MENU_ITEM_2_IMMEDIATE CONFIG_MENU_ITEM_3_DESC CONFIG_MENU_ITEM_3_GCODE opt_disable NOZZLE_TO_PROBE_OFFSET exec_test $1 $2 "BigTreeTech SKR CR6 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3"