Update unit test + fix first bugs

pull/288/head
D.R.racer 2023-08-04 09:57:46 +02:00
parent 79e69c9665
commit 9ca45b4aea
7 changed files with 30 additions and 21 deletions

View File

@ -79,6 +79,8 @@ bool FeedToBondtech::Step() {
//dbg_logic_P(PSTR("Feed to Bondtech --> Pushing")); //dbg_logic_P(PSTR("Feed to Bondtech --> Pushing"));
if (mfs::fsensor.Pressed()) { if (mfs::fsensor.Pressed()) {
mm::motion.AbortPlannedMoves(); // stop pushing filament mm::motion.AbortPlannedMoves(); // stop pushing filament
// remember the feed distance for later update of bowden length
feedEnd_mm = mpu::pulley.CurrentPosition_mm();
GoToPushToNozzle(); GoToPushToNozzle();
// } else if (mm::motion.StallGuard(mm::Pulley)) { // } else if (mm::motion.StallGuard(mm::Pulley)) {
// // StallGuard occurred during movement - the filament got stuck // // StallGuard occurred during movement - the filament got stuck
@ -109,7 +111,7 @@ bool FeedToBondtech::Step() {
dbg_logic_P(PSTR("Feed to Bondtech --> Idler disengaged")); dbg_logic_P(PSTR("Feed to Bondtech --> Idler disengaged"));
dbg_logic_fP(PSTR("Pulley end steps %u"), mpu::pulley.CurrentPosition_mm()); dbg_logic_fP(PSTR("Pulley end steps %u"), mpu::pulley.CurrentPosition_mm());
state = OK; state = OK;
UpdateBowdenLength(abs(mpu::pulley.CurrentPosition_mm() - feedStart_mm)); UpdateBowdenLength(abs(feedEnd_mm - feedStart_mm));
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::on); ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::on);
} }
return false; return false;

View File

@ -56,7 +56,7 @@ private:
uint8_t state; uint8_t state;
uint8_t maxRetries; uint8_t maxRetries;
int32_t feedStart_mm; // intentionally trying to avoid using U_mm because it is a float (resp. long double) int32_t feedStart_mm, feedEnd_mm; // intentionally trying to avoid using U_mm because it is a float (resp. long double)
}; };
} // namespace logic } // namespace logic

View File

@ -79,12 +79,12 @@ static constexpr bool validBowdenLen(const uint16_t BowdenLength) {
&& BowdenLength <= eepromBowdenLenMaximum); && BowdenLength <= eepromBowdenLenMaximum);
} }
uint16_t BowdenLength::Get(){ uint16_t BowdenLength::Get() {
uint16_t bl = ee::EEPROM::ReadByte(EEOFFSET(eepromBase->bowdenLengthMM)); uint16_t bl = ee::EEPROM::ReadWord(EEOFFSET(eepromBase->bowdenLengthMM));
return validBowdenLen(bl) ? bl : eepromBowdenLenDefault; return validBowdenLen(bl) ? bl : eepromBowdenLenDefault;
} }
void BowdenLength::Set(uint16_t mm){ void BowdenLength::Set(uint16_t mm) {
ee::EEPROM::UpdateWord(EEOFFSET(eepromBase->bowdenLengthMM), mm); ee::EEPROM::UpdateWord(EEOFFSET(eepromBase->bowdenLengthMM), mm);
} }

View File

@ -28,11 +28,9 @@ TEST_CASE("feed_to_bondtech::feed_phase_unlimited", "[feed_to_bondtech]") {
REQUIRE(EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley)); REQUIRE(EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley));
// reset bowden lenghts in EEPROM // reset bowden lenghts in EEPROM
InitBowdenLengths(); SetMinimalBowdenLength();
// check bowden lengths // check bowden lengths
for (uint8_t slot = 0; slot < config::toolCount; ++slot) { REQUIRE(mps::BowdenLength::Get() == config::minimumBowdenLength.v);
REQUIRE(mps::BowdenLength::Get(mg::globals.ActiveSlot()) == config::minimumBowdenLength.v);
}
FeedToBondtech fb; FeedToBondtech fb;
main_loop(); main_loop();
@ -64,20 +62,23 @@ TEST_CASE("feed_to_bondtech::feed_phase_unlimited", "[feed_to_bondtech]") {
REQUIRE(ml::leds.Mode(mg::globals.ActiveSlot(), ml::green) == ml::blink0); REQUIRE(ml::leds.Mode(mg::globals.ActiveSlot(), ml::green) == ml::blink0);
// fast load - no fsensor trigger // fast load - no fsensor trigger
// performs fast load for config::minimumBowdenLength distance
REQUIRE(WhileCondition( REQUIRE(WhileCondition(
fb, fb,
[&](uint32_t) { return fb.State() == FeedToBondtech::PushingFilamentFast; }, [&](uint32_t) { return fb.State() == FeedToBondtech::PushingFilamentFast; },
mm::unitToSteps<mm::P_pos_t>(config::minimumBowdenLength) + 2)); mm::unitToSteps<mm::P_pos_t>(config::minimumBowdenLength) + 2));
// slow load - expecting fsensor trigger // slow load - expecting fsensor trigger
// This gets interesting with bowden length autotuning - we should trigger at the right step
constexpr uint32_t additionalBowdenLengthTrigger = mm::unitToSteps<mm::P_pos_t>(config::defaultBowdenLength - config::minimumBowdenLength);
REQUIRE(WhileCondition( REQUIRE(WhileCondition(
fb, fb,
[&](uint32_t step) { [&](uint32_t step) {
if( step == 100 ){ if( step == additionalBowdenLengthTrigger ){
mfs::fsensor.ProcessMessage(true); mfs::fsensor.ProcessMessage(true);
} }
return fb.State() == FeedToBondtech::PushingFilamentToFSensor; }, return fb.State() == FeedToBondtech::PushingFilamentToFSensor; },
1500)); additionalBowdenLengthTrigger + 5));
REQUIRE(mfs::fsensor.Pressed()); REQUIRE(mfs::fsensor.Pressed());
@ -114,5 +115,11 @@ TEST_CASE("feed_to_bondtech::feed_phase_unlimited", "[feed_to_bondtech]") {
REQUIRE(fb.State() == FeedToBondtech::OK); REQUIRE(fb.State() == FeedToBondtech::OK);
REQUIRE(ml::leds.LedOn(mg::globals.ActiveSlot(), ml::green)); REQUIRE(ml::leds.LedOn(mg::globals.ActiveSlot(), ml::green));
// detected bowden length is expected to be 429 in our test scenario
uint16_t detectedBowdenLength = mps::BowdenLength::Get();
CHECK(detectedBowdenLength == 429);
// must be within the specified tolerance of 10mm from the default bowden length
REQUIRE(abs(detectedBowdenLength - config::defaultBowdenLength.v) < 10);
REQUIRE(fb.Step() == true); // the automaton finished its work, any consecutive calls to Step must return true REQUIRE(fb.Step() == true); // the automaton finished its work, any consecutive calls to Step must return true
} }

View File

@ -165,11 +165,9 @@ void ClearButtons(logic::CommandBase &cb) {
} }
} }
void InitBowdenLengths() { void SetMinimalBowdenLength() {
// reset bowdenLenght in EEPROM // reset bowdenLenght in EEPROM
for (uint8_t slot = 0; slot < config::toolCount; ++slot) { mps::BowdenLength::Set(config::minimumBowdenLength.v);
mps::BowdenLength::Set(slot, config::minimumBowdenLength.v);
}
} }
void SetFSensorStateAndDebounce(bool press) { void SetFSensorStateAndDebounce(bool press) {

View File

@ -32,7 +32,7 @@ bool SimulateRetractFromFINDA(uint32_t step, uint32_t findaOff);
void PressButtonAndDebounce(logic::CommandBase &cb, uint8_t btnIndex, bool fromPrinter); void PressButtonAndDebounce(logic::CommandBase &cb, uint8_t btnIndex, bool fromPrinter);
void ClearButtons(logic::CommandBase &cb); void ClearButtons(logic::CommandBase &cb);
void InitBowdenLengths(); void SetMinimalBowdenLength();
void SetFSensorStateAndDebounce(bool press); void SetFSensorStateAndDebounce(bool press);
// these are recommended max steps for simulated movement of the idler and selector // these are recommended max steps for simulated movement of the idler and selector

View File

@ -79,7 +79,7 @@ bool SimulateUnloadFilament(uint32_t step, const logic::CommandBase *tc, uint32_
void ToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) { void ToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
InitBowdenLengths(); SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle)); REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle));
SetFINDAStateAndDebounce(true); SetFINDAStateAndDebounce(true);
@ -105,7 +105,7 @@ void ToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
void NoToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) { void NoToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
InitBowdenLengths(); SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle)); REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle));
// the filament is LOADED // the filament is LOADED
@ -125,7 +125,7 @@ void NoToolChange(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
void JustLoadFilament(logic::ToolChange &tc, uint8_t slot) { void JustLoadFilament(logic::ToolChange &tc, uint8_t slot) {
for (uint8_t startSelectorSlot = 0; startSelectorSlot < config::toolCount; ++startSelectorSlot) { for (uint8_t startSelectorSlot = 0; startSelectorSlot < config::toolCount; ++startSelectorSlot) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
InitBowdenLengths(); SetMinimalBowdenLength();
// make sure all the modules are ready // make sure all the modules are ready
// MMU-196: Move selector to a "random" slot // MMU-196: Move selector to a "random" slot
REQUIRE(EnsureActiveSlotIndex(startSelectorSlot, mg::FilamentLoadState::AtPulley)); REQUIRE(EnsureActiveSlotIndex(startSelectorSlot, mg::FilamentLoadState::AtPulley));
@ -191,7 +191,7 @@ TEST_CASE("tool_change::same_slot_just_unloaded_filament", "[tool_change]") {
void ToolChangeFailLoadToFinda(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) { void ToolChangeFailLoadToFinda(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
InitBowdenLengths(); SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle)); REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle));
SetFINDAStateAndDebounce(true); SetFINDAStateAndDebounce(true);
@ -319,7 +319,7 @@ TEST_CASE("tool_change::load_fail_FINDA_resolve_btnM", "[tool_change]") {
void ToolChangeFailFSensor(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) { void ToolChangeFailFSensor(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot) {
using namespace std::placeholders; using namespace std::placeholders;
ForceReinitAllAutomata(); ForceReinitAllAutomata();
InitBowdenLengths(); SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle)); REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle));
SetFINDAStateAndDebounce(true); SetFINDAStateAndDebounce(true);
@ -402,6 +402,7 @@ TEST_CASE("tool_change::load_fail_FSensor_resolve_btnM", "[tool_change]") {
void ToolChangeWithFlickeringFINDA(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot, bool keepFindaPressed) { void ToolChangeWithFlickeringFINDA(logic::ToolChange &tc, uint8_t fromSlot, uint8_t toSlot, bool keepFindaPressed) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle)); REQUIRE(EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle));
SetFINDAStateAndDebounce(true); SetFINDAStateAndDebounce(true);
@ -500,6 +501,7 @@ TEST_CASE("tool_change::test_flickering_FINDA_keepPressed", "[tool_change]") {
void ToolChangeFSENSOR_TOO_EARLY(logic::ToolChange &tc, uint8_t slot) { void ToolChangeFSENSOR_TOO_EARLY(logic::ToolChange &tc, uint8_t slot) {
ForceReinitAllAutomata(); ForceReinitAllAutomata();
SetMinimalBowdenLength();
REQUIRE(EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley)); REQUIRE(EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley));
// verify filament NOT loaded // verify filament NOT loaded