diff --git a/tests/unit/logic/homing/test_homing.cpp b/tests/unit/logic/homing/test_homing.cpp index 72d2435..d95b842 100644 --- a/tests/unit/logic/homing/test_homing.cpp +++ b/tests/unit/logic/homing/test_homing.cpp @@ -82,7 +82,10 @@ bool SelectorFailedRetry() { SimulateSelectorHoming(h); - REQUIRE(WhileTopState(h, ProgressCode::Homing, 5000)); + REQUIRE(ms::selector.HomingValid()); + + // Wait for the selector to return to the parked position + REQUIRE(WhileTopState(h, ProgressCode::Homing, selectorMoveMaxSteps)); REQUIRE(VerifyState(h, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), 0, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK)); REQUIRE(mi::idler.HomingValid()); diff --git a/tests/unit/logic/stubs/homing.cpp b/tests/unit/logic/stubs/homing.cpp index 1057af0..8ae1043 100644 --- a/tests/unit/logic/stubs/homing.cpp +++ b/tests/unit/logic/stubs/homing.cpp @@ -52,7 +52,7 @@ void SimulateIdlerAndSelectorHoming(logic::CommandBase &cb) { #else // sadly, it looks like we need to separate homing of idler and selector due to electrical reasons SimulateIdlerHoming(cb); - SimulateSelectorHoming(cb); + SimulateSelectorHoming(cb, true); #endif } @@ -90,7 +90,7 @@ void SimulateIdlerHoming(logic::CommandBase &cb) { } } -void SimulateSelectorHoming(logic::CommandBase &cb) { +void SimulateSelectorHoming(logic::CommandBase &cb, bool waitForParkedPosition) { // do 5 steps until we trigger the simulated StallGuard for (uint8_t i = 0; i < 5; ++i) { main_loop(); @@ -117,11 +117,22 @@ void SimulateSelectorHoming(logic::CommandBase &cb) { } } - // now the Selector shall perform a move into their parking positions - while (ms::selector.State() != mm::MovableBase::Ready) { + // Wait for the HomingValid flag to be set + while (!ms::selector.HomingValid()) { main_loop(); cb.Step(); } + + // Normally the firmware does not wait for the state to turn ready. But it can + // be useful to setup test cases. After the selector homing is valid, it will + // go to it's last planned position. + if (waitForParkedPosition) { + // now the Selector shall perform a move into their parking positions + while (ms::selector.State() != mm::MovableBase::Ready) { + main_loop(); + cb.Step(); + } + } } bool SimulateFailedHomeSelectorPostfix(logic::CommandBase &cb) { diff --git a/tests/unit/logic/stubs/homing.h b/tests/unit/logic/stubs/homing.h index d7932ed..895e4a1 100644 --- a/tests/unit/logic/stubs/homing.h +++ b/tests/unit/logic/stubs/homing.h @@ -5,7 +5,7 @@ class CommandBase; } void SimulateIdlerHoming(logic::CommandBase &cb); -void SimulateSelectorHoming(logic::CommandBase &cb); +void SimulateSelectorHoming(logic::CommandBase &cb, bool waitForParkedPosition = false); void SimulateIdlerAndSelectorHoming(logic::CommandBase &cb); bool SimulateFailedHomeFirstTime(logic::CommandBase &cb); bool SimulateFailedHomeSelectorRepeated(logic::CommandBase &cb); diff --git a/tests/unit/logic/stubs/main_loop_stub.cpp b/tests/unit/logic/stubs/main_loop_stub.cpp index ab0406e..f528909 100644 --- a/tests/unit/logic/stubs/main_loop_stub.cpp +++ b/tests/unit/logic/stubs/main_loop_stub.cpp @@ -85,7 +85,7 @@ void HomeIdlerAndSelector() { ms::selector.InvalidateHoming(); logic::NoCommand nc; // just a dummy instance which has an empty Step() SimulateIdlerHoming(nc); - SimulateSelectorHoming(nc); + SimulateSelectorHoming(nc, true); } bool EnsureActiveSlotIndex(uint8_t slot, mg::FilamentLoadState loadState) { diff --git a/tests/unit/logic/tool_change/test_tool_change.cpp b/tests/unit/logic/tool_change/test_tool_change.cpp index 28078c5..dc5903d 100644 --- a/tests/unit/logic/tool_change/test_tool_change.cpp +++ b/tests/unit/logic/tool_change/test_tool_change.cpp @@ -513,7 +513,11 @@ void ToolChangeFSENSOR_TOO_EARLY(logic::ToolChange &tc, uint8_t slot) { 200'000UL)); // still unloading, but Selector can start homing - SimulateSelectorHoming(tc); + + // Set waitForParkedPosition to true, since the unload filament statemachine + // explicitly waits for (ms::selector.State() == ms::Selector::Ready) + SimulateSelectorHoming(tc, true); + // wait for finishing of UnloadingFilament WhileTopState(tc, ProgressCode::UnloadingFilament, 5000);