@@ -326,49 +326,43 @@ constexpr ena_mask_t enable_overlap[] = {
326326 #endif
327327};
328328
329+ constexpr float _DASU[] = DEFAULT_AXIS_STEPS_PER_UNIT;
330+ constexpr feedRate_t _DMF[] = DEFAULT_MAX_FEEDRATE;
331+
329332// static_assert(!any_enable_overlap(), "There is some overlap.");
330333
331334#if HAS_SHAPING
332335
333- // These constexpr are used to calculate the shaping queue buffer sizes
334- constexpr xyze_float_t max_feedrate = DEFAULT_MAX_FEEDRATE;
335- constexpr xyze_float_t steps_per_unit = DEFAULT_AXIS_STEPS_PER_UNIT;
336- // MIN_STEP_ISR_FREQUENCY is known at compile time on AVRs and any reduction in SRAM is welcome
337- #ifdef __AVR__
338- constexpr float max_isr_rate = _MAX(
339- LOGICAL_AXIS_LIST (
340- max_feedrate.e * steps_per_unit.e,
341- max_feedrate.x * steps_per_unit.x,
342- max_feedrate.y * steps_per_unit.y,
343- max_feedrate.z * steps_per_unit.z,
344- max_feedrate.i * steps_per_unit.i,
345- max_feedrate.j * steps_per_unit.j,
346- max_feedrate.k * steps_per_unit.k,
347- max_feedrate.u * steps_per_unit.u,
348- max_feedrate.v * steps_per_unit.v,
349- max_feedrate.w * steps_per_unit.w
350- )
351- OPTARG(ADAPTIVE_STEP_SMOOTHING, MIN_STEP_ISR_FREQUENCY)
352- );
353- constexpr float max_step_rate = _MIN(max_isr_rate,
354- TERN0 (INPUT_SHAPING_X, max_feedrate.x * steps_per_unit.x) +
355- TERN0(INPUT_SHAPING_Y, max_feedrate.y * steps_per_unit.y)
356- );
336+ #ifdef SHAPING_MAX_STEPRATE
337+ constexpr float max_step_rate = SHAPING_MAX_STEPRATE;
357338 #else
358- constexpr float max_step_rate = TERN0(INPUT_SHAPING_X, max_feedrate.x * steps_per_unit.x) +
359- TERN0 (INPUT_SHAPING_Y, max_feedrate.y * steps_per_unit.y);
339+ constexpr float max_shaped_rate = TERN0(INPUT_SHAPING_X, _DMF[X_AXIS] * _DASU[X_AXIS]) +
340+ TERN0 (INPUT_SHAPING_Y, _DMF[Y_AXIS] * _DASU[Y_AXIS]);
341+ #if defined(__AVR__) || !defined(ADAPTIVE_STEP_SMOOTHING)
342+ // MIN_STEP_ISR_FREQUENCY is known at compile time on AVRs and any reduction in SRAM is welcome
343+ template <int INDEX=DISTINCT_AXES> constexpr float max_isr_rate () {
344+ return _MAX (_DMF[INDEX - 1 ] * _DASU[INDEX - 1 ], max_isr_rate<INDEX - 1 >());
345+ }
346+ template <> constexpr float max_isr_rate<0 >() {
347+ return TERN0 (ADAPTIVE_STEP_SMOOTHING, MIN_STEP_ISR_FREQUENCY);
348+ }
349+ constexpr float max_step_rate = _MIN(max_isr_rate(), max_shaped_rate);
350+ #else
351+ constexpr float max_step_rate = max_shaped_rate;
352+ #endif
360353 #endif
361- constexpr uint16_t shaping_echoes = max_step_rate / _MIN(0x7FFFFFFFL OPTARG (INPUT_SHAPING_X, SHAPING_FREQ_X) OPTARG(INPUT_SHAPING_Y, SHAPING_FREQ_Y)) / 2 + 3;
354+
355+ #ifndef SHAPING_MIN_FREQ
356+ #define SHAPING_MIN_FREQ _MIN (0x7FFFFFFFL OPTARG (INPUT_SHAPING_X, SHAPING_FREQ_X) OPTARG(INPUT_SHAPING_Y, SHAPING_FREQ_Y))
357+ #endif
358+ constexpr uint16_t shaping_min_freq = SHAPING_MIN_FREQ,
359+ shaping_echoes = max_step_rate / shaping_min_freq / 2 + 3 ;
362360
363361 typedef IF<ENABLED(__AVR__), uint16_t, uint32_t>::type shaping_time_t;
364362 enum shaping_echo_t { ECHO_NONE = 0 , ECHO_FWD = 1 , ECHO_BWD = 2 };
365363 struct shaping_echo_axis_t {
366- #if ENABLED(INPUT_SHAPING_X)
367- shaping_echo_t x:2 ;
368- #endif
369- #if ENABLED(INPUT_SHAPING_Y)
370- shaping_echo_t y:2 ;
371- #endif
364+ TERN_ (INPUT_SHAPING_X, shaping_echo_t x:2 );
365+ TERN_ (INPUT_SHAPING_Y, shaping_echo_t y:2 );
372366 };
373367
374368 class ShapingQueue {
0 commit comments