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:
@@ -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 = """
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user