From 7fe9d7f329bc42afa98a80324229dc4b4b8eabbe Mon Sep 17 00:00:00 2001 From: "D.R.racer" Date: Mon, 8 Nov 2021 18:00:56 +0100 Subject: [PATCH] Finish UnloadFilament unit test - error state resolved by user + checks --- src/logic/command_base.cpp | 1 + src/logic/load_filament.cpp | 14 +++-- src/logic/load_filament.h | 3 + src/logic/unload_filament.cpp | 28 +++++---- src/logic/unload_filament.h | 4 ++ .../load_filament/test_load_filament.cpp | 10 ++-- tests/unit/logic/stubs/stub_motion.cpp | 2 + .../unload_filament/test_unload_filament.cpp | 58 ++++++++++++++++++- 8 files changed, 97 insertions(+), 23 deletions(-) diff --git a/src/logic/command_base.cpp b/src/logic/command_base.cpp index 776a793..a95b1b6 100644 --- a/src/logic/command_base.cpp +++ b/src/logic/command_base.cpp @@ -102,6 +102,7 @@ bool CommandBase::CheckToolIndex(uint8_t index) { void CommandBase::ErrDisengagingIdler() { if (!mi::idler.Engaged()) { state = ProgressCode::ERRWaitingForUser; + mm::motion.Disable(mm::Pulley); mui::userInput.Clear(); // remove all buffered events if any just before we wait for some input } } diff --git a/src/logic/load_filament.cpp b/src/logic/load_filament.cpp index 9ab5b98..82cb5bc 100644 --- a/src/logic/load_filament.cpp +++ b/src/logic/load_filament.cpp @@ -39,6 +39,14 @@ void logic::LoadFilament::GoToRetractingFromFinda() { retract.Reset(); } +void logic::LoadFilament::FinishedCorrectly() { + state = ProgressCode::OK; + error = ErrorCode::OK; + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); + mm::motion.Disable(mm::Pulley); +} + bool LoadFilament::StepInner() { switch (state) { case ProgressCode::FeedingToFinda: @@ -64,11 +72,7 @@ bool LoadFilament::StepInner() { break; case ProgressCode::DisengagingIdler: if (!mi::idler.Engaged()) { - state = ProgressCode::OK; - error = ErrorCode::OK; - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - mm::motion.Disable(mm::Pulley); + FinishedCorrectly(); } break; case ProgressCode::OK: diff --git a/src/logic/load_filament.h b/src/logic/load_filament.h index 4fe134f..c6b89ab 100644 --- a/src/logic/load_filament.h +++ b/src/logic/load_filament.h @@ -24,6 +24,9 @@ private: void GoToRetractingFromFinda(); void Reset2(); + /// Common code for a correct completion of UnloadFilament + void FinishedCorrectly(); + FeedToFinda feed; RetractFromFinda retract; }; diff --git a/src/logic/unload_filament.cpp b/src/logic/unload_filament.cpp index cdbfffa..c0dc926 100644 --- a/src/logic/unload_filament.cpp +++ b/src/logic/unload_filament.cpp @@ -31,6 +31,15 @@ void UnloadFilament::Reset(uint8_t /*param*/) { ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); } +void logic::UnloadFilament::FinishedCorrectly() { + state = ProgressCode::OK; + error = ErrorCode::OK; + mm::motion.Disable(mm::Pulley); + mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::AtPulley); // filament unloaded + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); +} + bool UnloadFilament::StepInner() { switch (state) { // state 1 engage idler - will be done by the Unload to FINDA state machine @@ -61,12 +70,7 @@ bool UnloadFilament::StepInner() { return false; case ProgressCode::DisengagingIdler: if (!mi::idler.Engaged()) { - state = ProgressCode::OK; - error = ErrorCode::OK; - mm::motion.Disable(mm::Pulley); - mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::AtPulley); // filament unloaded - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); + FinishedCorrectly(); } return false; case ProgressCode::ERRDisengagingIdler: // couldn't unload to FINDA @@ -80,7 +84,12 @@ bool UnloadFilament::StepInner() { GoToErrEngagingIdler(); break; case mui::Event::Middle: // try again the whole sequence - Reset(0); + if (mf::finda.Pressed()) { + Reset(0); + } else { + state = ProgressCode::DisengagingIdler; + mi::idler.Disengage(); + } break; case mui::Event::Right: // problem resolved - the user pulled the fillament by hand // we should check the state of all the sensors and either report another error or confirm the correct state @@ -94,10 +103,7 @@ bool UnloadFilament::StepInner() { state = ProgressCode::ERRWaitingForUser; // stand still } else { // all sensors are ok - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::on); - state = ProgressCode::OK; - error = ErrorCode::OK; + FinishedCorrectly(); } break; default: diff --git a/src/logic/unload_filament.h b/src/logic/unload_filament.h index 39b2fa4..c3575be 100644 --- a/src/logic/unload_filament.h +++ b/src/logic/unload_filament.h @@ -22,6 +22,10 @@ public: private: constexpr static const uint8_t maxRetries = 3; + + /// Common code for a correct completion of UnloadFilament + void FinishedCorrectly(); + UnloadToFinda unl; RetractFromFinda retract; }; diff --git a/tests/unit/logic/load_filament/test_load_filament.cpp b/tests/unit/logic/load_filament/test_load_filament.cpp index a29f889..fb730ff 100644 --- a/tests/unit/logic/load_filament/test_load_filament.cpp +++ b/tests/unit/logic/load_filament/test_load_filament.cpp @@ -88,7 +88,7 @@ void FailedLoadToFinda(uint8_t slot, logic::LoadFilament &lf) { // Stage 3 - disengaging idler in error mode REQUIRE(WhileTopState(lf, ProgressCode::ERRDisengagingIdler, idlerEngageDisengageMaxSteps)); - REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, true, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERRWaitingForUser)); + REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERRWaitingForUser)); } void FailedLoadToFindaResolveHelp(uint8_t slot, logic::LoadFilament &lf) { @@ -101,7 +101,7 @@ void FailedLoadToFindaResolveHelp(uint8_t slot, logic::LoadFilament &lf) { // In this case we check the first option PressButtonAndDebounce(lf, mb::Left); - REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, true, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERREngagingIdler)); + REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERREngagingIdler)); // Stage 4 - engage the idler REQUIRE(WhileTopState(lf, ProgressCode::ERREngagingIdler, idlerEngageDisengageMaxSteps)); @@ -138,7 +138,7 @@ void FailedLoadToFindaResolveManual(uint8_t slot, logic::LoadFilament &lf) { PressButtonAndDebounce(lf, mb::Right); // pulling filament back - REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, true, ml::blink0, ml::off, ErrorCode::RUNNING, ProgressCode::RetractingFromFinda)); + REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, false, ml::blink0, ml::off, ErrorCode::RUNNING, ProgressCode::RetractingFromFinda)); // Stage 3 - retracting from finda // we'll assume the finda is working correctly here @@ -162,14 +162,14 @@ void FailedLoadToFindaResolveManualNoFINDA(uint8_t slot, logic::LoadFilament &lf PressButtonAndDebounce(lf, mb::Right); // pulling filament back - REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, true, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERRWaitingForUser)); + REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_ON, ProgressCode::ERRWaitingForUser)); } void FailedLoadToFindaResolveTryAgain(uint8_t slot, logic::LoadFilament &lf) { PressButtonAndDebounce(lf, mb::Middle); // the state machine should have restarted - REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, true, ml::blink0, ml::off, ErrorCode::RUNNING, ProgressCode::FeedingToFinda)); + REQUIRE(VerifyState(lf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, false, ml::blink0, ml::off, ErrorCode::RUNNING, ProgressCode::FeedingToFinda)); LoadFilamentSuccessful(slot, lf); } diff --git a/tests/unit/logic/stubs/stub_motion.cpp b/tests/unit/logic/stubs/stub_motion.cpp index fe45a59..f95d0a1 100644 --- a/tests/unit/logic/stubs/stub_motion.cpp +++ b/tests/unit/logic/stubs/stub_motion.cpp @@ -38,6 +38,8 @@ void TriggerStallGuard(Axis axis) { void Motion::PlanMoveTo(Axis axis, pos_t pos, steps_t feed_rate, steps_t end_rate) { axes[axis].targetPos = pos; + if (!axisData[axis].enabled) + SetEnabled(axis, true); } pos_t Motion::Position(Axis axis) const { diff --git a/tests/unit/logic/unload_filament/test_unload_filament.cpp b/tests/unit/logic/unload_filament/test_unload_filament.cpp index 22ecf77..2988973 100644 --- a/tests/unit/logic/unload_filament/test_unload_filament.cpp +++ b/tests/unit/logic/unload_filament/test_unload_filament.cpp @@ -143,7 +143,7 @@ void FindaDidntTriggerCommonSetup(uint8_t slot, logic::UnloadFilament &uf) { // FINDA still on // red LED should blink // green LED should be off - REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, true, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_OFF, ProgressCode::ERRWaitingForUser)); + REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_OFF, ProgressCode::ERRWaitingForUser)); } void FindaDidntTriggerResolveHelp(uint8_t slot, logic::UnloadFilament &uf) { @@ -164,7 +164,7 @@ void FindaDidntTriggerResolveHelp(uint8_t slot, logic::UnloadFilament &uf) { // no change in selector's position // FINDA still on // red LED should blink, green LED should be off - REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, true, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_OFF, ProgressCode::ERREngagingIdler)); + REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_OFF, ProgressCode::ERREngagingIdler)); // Stage 4 - engage the idler REQUIRE(WhileTopState(uf, ProgressCode::ERREngagingIdler, idlerEngageDisengageMaxSteps)); @@ -273,3 +273,57 @@ TEST_CASE("unload_filament::not_loaded", "[unload_filament]") { // Stage 0 - unload filament should finish immediately as there is no filament loaded REQUIRE(VerifyState(uf, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), 0, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK)); } + +void FailedUnloadResolveManual(uint8_t slot, logic::UnloadFilament &uf) { + // simulate the user fixed the issue himself + + // Perform press on button 2 + debounce + switch off FINDA + hal::gpio::WritePin(FINDA_PIN, hal::gpio::Level::low); + PressButtonAndDebounce(uf, mb::Right); + + REQUIRE(VerifyState(uf, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK)); +} + +void FailedUnloadResolveManualFINDAon(uint8_t slot, logic::UnloadFilament &uf) { + // simulate the user fixed the issue himself + + // Perform press on button 2 + debounce + keep FINDA on + PressButtonAndDebounce(uf, mb::Right); + + REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, true, false, ml::off, ml::blink0, ErrorCode::FINDA_DIDNT_SWITCH_OFF, ProgressCode::ERRWaitingForUser)); +} + +void FailedUnloadResolveManualFSensorOn(uint8_t slot, logic::UnloadFilament &uf) { + // simulate the user fixed the issue himself + + // Perform press on button 2 + debounce + keep FSensor on + mfs::fsensor.ProcessMessage(true); + hal::gpio::WritePin(FINDA_PIN, hal::gpio::Level::low); + PressButtonAndDebounce(uf, mb::Right); + + REQUIRE(VerifyState(uf, mg::FilamentLoadState::InSelector, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::blink0, ErrorCode::FSENSOR_DIDNT_SWITCH_OFF, ProgressCode::ERRWaitingForUser)); +} + +TEST_CASE("unload_filament::failed_unload_to_finda_0-4_resolve_manual", "[unload_filament]") { + for (uint8_t slot = 0; slot < config::toolCount; ++slot) { + logic::UnloadFilament uf; + FindaDidntTriggerCommonSetup(slot, uf); + FailedUnloadResolveManual(slot, uf); + } +} + +TEST_CASE("unload_filament::failed_unload_to_finda_0-4_resolve_manual_FINDA_on", "[unload_filament]") { + for (uint8_t slot = 0; slot < config::toolCount; ++slot) { + logic::UnloadFilament uf; + FindaDidntTriggerCommonSetup(slot, uf); + FailedUnloadResolveManualFINDAon(slot, uf); + } +} + +TEST_CASE("unload_filament::failed_unload_to_finda_0-4_resolve_manual_FSensor_on", "[unload_filament]") { + for (uint8_t slot = 0; slot < config::toolCount; ++slot) { + logic::UnloadFilament uf; + FindaDidntTriggerCommonSetup(slot, uf); + FailedUnloadResolveManualFSensorOn(slot, uf); + } +}