Finish UnloadFilament unit test - error state resolved by user + checks
parent
afab309d27
commit
7fe9d7f329
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ private:
|
|||
void GoToRetractingFromFinda();
|
||||
void Reset2();
|
||||
|
||||
/// Common code for a correct completion of UnloadFilament
|
||||
void FinishedCorrectly();
|
||||
|
||||
FeedToFinda feed;
|
||||
RetractFromFinda retract;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue