|
@@ -581,7 +581,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
581
|
581
|
ediff * inv_segments
|
582
|
582
|
};
|
583
|
583
|
|
584
|
|
- #if DISABLED(SCARA_FEEDRATE_SCALING)
|
|
584
|
+ #if !HAS_FEEDRATE_SCALING
|
585
|
585
|
const float cartesian_segment_mm = cartesian_mm * inv_segments;
|
586
|
586
|
#endif
|
587
|
587
|
|
|
@@ -589,14 +589,13 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
589
|
589
|
SERIAL_ECHOPAIR("mm=", cartesian_mm);
|
590
|
590
|
SERIAL_ECHOPAIR(" seconds=", seconds);
|
591
|
591
|
SERIAL_ECHOPAIR(" segments=", segments);
|
592
|
|
- #if DISABLED(SCARA_FEEDRATE_SCALING)
|
593
|
|
- SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm);
|
594
|
|
- #else
|
595
|
|
- SERIAL_EOL();
|
|
592
|
+ #if !HAS_FEEDRATE_SCALING
|
|
593
|
+ SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm);
|
596
|
594
|
#endif
|
|
595
|
+ SERIAL_EOL();
|
597
|
596
|
//*/
|
598
|
597
|
|
599
|
|
- #if ENABLED(SCARA_FEEDRATE_SCALING)
|
|
598
|
+ #if HAS_FEEDRATE_SCALING
|
600
|
599
|
// SCARA needs to scale the feed rate from mm/s to degrees/s
|
601
|
600
|
// i.e., Complete the angular vector in the given time.
|
602
|
601
|
const float segment_length = cartesian_mm * inv_segments,
|
|
@@ -604,7 +603,11 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
604
|
603
|
inverse_secs = inv_segment_length * _feedrate_mm_s;
|
605
|
604
|
|
606
|
605
|
float oldA = planner.position_float[A_AXIS],
|
607
|
|
- oldB = planner.position_float[B_AXIS];
|
|
606
|
+ oldB = planner.position_float[B_AXIS]
|
|
607
|
+ #if ENABLED(DELTA_FEEDRATE_SCALING)
|
|
608
|
+ , oldC = planner.position_float[C_AXIS]
|
|
609
|
+ #endif
|
|
610
|
+ ;
|
608
|
611
|
|
609
|
612
|
/*
|
610
|
613
|
SERIAL_ECHOPGM("Scaled kinematic move: ");
|
|
@@ -613,7 +616,11 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
613
|
616
|
SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s);
|
614
|
617
|
SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs);
|
615
|
618
|
SERIAL_ECHOPAIR(" oldA=", oldA);
|
616
|
|
- SERIAL_ECHOLNPAIR(" oldB=", oldB);
|
|
619
|
+ SERIAL_ECHOPAIR(" oldB=", oldB);
|
|
620
|
+ #if ENABLED(DELTA_FEEDRATE_SCALING)
|
|
621
|
+ SERIAL_ECHOPAIR(" oldC=", oldC);
|
|
622
|
+ #endif
|
|
623
|
+ SERIAL_EOL();
|
617
|
624
|
safe_delay(5);
|
618
|
625
|
//*/
|
619
|
626
|
#endif
|
|
@@ -654,6 +661,19 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
654
|
661
|
safe_delay(5);
|
655
|
662
|
//*/
|
656
|
663
|
oldA = delta[A_AXIS]; oldB = delta[B_AXIS];
|
|
664
|
+ #elif ENABLED(DELTA_FEEDRATE_SCALING)
|
|
665
|
+ // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s
|
|
666
|
+ // i.e., Complete the linear vector in the given time.
|
|
667
|
+ if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder))
|
|
668
|
+ break;
|
|
669
|
+ /*
|
|
670
|
+ SERIAL_ECHO(segments);
|
|
671
|
+ SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]);
|
|
672
|
+ SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]);
|
|
673
|
+ SERIAL_ECHOLNPAIR(" F", SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs * 60);
|
|
674
|
+ safe_delay(5);
|
|
675
|
+ //*/
|
|
676
|
+ oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS];
|
657
|
677
|
#else
|
658
|
678
|
if (!planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm))
|
659
|
679
|
break;
|
|
@@ -661,17 +681,31 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
|
661
|
681
|
}
|
662
|
682
|
|
663
|
683
|
// Ensure last segment arrives at target location.
|
664
|
|
- #if ENABLED(SCARA_FEEDRATE_SCALING)
|
|
684
|
+ #if HAS_FEEDRATE_SCALING
|
665
|
685
|
inverse_kinematics(rtarget);
|
666
|
686
|
ADJUST_DELTA(rtarget);
|
|
687
|
+ #endif
|
|
688
|
+
|
|
689
|
+ #if ENABLED(SCARA_FEEDRATE_SCALING)
|
667
|
690
|
const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB);
|
668
|
691
|
if (diff2) {
|
669
|
692
|
planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
|
670
|
|
-
|
671
|
693
|
/*
|
672
|
694
|
SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]);
|
673
|
695
|
SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB);
|
674
|
|
- SERIAL_ECHOLNPAIR(" F", (SQRT(diff2) * inverse_secs) * 60);
|
|
696
|
+ SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60);
|
|
697
|
+ SERIAL_EOL();
|
|
698
|
+ safe_delay(5);
|
|
699
|
+ //*/
|
|
700
|
+ }
|
|
701
|
+ #elif ENABLED(DELTA_FEEDRATE_SCALING)
|
|
702
|
+ const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC);
|
|
703
|
+ if (diff2) {
|
|
704
|
+ planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder);
|
|
705
|
+ /*
|
|
706
|
+ SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]);
|
|
707
|
+ SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); SERIAL_ECHOPAIR(" cdiff=", delta[C_AXIS] - oldC);
|
|
708
|
+ SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60);
|
675
|
709
|
SERIAL_EOL();
|
676
|
710
|
safe_delay(5);
|
677
|
711
|
//*/
|