Scott Lahteine
7 years ago
12 changed files with 362 additions and 242 deletions
@ -0,0 +1,185 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
* fwretract.cpp - Implement firmware-based retraction |
|||
*/ |
|||
|
|||
#include "../inc/MarlinConfig.h" |
|||
|
|||
#if ENABLED(FWRETRACT) |
|||
|
|||
#include "fwretract.h" |
|||
|
|||
FWRetract fwretract; // Single instance
|
|||
|
|||
#include "../module/motion.h" |
|||
|
|||
bool FWRetract::autoretract_enabled, // M209 S - Autoretract switch
|
|||
FWRetract::retracted[EXTRUDERS] = { false }; // Which extruders are currently retracted
|
|||
float FWRetract::retract_length, // M207 S - G10 Retract length
|
|||
FWRetract::retract_feedrate_mm_s, // M207 F - G10 Retract feedrate
|
|||
FWRetract::retract_zlift, // M207 Z - G10 Retract hop size
|
|||
FWRetract::retract_recover_length, // M208 S - G11 Recover length
|
|||
FWRetract::retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate
|
|||
FWRetract::swap_retract_length, // M207 W - G10 Swap Retract length
|
|||
FWRetract::swap_retract_recover_length, // M208 W - G11 Swap Recover length
|
|||
FWRetract::swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate
|
|||
#if EXTRUDERS > 1 |
|||
bool FWRetract::retracted_swap[EXTRUDERS] = { false }; // Which extruders are swap-retracted
|
|||
#endif |
|||
|
|||
void FWRetract::reset() { |
|||
autoretract_enabled = false; |
|||
retract_length = RETRACT_LENGTH; |
|||
retract_feedrate_mm_s = RETRACT_FEEDRATE; |
|||
retract_zlift = RETRACT_ZLIFT; |
|||
retract_recover_length = RETRACT_RECOVER_LENGTH; |
|||
retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE; |
|||
swap_retract_length = RETRACT_LENGTH_SWAP; |
|||
swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP; |
|||
swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; |
|||
} |
|||
|
|||
/**
|
|||
* Retract or recover according to firmware settings |
|||
* |
|||
* This function handles retract/recover moves for G10 and G11, |
|||
* plus auto-retract moves sent from G0/G1 when E-only moves are done. |
|||
* |
|||
* To simplify the logic, doubled retract/recover moves are ignored. |
|||
* |
|||
* Note: Z lift is done transparently to the planner. Aborting |
|||
* a print between G10 and G11 may corrupt the Z position. |
|||
* |
|||
* Note: Auto-retract will apply the set Z hop in addition to any Z hop |
|||
* included in the G-code. Use M207 Z0 to to prevent double hop. |
|||
*/ |
|||
void FWRetract::retract(const bool retracting |
|||
#if EXTRUDERS > 1 |
|||
, bool swapping /* =false */ |
|||
#endif |
|||
) { |
|||
|
|||
static float hop_height, // Remember where the Z height started
|
|||
hop_amount = 0.0; // Total amount lifted, for use in recover
|
|||
|
|||
// Simply never allow two retracts or recovers in a row
|
|||
if (retracted[active_extruder] == retracting) return; |
|||
|
|||
#if EXTRUDERS < 2 |
|||
bool swapping = false; |
|||
#endif |
|||
if (!retracting) swapping = retracted_swap[active_extruder]; |
|||
|
|||
/* // debugging
|
|||
SERIAL_ECHOLNPAIR("retracting ", retracting); |
|||
SERIAL_ECHOLNPAIR("swapping ", swapping); |
|||
SERIAL_ECHOLNPAIR("active extruder ", active_extruder); |
|||
for (uint8_t i = 0; i < EXTRUDERS; ++i) { |
|||
SERIAL_ECHOPAIR("retracted[", i); |
|||
SERIAL_ECHOLNPAIR("] ", retracted[i]); |
|||
SERIAL_ECHOPAIR("retracted_swap[", i); |
|||
SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); |
|||
} |
|||
SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); |
|||
SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); |
|||
//*/
|
|||
|
|||
const bool has_zhop = retract_zlift > 0.01; // Is there a hop set?
|
|||
|
|||
const float old_feedrate_mm_s = feedrate_mm_s; |
|||
const int16_t old_flow = flow_percentage[active_extruder]; |
|||
|
|||
// Don't apply flow multiplication to retract/recover
|
|||
flow_percentage[active_extruder] = 100; |
|||
|
|||
// The current position will be the destination for E and Z moves
|
|||
set_destination_to_current(); |
|||
|
|||
if (retracting) { |
|||
// Remember the Z height since G-code may include its own Z-hop
|
|||
// For best results turn off Z hop if G-code already includes it
|
|||
hop_height = destination[Z_AXIS]; |
|||
|
|||
// Retract by moving from a faux E position back to the current E position
|
|||
feedrate_mm_s = retract_feedrate_mm_s; |
|||
current_position[E_AXIS] += (swapping ? swap_retract_length : retract_length) / volumetric_multiplier[active_extruder]; |
|||
sync_plan_position_e(); |
|||
prepare_move_to_destination(); |
|||
|
|||
// Is a Z hop set, and has the hop not yet been done?
|
|||
if (has_zhop) { |
|||
hop_amount += retract_zlift; // Carriage is raised for retraction hop
|
|||
current_position[Z_AXIS] -= retract_zlift; // Pretend current pos is lower. Next move raises Z.
|
|||
SYNC_PLAN_POSITION_KINEMATIC(); // Set the planner to the new position
|
|||
prepare_move_to_destination(); // Raise up to the old current pos
|
|||
} |
|||
} |
|||
else { |
|||
// If a hop was done and Z hasn't changed, undo the Z hop
|
|||
if (hop_amount && NEAR(hop_height, destination[Z_AXIS])) { |
|||
current_position[Z_AXIS] += hop_amount; // Pretend current pos is higher. Next move lowers Z.
|
|||
SYNC_PLAN_POSITION_KINEMATIC(); // Set the planner to the new position
|
|||
prepare_move_to_destination(); // Lower to the old current pos
|
|||
hop_amount = 0.0; |
|||
} |
|||
|
|||
// A retract multiplier has been added here to get faster swap recovery
|
|||
feedrate_mm_s = swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s; |
|||
|
|||
const float move_e = swapping ? swap_retract_length + swap_retract_recover_length : retract_length + retract_recover_length; |
|||
current_position[E_AXIS] -= move_e / volumetric_multiplier[active_extruder]; |
|||
sync_plan_position_e(); |
|||
|
|||
prepare_move_to_destination(); // Recover E
|
|||
} |
|||
|
|||
// Restore flow and feedrate
|
|||
flow_percentage[active_extruder] = old_flow; |
|||
feedrate_mm_s = old_feedrate_mm_s; |
|||
|
|||
// The active extruder is now retracted or recovered
|
|||
retracted[active_extruder] = retracting; |
|||
|
|||
// If swap retract/recover then update the retracted_swap flag too
|
|||
#if EXTRUDERS > 1 |
|||
if (swapping) retracted_swap[active_extruder] = retracting; |
|||
#endif |
|||
|
|||
/* // debugging
|
|||
SERIAL_ECHOLNPAIR("retracting ", retracting); |
|||
SERIAL_ECHOLNPAIR("swapping ", swapping); |
|||
SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); |
|||
for (uint8_t i = 0; i < EXTRUDERS; ++i) { |
|||
SERIAL_ECHOPAIR("retracted[", i); |
|||
SERIAL_ECHOLNPAIR("] ", retracted[i]); |
|||
SERIAL_ECHOPAIR("retracted_swap[", i); |
|||
SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); |
|||
} |
|||
SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); |
|||
SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); |
|||
//*/
|
|||
|
|||
} // retract()
|
|||
|
|||
#endif // FWRETRACT
|
@ -0,0 +1,65 @@ |
|||
/**
|
|||
* Marlin 3D Printer Firmware |
|||
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|||
* |
|||
* Based on Sprinter and grbl. |
|||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
*/ |
|||
|
|||
/**
|
|||
* fwretract.h - Define firmware-based retraction interface |
|||
*/ |
|||
|
|||
#ifndef FWRETRACT_H |
|||
#define FWRETRACT_H |
|||
|
|||
#include "../inc/MarlinConfig.h" |
|||
|
|||
class FWRetract { |
|||
public: |
|||
static bool autoretract_enabled, // M209 S - Autoretract switch
|
|||
retracted[EXTRUDERS]; // Which extruders are currently retracted
|
|||
static float retract_length, // M207 S - G10 Retract length
|
|||
retract_feedrate_mm_s, // M207 F - G10 Retract feedrate
|
|||
retract_zlift, // M207 Z - G10 Retract hop size
|
|||
retract_recover_length, // M208 S - G11 Recover length
|
|||
retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate
|
|||
swap_retract_length, // M207 W - G10 Swap Retract length
|
|||
swap_retract_recover_length, // M208 W - G11 Swap Recover length
|
|||
swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate
|
|||
|
|||
#if EXTRUDERS > 1 |
|||
static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted
|
|||
#else |
|||
static bool constexpr retracted_swap[1] = { false }; |
|||
#endif |
|||
|
|||
FWRetract() {} |
|||
|
|||
static void reset(); |
|||
|
|||
static void retract(const bool retracting |
|||
#if EXTRUDERS > 1 |
|||
, bool swapping = false |
|||
#endif |
|||
); |
|||
|
|||
}; |
|||
|
|||
extern FWRetract fwretract; |
|||
|
|||
#endif // FWRETRACT_H
|
Loading…
Reference in new issue