Avoid trying to unload filament when not loaded
however, it looks like the EEPROM is not updated correctly, needs more testingpull/134/head
parent
04348b2d86
commit
9438253106
|
|
@ -19,6 +19,7 @@
|
||||||
namespace config {
|
namespace config {
|
||||||
|
|
||||||
static constexpr const uint8_t toolCount = 5U; ///< Max number of extruders/tools/slots
|
static constexpr const uint8_t toolCount = 5U; ///< Max number of extruders/tools/slots
|
||||||
|
static_assert(toolCount < 15, "Up to 14 valid slots (+1 parking) is supported in EEPROM storage");
|
||||||
|
|
||||||
// Printer's filament sensor setup
|
// Printer's filament sensor setup
|
||||||
static constexpr const uint16_t fsensorDebounceMs = 10;
|
static constexpr const uint16_t fsensorDebounceMs = 10;
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ bool CutFilament::StepInner() {
|
||||||
if (mm::motion.QueueEmpty()) { // idler and selector finished their moves
|
if (mm::motion.QueueEmpty()) { // idler and selector finished their moves
|
||||||
// move selector aside - prepare the blade into active position
|
// move selector aside - prepare the blade into active position
|
||||||
state = ProgressCode::PreparingBlade;
|
state = ProgressCode::PreparingBlade;
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::AtPulley);
|
mg::globals.SetFilamentLoaded(cutSlot, mg::FilamentLoadState::AtPulley);
|
||||||
ms::selector.MoveToSlot(cutSlot + 1);
|
ms::selector.MoveToSlot(cutSlot + 1);
|
||||||
}
|
}
|
||||||
case ProgressCode::PreparingBlade:
|
case ProgressCode::PreparingBlade:
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ bool EjectFilament::StepInner() {
|
||||||
case ProgressCode::DisengagingIdler:
|
case ProgressCode::DisengagingIdler:
|
||||||
if (!mi::idler.Engaged()) { // idler disengaged
|
if (!mi::idler.Engaged()) { // idler disengaged
|
||||||
mm::motion.Disable(mm::Pulley);
|
mm::motion.Disable(mm::Pulley);
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::NotLoaded);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::NotLoaded);
|
||||||
state = ProgressCode::OK;
|
state = ProgressCode::OK;
|
||||||
error = ErrorCode::OK;
|
error = ErrorCode::OK;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ 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
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InFSensor);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InFSensor);
|
||||||
// plan a slow move to help push filament into the nozzle
|
// plan a slow move to help push filament into the nozzle
|
||||||
//@@TODO the speed in mm/s must correspond to printer's feeding speed!
|
//@@TODO the speed in mm/s must correspond to printer's feeding speed!
|
||||||
mm::motion.PlanMove<mm::Pulley>(config::fsensorToNozzle, config::pulleySlowFeedrate);
|
mm::motion.PlanMove<mm::Pulley>(config::fsensorToNozzle, config::pulleySlowFeedrate);
|
||||||
|
|
@ -49,7 +49,7 @@ bool FeedToBondtech::Step() {
|
||||||
return false;
|
return false;
|
||||||
case PushingFilamentIntoNozzle:
|
case PushingFilamentIntoNozzle:
|
||||||
if (mm::motion.QueueEmpty()) {
|
if (mm::motion.QueueEmpty()) {
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InNozzle);
|
||||||
mi::idler.Disengage();
|
mi::idler.Disengage();
|
||||||
// while disengaging the idler, keep on moving with the pulley to avoid grinding while the printer is trying to grab the filament itself
|
// while disengaging the idler, keep on moving with the pulley to avoid grinding while the printer is trying to grab the filament itself
|
||||||
mm::motion.PlanMove<mm::Pulley>(config::fsensorToNozzleAvoidGrind, config::pulleySlowFeedrate);
|
mm::motion.PlanMove<mm::Pulley>(config::fsensorToNozzleAvoidGrind, config::pulleySlowFeedrate);
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,12 @@ bool FeedToFinda::Step() {
|
||||||
dbg_logic_fP(PSTR("Pulley start steps %u"), mm::motion.CurPosition(mm::Pulley));
|
dbg_logic_fP(PSTR("Pulley start steps %u"), mm::motion.CurPosition(mm::Pulley));
|
||||||
state = PushingFilament;
|
state = PushingFilament;
|
||||||
mm::motion.InitAxis(mm::Pulley);
|
mm::motion.InitAxis(mm::Pulley);
|
||||||
if (mg::globals.FilamentLoaded() == mg::FilamentLoadState::NotLoaded) { // feed slowly filament to PTFE
|
// @@TODO this may never happen as load filament always assumes the filament is at least at the pulley
|
||||||
mm::motion.PlanMove<mm::Pulley>(config::filamentMinLoadedToMMU, config::pulleySlowFeedrate);
|
// if (mg::globals.FilamentLoaded() == mg::FilamentLoadState::NotLoaded) { // feed slowly filament to PTFE
|
||||||
}
|
// mm::motion.PlanMove<mm::Pulley>(config::filamentMinLoadedToMMU, config::pulleySlowFeedrate);
|
||||||
|
// }
|
||||||
mm::motion.PlanMove<mm::Pulley>(config::feedToFinda, config::pulleyFeedrate);
|
mm::motion.PlanMove<mm::Pulley>(config::feedToFinda, config::pulleyFeedrate);
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InSelector);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InSelector);
|
||||||
mui::userInput.Clear(); // remove all buffered events if any just before we wait for some input
|
mui::userInput.Clear(); // remove all buffered events if any just before we wait for some input
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -41,7 +42,7 @@ bool FeedToFinda::Step() {
|
||||||
if (mf::finda.Pressed() || (feedPhaseLimited && mui::userInput.AnyEvent())) { // @@TODO probably also a command from the printer
|
if (mf::finda.Pressed() || (feedPhaseLimited && mui::userInput.AnyEvent())) { // @@TODO probably also a command from the printer
|
||||||
mm::motion.AbortPlannedMoves(); // stop pushing filament
|
mm::motion.AbortPlannedMoves(); // stop pushing filament
|
||||||
// FINDA triggered - that means it works and detected the filament tip
|
// FINDA triggered - that means it works and detected the filament tip
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InSelector);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InSelector);
|
||||||
dbg_logic_P(PSTR("Feed to Finda --> Idler disengaged"));
|
dbg_logic_P(PSTR("Feed to Finda --> Idler disengaged"));
|
||||||
dbg_logic_fP(PSTR("Pulley end steps %u"), mm::motion.CurPosition(mm::Pulley));
|
dbg_logic_fP(PSTR("Pulley end steps %u"), mm::motion.CurPosition(mm::Pulley));
|
||||||
state = OK;
|
state = OK;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ void LoadFilament::Reset(uint8_t param) {
|
||||||
dbg_logic_P(PSTR("Load Filament"));
|
dbg_logic_P(PSTR("Load Filament"));
|
||||||
state = ProgressCode::FeedingToFinda;
|
state = ProgressCode::FeedingToFinda;
|
||||||
error = ErrorCode::RUNNING;
|
error = ErrorCode::RUNNING;
|
||||||
mg::globals.SetActiveSlot(param);
|
mg::globals.SetFilamentLoaded(param, mg::FilamentLoadState::AtPulley); // still at pulley, haven't moved yet
|
||||||
feed.Reset(true);
|
feed.Reset(true);
|
||||||
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::blink0);
|
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::blink0);
|
||||||
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off);
|
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off);
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ bool RetractFromFinda::Step() {
|
||||||
if (mm::motion.QueueEmpty()) { // all moves have been finished
|
if (mm::motion.QueueEmpty()) { // all moves have been finished
|
||||||
if (!mf::finda.Pressed()) { // FINDA switched off correctly while the move was performed
|
if (!mf::finda.Pressed()) { // FINDA switched off correctly while the move was performed
|
||||||
state = OK;
|
state = OK;
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::AtPulley);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::AtPulley);
|
||||||
dbg_logic_fP(PSTR("Pulley end steps %u"), mm::motion.CurPosition(mm::Pulley));
|
dbg_logic_fP(PSTR("Pulley end steps %u"), mm::motion.CurPosition(mm::Pulley));
|
||||||
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off);
|
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::green, ml::off);
|
||||||
} else { // FINDA didn't switch off
|
} else { // FINDA didn't switch off
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ void ToolChange::Reset(uint8_t param) {
|
||||||
state = ProgressCode::FeedingToFinda;
|
state = ProgressCode::FeedingToFinda;
|
||||||
error = ErrorCode::RUNNING;
|
error = ErrorCode::RUNNING;
|
||||||
dbg_logic_P(PSTR("Filament is not loaded --> load"));
|
dbg_logic_P(PSTR("Filament is not loaded --> load"));
|
||||||
mg::globals.SetActiveSlot(plannedSlot);
|
mg::globals.SetFilamentLoaded(plannedSlot, mg::FilamentLoadState::InSelector);
|
||||||
feed.Reset(true);
|
feed.Reset(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -52,7 +52,7 @@ bool ToolChange::StepInner() {
|
||||||
// There is no way the UnloadFilament to finish in an error state
|
// There is no way the UnloadFilament to finish in an error state
|
||||||
state = ProgressCode::FeedingToFinda;
|
state = ProgressCode::FeedingToFinda;
|
||||||
error = ErrorCode::RUNNING;
|
error = ErrorCode::RUNNING;
|
||||||
mg::globals.SetActiveSlot(plannedSlot);
|
mg::globals.SetFilamentLoaded(plannedSlot, mg::FilamentLoadState::AtPulley);
|
||||||
feed.Reset(true);
|
feed.Reset(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,13 @@ namespace logic {
|
||||||
UnloadFilament unloadFilament;
|
UnloadFilament unloadFilament;
|
||||||
|
|
||||||
void UnloadFilament::Reset(uint8_t /*param*/) {
|
void UnloadFilament::Reset(uint8_t /*param*/) {
|
||||||
|
|
||||||
|
if (!mf::finda.Pressed() && mg::globals.FilamentLoaded() < mg::FilamentLoadState::InSelector) {
|
||||||
|
// it looks like we have nothing in the PTFE tube, at least FINDA doesn't sense anything
|
||||||
|
// so the filament has been probably already unloaded - terminate with OK or report an error?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// unloads filament from extruder - filament is above Bondtech gears
|
// unloads filament from extruder - filament is above Bondtech gears
|
||||||
mm::motion.InitAxis(mm::Pulley);
|
mm::motion.InitAxis(mm::Pulley);
|
||||||
state = ProgressCode::UnloadingToFinda;
|
state = ProgressCode::UnloadingToFinda;
|
||||||
|
|
@ -59,7 +66,7 @@ bool UnloadFilament::StepInner() {
|
||||||
state = ProgressCode::OK;
|
state = ProgressCode::OK;
|
||||||
error = ErrorCode::OK;
|
error = ErrorCode::OK;
|
||||||
mm::motion.Disable(mm::Pulley);
|
mm::motion.Disable(mm::Pulley);
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::AtPulley); // filament unloaded
|
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::green, ml::off);
|
||||||
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off);
|
ml::leds.SetMode(mg::globals.ActiveSlot(), ml::red, ml::off);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ bool UnloadToFinda::Step() {
|
||||||
case UnloadingToFinda:
|
case UnloadingToFinda:
|
||||||
if (mi::idler.Engaged()) {
|
if (mi::idler.Engaged()) {
|
||||||
state = WaitingForFINDA;
|
state = WaitingForFINDA;
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InSelector);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InSelector);
|
||||||
mm::motion.PlanMove<mm::Pulley>(-config::defaultBowdenLength - config::feedToFinda - config::filamentMinLoadedToMMU, config::pulleyFeedrate); // @@TODO constants
|
mm::motion.PlanMove<mm::Pulley>(-config::defaultBowdenLength - config::feedToFinda - config::filamentMinLoadedToMMU, config::pulleyFeedrate); // @@TODO constants
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
/// @file globals.cpp
|
/// @file globals.cpp
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
#include "../config/config.h"
|
||||||
#include "permanent_storage.h"
|
#include "permanent_storage.h"
|
||||||
|
|
||||||
namespace modules {
|
namespace modules {
|
||||||
|
|
@ -9,7 +10,14 @@ Globals globals;
|
||||||
|
|
||||||
void Globals::Init() {
|
void Globals::Init() {
|
||||||
mps::FilamentLoaded::get(activeSlot); //@@TODO check for errors
|
mps::FilamentLoaded::get(activeSlot); //@@TODO check for errors
|
||||||
// @@TODO where to obtain information whether a slot is loaded with a filament?
|
|
||||||
|
if (activeSlot < config::toolCount) {
|
||||||
|
// some valid slot has been recorded in EEPROM - we have some filament loaded in the selector or even in the nozzle
|
||||||
|
filamentLoaded = FilamentLoadState::InNozzle; // let's assume the filament is down to the nozzle as a worst case scenario
|
||||||
|
} else {
|
||||||
|
// the filament is not present in the selector - we can move the selector freely
|
||||||
|
filamentLoaded = FilamentLoadState::AtPulley;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Globals::ActiveSlot() const {
|
uint8_t Globals::ActiveSlot() const {
|
||||||
|
|
@ -18,15 +26,28 @@ uint8_t Globals::ActiveSlot() const {
|
||||||
|
|
||||||
void Globals::SetActiveSlot(uint8_t newActiveSlot) {
|
void Globals::SetActiveSlot(uint8_t newActiveSlot) {
|
||||||
activeSlot = newActiveSlot;
|
activeSlot = newActiveSlot;
|
||||||
mps::FilamentLoaded::set(activeSlot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FilamentLoadState Globals::FilamentLoaded() const {
|
FilamentLoadState Globals::FilamentLoaded() const {
|
||||||
return filamentLoaded;
|
return filamentLoaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Globals::SetFilamentLoaded(FilamentLoadState newFilamentLoaded) {
|
void Globals::SetFilamentLoaded(uint8_t slot, FilamentLoadState newFilamentLoaded) {
|
||||||
filamentLoaded = newFilamentLoaded;
|
filamentLoaded = newFilamentLoaded;
|
||||||
|
SetActiveSlot(slot);
|
||||||
|
switch (newFilamentLoaded) {
|
||||||
|
case FilamentLoadState::NotLoaded:
|
||||||
|
case FilamentLoadState::AtPulley:
|
||||||
|
// Clear the active slot (basically sets the active slot to config::toolCount)
|
||||||
|
mps::FilamentLoaded::set(config::toolCount);
|
||||||
|
break;
|
||||||
|
case FilamentLoadState::InSelector:
|
||||||
|
case FilamentLoadState::InFSensor:
|
||||||
|
case FilamentLoadState::InNozzle:
|
||||||
|
// Record a valid active slot
|
||||||
|
mps::FilamentLoaded::set(slot);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Globals::DriveErrors() const {
|
uint16_t Globals::DriveErrors() const {
|
||||||
|
|
|
||||||
|
|
@ -28,28 +28,22 @@ static_assert(
|
||||||
"incorrect order of Slot Filament Load States");
|
"incorrect order of Slot Filament Load States");
|
||||||
|
|
||||||
/// Globals keep track of global state variables in the firmware.
|
/// Globals keep track of global state variables in the firmware.
|
||||||
/// So far only Active slot and Filament loaded variables are used.
|
|
||||||
class Globals {
|
class Globals {
|
||||||
public:
|
public:
|
||||||
/// Initializes the global storage hive - basically looks into EEPROM to gather information.
|
/// Initializes the global storage hive - basically looks into EEPROM to gather information.
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
/// @returns active filament slot on the MMU unit
|
/// @returns active filament slot on the MMU unit. This value basically means there is some piece of filament blocking the selector from moving freely.
|
||||||
/// Slots are numbered 0-4
|
/// Slots are numbered 0-4
|
||||||
uint8_t ActiveSlot() const;
|
uint8_t ActiveSlot() const;
|
||||||
|
|
||||||
/// Sets the active slot, usually after some command/operation.
|
|
||||||
/// Also updates the EEPROM records accordingly
|
|
||||||
/// @param newActiveSlot the new slot index to set
|
|
||||||
void SetActiveSlot(uint8_t newActiveSlot);
|
|
||||||
|
|
||||||
/// @returns true if filament is considered as loaded
|
/// @returns true if filament is considered as loaded
|
||||||
FilamentLoadState FilamentLoaded() const;
|
FilamentLoadState FilamentLoaded() const;
|
||||||
|
|
||||||
/// Sets the filament loaded flag value, usually after some command/operation.
|
/// Sets the filament loaded flag value, usually after some command/operation.
|
||||||
/// Also updates the EEPROM records accordingly
|
/// Also updates the EEPROM records accordingly
|
||||||
/// @param newFilamentLoaded new state
|
/// @param newFilamentLoaded new state
|
||||||
void SetFilamentLoaded(FilamentLoadState newFilamentLoaded);
|
void SetFilamentLoaded(uint8_t slot, FilamentLoadState newFilamentLoaded);
|
||||||
|
|
||||||
/// @returns the total number of MMU errors so far
|
/// @returns the total number of MMU errors so far
|
||||||
/// Errors are stored in the EEPROM
|
/// Errors are stored in the EEPROM
|
||||||
|
|
@ -68,6 +62,11 @@ public:
|
||||||
bool MotorsStealth() const { return stealthMode; }
|
bool MotorsStealth() const { return stealthMode; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/// Sets the active slot, usually after some command/operation.
|
||||||
|
/// Also updates the EEPROM records accordingly
|
||||||
|
/// @param newActiveSlot the new slot index to set
|
||||||
|
void SetActiveSlot(uint8_t newActiveSlot);
|
||||||
|
|
||||||
uint8_t activeSlot;
|
uint8_t activeSlot;
|
||||||
FilamentLoadState filamentLoaded;
|
FilamentLoadState filamentLoaded;
|
||||||
bool stealthMode;
|
bool stealthMode;
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,7 @@ bool FilamentLoaded::get(uint8_t &filament) {
|
||||||
return false;
|
return false;
|
||||||
const uint8_t rawFilament = ee::EEPROM::ReadByte(EEOFFSET(eepromBase->eepromFilament[index]));
|
const uint8_t rawFilament = ee::EEPROM::ReadByte(EEOFFSET(eepromBase->eepromFilament[index]));
|
||||||
filament = 0x0f & rawFilament;
|
filament = 0x0f & rawFilament;
|
||||||
if (filament > 4)
|
if (filament >= config::toolCount)
|
||||||
return false;
|
return false;
|
||||||
const uint8_t status = getStatus();
|
const uint8_t status = getStatus();
|
||||||
if (!(status == KeyFront1
|
if (!(status == KeyFront1
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ using Catch::Matchers::Equals;
|
||||||
void CutSlot(logic::CutFilament &cf, uint8_t cutSlot) {
|
void CutSlot(logic::CutFilament &cf, uint8_t cutSlot) {
|
||||||
|
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
EnsureActiveSlotIndex(0);
|
EnsureActiveSlotIndex(0, mg::FilamentLoadState::AtPulley);
|
||||||
|
|
||||||
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), 0, false, false, ml::off, ml::off));
|
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), 0, false, false, ml::off, ml::off));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,7 @@ void FailingIdler(hal::tmc2130::ErrorFlags ef, ErrorCode ec) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
// change the startup to what we need here
|
// change the startup to what we need here
|
||||||
EnsureActiveSlotIndex(0);
|
EnsureActiveSlotIndex(0, mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
|
||||||
|
|
||||||
// set FINDA ON + debounce
|
// set FINDA ON + debounce
|
||||||
SetFINDAStateAndDebounce(true);
|
SetFINDAStateAndDebounce(true);
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ void InvalidSlot(SM &logicSM, uint8_t activeSlot, uint8_t invSlot){
|
||||||
|
|
||||||
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), ms::Selector::IdleSlotIndex(), false, false, ml::off, ml::off));
|
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), ms::Selector::IdleSlotIndex(), false, false, ml::off, ml::off));
|
||||||
|
|
||||||
EnsureActiveSlotIndex(activeSlot);
|
EnsureActiveSlotIndex(activeSlot, mg::FilamentLoadState::AtPulley);
|
||||||
|
|
||||||
logicSM.Reset(invSlot);
|
logicSM.Reset(invSlot);
|
||||||
REQUIRE(VerifyState(logicSM, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), activeSlot, false, false, ml::off, ml::off, ErrorCode::INVALID_TOOL, ProgressCode::OK));
|
REQUIRE(VerifyState(logicSM, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), activeSlot, false, false, ml::off, ml::off, ErrorCode::INVALID_TOOL, ProgressCode::OK));
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ void LoadFilamentCommonSetup(uint8_t slot, logic::LoadFilament &lf) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
// change the startup to what we need here
|
// change the startup to what we need here
|
||||||
EnsureActiveSlotIndex(slot);
|
EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley);
|
||||||
|
|
||||||
// verify startup conditions
|
// verify startup conditions
|
||||||
REQUIRE(VerifyState(lf, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK));
|
REQUIRE(VerifyState(lf, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK));
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,7 @@ void ForceReinitAllAutomata() {
|
||||||
mm::ReinitMotion();
|
mm::ReinitMotion();
|
||||||
|
|
||||||
// let's assume we have the filament NOT loaded and active slot 0
|
// let's assume we have the filament NOT loaded and active slot 0
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::AtPulley);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::AtPulley);
|
||||||
mg::globals.SetActiveSlot(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HomeIdlerAndSelector() {
|
void HomeIdlerAndSelector() {
|
||||||
|
|
@ -86,7 +85,7 @@ void HomeIdlerAndSelector() {
|
||||||
main_loop();
|
main_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureActiveSlotIndex(uint8_t slot) {
|
void EnsureActiveSlotIndex(uint8_t slot, mg::FilamentLoadState loadState) {
|
||||||
HomeIdlerAndSelector();
|
HomeIdlerAndSelector();
|
||||||
|
|
||||||
// move selector to the right spot
|
// move selector to the right spot
|
||||||
|
|
@ -94,7 +93,8 @@ void EnsureActiveSlotIndex(uint8_t slot) {
|
||||||
while (ms::selector.Slot() != slot)
|
while (ms::selector.Slot() != slot)
|
||||||
main_loop();
|
main_loop();
|
||||||
|
|
||||||
mg::globals.SetActiveSlot(slot);
|
// mg::globals.SetActiveSlot(slot);
|
||||||
|
mg::globals.SetFilamentLoaded(slot, loadState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetFINDAStateAndDebounce(bool press) {
|
void SetFINDAStateAndDebounce(bool press) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../../../../src/logic/command_base.h"
|
#include "../../../../src/logic/command_base.h"
|
||||||
|
#include "../../../../src/modules/globals.h"
|
||||||
|
|
||||||
extern void main_loop();
|
extern void main_loop();
|
||||||
extern void ForceReinitAllAutomata();
|
extern void ForceReinitAllAutomata();
|
||||||
|
|
@ -21,7 +22,7 @@ bool WhileTopState(SM &sm, ProgressCode state, uint32_t maxLoops = 5000) {
|
||||||
sm, [&](int) { return sm.TopLevelState() == state; }, maxLoops);
|
sm, [&](int) { return sm.TopLevelState() == state; }, maxLoops);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void EnsureActiveSlotIndex(uint8_t slot);
|
extern void EnsureActiveSlotIndex(uint8_t slot, modules::globals::FilamentLoadState loadState);
|
||||||
|
|
||||||
extern void SetFINDAStateAndDebounce(bool press);
|
extern void SetFINDAStateAndDebounce(bool press);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ void FeedingToBondtech(logic::ToolChange &tc, uint8_t toSlot) {
|
||||||
void ToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) {
|
void ToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
EnsureActiveSlotIndex(fromSlot);
|
EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
// restart the automaton
|
// restart the automaton
|
||||||
tc.Reset(toSlot);
|
tc.Reset(toSlot);
|
||||||
|
|
@ -63,7 +63,9 @@ void ToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) {
|
||||||
}
|
}
|
||||||
return tc.TopLevelState() == ProgressCode::UnloadingFilament; },
|
return tc.TopLevelState() == ProgressCode::UnloadingFilament; },
|
||||||
200000UL));
|
200000UL));
|
||||||
REQUIRE(mg::globals.FilamentLoaded() == mg::FilamentLoadState::AtPulley);
|
CHECKED_ELSE(mg::globals.FilamentLoaded() == mg::FilamentLoadState::AtPulley) {
|
||||||
|
++toSlot;
|
||||||
|
}
|
||||||
|
|
||||||
FeedingToFinda(tc, toSlot);
|
FeedingToFinda(tc, toSlot);
|
||||||
|
|
||||||
|
|
@ -78,9 +80,7 @@ void NoToolChange(logic::ToolChange tc, uint8_t fromSlot, uint8_t toSlot) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
// the filament is LOADED
|
// the filament is LOADED
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
EnsureActiveSlotIndex(fromSlot, mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
EnsureActiveSlotIndex(fromSlot);
|
|
||||||
|
|
||||||
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::InNozzle, mi::Idler::IdleSlotIndex(), toSlot, false, false, ml::off, ml::off));
|
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::InNozzle, mi::Idler::IdleSlotIndex(), toSlot, false, false, ml::off, ml::off));
|
||||||
|
|
||||||
|
|
@ -95,7 +95,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) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
EnsureActiveSlotIndex(slot);
|
EnsureActiveSlotIndex(slot, mg::FilamentLoadState::AtPulley);
|
||||||
|
|
||||||
// verify filament NOT loaded
|
// verify filament NOT loaded
|
||||||
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::off));
|
REQUIRE(VerifyEnvironmentState(mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), slot, false, false, ml::off, ml::off));
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,7 @@ void RegularUnloadFromSlot04Init(uint8_t slot, logic::UnloadFilament &uf) {
|
||||||
ForceReinitAllAutomata();
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
// change the startup to what we need here
|
// change the startup to what we need here
|
||||||
EnsureActiveSlotIndex(slot);
|
EnsureActiveSlotIndex(slot, mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
|
||||||
|
|
||||||
// set FINDA ON + debounce
|
// set FINDA ON + debounce
|
||||||
SetFINDAStateAndDebounce(true);
|
SetFINDAStateAndDebounce(true);
|
||||||
|
|
@ -102,12 +100,12 @@ void FindaDidntTriggerCommonSetup(uint8_t slot, logic::UnloadFilament &uf) {
|
||||||
|
|
||||||
// change the startup to what we need here
|
// change the startup to what we need here
|
||||||
// move selector to the right spot
|
// move selector to the right spot
|
||||||
EnsureActiveSlotIndex(slot);
|
EnsureActiveSlotIndex(slot, mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
// set FINDA ON + debounce
|
// set FINDA ON + debounce
|
||||||
SetFINDAStateAndDebounce(true);
|
SetFINDAStateAndDebounce(true);
|
||||||
|
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
// mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
// verify startup conditions
|
// verify startup conditions
|
||||||
REQUIRE(VerifyState(uf, mg::FilamentLoadState::InNozzle, mi::Idler::IdleSlotIndex(), slot, true, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK));
|
REQUIRE(VerifyState(uf, mg::FilamentLoadState::InNozzle, mi::Idler::IdleSlotIndex(), slot, true, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK));
|
||||||
|
|
@ -265,3 +263,23 @@ TEST_CASE("unload_filament::finda_didnt_trigger_resolve_try_again", "[unload_fil
|
||||||
RegularUnloadFromSlot04(slot, uf);
|
RegularUnloadFromSlot04(slot, uf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("unload_filament::not_loaded", "[unload_filament]") {
|
||||||
|
logic::UnloadFilament uf;
|
||||||
|
|
||||||
|
// prepare startup conditions
|
||||||
|
ForceReinitAllAutomata();
|
||||||
|
|
||||||
|
// change the startup to what we need here
|
||||||
|
// move selector to the right spot
|
||||||
|
EnsureActiveSlotIndex(0, mg::FilamentLoadState::AtPulley);
|
||||||
|
|
||||||
|
// verify startup conditions
|
||||||
|
REQUIRE(VerifyState(uf, mg::FilamentLoadState::AtPulley, mi::Idler::IdleSlotIndex(), 0, false, false, ml::off, ml::off, ErrorCode::OK, ProgressCode::OK));
|
||||||
|
|
||||||
|
// restart the automaton
|
||||||
|
uf.Reset(0);
|
||||||
|
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ TEST_CASE("unload_to_finda::regular_unload", "[unload_to_finda]") {
|
||||||
// we need finda ON
|
// we need finda ON
|
||||||
SetFINDAStateAndDebounce(true);
|
SetFINDAStateAndDebounce(true);
|
||||||
// and MMU "thinks" it has the filament loaded
|
// and MMU "thinks" it has the filament loaded
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
logic::UnloadToFinda ff;
|
logic::UnloadToFinda ff;
|
||||||
|
|
||||||
|
|
@ -82,7 +82,7 @@ TEST_CASE("unload_to_finda::unload_without_FINDA_trigger", "[unload_to_finda]")
|
||||||
// we need finda ON
|
// we need finda ON
|
||||||
SetFINDAStateAndDebounce(true);
|
SetFINDAStateAndDebounce(true);
|
||||||
// and MMU "thinks" it has the filament loaded
|
// and MMU "thinks" it has the filament loaded
|
||||||
mg::globals.SetFilamentLoaded(mg::FilamentLoadState::InNozzle);
|
mg::globals.SetFilamentLoaded(mg::globals.ActiveSlot(), mg::FilamentLoadState::InNozzle);
|
||||||
|
|
||||||
logic::UnloadToFinda ff;
|
logic::UnloadToFinda ff;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue