From 5a53acd80222d045d95e3ada9708c0e93e3434db Mon Sep 17 00:00:00 2001 From: "D.R.racer" Date: Fri, 27 Aug 2021 12:05:59 +0200 Subject: [PATCH] Force Tool Change to load the filament if same slot but not loaded MMU-63 --- src/logic/tool_change.cpp | 6 ++- .../logic/tool_change/test_tool_change.cpp | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/logic/tool_change.cpp b/src/logic/tool_change.cpp index 71c9ab9..4524066 100644 --- a/src/logic/tool_change.cpp +++ b/src/logic/tool_change.cpp @@ -17,9 +17,13 @@ void ToolChange::Reset(uint8_t param) { return; } - if (param == mg::globals.ActiveSlot()) + if (param == mg::globals.ActiveSlot() && mg::globals.FilamentLoaded()) { + // we are already at the correct slot and the filament is loaded - nothing to do return; + } + // we are either already at the correct slot, just the filament is not loaded - load the filament directly + // or we are standing at another slot ... plannedSlot = param; if (mg::globals.FilamentLoaded()) { diff --git a/tests/unit/logic/tool_change/test_tool_change.cpp b/tests/unit/logic/tool_change/test_tool_change.cpp index ca7096f..0ddd4bb 100644 --- a/tests/unit/logic/tool_change/test_tool_change.cpp +++ b/tests/unit/logic/tool_change/test_tool_change.cpp @@ -56,8 +56,13 @@ void ToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) { void NoToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) { ForceReinitAllAutomata(); + // the filament is LOADED + mg::globals.SetFilamentLoaded(true); + EnsureActiveSlotIndex(fromSlot); + REQUIRE(VerifyEnvironmentState(true, mi::Idler::IdleSlotIndex(), toSlot, false, ml::off, ml::off)); + // restart the automaton tc.Reset(toSlot); @@ -66,6 +71,31 @@ void NoToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) { REQUIRE(tc.Error() == ErrorCode::OK); } +void JustLoadFilament(logic::ToolChange tc, uint8_t slot) { + ForceReinitAllAutomata(); + + EnsureActiveSlotIndex(slot); + + // verify filament NOT loaded + REQUIRE(VerifyEnvironmentState(false, mi::Idler::IdleSlotIndex(), slot, false, ml::off, ml::off)); + + // restart the automaton + tc.Reset(slot); + + REQUIRE(WhileCondition( + tc, + [&](int step) -> bool { + if(step == 1000){ // on 1000th step make FINDA trigger + hal::adc::SetADC(config::findaADCIndex, 900); + } + return tc.TopLevelState() == ProgressCode::LoadingFilament; }, + 200000UL)); + + REQUIRE(tc.TopLevelState() == ProgressCode::OK); + REQUIRE(mg::globals.FilamentLoaded() == true); + REQUIRE(mg::globals.ActiveSlot() == slot); +} + TEST_CASE("tool_change::test0", "[tool_change]") { for (uint8_t fromSlot = 0; fromSlot < config::toolCount; ++fromSlot) { for (uint8_t toSlot = 0; toSlot < config::toolCount; ++toSlot) { @@ -101,3 +131,10 @@ TEST_CASE("tool_change::state_machine_reusal", "[tool_change]") { } } } + +TEST_CASE("tool_change::same_slot_just_unloaded_filament", "[tool_change]") { + for (uint8_t toSlot = 0; toSlot < config::toolCount; ++toSlot) { + logic::ToolChange tc; + JustLoadFilament(tc, toSlot); + } +}