Stepdance Software Library
Loading...
Searching...
No Matches
interpolators.hpp
1#include <sys/_stdint.h>
2#include "arm_math.h"
3/*
4Interpolator Module of the StepDance Control System
5
6This module provides buffered motion interpretation.
7
8[More Details to be Added]
9
10A part of the Mixing Metaphors Project
11(c) 2025 Ilan Moyer, Jennifer Jacobs, Devon Frost
12*/
13
14#include "core.hpp"
15
16#ifndef interpolators_h //prevent importing twice
17#define interpolators_h
18
19// TBI stands for "TIME_BASED_INTERPRETER"
20#define TBI_BLOCK_QUEUE_SIZE 100 //we'll start here. Each block currently requires 33 bytes of RAM
21#define TBI_NUM_AXES 7 //number of axes to support in the interpolator
22
23#define TBI_AXIS_INACTIVE 0
24#define TBI_AXIS_ACTIVE 1
25
26#define TBI_AXIS_X 0
27#define TBI_AXIS_Y 1
28#define TBI_AXIS_Z 2
29#define TBI_AXIS_E 3
30#define TBI_AXIS_R 4
31#define TBI_AXIS_T 5
32#define TBI_AXIS_V 6 //virtual axis. we use this for detecting the end of a move
33
34
41class TimeBasedInterpolator : public Plugin{
42 public:
43 TimeBasedInterpolator();
44
48 struct position{
49 float64_t x_mm; // X
50 float64_t y_mm; // Y
51 float64_t z_mm; // Z
52 float64_t e_mm; // Extruder
53 float64_t r_mm; // Radial
54 float64_t t_rad; // Theta
55 };
56
57 struct motion_block{
58 uint8_t block_type; //specifies which type of block this is (e.g. delay, absolute, relative, set position, etc...). We don't currently use this.
59 uint32_t block_id; //an ID # for the motion block
60 float32_t block_time_s; //total time for the block, in seconds. We'll later convert this to frames, but keep it in seconds here for legibility.
61 float32_t block_velocity_per_s;
62 struct position block_position;
63 };
64
65 int16_t add_block(struct motion_block* block_to_add); //adds a block to the queue
67
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);
80
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);
93
97 volatile ControlParameter speed_overide = 1; //modifier for the interpolator speed.
98
102 void begin();
103
107 volatile uint16_t slots_remaining; //number of slots remaining in block queue
109
110 bool is_idle(); //returns true if the interpolator is idle
111 bool queue_is_full();
112
117 void enroll(RPC *rpc, const String& instance_name);
119
120 // BlockPorts
128
136
141
146
151
156
162
169
170 private:
171 // BlockPort State Variables
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;
178
179 DecimalPosition output_position_parameter;
180 DecimalPosition output_value_duration;
181
182 struct motion_block block_queue[TBI_BLOCK_QUEUE_SIZE]; // stores all pending motion blocks
183 volatile uint16_t next_write_index; //next write index in the block queue
184 volatile uint16_t next_read_index; //next read index in the block queue
185
186 void advance_head(volatile uint16_t* target_head); //handles roll-overs etc
187 void reset_block_queue();
188 void pull_block(); //pulls a block from the queue and into the active buffer
189 volatile uint8_t in_block = 0; //1 if actively reading a block
190 volatile uint16_t active_block_id; //stores the current active block
191 volatile uint8_t active_block_type; //we don't use this for now
192 volatile uint8_t active_axes[TBI_NUM_AXES]; //indexed by axis #, 0 if axis inactive, 1 if active
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];
195 BlockPort* output_BlockPorts[TBI_NUM_AXES - 1] = {&output_x, &output_y, &output_z, &output_e, &output_r, &output_t};
196 void run_frame_on_active_block(); //run a frame of the currently 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);
198
199 enum{
200 BLOCK_TYPE_INCREMENTAL,
201 BLOCK_TYPE_ABSOLUTE,
202 BLOCK_TYPE_GLOBAL
203 };
204
205 protected:
206 void run();
207};
208
209#endif
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