#include "idler.h" #include "buttons.h" #include "leds.h" #include "motion.h" #include "permanent_storage.h" namespace modules { namespace idler { Idler idler; void Idler::PrepareMoveToPlannedSlot() { mm::motion.PlanMoveTo(SlotPosition(plannedSlot), mm::unitToAxisUnit(config::idlerFeedrate)); } Idler::OperationResult Idler::Disengage() { if (state == Moving) return OperationResult::Refused; plannedSlot = IdleSlotIndex(); plannedEngage = false; if (!Engaged()) return OperationResult::Accepted; return InitMovement(mm::Idler); } Idler::OperationResult Idler::Engage(uint8_t slot) { if (state == Moving) return OperationResult::Refused; plannedSlot = slot; plannedEngage = true; if (Engaged()) return OperationResult::Accepted; return InitMovement(mm::Idler); } bool Idler::Home() { if (state == Moving) return false; plannedEngage = false; mm::motion.InitAxis(mm::Idler); mm::motion.Home(mm::Idler, false); return true; } bool Idler::Step() { switch (state) { case Moving: PerformMove(mm::Idler); return false; case Ready: currentlyEngaged = plannedEngage; currentSlot = plannedSlot; if (!Engaged()) // turn off power into the Idler motor when disengaged (no force necessary) mm::motion.Disable(mm::Idler); return true; case Failed: default: return true; } } } // namespace idler } // namespace modules