diff --git a/klippy/chelper/__init__.py b/klippy/chelper/__init__.py index 3800834b..175b10be 100644 --- a/klippy/chelper/__init__.py +++ b/klippy/chelper/__init__.py @@ -68,13 +68,12 @@ defs_steppersync = """ defs_itersolve = """ int32_t itersolve_generate_steps(struct stepper_kinematics *sk - , double flush_time); + , struct stepcompress *sc, double flush_time); double itersolve_check_active(struct stepper_kinematics *sk , double flush_time); int32_t itersolve_is_active_axis(struct stepper_kinematics *sk, char axis); - void itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq); - void itersolve_set_stepcompress(struct stepper_kinematics *sk - , struct stepcompress *sc, double step_dist); + void itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq + , double step_dist); double itersolve_calc_position_from_coord(struct stepper_kinematics *sk , double x, double y, double z); void itersolve_set_position(struct stepper_kinematics *sk diff --git a/klippy/chelper/itersolve.c b/klippy/chelper/itersolve.c index 0dbc6c51..968c8cfb 100644 --- a/klippy/chelper/itersolve.c +++ b/klippy/chelper/itersolve.c @@ -26,8 +26,8 @@ struct timepos { // Generate step times for a portion of a move static int32_t -itersolve_gen_steps_range(struct stepper_kinematics *sk, struct move *m - , double abs_start, double abs_end) +itersolve_gen_steps_range(struct stepper_kinematics *sk, struct stepcompress *sc + , struct move *m, double abs_start, double abs_end) { sk_calc_callback calc_position_cb = sk->calc_position_cb; double half_step = .5 * sk->step_dist; @@ -37,7 +37,7 @@ itersolve_gen_steps_range(struct stepper_kinematics *sk, struct move *m if (end > m->move_t) end = m->move_t; struct timepos old_guess = {start, sk->commanded_pos}, guess = old_guess; - int sdir = stepcompress_get_step_dir(sk->sc); + int sdir = stepcompress_get_step_dir(sc); int is_dir_change = 0, have_bracket = 0, check_oscillate = 0; double target = sk->commanded_pos + (sdir ? half_step : -half_step); double last_time=start, low_time=start, high_time=start + SEEK_TIME_RESET; @@ -99,13 +99,13 @@ itersolve_gen_steps_range(struct stepper_kinematics *sk, struct move *m if (!have_bracket || high_time - low_time > .000000001) { if (!is_dir_change && rel_dist >= -half_step) // Avoid rollback if stepper fully reaches step position - stepcompress_commit(sk->sc); + stepcompress_commit(sc); // Guess is not close enough - guess again with new time continue; } } // Found next step - submit it - int ret = stepcompress_append(sk->sc, sdir, m->print_time, guess.time); + int ret = stepcompress_append(sc, sdir, m->print_time, guess.time); if (ret) return ret; target = sdir ? target+half_step+half_step : target-half_step-half_step; @@ -144,7 +144,8 @@ check_active(struct stepper_kinematics *sk, struct move *m) // Generate step times for a range of moves on the trapq int32_t __visible -itersolve_generate_steps(struct stepper_kinematics *sk, double flush_time) +itersolve_generate_steps(struct stepper_kinematics *sk, struct stepcompress *sc + , double flush_time) { double last_flush_time = sk->last_flush_time; sk->last_flush_time = flush_time; @@ -170,15 +171,15 @@ itersolve_generate_steps(struct stepper_kinematics *sk, double flush_time) while (--skip_count && pm->print_time > abs_start) pm = list_prev_entry(pm, node); do { - int32_t ret = itersolve_gen_steps_range(sk, pm, abs_start - , flush_time); + int32_t ret = itersolve_gen_steps_range( + sk, sc, pm, abs_start, flush_time); if (ret) return ret; pm = list_next_entry(pm, node); } while (pm != m); } // Generate steps for this move - int32_t ret = itersolve_gen_steps_range(sk, m, last_flush_time + int32_t ret = itersolve_gen_steps_range(sk, sc, m, last_flush_time , flush_time); if (ret) return ret; @@ -195,8 +196,8 @@ itersolve_generate_steps(struct stepper_kinematics *sk, double flush_time) double abs_end = force_steps_time; if (abs_end > flush_time) abs_end = flush_time; - int32_t ret = itersolve_gen_steps_range(sk, m, last_flush_time - , abs_end); + int32_t ret = itersolve_gen_steps_range( + sk, sc, m, last_flush_time, abs_end); if (ret) return ret; skip_count = 1; @@ -240,16 +241,10 @@ itersolve_is_active_axis(struct stepper_kinematics *sk, char axis) } void __visible -itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq) +itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq + , double step_dist) { sk->tq = tq; -} - -void __visible -itersolve_set_stepcompress(struct stepper_kinematics *sk - , struct stepcompress *sc, double step_dist) -{ - sk->sc = sc; sk->step_dist = step_dist; } diff --git a/klippy/chelper/itersolve.h b/klippy/chelper/itersolve.h index adb48055..e2e46ebe 100644 --- a/klippy/chelper/itersolve.h +++ b/klippy/chelper/itersolve.h @@ -26,12 +26,11 @@ struct stepper_kinematics { }; int32_t itersolve_generate_steps(struct stepper_kinematics *sk - , double flush_time); + , struct stepcompress *sc, double flush_time); double itersolve_check_active(struct stepper_kinematics *sk, double flush_time); int32_t itersolve_is_active_axis(struct stepper_kinematics *sk, char axis); -void itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq); -void itersolve_set_stepcompress(struct stepper_kinematics *sk - , struct stepcompress *sc, double step_dist); +void itersolve_set_trapq(struct stepper_kinematics *sk, struct trapq *tq + , double step_dist); double itersolve_calc_position_from_coord(struct stepper_kinematics *sk , double x, double y, double z); void itersolve_set_position(struct stepper_kinematics *sk diff --git a/klippy/stepper.py b/klippy/stepper.py index 8e6a883d..8e87c538 100644 --- a/klippy/stepper.py +++ b/klippy/stepper.py @@ -135,7 +135,7 @@ class MCU_stepper: mcu_pos = self.get_mcu_position() self._rotation_dist = rotation_dist self._step_dist = rotation_dist / self._steps_per_rotation - self.set_stepper_kinematics(self._stepper_kinematics) + self.set_trapq(self._trapq) self._set_mcu_position(mcu_pos) def get_dir_inverted(self): return self._invert_dir, self._orig_invert_dir @@ -192,8 +192,6 @@ class MCU_stepper: if old_sk is not None: mcu_pos = self.get_mcu_position() self._stepper_kinematics = sk - ffi_main, ffi_lib = chelper.get_ffi() - ffi_lib.itersolve_set_stepcompress(sk, self._stepqueue, self._step_dist) self.set_trapq(self._trapq) self._set_mcu_position(mcu_pos) return old_sk @@ -229,7 +227,8 @@ class MCU_stepper: ffi_main, ffi_lib = chelper.get_ffi() if tq is None: tq = ffi_main.NULL - ffi_lib.itersolve_set_trapq(self._stepper_kinematics, tq) + ffi_lib.itersolve_set_trapq(self._stepper_kinematics, + tq, self._step_dist) old_tq = self._trapq self._trapq = tq return old_tq @@ -257,7 +256,7 @@ class MCU_stepper: def generate_steps(self, flush_time): # Generate steps sk = self._stepper_kinematics - ret = self._itersolve_generate_steps(sk, flush_time) + ret = self._itersolve_generate_steps(sk, self._stepqueue, flush_time) if ret: raise error("Internal error in stepcompress") def is_active_axis(self, axis):