trapq: Initial support for building a queue of trapezoidal velocity moves

Add support for building a list of moves in the trapq.c code.  Update
the toolhead code so that moves generated from the look-ahead code are
added to that list.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2019-10-27 18:50:53 -04:00
parent c06f6943a6
commit d3afe4f1d8
4 changed files with 81 additions and 6 deletions

View File

@@ -60,6 +60,10 @@ defs_trapq = """
, double start_pos_x, double start_pos_y, double start_pos_z
, double axes_d_x, double axes_d_y, double axes_d_z
, double start_v, double cruise_v, double accel);
struct trapq *trapq_alloc(void);
void trapq_free(struct trapq *tq);
void trapq_add_move(struct trapq *tq, struct move *m);
void trapq_free_moves(struct trapq *tq, double print_time);
"""
defs_kin_cartesian = """

View File

@@ -5,11 +5,13 @@
// This file may be distributed under the terms of the GNU GPLv3 license.
#include <math.h> // sqrt
#include <stddef.h> // offsetof
#include <stdlib.h> // malloc
#include <string.h> // memset
#include "compiler.h" // unlikely
#include "trapq.h" // move_get_coord
// Allocate a new 'move' object
struct move * __visible
move_alloc(void)
{
@@ -85,3 +87,47 @@ move_get_coord(struct move *m, double move_time)
.y = m->start_pos.y + m->axes_r.y * move_dist,
.z = m->start_pos.z + m->axes_r.z * move_dist };
}
// Allocate a new 'trapq' object
struct trapq * __visible
trapq_alloc(void)
{
struct trapq *tq = malloc(sizeof(*tq));
memset(tq, 0, sizeof(*tq));
list_init(&tq->moves);
return tq;
}
// Free memory associated with a 'trapq' object
void __visible
trapq_free(struct trapq *tq)
{
while (!list_empty(&tq->moves)) {
struct move *m = list_first_entry(&tq->moves, struct move, node);
list_del(&m->node);
free(m);
}
free(tq);
}
// Add a move to the trapezoid velocity queue
void __visible
trapq_add_move(struct trapq *tq, struct move *m)
{
struct move *nm = move_alloc();
memcpy(nm, m, sizeof(*nm));
list_add_tail(&nm->node, &tq->moves);
}
// Free any moves older than `print_time` from the trapezoid velocity queue
void __visible
trapq_free_moves(struct trapq *tq, double print_time)
{
while (!list_empty(&tq->moves)) {
struct move *m = list_first_entry(&tq->moves, struct move, node);
if (m->print_time + m->move_t > print_time)
return;
list_del(&m->node);
free(m);
}
}

View File

@@ -1,6 +1,8 @@
#ifndef TRAPQ_H
#define TRAPQ_H
#include "list.h" // list_node
struct coord {
double x, y, z;
};
@@ -16,6 +18,8 @@ struct move {
double cruise_v;
struct move_accel accel, decel;
struct coord start_pos, axes_r;
struct list_node node;
};
struct move *move_alloc(void);
@@ -27,4 +31,13 @@ void move_fill(struct move *m, double print_time
double move_get_distance(struct move *m, double move_time);
struct coord move_get_coord(struct move *m, double move_time);
struct trapq {
struct list_head moves;
};
struct trapq *trapq_alloc(void);
void trapq_free(struct trapq *tq);
void trapq_add_move(struct trapq *tq, struct move *m);
void trapq_free_moves(struct trapq *tq, double print_time);
#endif // trapq.h