@@ -1661,21 +1661,24 @@ void Stepper::pulse_phase_isr() {
1661
1661
bool firstStep = true ;
1662
1662
USING_TIMED_PULSE ();
1663
1663
#endif
1664
- xyze_bool_t step_needed{0 };
1665
1664
1666
1665
// Direct Stepping page?
1667
1666
const bool is_page = current_block->is_page ();
1668
1667
1669
1668
do {
1669
+ AxisFlags step_needed{0 };
1670
+
1670
1671
#define _APPLY_STEP (AXIS, INV, ALWAYS ) AXIS ##_APPLY_STEP(INV, ALWAYS)
1671
1672
#define _STEP_STATE (AXIS ) STEP_STATE_## AXIS
1672
1673
1673
1674
// Determine if a pulse is needed using Bresenham
1674
1675
#define PULSE_PREP (AXIS ) do { \
1675
- delta_error[_AXIS (AXIS)] += advance_dividend[_AXIS (AXIS)]; \
1676
- step_needed[_AXIS (AXIS)] = (delta_error[_AXIS (AXIS)] >= 0 ); \
1677
- if (step_needed[_AXIS (AXIS)]) \
1678
- delta_error[_AXIS (AXIS)] -= advance_divisor; \
1676
+ int32_t de = delta_error[_AXIS (AXIS)] + advance_dividend[_AXIS (AXIS)]; \
1677
+ if (de >= 0 ) { \
1678
+ step_needed.set (_AXIS (AXIS)); \
1679
+ de -= advance_divisor; \
1680
+ } \
1681
+ delta_error[_AXIS (AXIS)] = de; \
1679
1682
}while (0 )
1680
1683
1681
1684
// With input shaping, direction changes can happen with almost only
@@ -1699,7 +1702,7 @@ void Stepper::pulse_phase_isr() {
1699
1702
#define HYSTERESIS (AXIS ) _HYSTERESIS(AXIS)
1700
1703
1701
1704
#define PULSE_PREP_SHAPING (AXIS, DELTA_ERROR, DIVIDEND ) do { \
1702
- if (step_needed[ _AXIS (AXIS)] ) { \
1705
+ if (step_needed. test ( _AXIS (AXIS)) ) { \
1703
1706
DELTA_ERROR += (DIVIDEND); \
1704
1707
if ((MAXDIR (AXIS) && DELTA_ERROR <= -(64 + HYSTERESIS (AXIS))) || (MINDIR (AXIS) && DELTA_ERROR >= (64 + HYSTERESIS (AXIS)))) { \
1705
1708
{ USING_TIMED_PULSE (); START_TIMED_PULSE (); AWAIT_LOW_PULSE (); } \
@@ -1708,23 +1711,23 @@ void Stepper::pulse_phase_isr() {
1708
1711
SET_STEP_DIR (AXIS); \
1709
1712
DIR_WAIT_AFTER (); \
1710
1713
} \
1711
- step_needed[ _AXIS (AXIS)] = DELTA_ERROR <= -(64 + HYSTERESIS (AXIS)) || DELTA_ERROR >= (64 + HYSTERESIS (AXIS)); \
1712
- if (step_needed[ _AXIS (AXIS)] ) \
1714
+ step_needed. set ( _AXIS (AXIS), DELTA_ERROR <= -(64 + HYSTERESIS (AXIS)) || DELTA_ERROR >= (64 + HYSTERESIS (AXIS) )); \
1715
+ if (step_needed. test ( _AXIS (AXIS)) ) \
1713
1716
DELTA_ERROR += MAXDIR (AXIS) ? -128 : 128 ; \
1714
1717
} \
1715
1718
}while (0 )
1716
1719
1717
1720
// Start an active pulse if needed
1718
1721
#define PULSE_START (AXIS ) do { \
1719
- if (step_needed[ _AXIS (AXIS)] ) { \
1722
+ if (step_needed. test ( _AXIS (AXIS)) ) { \
1720
1723
count_position[_AXIS (AXIS)] += count_direction[_AXIS (AXIS)]; \
1721
1724
_APPLY_STEP (AXIS, _STEP_STATE (AXIS), 0 ); \
1722
1725
} \
1723
1726
}while (0 )
1724
1727
1725
1728
// Stop an active pulse if needed
1726
1729
#define PULSE_STOP (AXIS ) do { \
1727
- if (step_needed[ _AXIS (AXIS)] ) { \
1730
+ if (step_needed. test ( _AXIS (AXIS)) ) { \
1728
1731
_APPLY_STEP (AXIS, !_STEP_STATE (AXIS), 0 ); \
1729
1732
} \
1730
1733
}while (0 )
@@ -1743,8 +1746,8 @@ void Stepper::pulse_phase_isr() {
1743
1746
}while (0 )
1744
1747
1745
1748
#define PAGE_PULSE_PREP (AXIS ) do { \
1746
- step_needed[ _AXIS (AXIS)] = \
1747
- pgm_read_byte (&segment_table[page_step_state.sd [_AXIS (AXIS)]][page_step_state.segment_steps & 0x7 ]); \
1749
+ step_needed. set ( _AXIS (AXIS), \
1750
+ pgm_read_byte (&segment_table[page_step_state.sd [_AXIS (AXIS)]][page_step_state.segment_steps & 0x7 ])) ; \
1748
1751
}while (0 )
1749
1752
1750
1753
switch (page_step_state.segment_steps ) {
@@ -1784,8 +1787,8 @@ void Stepper::pulse_phase_isr() {
1784
1787
page_step_state.bd [_AXIS (AXIS)] += VALUE;
1785
1788
1786
1789
#define PAGE_PULSE_PREP (AXIS ) do { \
1787
- step_needed[ _AXIS (AXIS)] = \
1788
- pgm_read_byte (&segment_table[page_step_state.sd [_AXIS (AXIS)]][page_step_state.segment_steps & 0x3 ]); \
1790
+ step_needed. set ( _AXIS (AXIS), \
1791
+ pgm_read_byte (&segment_table[page_step_state.sd [_AXIS (AXIS)]][page_step_state.segment_steps & 0x3 ])) ; \
1789
1792
}while (0 )
1790
1793
1791
1794
switch (page_step_state.segment_steps ) {
@@ -1812,10 +1815,10 @@ void Stepper::pulse_phase_isr() {
1812
1815
1813
1816
#elif STEPPER_PAGE_FORMAT == SP_4x1_512
1814
1817
1815
- #define PAGE_PULSE_PREP (AXIS, BITS ) do { \
1816
- step_needed[ _AXIS (AXIS)] = (steps >> BITS) & 0x1 ; \
1817
- if (step_needed[ _AXIS (AXIS)]) \
1818
- page_step_state.bd [_AXIS (AXIS)]++; \
1818
+ #define PAGE_PULSE_PREP (AXIS, NBIT ) do { \
1819
+ step_needed. set ( _AXIS (AXIS), TEST (steps, NBIT)) ; \
1820
+ if (step_needed. test ( _AXIS (AXIS))) \
1821
+ page_step_state.bd [_AXIS (AXIS)]++; \
1819
1822
}while (0 )
1820
1823
1821
1824
uint8_t steps = page_step_state.page [page_step_state.segment_idx >> 1 ];
@@ -1880,8 +1883,8 @@ void Stepper::pulse_phase_isr() {
1880
1883
1881
1884
#if HAS_SHAPING
1882
1885
// record an echo if a step is needed in the primary bresenham
1883
- const bool x_step = TERN0 (INPUT_SHAPING_X, shaping_x.enabled && step_needed[X_AXIS] ),
1884
- y_step = TERN0 (INPUT_SHAPING_Y, shaping_y.enabled && step_needed[Y_AXIS] );
1886
+ const bool x_step = TERN0 (INPUT_SHAPING_X, shaping_x.enabled && step_needed. x ),
1887
+ y_step = TERN0 (INPUT_SHAPING_Y, shaping_y.enabled && step_needed. y );
1885
1888
if (x_step || y_step)
1886
1889
ShapingQueue::enqueue (x_step, TERN0 (INPUT_SHAPING_X, shaping_x.forward ), y_step, TERN0 (INPUT_SHAPING_Y, shaping_y.forward ));
1887
1890
@@ -1995,23 +1998,23 @@ void Stepper::pulse_phase_isr() {
1995
1998
#if HAS_SHAPING
1996
1999
1997
2000
void Stepper::shaping_isr () {
1998
- xy_bool_t step_needed{0 };
2001
+ AxisFlags step_needed{0 };
1999
2002
2000
2003
// Clear the echoes that are ready to process. If the buffers are too full and risk overflow, also apply echoes early.
2001
- TERN_ (INPUT_SHAPING_X, step_needed[X_AXIS] = !ShapingQueue::peek_x () || ShapingQueue::free_count_x () < steps_per_isr);
2002
- TERN_ (INPUT_SHAPING_Y, step_needed[Y_AXIS] = !ShapingQueue::peek_y () || ShapingQueue::free_count_y () < steps_per_isr);
2004
+ TERN_ (INPUT_SHAPING_X, step_needed. x = !ShapingQueue::peek_x () || ShapingQueue::free_count_x () < steps_per_isr);
2005
+ TERN_ (INPUT_SHAPING_Y, step_needed. y = !ShapingQueue::peek_y () || ShapingQueue::free_count_y () < steps_per_isr);
2003
2006
2004
2007
if (bool (step_needed)) while (true ) {
2005
2008
#if ENABLED(INPUT_SHAPING_X)
2006
- if (step_needed[X_AXIS] ) {
2009
+ if (step_needed. x ) {
2007
2010
const bool forward = ShapingQueue::dequeue_x ();
2008
2011
PULSE_PREP_SHAPING (X, shaping_x.delta_error , shaping_x.factor2 * (forward ? 1 : -1 ));
2009
2012
PULSE_START (X);
2010
2013
}
2011
2014
#endif
2012
2015
2013
2016
#if ENABLED(INPUT_SHAPING_Y)
2014
- if (step_needed[Y_AXIS] ) {
2017
+ if (step_needed. y ) {
2015
2018
const bool forward = ShapingQueue::dequeue_y ();
2016
2019
PULSE_PREP_SHAPING (Y, shaping_y.delta_error , shaping_y.factor2 * (forward ? 1 : -1 ));
2017
2020
PULSE_START (Y);
@@ -2034,8 +2037,8 @@ void Stepper::pulse_phase_isr() {
2034
2037
#endif
2035
2038
}
2036
2039
2037
- TERN_ (INPUT_SHAPING_X, step_needed[X_AXIS] = !ShapingQueue::peek_x () || ShapingQueue::free_count_x () < steps_per_isr);
2038
- TERN_ (INPUT_SHAPING_Y, step_needed[Y_AXIS] = !ShapingQueue::peek_y () || ShapingQueue::free_count_y () < steps_per_isr);
2040
+ TERN_ (INPUT_SHAPING_X, step_needed. x = !ShapingQueue::peek_x () || ShapingQueue::free_count_x () < steps_per_isr);
2041
+ TERN_ (INPUT_SHAPING_Y, step_needed. y = !ShapingQueue::peek_y () || ShapingQueue::free_count_y () < steps_per_isr);
2039
2042
2040
2043
if (!bool (step_needed)) break ;
2041
2044
0 commit comments