@@ -2929,14 +2929,42 @@ hal_timer_t Stepper::block_phase_isr() {
29292929 }
29302930
29312931 #endif // INPUT_SHAPING_E_SYNC
2932+ #if ENABLED(S_CURVE_ACCELERATION)
2933+ static int32_t bezier_A_backup;
2934+ static int32_t bezier_B_backup;
2935+ static int32_t bezier_C_backup;
2936+ static uint32_t bezier_F_backup;
2937+ static uint32_t bezier_AV_backup;
2938+ void Stepper::backup_bezier (){
2939+ bezier_A_backup = bezier_A;
2940+ bezier_B_backup = bezier_B;
2941+ bezier_C_backup = bezier_C;
2942+ bezier_F_backup = bezier_F;
2943+ bezier_AV_backup = bezier_AV;
2944+ }
2945+ void Stepper::recover_bezier (){
2946+ bezier_A = bezier_A_backup;
2947+ bezier_B = bezier_B_backup;
2948+ bezier_C = bezier_C_backup;
2949+ bezier_F = bezier_F_backup;
2950+ bezier_AV = bezier_AV_backup;
2951+ }
2952+ #endif
29322953
29332954 int32_t smooth_lin_adv_lookahead (uint32_t stepper_ticks) {
29342955 for (uint8_t i = 0 ; block_t *block = planner.get_future_block (i); i++) {
29352956 if (block->is_sync ()) continue ;
29362957 if (stepper_ticks <= block->acceleration_time ) {
29372958 if (!block->use_advance_lead ) return 0 ;
2938- uint32_t rate = STEP_MULTIPLY (stepper_ticks, block->acceleration_rate ) + block->initial_rate ;
2939- NOMORE (rate, block->nominal_rate );
2959+ #if ENABLED(S_CURVE_ACCELERATION)
2960+ Stepper::backup_bezier ();
2961+ Stepper::_calc_bezier_curve_coeffs (block->initial_rate , block->cruise_rate , block->acceleration_time_inverse );
2962+ uint32_t rate = Stepper::_eval_bezier_curve (stepper_ticks);
2963+ Stepper::recover_bezier ();
2964+ #else
2965+ uint32_t rate = STEP_MULTIPLY (stepper_ticks, block->acceleration_rate ) + block->initial_rate ;
2966+ NOMORE (rate, block->nominal_rate );
2967+ #endif
29402968 return MULT_Q (30 , rate, block->e_step_ratio_q30 );
29412969 }
29422970 stepper_ticks -= block->acceleration_time ;
@@ -2949,13 +2977,20 @@ hal_timer_t Stepper::block_phase_isr() {
29492977
29502978 if (stepper_ticks <= block->deceleration_time ) {
29512979 if (!block->use_advance_lead ) return 0 ;
2952- uint32_t rate = STEP_MULTIPLY (stepper_ticks, block->acceleration_rate );
2953- if (rate < block->cruise_rate ) {
2954- rate = block->cruise_rate - rate;
2955- NOLESS (rate, block->final_rate );
2956- }
2957- else
2958- rate = block->final_rate ;
2980+ #if ENABLED(S_CURVE_ACCELERATION)
2981+ Stepper::backup_bezier ();
2982+ Stepper::_calc_bezier_curve_coeffs (block->cruise_rate , block->final_rate , block->deceleration_time_inverse );
2983+ uint32_t rate = Stepper::_eval_bezier_curve (stepper_ticks);
2984+ Stepper::recover_bezier ();
2985+ #else
2986+ uint32_t rate = STEP_MULTIPLY (stepper_ticks, block->acceleration_rate );
2987+ if (rate < block->cruise_rate ) {
2988+ rate = block->cruise_rate - rate;
2989+ NOLESS (rate, block->final_rate );
2990+ }
2991+ else
2992+ rate = block->final_rate ;
2993+ #endif
29592994 return MULT_Q (30 , rate, block->e_step_ratio_q30 );
29602995 }
29612996 stepper_ticks -= block->deceleration_time ;
0 commit comments