Prusa-MMU-Private
PrusaMultiMaterialUpgradev3firmwareforMK3SMK4
idler.h
Go to the documentation of this file.
1 #pragma once
3 #include "../config/config.h"
4 #include "axisunit.h"
5 #include "movable_base.h"
6 
7 namespace modules {
8 
10 namespace idler {
11 
12 namespace mm = modules::motion;
13 
15 class Idler : public motion::MovableBase {
16 public:
17  inline constexpr Idler()
18  : MovableBase(mm::Idler)
19  , plannedMove(Operation::disengage)
20  , currentlyEngaged(Operation::disengage) {}
21 
26  OperationResult Engage(uint8_t slot);
27 
32 
35  OperationResult PartiallyDisengage(uint8_t slot);
36 
39  bool Step();
40 
44  inline bool Engaged() const { return currentlyEngaged == Operation::engage; }
45  inline bool Disengaged() const { return currentlyEngaged == Operation::disengage; }
46  inline bool PartiallyDisengaged() const { return currentlyEngaged == Operation::intermediate; }
47 
49  static constexpr mm::I_pos_t SlotPosition(uint8_t slot) {
50  return mm::unitToAxisUnit<mm::I_pos_t>(config::idlerSlotPositions[slot]);
51  }
52 
54  static constexpr mm::I_pos_t IntermediateSlotPosition(uint8_t slot) {
55  return mm::unitToAxisUnit<mm::I_pos_t>(config::idlerIntermediateSlotPositions[slot]);
56  }
57 
59  inline static constexpr uint8_t IdleSlotIndex() { return config::toolCount; }
60 
65  void Init();
66 
67 protected:
68  virtual void PrepareMoveToPlannedSlot() override;
69  virtual void PlanHomingMoveForward() override;
70  virtual void PlanHomingMoveBack() override;
71  virtual bool FinishHomingAndPlanMoveToParkPos() override;
72  virtual void FinishMove() override;
73  virtual bool StallGuardAllowed(bool forward) const override;
74 
75 private:
76  enum class Operation : uint8_t {
77  disengage = 0,
78  engage = 1,
79  intermediate = 2
80  };
81 
82  OperationResult PlanMoveInner(uint8_t slot, Operation plannedOp);
83 
85  Operation plannedMove;
86 
88  Operation currentlyEngaged;
89 };
90 
92 extern Idler idler;
93 
94 } // namespace idler
95 } // namespace modules
96 
97 namespace mi = modules::idler;
The Idler model handles asynchronnous Engaging / Disengaging operations and keeps track of idler's cu...
Definition: idler.h:15
OperationResult PartiallyDisengage(uint8_t slot)
Definition: idler.cpp:95
virtual bool FinishHomingAndPlanMoveToParkPos() override
Definition: idler.cpp:39
static constexpr mm::I_pos_t IntermediateSlotPosition(uint8_t slot)
Definition: idler.h:54
void Init()
Definition: idler.cpp:168
bool Engaged() const
Definition: idler.h:44
OperationResult Disengage()
Definition: idler.cpp:71
virtual bool StallGuardAllowed(bool forward) const override
Definition: idler.cpp:66
static constexpr mm::I_pos_t SlotPosition(uint8_t slot)
Definition: idler.h:49
static constexpr uint8_t IdleSlotIndex()
Definition: idler.h:59
OperationResult Engage(uint8_t slot)
Definition: idler.cpp:99
bool Step()
Definition: idler.cpp:134
Base class for movable modules - modules::idler::Idler and modules::selector::Selector contains the c...
Definition: movable_base.h:11
OperationResult
Operation (Engage/Disengage/MoveToSlot) return values.
Definition: movable_base.h:26
static constexpr U_deg idlerSlotPositions[toolCount+1]
Idler offset from home to slots.
Definition: config.h:208
static constexpr U_deg idlerIntermediateSlotPositions[toolCount+1]
Intermediate positions for Idler's slots: 0-4 are the real ones, the 5th index is the idle position.
Definition: config.h:218
static constexpr AxisConfig idler
End: Selector configuration.
Definition: config.h:186
static constexpr const uint8_t toolCount
Definition: config.h:24
The idler namespace provides all necessary facilities related to the logical model of the idler devic...
Definition: idler.cpp:11
Idler idler
The one and only instance of Idler in the FW.
Definition: idler.cpp:13
Definition: command_base.h:9
The modules namespace contains models of MMU's components.
Definition: command_base.h:8
Definition: axisunit.h:68