Skip to content

File syn_interpolator.h

File List > motor > syn_interpolator.h

Go to the documentation of this file

#ifndef SYN_INTERPOLATOR_H
#define SYN_INTERPOLATOR_H

#include "../common/syn_defs.h"
#include "../util/syn_scurve.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    SYN_INTERP_MODE_IDLE = 0,
    SYN_INTERP_MODE_LINEAR,       
    SYN_INTERP_MODE_CIRCULAR_CW,  
    SYN_INTERP_MODE_CIRCULAR_CCW, 
} SYN_Interp_Mode;

typedef struct {
    float x; 
    float y; 
    float z; 
} SYN_Vector3F;

typedef struct {
    SYN_Interp_Mode mode; 
    /* Endpoints & Geometry */
    SYN_Vector3F start_pos;     
    SYN_Vector3F target_pos;    
    SYN_Vector3F center_offset; 
    /* Current State */
    SYN_Vector3F current_pos; 
    float total_length;       
    float current_dist;       
    float radius;             
    float start_angle;        
    float sweep_angle;        
    /* Speed & Acceleration Profiling */
    SYN_SCurve scurve;     
    float target_feedrate; 
    uint32_t total_steps; 
    uint32_t step_index;  
} SYN_Interpolator;

void syn_interpolator_init(SYN_Interpolator *interp);

SYN_Status syn_interpolator_plan_linear(SYN_Interpolator *interp, SYN_Vector3F start,
                                        SYN_Vector3F target, float feedrate, float max_accel,
                                        float max_jerk, float step_res);

SYN_Status syn_interpolator_plan_circular(SYN_Interpolator *interp, SYN_Vector3F start,
                                          SYN_Vector3F target, SYN_Vector3F center_offset,
                                          bool is_cw, float feedrate, float max_accel,
                                          float max_jerk, float step_res);

bool syn_interpolator_step(SYN_Interpolator *interp, SYN_Vector3F *out_pos);

bool syn_interpolator_eval_at_time(SYN_Interpolator *interp, float t_sec, SYN_Vector3F *out_pos,
                                   SYN_Vector3F *out_vel);

SYN_Status syn_interpolator_plan_bezier(SYN_Interpolator *interp, SYN_Vector3F p0, SYN_Vector3F p1,
                                        SYN_Vector3F p2, SYN_Vector3F p3, float feedrate,
                                        float max_accel, float max_jerk, float step_res);

#ifdef __cplusplus
}
#endif

#endif /* SYN_INTERPOLATOR_H */