diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2022-01-11 13:21:07 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2022-01-16 19:01:15 -0500 |
commit | 29724a7411063879d3343a0610b4f288e045cabf (patch) | |
tree | 5584c0da79af7ddc2a6daf0ec0f1d1fd3211ff8b /klippy/chelper | |
parent | 34a1ce483737832fea5651f7c2d2fc9838c19414 (diff) | |
download | kutter-29724a7411063879d3343a0610b4f288e045cabf.tar.gz kutter-29724a7411063879d3343a0610b4f288e045cabf.tar.xz kutter-29724a7411063879d3343a0610b4f288e045cabf.zip |
extruder: Don't store pressure_advance value in trapq moves
Store the pressure_advance value in "struct extruder_stepper" instead
of in the trapq's "struct move". This makes it possible for multiple
stepper motors to have different pressure advance values while still
using the same trapq.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/chelper')
-rw-r--r-- | klippy/chelper/__init__.py | 4 | ||||
-rw-r--r-- | klippy/chelper/kin_extruder.c | 28 |
2 files changed, 19 insertions, 13 deletions
diff --git a/klippy/chelper/__init__.py b/klippy/chelper/__init__.py index 66d701d3..e04d431d 100644 --- a/klippy/chelper/__init__.py +++ b/klippy/chelper/__init__.py @@ -133,8 +133,8 @@ defs_kin_winch = """ defs_kin_extruder = """ struct stepper_kinematics *extruder_stepper_alloc(void); - void extruder_set_smooth_time(struct stepper_kinematics *sk - , double smooth_time); + void extruder_set_pressure_advance(struct stepper_kinematics *sk + , double pressure_advance, double smooth_time); """ defs_kin_shaper = """ diff --git a/klippy/chelper/kin_extruder.c b/klippy/chelper/kin_extruder.c index 63dca909..b8d1cc22 100644 --- a/klippy/chelper/kin_extruder.c +++ b/klippy/chelper/kin_extruder.c @@ -52,15 +52,17 @@ extruder_integrate_time(double base, double start_v, double half_accel // Calculate the definitive integral of extruder for a given move static double -pa_move_integrate(struct move *m, double base, double start, double end, - double time_offset) +pa_move_integrate(struct move *m, double pressure_advance + , double base, double start, double end, double time_offset) { if (start < 0.) start = 0.; if (end > m->move_t) end = m->move_t; // Calculate base position and velocity with pressure advance - double pressure_advance = m->axes_r.y; + int can_pressure_advance = m->axes_r.y != 0.; + if (!can_pressure_advance) + pressure_advance = 0.; base += pressure_advance * m->start_v; double start_v = m->start_v + pressure_advance * 2. * m->half_accel; // Calculate definitive integral @@ -72,34 +74,36 @@ pa_move_integrate(struct move *m, double base, double start, double end, // Calculate the definitive integral of the extruder over a range of moves static double -pa_range_integrate(struct move *m, double move_time, double hst) +pa_range_integrate(struct move *m, double move_time + , double pressure_advance, double hst) { // Calculate integral for the current move double res = 0., start = move_time - hst, end = move_time + hst; double start_base = m->start_pos.x; - res += pa_move_integrate(m, 0., start, move_time, start); - res -= pa_move_integrate(m, 0., move_time, end, end); + res += pa_move_integrate(m, pressure_advance, 0., start, move_time, start); + res -= pa_move_integrate(m, pressure_advance, 0., move_time, end, end); // Integrate over previous moves struct move *prev = m; while (unlikely(start < 0.)) { prev = list_prev_entry(prev, node); start += prev->move_t; double base = prev->start_pos.x - start_base; - res += pa_move_integrate(prev, base, start, prev->move_t, start); + res += pa_move_integrate(prev, pressure_advance, base, start + , prev->move_t, start); } // Integrate over future moves while (unlikely(end > m->move_t)) { end -= m->move_t; m = list_next_entry(m, node); double base = m->start_pos.x - start_base; - res -= pa_move_integrate(m, base, 0., end, end); + res -= pa_move_integrate(m, pressure_advance, base, 0., end, end); } return res; } struct extruder_stepper { struct stepper_kinematics sk; - double half_smooth_time, inv_half_smooth_time2; + double pressure_advance, half_smooth_time, inv_half_smooth_time2; }; static double @@ -112,12 +116,13 @@ extruder_calc_position(struct stepper_kinematics *sk, struct move *m // Pressure advance not enabled return m->start_pos.x + move_get_distance(m, move_time); // Apply pressure advance and average over smooth_time - double area = pa_range_integrate(m, move_time, hst); + double area = pa_range_integrate(m, move_time, es->pressure_advance, hst); return m->start_pos.x + area * es->inv_half_smooth_time2; } void __visible -extruder_set_smooth_time(struct stepper_kinematics *sk, double smooth_time) +extruder_set_pressure_advance(struct stepper_kinematics *sk + , double pressure_advance, double smooth_time) { struct extruder_stepper *es = container_of(sk, struct extruder_stepper, sk); double hst = smooth_time * .5; @@ -126,6 +131,7 @@ extruder_set_smooth_time(struct stepper_kinematics *sk, double smooth_time) if (! hst) return; es->inv_half_smooth_time2 = 1. / (hst * hst); + es->pressure_advance = pressure_advance; } struct stepper_kinematics * __visible |