1#include <sys/_stdint.h>
16#ifndef interpolators_h
17#define interpolators_h
20#define TBI_BLOCK_QUEUE_SIZE 100
23#define TBI_AXIS_INACTIVE 0
24#define TBI_AXIS_ACTIVE 1
41class TimeBasedInterpolator :
public Plugin{
43 TimeBasedInterpolator();
60 float32_t block_time_s;
61 float32_t block_velocity_per_s;
62 struct position block_position;
65 int16_t add_block(
struct motion_block* block_to_add);
79 int16_t
add_move(uint8_t mode, float32_t velocity_per_s, DecimalPosition x, DecimalPosition y, DecimalPosition z, DecimalPosition e, DecimalPosition r, DecimalPosition t);
92 int16_t
add_timed_move(uint8_t mode, float32_t time_s, DecimalPosition x, DecimalPosition y, DecimalPosition z, DecimalPosition e, DecimalPosition r, DecimalPosition t);
107 volatile uint16_t slots_remaining;
111 bool queue_is_full();
117 void enroll(
RPC *rpc,
const String& instance_name);
172 DecimalPosition output_position_x;
173 DecimalPosition output_position_y;
174 DecimalPosition output_position_z;
175 DecimalPosition output_position_e;
176 DecimalPosition output_position_r;
177 DecimalPosition output_position_t;
179 DecimalPosition output_position_parameter;
180 DecimalPosition output_value_duration;
182 struct motion_block block_queue[TBI_BLOCK_QUEUE_SIZE];
183 volatile uint16_t next_write_index;
184 volatile uint16_t next_read_index;
186 void advance_head(
volatile uint16_t* target_head);
187 void reset_block_queue();
189 volatile uint8_t in_block = 0;
190 volatile uint16_t active_block_id;
191 volatile uint8_t active_block_type;
192 volatile uint8_t active_axes[TBI_NUM_AXES];
193 volatile float64_t active_axes_remaining_distance_mm[TBI_NUM_AXES];
194 volatile float32_t active_axes_velocity_mm_per_frame[TBI_NUM_AXES];
196 void run_frame_on_active_block();
197 int16_t _add_move(uint8_t mode, float32_t move_time_s, float32_t velocity_per_s, DecimalPosition x, DecimalPosition y, DecimalPosition z, DecimalPosition e, DecimalPosition r, DecimalPosition t);
200 BLOCK_TYPE_INCREMENTAL,
BlockPorts provide a unified interface for mapping inputs and outputs of different StepDance componen...
Definition core.hpp:148
RPC class for handling remote procedure calls over serial streams.
Definition rpc.hpp:35
BlockPort output_e
Output BlockPort for the generated position signal on axis E.
Definition interpolators.hpp:145
BlockPort output_z
Output BlockPort for the generated position signal on axis Z.
Definition interpolators.hpp:140
BlockPort output_t
Output BlockPort for the generated position signal on axis T.
Definition interpolators.hpp:155
BlockPort output_y
Output BlockPort for the generated position signal on axis Y.
Definition interpolators.hpp:135
BlockPort output_duration
Output BlockPort for the duration of the active move. Indicates the time the entire move is scheduled...
Definition interpolators.hpp:168
BlockPort output_x
Output BlockPort for the generated position signal on axis X.
Definition interpolators.hpp:127
int16_t add_timed_move(uint8_t mode, float32_t time_s, DecimalPosition x, DecimalPosition y, DecimalPosition z, DecimalPosition e, DecimalPosition r, DecimalPosition t)
Add a move to the list of moves the interpolator will perform (indicate motion time).
int16_t add_move(uint8_t mode, float32_t velocity_per_s, DecimalPosition x, DecimalPosition y, DecimalPosition z, DecimalPosition e, DecimalPosition r, DecimalPosition t)
Add a move to the list of moves the interpolator will perform (indicate target velocity).
void begin()
Initialize the time-based interpolator. This must be called to set up the interpolator.
volatile ControlParameter speed_overide
ControlParameter specifying a multiplicative modifier for the interpolator speed.
Definition interpolators.hpp:97
BlockPort output_parameter
Output BlockPort for the generated position signal of a parameter in [0, 1] range....
Definition interpolators.hpp:161
BlockPort output_r
Output BlockPort for the generated position signal on axis R.
Definition interpolators.hpp:150