|
@@ -9201,7 +9201,7 @@ void ok_to_send() {
|
9201
|
9201
|
) \
|
9202
|
9202
|
)
|
9203
|
9203
|
|
9204
|
|
- #define DELTA_RAW_IK() do { \
|
|
9204
|
+ #define DELTA_RAW_IK() do { \
|
9205
|
9205
|
delta[A_AXIS] = DELTA_Z(A_AXIS); \
|
9206
|
9206
|
delta[B_AXIS] = DELTA_Z(B_AXIS); \
|
9207
|
9207
|
delta[C_AXIS] = DELTA_Z(C_AXIS); \
|
|
@@ -9568,54 +9568,19 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
|
9568
|
9568
|
// If there's only 1 segment, loops will be skipped entirely.
|
9569
|
9569
|
--segments;
|
9570
|
9570
|
|
9571
|
|
- // Using "raw" coordinates saves 6 float subtractions
|
9572
|
|
- // per segment, saving valuable CPU cycles
|
9573
|
|
-
|
9574
|
|
- #if ENABLED(USE_RAW_KINEMATICS)
|
9575
|
|
-
|
9576
|
|
- // Get the raw current position as starting point
|
9577
|
|
- float raw[XYZE] = {
|
9578
|
|
- RAW_CURRENT_POSITION(X_AXIS),
|
9579
|
|
- RAW_CURRENT_POSITION(Y_AXIS),
|
9580
|
|
- RAW_CURRENT_POSITION(Z_AXIS),
|
9581
|
|
- current_position[E_AXIS]
|
9582
|
|
- };
|
9583
|
|
-
|
9584
|
|
- #define DELTA_VAR raw
|
9585
|
|
-
|
9586
|
|
- // Delta can inline its kinematics
|
9587
|
|
- #if ENABLED(DELTA)
|
9588
|
|
- #define DELTA_IK() DELTA_RAW_IK()
|
9589
|
|
- #else
|
9590
|
|
- #define DELTA_IK() inverse_kinematics(raw)
|
9591
|
|
- #endif
|
9592
|
|
-
|
9593
|
|
- #else
|
9594
|
|
-
|
9595
|
|
- // Get the logical current position as starting point
|
9596
|
|
- float logical[XYZE];
|
9597
|
|
- COPY(logical, current_position);
|
9598
|
|
-
|
9599
|
|
- #define DELTA_VAR logical
|
9600
|
|
-
|
9601
|
|
- // Delta can inline its kinematics
|
9602
|
|
- #if ENABLED(DELTA)
|
9603
|
|
- #define DELTA_IK() DELTA_LOGICAL_IK()
|
9604
|
|
- #else
|
9605
|
|
- #define DELTA_IK() inverse_kinematics(logical)
|
9606
|
|
- #endif
|
9607
|
|
-
|
9608
|
|
- #endif
|
|
9571
|
+ // Get the logical current position as starting point
|
|
9572
|
+ float logical[XYZE];
|
|
9573
|
+ COPY(logical, current_position);
|
9609
|
9574
|
|
9610
|
9575
|
#if ENABLED(USE_DELTA_IK_INTERPOLATION)
|
9611
|
9576
|
|
9612
|
9577
|
// Only interpolate XYZ. Advance E normally.
|
9613
|
|
- #define DELTA_NEXT(ADDEND) LOOP_XYZ(i) DELTA_VAR[i] += ADDEND;
|
|
9578
|
+ #define DELTA_NEXT(ADDEND) LOOP_XYZ(i) logical[i] += ADDEND;
|
9614
|
9579
|
|
9615
|
9580
|
// Get the starting delta if interpolation is possible
|
9616
|
9581
|
if (segments >= 2) {
|
9617
|
9582
|
DELTA_IK();
|
9618
|
|
- ADJUST_DELTA(DELTA_VAR); // Adjust Z if bed leveling is enabled
|
|
9583
|
+ ADJUST_DELTA(logical); // Adjust Z if bed leveling is enabled
|
9619
|
9584
|
}
|
9620
|
9585
|
|
9621
|
9586
|
// Loop using decrement
|
|
@@ -9629,22 +9594,22 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
|
9629
|
9594
|
DELTA_NEXT(segment_distance[i] + segment_distance[i]);
|
9630
|
9595
|
|
9631
|
9596
|
// Advance E normally
|
9632
|
|
- DELTA_VAR[E_AXIS] += segment_distance[E_AXIS];
|
|
9597
|
+ logical[E_AXIS] += segment_distance[E_AXIS];
|
9633
|
9598
|
|
9634
|
9599
|
// Get the exact delta for the move after this
|
9635
|
9600
|
DELTA_IK();
|
9636
|
|
- ADJUST_DELTA(DELTA_VAR); // Adjust Z if bed leveling is enabled
|
|
9601
|
+ ADJUST_DELTA(logical); // Adjust Z if bed leveling is enabled
|
9637
|
9602
|
|
9638
|
9603
|
// Move to the interpolated delta position first
|
9639
|
9604
|
planner.buffer_line(
|
9640
|
9605
|
(prev_delta[A_AXIS] + delta[A_AXIS]) * 0.5,
|
9641
|
9606
|
(prev_delta[B_AXIS] + delta[B_AXIS]) * 0.5,
|
9642
|
9607
|
(prev_delta[C_AXIS] + delta[C_AXIS]) * 0.5,
|
9643
|
|
- DELTA_VAR[E_AXIS], _feedrate_mm_s, active_extruder
|
|
9608
|
+ logical[E_AXIS], _feedrate_mm_s, active_extruder
|
9644
|
9609
|
);
|
9645
|
9610
|
|
9646
|
9611
|
// Advance E once more for the next move
|
9647
|
|
- DELTA_VAR[E_AXIS] += segment_distance[E_AXIS];
|
|
9612
|
+ logical[E_AXIS] += segment_distance[E_AXIS];
|
9648
|
9613
|
|
9649
|
9614
|
// Do an extra decrement of the loop
|
9650
|
9615
|
--s;
|
|
@@ -9652,25 +9617,29 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
|
9652
|
9617
|
else {
|
9653
|
9618
|
// Get the last segment delta. (Used when segments is odd)
|
9654
|
9619
|
DELTA_NEXT(segment_distance[i]);
|
9655
|
|
- DELTA_VAR[E_AXIS] += segment_distance[E_AXIS];
|
|
9620
|
+ logical[E_AXIS] += segment_distance[E_AXIS];
|
9656
|
9621
|
DELTA_IK();
|
9657
|
|
- ADJUST_DELTA(DELTA_VAR); // Adjust Z if bed leveling is enabled
|
|
9622
|
+ ADJUST_DELTA(logical); // Adjust Z if bed leveling is enabled
|
9658
|
9623
|
}
|
9659
|
9624
|
|
9660
|
9625
|
// Move to the non-interpolated position
|
9661
|
|
- planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], DELTA_VAR[E_AXIS], _feedrate_mm_s, active_extruder);
|
|
9626
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], logical[E_AXIS], _feedrate_mm_s, active_extruder);
|
9662
|
9627
|
}
|
9663
|
9628
|
|
9664
|
9629
|
#else
|
9665
|
9630
|
|
9666
|
|
- #define DELTA_NEXT(ADDEND) LOOP_XYZE(i) DELTA_VAR[i] += ADDEND;
|
|
9631
|
+ #define DELTA_NEXT(ADDEND) LOOP_XYZE(i) logical[i] += ADDEND;
|
9667
|
9632
|
|
9668
|
9633
|
// For non-interpolated delta calculate every segment
|
9669
|
9634
|
for (uint16_t s = segments + 1; --s;) {
|
9670
|
9635
|
DELTA_NEXT(segment_distance[i]);
|
9671
|
|
- DELTA_IK();
|
9672
|
|
- ADJUST_DELTA(DELTA_VAR); // Adjust Z if bed leveling is enabled
|
9673
|
|
- planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], DELTA_VAR[E_AXIS], _feedrate_mm_s, active_extruder);
|
|
9636
|
+ #if ENABLED(DELTA)
|
|
9637
|
+ DELTA_LOGICAL_IK(); // Delta can inline its kinematics
|
|
9638
|
+ #else
|
|
9639
|
+ inverse_kinematics(logical);
|
|
9640
|
+ #endif
|
|
9641
|
+ ADJUST_DELTA(logical); // Adjust Z if bed leveling is enabled
|
|
9642
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], logical[E_AXIS], _feedrate_mm_s, active_extruder);
|
9674
|
9643
|
}
|
9675
|
9644
|
|
9676
|
9645
|
#endif
|