#ifndef LINUXCNC_WEB_WASM_SIM_INTERPRETER_H #define LINUXCNC_WEB_WASM_SIM_INTERPRETER_H #include #include "sim_posemath.h" #ifdef __cplusplus extern "C" { #endif enum sim_interpreter_result { SIM_INTERP_OK = 0, SIM_INTERP_ERR_ARGUMENT = -500, SIM_INTERP_ERR_NONFINITE = -501, SIM_INTERP_ERR_SYNTAX = -502, SIM_INTERP_ERR_RANGE = -503, SIM_INTERP_ERR_UNKNOWN_CODE = -504, SIM_INTERP_ERR_STATE = -505, SIM_INTERP_ERR_BUFFER = -506, SIM_INTERP_ERR_PARAMETER = -507, SIM_INTERP_ERR_EXPRESSION = -508, }; enum sim_interpreter_units { SIM_INTERP_UNITS_INCH = 20, SIM_INTERP_UNITS_MM = 21, }; enum sim_interpreter_distance_mode { SIM_INTERP_ABSOLUTE = 90, SIM_INTERP_INCREMENTAL = 91, }; typedef struct sim_interpreter_state { double x; double y; double z; double a; double b; double c; double u; double v; double w; double feed; double speed; uint32_t line; int units; int distance_mode; int plane; int motion_mode; int spindle_mode; int program_end; int status; } sim_interpreter_state; #define SIM_INTERPRETER_CANONICAL_CAPACITY 512u #define SIM_INTERPRETER_PARAMETER_MIN 1u #define SIM_INTERPRETER_PARAMETER_MAX 5399u typedef struct sim_interpreter { sim_interpreter_state state; uint64_t block_hash; uint32_t canonical_length; char canonical[SIM_INTERPRETER_CANONICAL_CAPACITY]; } sim_interpreter; typedef struct sim_coordinate_context { double offsets[9][9]; int system; } sim_coordinate_context; int sim_interpreter_get_coordinates(const sim_interpreter *interpreter, sim_coordinate_context *context); int sim_interpreter_set_coordinates(sim_interpreter *interpreter, const sim_coordinate_context *context); int sim_interpreter_sync_position(sim_interpreter *interpreter, const sim_posemath_pose *position); int sim_interpreter_init(sim_interpreter *interpreter); int sim_interpreter_reset(sim_interpreter *interpreter); int sim_interpreter_execute(sim_interpreter *interpreter, const char *block, uint32_t length); uint32_t sim_interpreter_size(void); int sim_interpreter_read_state(const sim_interpreter *interpreter, sim_interpreter_state *state); int sim_interpreter_read_motion(const sim_interpreter *interpreter, sim_posemath_segment *segment); uint32_t sim_interpreter_motion_size(void); uint32_t sim_interpreter_canonical(const sim_interpreter *interpreter, char *output, uint32_t capacity); uint64_t sim_interpreter_state_hash(const sim_interpreter *interpreter); uint64_t sim_interpreter_block_hash(const sim_interpreter *interpreter); uint64_t sim_interpreter_modal_hash(const sim_interpreter *interpreter); uint32_t sim_interpreter_error_column(const sim_interpreter *interpreter); int32_t sim_interpreter_error_code(const sim_interpreter *interpreter); int sim_interpreter_parameter_set(sim_interpreter *interpreter, uint32_t index, double value); int sim_interpreter_parameter_get(const sim_interpreter *interpreter, uint32_t index, double *value); #ifdef __cplusplus } #endif #endif