Prusa-Firmware-MMU/src/logic/feed_to_bondtech.h

59 lines
1.8 KiB
C++

/// @file feed_to_bondtech.h
#pragma once
#include <stdint.h>
#include "../modules/axisunit.h"
namespace logic {
/// @brief Feed filament to Bondtech gears of the printer
///
/// Continuously feed filament until the printer detects the filament in its filament sensor.
/// Then it feeds a bit more very gently to push the filament into the nozzle
/// Disengages the Idler after finishing the feed.
/// Disables the Pulley axis after disengaging the idler.
///
/// If filament has been successfully fed into the fsensor,
/// records/updates PTFE length.
/// To prevent constant EEPROM updates only significant changes are recorded.
struct FeedToBondtech {
/// internal states of the state machine
enum {
EngagingIdler,
PushingFilamentFast,
PushingFilamentToFSensor,
PushingFilamentIntoNozzle,
PartiallyDisengagingIdler,
DisengagingIdler,
OK,
Failed,
FSensorTooEarly,
// PulleyStalled
};
inline constexpr FeedToBondtech()
: state(OK)
, maxRetries(1) {}
/// Restart the automaton
void Reset(uint8_t maxRetries);
/// @returns true if the state machine finished its job, false otherwise
bool Step();
/// This method may be used to check the result of the automaton
/// @returns OK if everything went OK and printer's filament sensor triggered
/// @returns Failed if the maximum feed length has been reached without the the printer's fsensor trigger being reported
inline uint8_t State() const { return state; }
/// Transition to PushingFilamentIntoNozzle.
/// Allows jumping into the state machine from outside just to push filament slowly into the nozzle
/// (this principle uses tool change)
void GoToPushToNozzle();
private:
uint8_t state;
uint8_t maxRetries;
};
} // namespace logic