File syn_gcode.h¶
File List > motor > syn_gcode.h
Go to the documentation of this file
#ifndef SYN_GCODE_H
#define SYN_GCODE_H
#include "../common/syn_defs.h"
#include "../pt/syn_pt.h"
#include "../sched/syn_sched.h"
#include "syn_interpolator.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#if !defined(SYN_USE_GCODE) || SYN_USE_GCODE
#ifdef __cplusplus
extern "C" {
#endif
/* ── Modal State Enums ──────────────────────────────────────────────────── */
typedef enum {
SYN_GCODE_MOTION_RAPID = 0,
SYN_GCODE_MOTION_LINEAR = 1,
SYN_GCODE_MOTION_ARC_CW = 2,
SYN_GCODE_MOTION_ARC_CCW = 3,
SYN_GCODE_MOTION_DWELL = 4
} SYN_GCode_MotionMode;
typedef enum {
SYN_GCODE_DIST_ABSOLUTE = 0,
SYN_GCODE_DIST_INCREMENTAL = 1
} SYN_GCode_DistanceMode;
typedef enum {
SYN_GCODE_PLANE_XY = 0,
SYN_GCODE_PLANE_XZ = 1,
SYN_GCODE_PLANE_YZ = 2
} SYN_GCode_Plane;
typedef enum {
SYN_GCODE_UNITS_MM = 0,
SYN_GCODE_UNITS_INCH = 1
} SYN_GCode_Units;
typedef enum {
SYN_GCODE_SPINDLE_OFF = 0,
SYN_GCODE_SPINDLE_CW = 1,
SYN_GCODE_SPINDLE_CCW = 2
} SYN_GCode_SpindleMode;
typedef enum {
SYN_GCODE_COOLANT_OFF = 0,
SYN_GCODE_COOLANT_FLOOD = 1,
SYN_GCODE_COOLANT_MIST = 2
} SYN_GCode_CoolantMode;
/* ── Parsed Block Representation ────────────────────────────────────────── */
typedef struct {
bool has_g;
uint32_t g_code;
bool has_m;
uint32_t m_code;
bool has_x;
float x;
bool has_y;
float y;
bool has_z;
float z;
bool has_i;
float i;
bool has_j;
float j;
bool has_k;
float k;
bool has_f;
float f;
bool has_s;
float s;
bool has_p;
float p;
bool has_t;
uint32_t t;
} SYN_GCode_Block;
/* ── Controller & Callbacks ─────────────────────────────────────────────── */
struct SYN_GCode_Controller;
typedef void (*SYN_GCode_SpindleCb)(SYN_GCode_SpindleMode mode, float rpm, void *user_data);
typedef void (*SYN_GCode_CoolantCb)(SYN_GCode_CoolantMode mode, void *user_data);
typedef void (*SYN_GCode_ToolCb)(uint32_t tool_num, void *user_data);
typedef struct {
SYN_Interpolator *interpolator;
float default_feedrate;
float max_acceleration;
float max_jerk;
float step_resolution;
SYN_GCode_SpindleCb on_spindle;
SYN_GCode_CoolantCb on_coolant;
SYN_GCode_ToolCb on_tool;
void *user_data;
} SYN_GCode_Config;
typedef struct SYN_GCode_Controller {
SYN_GCode_Config cfg;
SYN_PT pt;
SYN_Vector3F current_pos;
SYN_Vector3F offset_pos;
SYN_GCode_MotionMode motion_mode;
SYN_GCode_DistanceMode dist_mode;
SYN_GCode_Plane plane;
SYN_GCode_Units units;
SYN_GCode_SpindleMode spindle;
SYN_GCode_CoolantMode coolant;
float feedrate;
float spindle_speed;
uint32_t active_tool;
bool move_in_progress;
} SYN_GCode_Controller;
/* ── Public API ─────────────────────────────────────────────────────────── */
SYN_Status syn_gcode_init(SYN_GCode_Controller *ctrl, const SYN_GCode_Config *cfg);
SYN_Status syn_gcode_parse_line(const char *line, SYN_GCode_Block *block);
SYN_Status syn_gcode_execute_block(SYN_GCode_Controller *ctrl, const SYN_GCode_Block *block);
SYN_Status syn_gcode_execute_line(SYN_GCode_Controller *ctrl, const char *line);
bool syn_gcode_step(SYN_GCode_Controller *ctrl, SYN_Vector3F *out_pos);
SYN_PT_Status syn_gcode_task_pt(SYN_PT *pt, SYN_Task *task);
#ifdef __cplusplus
}
#endif
#endif /* SYN_USE_GCODE */
#endif /* SYN_GCODE_H */