From afab309d2726e932b579c9e6c530d374ecc9156b Mon Sep 17 00:00:00 2001 From: "D.R.racer" Date: Mon, 8 Nov 2021 12:32:44 +0100 Subject: [PATCH] Extract common Dis/Engaging of idler in Error states into base class --- src/logic/command_base.cpp | 14 ++++++++++++++ src/logic/command_base.h | 8 +++++++- src/logic/load_filament.cpp | 18 +++++------------- src/logic/tool_change.cpp | 17 ++++------------- src/logic/unload_filament.cpp | 21 ++++++--------------- 5 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/logic/command_base.cpp b/src/logic/command_base.cpp index 407f3f1..776a793 100644 --- a/src/logic/command_base.cpp +++ b/src/logic/command_base.cpp @@ -1,5 +1,6 @@ /// @file command_base.cpp #include "command_base.h" +#include "../modules/globals.h" #include "../modules/idler.h" #include "../modules/selector.h" #include "../modules/motion.h" @@ -105,4 +106,17 @@ void CommandBase::ErrDisengagingIdler() { } } +void CommandBase::GoToErrDisengagingIdler(ErrorCode ec) { + state = ProgressCode::ERRDisengagingIdler; + error = ec; + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); + ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); + mi::idler.Disengage(); +} + +void CommandBase::GoToErrEngagingIdler() { + state = ProgressCode::ERREngagingIdler; + mi::idler.Engage(mg::globals.ActiveSlot()); +} + } // namespace logic diff --git a/src/logic/command_base.h b/src/logic/command_base.h index 472b9ca..641180a 100644 --- a/src/logic/command_base.h +++ b/src/logic/command_base.h @@ -75,9 +75,15 @@ protected: /// If not, it returns false and sets the error to ErrorCode::INVALID_TOOL bool CheckToolIndex(uint8_t index); - /// Common error processing - disengaging idler + /// Perform disengaging idler in ErrDisengagingIdler state void ErrDisengagingIdler(); + /// Transit the state machine into ErrDisengagingIdler + void GoToErrDisengagingIdler(ErrorCode ec); + + /// Transit the state machine into ErrEngagingIdler + void GoToErrEngagingIdler(); + ProgressCode state; ///< current progress state of the state machine ErrorCode error; ///< current error code }; diff --git a/src/logic/load_filament.cpp b/src/logic/load_filament.cpp index 12d0703..9ab5b98 100644 --- a/src/logic/load_filament.cpp +++ b/src/logic/load_filament.cpp @@ -45,11 +45,7 @@ bool LoadFilament::StepInner() { if (feed.Step()) { if (feed.State() == FeedToFinda::Failed) { // @@TODO - try to repeat 6x - push/pull sequence - probably something to put into feed_to_finda as an option - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FINDA_DIDNT_SWITCH_ON; - mi::idler.Disengage(); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); // signal loading error + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_ON); // signal loading error } else { state = ProgressCode::RetractingFromFinda; retract.Reset(); @@ -59,14 +55,11 @@ bool LoadFilament::StepInner() { case ProgressCode::RetractingFromFinda: if (retract.Step()) { if (retract.State() == RetractFromFinda::Failed) { - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FINDA_DIDNT_SWITCH_OFF; - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); // signal loading error + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_OFF); // signal loading error } else { state = ProgressCode::DisengagingIdler; + mi::idler.Disengage(); } - mi::idler.Disengage(); // disengage in both cases } break; case ProgressCode::DisengagingIdler: @@ -88,8 +81,7 @@ bool LoadFilament::StepInner() { mui::Event ev = mui::userInput.ConsumeEvent(); switch (ev) { case mui::Event::Left: // try to manually load just a tiny bit - help the filament with the pulley - state = ProgressCode::ERREngagingIdler; - mi::idler.Engage(mg::globals.ActiveSlot()); + GoToErrEngagingIdler(); break; case mui::Event::Middle: // try again the whole sequence // however it depends on the state of FINDA - if it is on, we must perform unload first @@ -127,7 +119,7 @@ bool LoadFilament::StepInner() { GoToRetractingFromFinda(); } else if (mm::motion.QueueEmpty()) { // helped a bit, but FINDA didn't trigger, return to the main error state - state = ProgressCode::ERRDisengagingIdler; + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_ON); } return false; default: // we got into an unhandled state, better report it diff --git a/src/logic/tool_change.cpp b/src/logic/tool_change.cpp index 20fd8ea..dc40783 100644 --- a/src/logic/tool_change.cpp +++ b/src/logic/tool_change.cpp @@ -60,11 +60,7 @@ bool ToolChange::StepInner() { case ProgressCode::FeedingToFinda: if (feed.Step()) { if (feed.State() == FeedToFinda::Failed) { - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FINDA_DIDNT_SWITCH_ON; - mi::idler.Disengage(); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); // signal loading error + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_ON); // signal loading error } else { state = ProgressCode::FeedingToBondtech; james.Reset(3); @@ -74,11 +70,7 @@ bool ToolChange::StepInner() { case ProgressCode::FeedingToBondtech: if (james.Step()) { if (james.State() == FeedToBondtech::Failed) { - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FSENSOR_DIDNT_SWITCH_ON; - mi::idler.Disengage(); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); // signal loading error + GoToErrDisengagingIdler(ErrorCode::FSENSOR_DIDNT_SWITCH_ON); // signal loading error } else { state = ProgressCode::OK; error = ErrorCode::OK; @@ -97,8 +89,7 @@ bool ToolChange::StepInner() { mui::Event ev = mui::userInput.ConsumeEvent(); switch (ev) { case mui::Event::Left: // try to manually load just a tiny bit - help the filament with the pulley - state = ProgressCode::ERREngagingIdler; - mi::idler.Engage(mg::globals.ActiveSlot()); + GoToErrEngagingIdler(); break; case mui::Event::Middle: // try again the whole sequence Reset(mg::globals.ActiveSlot()); @@ -146,7 +137,7 @@ bool ToolChange::StepInner() { error = ErrorCode::RUNNING; } else if (mm::motion.QueueEmpty()) { // helped a bit, but FINDA/Fsensor didn't trigger, return to the main error state - state = ProgressCode::ERRDisengagingIdler; + GoToErrDisengagingIdler(ErrorCode::FSENSOR_DIDNT_SWITCH_ON); } return false; default: // we got into an unhandled state, better report it diff --git a/src/logic/unload_filament.cpp b/src/logic/unload_filament.cpp index eeefc3d..cdbfffa 100644 --- a/src/logic/unload_filament.cpp +++ b/src/logic/unload_filament.cpp @@ -38,16 +38,11 @@ bool UnloadFilament::StepInner() { if (unl.Step()) { if (unl.State() == UnloadToFinda::Failed) { // couldn't unload to FINDA, report error and wait for user to resolve it - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FINDA_DIDNT_SWITCH_OFF; - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); - mi::idler.Disengage(); + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_OFF); } else if (mfs::fsensor.Pressed()) { // fsensor still pressed - that smells bad - a piece of filament may still be present in the heatsink // and that would cause serious problems while loading another filament - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FSENSOR_DIDNT_SWITCH_OFF; + GoToErrDisengagingIdler(ErrorCode::FSENSOR_DIDNT_SWITCH_OFF); } else { state = ProgressCode::RetractingFromFinda; retract.Reset(); @@ -57,14 +52,11 @@ bool UnloadFilament::StepInner() { case ProgressCode::RetractingFromFinda: if (retract.Step()) { if (retract.State() == RetractFromFinda::Failed) { - state = ProgressCode::ERRDisengagingIdler; - error = ErrorCode::FINDA_DIDNT_SWITCH_OFF; - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off); - ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::blink0); // signal loading error + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_OFF); // signal unloading error } else { state = ProgressCode::DisengagingIdler; + mi::idler.Disengage(); } - mi::idler.Disengage(); } return false; case ProgressCode::DisengagingIdler: @@ -85,8 +77,7 @@ bool UnloadFilament::StepInner() { mui::Event ev = mui::userInput.ConsumeEvent(); switch (ev) { case mui::Event::Left: // try to manually unload just a tiny bit - help the filament with the pulley - state = ProgressCode::ERREngagingIdler; - mi::idler.Engage(mg::globals.ActiveSlot()); + GoToErrEngagingIdler(); break; case mui::Event::Middle: // try again the whole sequence Reset(0); @@ -127,7 +118,7 @@ bool UnloadFilament::StepInner() { error = ErrorCode::RUNNING; } else if (mm::motion.QueueEmpty()) { // helped a bit, but FINDA didn't trigger, return to the main error state - state = ProgressCode::ERRDisengagingIdler; + GoToErrDisengagingIdler(ErrorCode::FINDA_DIDNT_SWITCH_OFF); } return false; case ProgressCode::OK: