From 0e469c054f336ffc665416a0060775513653bebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Fri, 4 Aug 2023 11:13:02 +0000 Subject: [PATCH] Fix disappearing menu items when Filament Action completes An example is when Unloading filament with MMU. After the unload completes successfully, some menu items disappeared. Because mFilamentBack() was not called Change in memory: Flash: -56 bytes SRAM: 0 bytes --- Firmware/ultralcd.cpp | 45 +++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index c3b55f681..cf353d4ac 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1837,10 +1837,15 @@ void mFilamentBack() eFilamentAction = FilamentAction::None; } +/// Reset the menu stack and clear the planned filament action flag +static void mFilamentDone() +{ + menu_back(bFilamentPreheatState ? 1 : 2); + mFilamentBack(); +} + void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) { - uint8_t nLevel; - setTargetHotend((float)nTemp); if (!shouldPreheatOnlyNozzle()) setTargetBed((float)nTempBed); @@ -1869,6 +1874,7 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) // then continue with the filament action if any is set if (bFilamentSkipPreheat || abs((int)current_temperature[0] - nTemp) < TEMP_HYSTERESIS) { + menu_func_t filamentActionMenu = nullptr; switch (eFilamentAction) { case FilamentAction::Load: @@ -1877,9 +1883,7 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true); else { - nLevel = bFilamentPreheatState ? 1 : 2; - menu_back(nLevel); - + mFilamentDone(); if (eFilamentAction == FilamentAction::AutoLoad) { // loading no longer cancellable eFilamentAction = FilamentAction::Load; @@ -1892,30 +1896,21 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) } break; case FilamentAction::MmuLoad: - nLevel = bFilamentPreheatState ? 1 : 2; - menu_back(nLevel); - menu_submenu(mmu_load_to_nozzle_menu, true); + filamentActionMenu = mmu_load_to_nozzle_menu; break; case FilamentAction::MmuLoadingTest: - nLevel = bFilamentPreheatState ? 1 : 2; - menu_back(nLevel); - menu_submenu(mmu_loading_test_menu, true); + filamentActionMenu = mmu_loading_test_menu; break; case FilamentAction::MmuUnLoad: - nLevel = bFilamentPreheatState ? 1 : 2; - menu_back(nLevel); + mFilamentDone(); MMU2::mmu2.unload(); break; case FilamentAction::MmuEject: - nLevel = bFilamentPreheatState ? 1 : 2; - menu_back(nLevel); - menu_submenu(mmu_fil_eject_menu, true); + filamentActionMenu = mmu_fil_eject_menu; break; case FilamentAction::MmuCut: #ifdef MMU_HAS_CUTTER - nLevel=bFilamentPreheatState?1:2; - menu_back(nLevel); - menu_submenu(mmu_cut_filament_menu, true); + filamentActionMenu = mmu_cut_filament_menu; #endif //MMU_HAS_CUTTER break; case FilamentAction::None: @@ -1924,8 +1919,16 @@ void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) // handled earlier break; } - if (bFilamentWaitingFlag) Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); - bFilamentWaitingFlag = false; + if (bFilamentWaitingFlag) { + Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); + bFilamentWaitingFlag = false; + } + + if (filamentActionMenu) { + // Reset the menu stack and filament action before entering action menu + mFilamentDone(); + menu_submenu(filamentActionMenu, true); + } } else // still preheating, continue updating LCD UI {