Finish UnloadFilament unit test - error state resolved by user + checks

pull/138/head
D.R.racer 2021-11-08 18:00:56 +01:00 committed by DRracer
parent afab309d27
commit 7fe9d7f329
8 changed files with 97 additions and 23 deletions

View File

@ -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
}
}

View File

@ -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:

View File

@ -24,6 +24,9 @@ private:
void GoToRetractingFromFinda();
void Reset2();
/// Common code for a correct completion of UnloadFilament
void FinishedCorrectly();
FeedToFinda feed;
RetractFromFinda retract;
};

View File

@ -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:

View File

@ -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;
};

View File

@ -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);
}

View File

@ -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 {

View File

@ -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);
}
}