🚸 Immediate Buttons and Menu Items (#28180)

This commit is contained in:
Scott Lahteine
2025-11-19 21:42:43 -06:00
parent 402aab968c
commit 06c6c479dd
14 changed files with 157 additions and 102 deletions
+13
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+6 -2
View File
@@ -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()); \
} \
} \
+37 -38
View File
@@ -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
@@ -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<bool> 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<true>(FSTR_P const fstr) {
gcode.process_subcommands_now(fstr);
_lcd_custom_menu_gcode_done();
}
template<> void _lcd_custom_menu_gcode<false>(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<ENABLED(MAIN_MENU_ITEM_1_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_2_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_3_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_4_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_5_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_6_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_7_IMMEDIATE)>(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<ENABLED(MAIN_MENU_ITEM_8_IMMEDIATE)>(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;
@@ -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
+7 -6
View File
@@ -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();
+2
View File
@@ -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();
+4
View File
@@ -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<bool> void _lcd_custom_menu_gcode(FSTR_P const fstr);
#endif
+1 -7
View File
@@ -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<ENABLED(CONFIG_MENU_ITEM_##N##_IMMEDIATE)>(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), []{ \
+16
View File
@@ -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)
+15 -4
View File
@@ -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<true>(FSTR_P const fstr) {
gcode.process_subcommands_now(fstr);
_lcd_custom_menu_gcode_done();
}
template<> void _lcd_custom_menu_gcode<false>(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<ENABLED(MAIN_MENU_ITEM_##N##_IMMEDIATE)>(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), []{ \
+4 -2
View File
@@ -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"