@ -1657,7 +1657,7 @@ static void homeaxis(AxisEnum axis) {
# ifdef FWRETRACT
# ifdef FWRETRACT
void retract ( bool retracting , bool swap retract = false ) {
void retract ( bool retracting , bool swap ping= false ) {
if ( retracting = = retracted [ active_extruder ] ) return ;
if ( retracting = = retracted [ active_extruder ] ) return ;
@ -1668,7 +1668,7 @@ static void homeaxis(AxisEnum axis) {
if ( retracting ) {
if ( retracting ) {
feedrate = retract_feedrate * 60 ;
feedrate = retract_feedrate * 60 ;
current_position [ E_AXIS ] + = ( swap retract ? retract_length_swap : retract_length ) / volumetric_multiplier [ active_extruder ] ;
current_position [ E_AXIS ] + = ( swap ping ? retract_length_swap : retract_length ) / volumetric_multiplier [ active_extruder ] ;
plan_set_e_position ( current_position [ E_AXIS ] ) ;
plan_set_e_position ( current_position [ E_AXIS ] ) ;
prepare_move ( ) ;
prepare_move ( ) ;
@ -1695,7 +1695,7 @@ static void homeaxis(AxisEnum axis) {
}
}
feedrate = retract_recover_feedrate * 60 ;
feedrate = retract_recover_feedrate * 60 ;
float move_e = swap retract ? retract_length_swap + retract_recover_length_swap : retract_length + retract_recover_length ;
float move_e = swap ping ? retract_length_swap + retract_recover_length_swap : retract_length + retract_recover_length ;
current_position [ E_AXIS ] - = move_e / volumetric_multiplier [ active_extruder ] ;
current_position [ E_AXIS ] - = move_e / volumetric_multiplier [ active_extruder ] ;
plan_set_e_position ( current_position [ E_AXIS ] ) ;
plan_set_e_position ( current_position [ E_AXIS ] ) ;
prepare_move ( ) ;
prepare_move ( ) ;
@ -1770,7 +1770,7 @@ inline void gcode_G0_G1() {
# endif //FWRETRACT
# endif //FWRETRACT
prepare_move ( ) ;
prepare_move ( ) ;
// ClearToS end();
// ok_to_s end();
}
}
}
}
@ -4292,7 +4292,7 @@ inline void gcode_M303() {
destination [ X_AXIS ] = delta [ X_AXIS ] / axis_scaling [ X_AXIS ] ;
destination [ X_AXIS ] = delta [ X_AXIS ] / axis_scaling [ X_AXIS ] ;
destination [ Y_AXIS ] = delta [ Y_AXIS ] / axis_scaling [ Y_AXIS ] ;
destination [ Y_AXIS ] = delta [ Y_AXIS ] / axis_scaling [ Y_AXIS ] ;
prepare_move ( ) ;
prepare_move ( ) ;
// ClearToS end();
// ok_to_s end();
return true ;
return true ;
}
}
return false ;
return false ;
@ -5515,7 +5515,7 @@ void process_commands() {
SERIAL_ECHOLNPGM ( " \" " ) ;
SERIAL_ECHOLNPGM ( " \" " ) ;
}
}
ClearToS end( ) ;
ok_to_s end( ) ;
}
}
void FlushSerialRequestResend ( ) {
void FlushSerialRequestResend ( ) {
@ -5523,10 +5523,10 @@ void FlushSerialRequestResend() {
MYSERIAL . flush ( ) ;
MYSERIAL . flush ( ) ;
SERIAL_PROTOCOLPGM ( MSG_RESEND ) ;
SERIAL_PROTOCOLPGM ( MSG_RESEND ) ;
SERIAL_PROTOCOLLN ( gcode_LastN + 1 ) ;
SERIAL_PROTOCOLLN ( gcode_LastN + 1 ) ;
ClearToS end( ) ;
ok_to_s end( ) ;
}
}
void ClearToS end( ) {
void ok_to_s end( ) {
refresh_cmd_timeout ( ) ;
refresh_cmd_timeout ( ) ;
# ifdef SDSUPPORT
# ifdef SDSUPPORT
if ( fromsd [ cmd_queue_index_r ] ) return ;
if ( fromsd [ cmd_queue_index_r ] ) return ;
@ -5755,54 +5755,15 @@ void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_
# endif // PREVENT_DANGEROUS_EXTRUDE
# endif // PREVENT_DANGEROUS_EXTRUDE
void prepare_move ( ) {
# if defined(DELTA) || defined(SCARA)
clamp_to_software_endstops ( destination ) ;
refresh_cmd_timeout ( ) ;
# ifdef PREVENT_DANGEROUS_EXTRUDE
( void ) prevent_dangerous_extrude ( current_position [ E_AXIS ] , destination [ E_AXIS ] ) ;
# endif
# ifdef SCARA //for now same as delta-code
float difference [ NUM_AXIS ] ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + ) difference [ i ] = destination [ i ] - current_position [ i ] ;
float cartesian_mm = sqrt ( sq ( difference [ X_AXIS ] ) + sq ( difference [ Y_AXIS ] ) + sq ( difference [ Z_AXIS ] ) ) ;
if ( cartesian_mm < 0.000001 ) { cartesian_mm = abs ( difference [ E_AXIS ] ) ; }
if ( cartesian_mm < 0.000001 ) { return ; }
float seconds = 6000 * cartesian_mm / feedrate / feedrate_multiplier ;
int steps = max ( 1 , int ( scara_segments_per_second * seconds ) ) ;
//SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
//SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
//SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
for ( int s = 1 ; s < = steps ; s + + ) {
float fraction = float ( s ) / float ( steps ) ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + ) destination [ i ] = current_position [ i ] + difference [ i ] * fraction ;
calculate_delta ( destination ) ;
//SERIAL_ECHOPGM("destination[X_AXIS]="); SERIAL_ECHOLN(destination[X_AXIS]);
//SERIAL_ECHOPGM("destination[Y_AXIS]="); SERIAL_ECHOLN(destination[Y_AXIS]);
//SERIAL_ECHOPGM("destination[Z_AXIS]="); SERIAL_ECHOLN(destination[Z_AXIS]);
//SERIAL_ECHOPGM("delta[X_AXIS]="); SERIAL_ECHOLN(delta[X_AXIS]);
//SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
//SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
plan_buffer_line ( delta [ X_AXIS ] , delta [ Y_AXIS ] , delta [ Z_AXIS ] , destination [ E_AXIS ] , feedrate / 60 * feedrate_multiplier / 100.0 , active_extruder ) ;
}
# endif // SCARA
# ifdef DELTA
inline bool prepare_move_delta ( ) {
float difference [ NUM_AXIS ] ;
float difference [ NUM_AXIS ] ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + ) difference [ i ] = destination [ i ] - current_position [ i ] ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + ) difference [ i ] = destination [ i ] - current_position [ i ] ;
float cartesian_mm = sqrt ( sq ( difference [ X_AXIS ] ) + sq ( difference [ Y_AXIS ] ) + sq ( difference [ Z_AXIS ] ) ) ;
float cartesian_mm = sqrt ( sq ( difference [ X_AXIS ] ) + sq ( difference [ Y_AXIS ] ) + sq ( difference [ Z_AXIS ] ) ) ;
if ( cartesian_mm < 0.000001 ) cartesian_mm = abs ( difference [ E_AXIS ] ) ;
if ( cartesian_mm < 0.000001 ) cartesian_mm = abs ( difference [ E_AXIS ] ) ;
if ( cartesian_mm < 0.000001 ) return ;
if ( cartesian_mm < 0.000001 ) return false ;
float seconds = 6000 * cartesian_mm / feedrate / feedrate_multiplier ;
float seconds = 6000 * cartesian_mm / feedrate / feedrate_multiplier ;
int steps = max ( 1 , int ( delta_segments_per_second * seconds ) ) ;
int steps = max ( 1 , int ( delta_segments_per_second * seconds ) ) ;
@ -5811,18 +5772,39 @@ void prepare_move() {
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
for ( int s = 1 ; s < = steps ; s + + ) {
for ( int s = 1 ; s < = steps ; s + + ) {
float fraction = float ( s ) / float ( steps ) ;
float fraction = float ( s ) / float ( steps ) ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + ) destination [ i ] = current_position [ i ] + difference [ i ] * fraction ;
for ( int8_t i = 0 ; i < NUM_AXIS ; i + + )
destination [ i ] = current_position [ i ] + difference [ i ] * fraction ;
calculate_delta ( destination ) ;
calculate_delta ( destination ) ;
# ifdef ENABLE_AUTO_BED_LEVELING
# ifdef ENABLE_AUTO_BED_LEVELING
adjust_delta ( destination ) ;
adjust_delta ( destination ) ;
# endif
# endif
//SERIAL_ECHOPGM("destination[X_AXIS]="); SERIAL_ECHOLN(destination[X_AXIS]);
//SERIAL_ECHOPGM("destination[Y_AXIS]="); SERIAL_ECHOLN(destination[Y_AXIS]);
//SERIAL_ECHOPGM("destination[Z_AXIS]="); SERIAL_ECHOLN(destination[Z_AXIS]);
//SERIAL_ECHOPGM("delta[X_AXIS]="); SERIAL_ECHOLN(delta[X_AXIS]);
//SERIAL_ECHOPGM("delta[Y_AXIS]="); SERIAL_ECHOLN(delta[Y_AXIS]);
//SERIAL_ECHOPGM("delta[Z_AXIS]="); SERIAL_ECHOLN(delta[Z_AXIS]);
plan_buffer_line ( delta [ X_AXIS ] , delta [ Y_AXIS ] , delta [ Z_AXIS ] , destination [ E_AXIS ] , feedrate / 60 * feedrate_multiplier / 100.0 , active_extruder ) ;
plan_buffer_line ( delta [ X_AXIS ] , delta [ Y_AXIS ] , delta [ Z_AXIS ] , destination [ E_AXIS ] , feedrate / 60 * feedrate_multiplier / 100.0 , active_extruder ) ;
}
}
return true ;
}
# endif // DELTA
# endif // DELT A || SCAR A
# ifdef DUAL_X_CARRIAGE
# ifdef SCARA
inline bool prepare_move_scara ( ) { return prepare_move_delta ( ) ; }
# endif
# ifdef DUAL_X_CARRIAGE
inline bool prepare_move_dual_x_carriage ( ) {
if ( active_extruder_parked ) {
if ( active_extruder_parked ) {
if ( dual_x_carriage_mode = = DXC_DUPLICATION_MODE & & active_extruder = = 0 ) {
if ( dual_x_carriage_mode = = DXC_DUPLICATION_MODE & & active_extruder = = 0 ) {
// move duplicate extruder into correct duplication position.
// move duplicate extruder into correct duplication position.
@ -5843,7 +5825,7 @@ void prepare_move() {
set_current_to_destination ( ) ;
set_current_to_destination ( ) ;
NOLESS ( raised_parked_position [ Z_AXIS ] , destination [ Z_AXIS ] ) ;
NOLESS ( raised_parked_position [ Z_AXIS ] , destination [ Z_AXIS ] ) ;
delayed_move_time = millis ( ) ;
delayed_move_time = millis ( ) ;
return ;
return false ;
}
}
}
}
delayed_move_time = 0 ;
delayed_move_time = 0 ;
@ -5854,9 +5836,14 @@ void prepare_move() {
active_extruder_parked = false ;
active_extruder_parked = false ;
}
}
}
}
# endif // DUAL_X_CARRIAGE
return true ;
}
# if !defined(DELTA) && !defined(SCARA)
# endif // DUAL_X_CARRIAGE
# if !defined(DELTA) && !defined(SCARA)
inline bool prepare_move_cartesian ( ) {
// Do not use feedrate_multiplier for E or Z only moves
// Do not use feedrate_multiplier for E or Z only moves
if ( current_position [ X_AXIS ] = = destination [ X_AXIS ] & & current_position [ Y_AXIS ] = = destination [ Y_AXIS ] ) {
if ( current_position [ X_AXIS ] = = destination [ X_AXIS ] & & current_position [ Y_AXIS ] = = destination [ Y_AXIS ] ) {
line_to_destination ( ) ;
line_to_destination ( ) ;
@ -5864,12 +5851,40 @@ void prepare_move() {
else {
else {
# ifdef MESH_BED_LEVELING
# ifdef MESH_BED_LEVELING
mesh_plan_buffer_line ( destination [ X_AXIS ] , destination [ Y_AXIS ] , destination [ Z_AXIS ] , destination [ E_AXIS ] , ( feedrate / 60 ) * ( feedrate_multiplier / 100.0 ) , active_extruder ) ;
mesh_plan_buffer_line ( destination [ X_AXIS ] , destination [ Y_AXIS ] , destination [ Z_AXIS ] , destination [ E_AXIS ] , ( feedrate / 60 ) * ( feedrate_multiplier / 100.0 ) , active_extruder ) ;
return ;
return false ;
# else
# else
line_to_destination ( feedrate * feedrate_multiplier / 100.0 ) ;
line_to_destination ( feedrate * feedrate_multiplier / 100.0 ) ;
# endif // MESH_BED_LEVELING
# endif
}
}
# endif // !(DELTA || SCARA)
return true ;
}
# endif // !DELTA && !SCARA
/**
* Prepare a single move and get ready for the next one
*/
void prepare_move ( ) {
clamp_to_software_endstops ( destination ) ;
refresh_cmd_timeout ( ) ;
# ifdef PREVENT_DANGEROUS_EXTRUDE
prevent_dangerous_extrude ( current_position [ E_AXIS ] , destination [ E_AXIS ] ) ;
# endif
# ifdef SCARA
if ( ! prepare_move_scara ( ) ) return ;
# elif defined(DELTA)
if ( ! prepare_move_delta ( ) ) return ;
# endif
# ifdef DUAL_X_CARRIAGE
if ( ! prepare_move_dual_x_carriage ( ) ) return ;
# endif
# if !defined(DELTA) && !defined(SCARA)
if ( ! prepare_move_cartesian ( ) ) return ;
# endif
set_current_to_destination ( ) ;
set_current_to_destination ( ) ;
}
}
@ -5889,37 +5904,37 @@ void prepare_arc_move(char isclockwise) {
# if HAS_CONTROLLERFAN
# if HAS_CONTROLLERFAN
millis_t lastMotor = 0 ; // Last time a motor was turned on
void controllerFan ( ) {
millis_t lastMotorCheck = 0 ; // Last time the state was checked
static millis_t lastMotor = 0 ; // Last time a motor was turned on
static millis_t lastMotorCheck = 0 ; // Last time the state was checked
void controllerFan ( ) {
millis_t ms = millis ( ) ;
millis_t ms = millis ( ) ;
if ( ms > = lastMotorCheck + 2500 ) { // Not a time critical function, so we only check every 2500ms
if ( ms > = lastMotorCheck + 2500 ) { // Not a time critical function, so we only check every 2500ms
lastMotorCheck = ms ;
lastMotorCheck = ms ;
if ( X_ENABLE_READ = = X_ENABLE_ON | | Y_ENABLE_READ = = Y_ENABLE_ON | | Z_ENABLE_READ = = Z_ENABLE_ON | | soft_pwm_bed > 0
if ( X_ENABLE_READ = = X_ENABLE_ON | | Y_ENABLE_READ = = Y_ENABLE_ON | | Z_ENABLE_READ = = Z_ENABLE_ON | | soft_pwm_bed > 0
| | E0_ENABLE_READ = = E_ENABLE_ON // If any of the drivers are enabled...
| | E0_ENABLE_READ = = E_ENABLE_ON // If any of the drivers are enabled...
# if EXTRUDERS > 1
# if EXTRUDERS > 1
| | E1_ENABLE_READ = = E_ENABLE_ON
| | E1_ENABLE_READ = = E_ENABLE_ON
# if HAS_X2_ENABLE
# if HAS_X2_ENABLE
| | X2_ENABLE_READ = = X_ENABLE_ON
| | X2_ENABLE_READ = = X_ENABLE_ON
# endif
# end if
# if EXTRUDERS > 2
# if EXTRUDERS > 2
| | E2_ENABLE_READ = = E_ENABLE_ON
| | E2_ENABLE_READ = = E_ENABLE_ON
# if EXTRUDERS > 3
# if EXTRUDERS > 3
| | E3_ENABLE_READ = = E_ENABLE_ON
| | E3_ENABLE_READ = = E_ENABLE_ON
# endif
# endif
# endif
# endif
# endif
# endif
) {
) {
lastMotor = ms ; //... set time to NOW so the fan will turn on
lastMotor = ms ; //... set time to NOW so the fan will turn on
}
uint8_t speed = ( lastMotor = = 0 | | ms > = lastMotor + ( CONTROLLERFAN_SECS * 1000UL ) ) ? 0 : CONTROLLERFAN_SPEED ;
// allows digital or PWM fan output to be used (see M42 handling)
digitalWrite ( CONTROLLERFAN_PIN , speed ) ;
analogWrite ( CONTROLLERFAN_PIN , speed ) ;
}
}
uint8_t speed = ( lastMotor = = 0 | | ms > = lastMotor + ( CONTROLLERFAN_SECS * 1000UL ) ) ? 0 : CONTROLLERFAN_SPEED ;
// allows digital or PWM fan output to be used (see M42 handling)
digitalWrite ( CONTROLLERFAN_PIN , speed ) ;
analogWrite ( CONTROLLERFAN_PIN , speed ) ;
}
}
}
# endif
# endif // HAS_CONTROLLERFAN
# ifdef SCARA
# ifdef SCARA
void calculate_SCARA_forward_Transform ( float f_scara [ 3 ] )
void calculate_SCARA_forward_Transform ( float f_scara [ 3 ] )