Skip to content

Commit 82cef84

Browse files
committed
FT: Reverse DIR bits, Multi-Axis
1 parent 1f5b886 commit 82cef84

File tree

5 files changed

+60
-87
lines changed

5 files changed

+60
-87
lines changed

Marlin/src/inc/SanityCheck.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -4033,8 +4033,12 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive.");
40334033
/**
40344034
* Fixed-Time Motion limitations
40354035
*/
4036-
#if ENABLED(FT_MOTION) && (NUM_AXES > 3 || E_STEPPERS > 1 || NUM_Z_STEPPERS > 1 || ANY(DUAL_X_CARRIAGE, HAS_DUAL_X_STEPPERS, HAS_DUAL_Y_STEPPERS, HAS_MULTI_EXTRUDER, MIXING_EXTRUDER))
4037-
#error "FT_MOTION is currently limited to machines with 3 linear axes and a single extruder."
4036+
#if ENABLED(FT_MOTION)
4037+
#if NUM_AXES > 3
4038+
#error "FT_MOTION is currently limited to machines with 3 linear axes."
4039+
#elif ENABLED(MIXING_EXTRUDER)
4040+
#error "FT_MOTION is incompatible with MIXING_EXTRUDER."
4041+
#endif
40384042
#endif
40394043

40404044
// Multi-Stepping Limit

Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727
namespace FTDI {
2828
void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) {
2929
const float rim = 0.3;
30-
const float a = percent/100.0*2.0*PI;
31-
const float a1 = min(PI/2, a);
32-
const float a2 = min(PI/2, a-a1);
33-
const float a3 = min(PI/2, a-a1-a2);
34-
const float a4 = min(PI/2, a-a1-a2-a3);
30+
const float a = percent/100.0*2.0*M_PI;
31+
const float a1 = min(M_PI/2, a);
32+
const float a2 = min(M_PI/2, a-a1);
33+
const float a3 = min(M_PI/2, a-a1-a2);
34+
const float a4 = min(M_PI/2, a-a1-a2-a3);
3535

3636
const int ro = min(w,h) * 8;
3737
const int rr = ro * rim;
@@ -69,21 +69,21 @@ namespace FTDI {
6969
cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8));
7070

7171
// Paint lower-right quadrant
72-
if (a > PI/2) {
72+
if (a > M_PI/2) {
7373
cmd.cmd(BEGIN(EDGE_STRIP_R));
7474
cmd.cmd(VERTEX2F(cx, cy));
7575
cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16));
7676
}
7777

7878
// Paint lower-left quadrant
79-
if (a > PI) {
79+
if (a > M_PI) {
8080
cmd.cmd(BEGIN(EDGE_STRIP_B));
8181
cmd.cmd(VERTEX2F(cx, cy));
8282
cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3)));
8383
}
8484

8585
// Paint upper-left quadrant
86-
if (a > 1.5*PI) {
86+
if (a > 1.5*M_PI) {
8787
cmd.cmd(BEGIN(EDGE_STRIP_L));
8888
cmd.cmd(VERTEX2F(cx, cy));
8989
cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4)));

Marlin/src/module/ft_motion.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ void FxdTiCtrl::loop() {
288288
// To be called on init or mode or zeta change.
289289
void FxdTiCtrl::updateShapingA(const_float_t zeta/*=FTM_SHAPING_ZETA*/, const_float_t vtol/*=FTM_SHAPING_V_TOL*/) {
290290

291-
const float K = exp( -zeta * PI / sqrt(1.0f - sq(zeta)) ),
291+
const float K = exp( -zeta * M_PI / sqrt(1.0f - sq(zeta)) ),
292292
K2 = sq(K);
293293

294294
switch (cfg_mode) {
@@ -862,40 +862,40 @@ void FxdTiCtrl::convertToSteps(const uint32_t idx) {
862862
SBI(stepperCmdBuff_ApplyDir[dir_index], dir_bit);
863863
#if HAS_X_AXIS
864864
if (x_delta > 0) {
865-
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_X);
866865
x_dirState = stepDirState_POS;
867866
}
868867
else {
868+
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_X);
869869
x_dirState = stepDirState_NEG;
870870
}
871871
#endif
872872

873873
#if HAS_Y_AXIS
874874
if (y_delta > 0) {
875-
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Y);
876875
y_dirState = stepDirState_POS;
877876
}
878877
else {
878+
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Y);
879879
y_dirState = stepDirState_NEG;
880880
}
881881
#endif
882882

883883
#if HAS_Z_AXIS
884884
if (z_delta > 0) {
885-
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Z);
886885
z_dirState = stepDirState_POS;
887886
}
888887
else {
888+
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Z);
889889
z_dirState = stepDirState_NEG;
890890
}
891891
#endif
892892

893893
#if HAS_EXTRUDERS
894894
if (e_delta > 0) {
895-
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_E);
896895
e_dirState = stepDirState_POS;
897896
}
898897
else {
898+
stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_E);
899899
e_dirState = stepDirState_NEG;
900900
}
901901
#endif

Marlin/src/module/planner.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -3173,14 +3173,14 @@ bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s
31733173
if (delta.a <= POLAR_FAST_RADIUS )
31743174
calculated_feedrate = settings.max_feedrate_mm_s[Y_AXIS];
31753175
else {
3176-
// Normalized vector of movement
3177-
const float diffBLength = ABS((2.0f * PI * diff.a) * (diff.b / 360.0f)),
3178-
diffTheta = DEGREES(ATAN2(diff.a, diffBLength)),
3179-
normalizedTheta = 1.0f - (ABS(diffTheta > 90.0f ? 180.0f - diffTheta : diffTheta) / 90.0f);
3180-
3181-
// Normalized position along the radius
3182-
const float radiusRatio = PRINTABLE_RADIUS/delta.a;
3183-
calculated_feedrate += (fr_mm_s * radiusRatio * normalizedTheta);
3176+
// Normalized vector of movement
3177+
const float diffBLength = ABS((2.0f * M_PI * diff.a) * (diff.b / 360.0f)),
3178+
diffTheta = DEGREES(ATAN2(diff.a, diffBLength)),
3179+
normalizedTheta = 1.0f - (ABS(diffTheta > 90.0f ? 180.0f - diffTheta : diffTheta) / 90.0f);
3180+
3181+
// Normalized position along the radius
3182+
const float radiusRatio = PRINTABLE_RADIUS/delta.a;
3183+
calculated_feedrate += (fr_mm_s * radiusRatio * normalizedTheta);
31843184
}
31853185
}
31863186
const feedRate_t feedrate = calculated_feedrate;

Marlin/src/module/stepper.cpp

+33-64
Original file line numberDiff line numberDiff line change
@@ -477,17 +477,20 @@ xyze_int8_t Stepper::count_direction{0};
477477
#define W_APPLY_STEP(v,Q) W_STEP_WRITE(v)
478478
#endif
479479

480-
#define E0_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(0) : REV_E_DIR(0); }while(0)
481-
#define E1_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(1) : REV_E_DIR(1); }while(0)
482-
#define E2_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(2) : REV_E_DIR(2); }while(0)
483-
#define E3_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(3) : REV_E_DIR(3); }while(0)
484-
#define E4_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(4) : REV_E_DIR(4); }while(0)
485-
#define E5_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(5) : REV_E_DIR(5); }while(0)
486-
#define E6_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(6) : REV_E_DIR(6); }while(0)
487-
#define E7_APPLY_DIR(REV) do{ (REV) ? FWD_E_DIR(7) : REV_E_DIR(7); }while(0)
488-
489-
#if DISABLED(MIXING_EXTRUDER)
480+
//#define E0_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(0) : REV_E_DIR(0); }while(0)
481+
//#define E1_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(1) : REV_E_DIR(1); }while(0)
482+
//#define E2_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(2) : REV_E_DIR(2); }while(0)
483+
//#define E3_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(3) : REV_E_DIR(3); }while(0)
484+
//#define E4_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(4) : REV_E_DIR(4); }while(0)
485+
//#define E5_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(5) : REV_E_DIR(5); }while(0)
486+
//#define E6_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(6) : REV_E_DIR(6); }while(0)
487+
//#define E7_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(7) : REV_E_DIR(7); }while(0)
488+
489+
#if ENABLED(MIXING_EXTRUDER)
490+
#define E_APPLY_DIR(FWD,Q) do{ if (FWD) { MIXER_STEPPER_LOOP(j) FWD_E_DIR(j); } else { MIXER_STEPPER_LOOP(j) REV_E_DIR(j); } }while(0)
491+
#else
490492
#define E_APPLY_STEP(v,Q) E_STEP_WRITE(stepper_extruder, v)
493+
#define E_APPLY_DIR(FWD,Q) do{ if (FWD) { FWD_E_DIR(stepper_extruder); } else { REV_E_DIR(stepper_extruder); } }while(0)
491494
#endif
492495

493496
#define CYCLES_TO_NS(CYC) (1000UL * (CYC) / ((F_CPU) / 1000000))
@@ -621,36 +624,15 @@ void Stepper::disable_all_steppers() {
621624
* COREYZ: Y_AXIS=B_AXIS and Z_AXIS=C_AXIS
622625
*/
623626
void Stepper::apply_directions() {
624-
625627
DIR_WAIT_BEFORE();
626628

627-
NUM_AXIS_CODE(
629+
LOGICAL_AXIS_CODE(
630+
SET_STEP_DIR(E),
628631
SET_STEP_DIR(X), SET_STEP_DIR(Y), SET_STEP_DIR(Z), // ABC
629632
SET_STEP_DIR(I), SET_STEP_DIR(J), SET_STEP_DIR(K),
630633
SET_STEP_DIR(U), SET_STEP_DIR(V), SET_STEP_DIR(W)
631634
);
632635

633-
#if HAS_EXTRUDERS
634-
// Because this is valid for the whole block we don't know
635-
// what E steppers will step. Likely all. Set all.
636-
if (motor_direction(E_AXIS)) {
637-
#if ENABLED(MIXING_EXTRUDER)
638-
MIXER_STEPPER_LOOP(j) REV_E_DIR(j);
639-
#else
640-
REV_E_DIR(stepper_extruder);
641-
#endif
642-
count_direction.e = -1;
643-
}
644-
else {
645-
#if ENABLED(MIXING_EXTRUDER)
646-
MIXER_STEPPER_LOOP(j) FWD_E_DIR(j);
647-
#else
648-
FWD_E_DIR(stepper_extruder);
649-
#endif
650-
count_direction.e = 1;
651-
}
652-
#endif // HAS_EXTRUDERS
653-
654636
DIR_WAIT_AFTER();
655637
}
656638

@@ -2409,29 +2391,16 @@ hal_timer_t Stepper::block_phase_isr() {
24092391
if (la_active) {
24102392
const uint32_t la_step_rate = la_advance_steps > current_block->final_adv_steps ? current_block->la_advance_rate : 0;
24112393
if (la_step_rate != step_rate) {
2412-
const bool reverse_e = la_step_rate > step_rate;
2413-
la_interval = calc_timer_interval((reverse_e ? la_step_rate - step_rate : step_rate - la_step_rate) >> current_block->la_scaling);
2394+
const bool forward_e = la_step_rate <= step_rate;
2395+
la_interval = calc_timer_interval((forward_e ? step_rate - la_step_rate : la_step_rate - step_rate) >> current_block->la_scaling);
24142396

2415-
if (reverse_e != motor_direction(E_AXIS)) {
2397+
if (forward_e == motor_direction(E_AXIS)) {
24162398
last_direction_bits.toggle(E_AXIS);
24172399
count_direction.e = -count_direction.e;
24182400

24192401
DIR_WAIT_BEFORE();
24202402

2421-
if (reverse_e) {
2422-
#if ENABLED(MIXING_EXTRUDER)
2423-
MIXER_STEPPER_LOOP(j) REV_E_DIR(j);
2424-
#else
2425-
REV_E_DIR(stepper_extruder);
2426-
#endif
2427-
}
2428-
else {
2429-
#if ENABLED(MIXING_EXTRUDER)
2430-
MIXER_STEPPER_LOOP(j) FWD_E_DIR(j);
2431-
#else
2432-
FWD_E_DIR(stepper_extruder);
2433-
#endif
2434-
}
2403+
E_APPLY_DIR(forward_e, false);
24352404

24362405
DIR_WAIT_AFTER();
24372406
}
@@ -3448,36 +3417,36 @@ void Stepper::report_positions() {
34483417
#if HAS_Z_AXIS
34493418
// Z is handled differently to update the stepper
34503419
// counts (needed by Marlin for bed level probing).
3451-
const bool z_dir = TEST(command, FT_BIT_DIR_Z),
3420+
const bool z_rev = TEST(command, FT_BIT_DIR_Z),
34523421
z_step = TEST(command, FT_BIT_STEP_Z);
34533422
#endif
34543423

34553424
if (applyDir) {
3456-
TERN_(HAS_X_AXIS, X_DIR_WRITE(TEST(command, FT_BIT_DIR_X)));
3457-
TERN_(HAS_Y_AXIS, Y_DIR_WRITE(TEST(command, FT_BIT_DIR_Y)));
3458-
TERN_(HAS_Z_AXIS, Z_DIR_WRITE(z_dir));
3459-
TERN_(HAS_EXTRUDERS, E0_DIR_WRITE(TEST(command, FT_BIT_DIR_E)));
3425+
TERN_(HAS_X_AXIS, X_APPLY_DIR(!TEST(command, FT_BIT_DIR_X), false));
3426+
TERN_(HAS_Y_AXIS, Y_APPLY_DIR(!TEST(command, FT_BIT_DIR_Y), false));
3427+
TERN_(HAS_Z_AXIS, Z_APPLY_DIR(!z_rev, false));
3428+
TERN_(HAS_EXTRUDERS, E_APPLY_DIR(!TEST(command, FT_BIT_DIR_E), false));
34603429
DIR_WAIT_AFTER();
34613430
}
34623431

3463-
TERN_(HAS_X_AXIS, X_STEP_WRITE(TEST(command, FT_BIT_STEP_X)));
3464-
TERN_(HAS_Y_AXIS, Y_STEP_WRITE(TEST(command, FT_BIT_STEP_Y)));
3465-
TERN_(HAS_Z_AXIS, Z_STEP_WRITE(z_step));
3466-
TERN_(HAS_EXTRUDERS, E0_STEP_WRITE(TEST(command, FT_BIT_STEP_E)));
3432+
TERN_(HAS_X_AXIS, X_APPLY_STEP(TEST(command, FT_BIT_STEP_X)));
3433+
TERN_(HAS_Y_AXIS, Y_APPLY_STEP(TEST(command, FT_BIT_STEP_Y)));
3434+
TERN_(HAS_Z_AXIS, Z_APPLY_STEP(z_step));
3435+
TERN_(HAS_EXTRUDERS, E_APPLY_STEP(TEST(command, FT_BIT_STEP_E)));
34673436

34683437
START_TIMED_PULSE();
34693438

34703439
#if HAS_Z_AXIS
34713440
// Update step counts
3472-
if (z_step) count_position.z += z_dir ? 1 : -1;
3441+
if (z_step) count_position.z += z_rev ? -1 : 1;
34733442
#endif
34743443

34753444
AWAIT_HIGH_PULSE();
34763445

3477-
X_STEP_WRITE(0);
3478-
TERN_(HAS_Y_AXIS, Y_STEP_WRITE(0));
3479-
TERN_(HAS_Z_AXIS, Z_STEP_WRITE(0));
3480-
TERN_(HAS_EXTRUDERS, E0_STEP_WRITE(0));
3446+
TERN_(HAS_X_AXIS, X_APPLY_STEP(0, false));
3447+
TERN_(HAS_Y_AXIS, Y_APPLY_STEP(0, false));
3448+
TERN_(HAS_Z_AXIS, Z_APPLY_STEP(0, false));
3449+
TERN_(HAS_EXTRUDERS, E_APPLY_STEP(0, false));
34813450

34823451
} // Stepper::fxdTiCtrl_stepper
34833452

0 commit comments

Comments
 (0)