aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/stepcompress.c
diff options
context:
space:
mode:
Diffstat (limited to 'klippy/stepcompress.c')
-rw-r--r--klippy/stepcompress.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/klippy/stepcompress.c b/klippy/stepcompress.c
index 8c847cb3..18750e9f 100644
--- a/klippy/stepcompress.c
+++ b/klippy/stepcompress.c
@@ -533,20 +533,25 @@ stepcompress_push_const(
// Schedule 'count' number of steps using the delta kinematic const speed
int32_t
stepcompress_push_delta_const(
- struct stepcompress *sc, double clock_offset, double dist, double start_pos
- , double inv_velocity, double step_dist
- , double height, double closestxy_d, double closest_height2, double movez_r)
+ struct stepcompress *sc, double clock_offset, double start_pos
+ , double steps, double cruise_sv
+ , double height, double closestxy_sd, double closest_height2, double movez_r)
{
// Calculate number of steps to take
+ double step_dist = 1.;
+ if (steps < 0) {
+ step_dist = -1.;
+ steps = -steps;
+ }
double movexy_r = movez_r ? sqrt(1. - movez_r*movez_r) : 1.;
- double reldist = closestxy_d - movexy_r*dist;
+ double reldist = closestxy_sd - movexy_r*steps;
double end_height = safe_sqrt(closest_height2 - reldist*reldist);
- int count = (end_height - height + movez_r*dist) / step_dist + .5;
+ int count = (end_height - height + movez_r*steps) * step_dist + .5;
if (count <= 0 || count > 10000000) {
if (count) {
errorf("push_delta_const invalid count %d %d %f %f %f %f %f %f %f %f"
- , sc->oid, count, clock_offset, dist, step_dist, start_pos
- , closest_height2, height, movez_r, inv_velocity);
+ , sc->oid, count, clock_offset, start_pos, steps, cruise_sv
+ , height, closestxy_sd, closest_height2, movez_r);
return ERROR_RET;
}
return 0;
@@ -557,8 +562,9 @@ stepcompress_push_delta_const(
int res = step_dist > 0. ? count : -count;
// Calculate each step time
+ double inv_cruise_sv = 1. / cruise_sv;
clock_offset += 0.5;
- start_pos += movexy_r*closestxy_d;
+ start_pos += movexy_r*closestxy_sd;
height += .5 * step_dist;
uint64_t *qn = sc->queue_next, *qend = sc->queue_end;
if (!movez_r) {
@@ -569,7 +575,7 @@ stepcompress_push_delta_const(
return ret;
double v = safe_sqrt(closest_height2 - height*height);
double pos = start_pos + (step_dist > 0. ? -v : v);
- *qn++ = clock_offset + pos * inv_velocity;
+ *qn++ = clock_offset + pos * inv_cruise_sv;
height += step_dist;
}
} else if (!movexy_r) {
@@ -580,7 +586,7 @@ stepcompress_push_delta_const(
if (ret)
return ret;
double pos = start_pos + movez_r*height + v;
- *qn++ = clock_offset + pos * inv_velocity;
+ *qn++ = clock_offset + pos * inv_cruise_sv;
height += step_dist;
}
} else {
@@ -589,10 +595,10 @@ stepcompress_push_delta_const(
int ret = check_expand(sc, &qn, &qend);
if (ret)
return ret;
- double relheight = movexy_r*height - movez_r*closestxy_d;
+ double relheight = movexy_r*height - movez_r*closestxy_sd;
double v = safe_sqrt(closest_height2 - relheight*relheight);
double pos = start_pos + movez_r*height + (step_dist > 0. ? -v : v);
- *qn++ = clock_offset + pos * inv_velocity;
+ *qn++ = clock_offset + pos * inv_cruise_sv;
height += step_dist;
}
}
@@ -603,20 +609,27 @@ stepcompress_push_delta_const(
// Schedule 'count' number of steps using delta kinematic acceleration
int32_t
stepcompress_push_delta_accel(
- struct stepcompress *sc, double clock_offset, double dist, double start_pos
- , double accel_multiplier, double step_dist
- , double height, double closestxy_d, double closest_height2, double movez_r)
+ struct stepcompress *sc, double clock_offset, double start_pos
+ , double steps, double start_sv, double accel
+ , double height, double closestxy_sd, double closest_height2, double movez_r)
{
// Calculate number of steps to take
+ double step_dist = 1.;
+ if (steps < 0) {
+ step_dist = -1.;
+ steps = -steps;
+ }
double movexy_r = movez_r ? sqrt(1. - movez_r*movez_r) : 1.;
- double reldist = closestxy_d - movexy_r*dist;
+ double reldist = closestxy_sd - movexy_r*steps;
double end_height = safe_sqrt(closest_height2 - reldist*reldist);
- int count = (end_height - height + movez_r*dist) / step_dist + .5;
+ int count = (end_height - height + movez_r*steps) * step_dist + .5;
if (count <= 0 || count > 10000000) {
if (count) {
- errorf("push_delta_accel invalid count %d %d %f %f %f %f %f %f %f %f"
- , sc->oid, count, clock_offset, dist, step_dist, start_pos
- , closest_height2, height, movez_r, accel_multiplier);
+ errorf("push_delta_accel invalid count %d %d %f %f"
+ " %f %f %f %f %f %f %f"
+ , sc->oid, count, clock_offset, start_pos
+ , steps, start_sv, accel
+ , height, closestxy_sd, closest_height2, movez_r);
return ERROR_RET;
}
return 0;
@@ -627,15 +640,17 @@ stepcompress_push_delta_accel(
int res = step_dist > 0. ? count : -count;
// Calculate each step time
- clock_offset += 0.5;
- start_pos += movexy_r*closestxy_d;
+ double inv_accel = 1. / accel;
+ double accel_multiplier = 2. * inv_accel;
+ clock_offset += 0.5 - start_sv * inv_accel;
+ start_pos += movexy_r*closestxy_sd + 0.5 * start_sv*start_sv * inv_accel;
height += .5 * step_dist;
uint64_t *qn = sc->queue_next, *qend = sc->queue_end;
while (count--) {
int ret = check_expand(sc, &qn, &qend);
if (ret)
return ret;
- double relheight = movexy_r*height - movez_r*closestxy_d;
+ double relheight = movexy_r*height - movez_r*closestxy_sd;
double v = safe_sqrt(closest_height2 - relheight*relheight);
double pos = start_pos + movez_r*height + (step_dist > 0. ? -v : v);
v = safe_sqrt(pos * accel_multiplier);