Add AC/BC RTCP programs and 3D machine manager

This commit is contained in:
2026-09-20 12:31:12 +08:00
parent 1c1e5f9672
commit 8aab531b02
363 changed files with 53213 additions and 58 deletions

View File

@@ -376,6 +376,7 @@ static int apply_g(sim_interpreter_state *state, interpreter_meta *meta, double
}
static int apply_m(sim_interpreter_state *state, interpreter_meta *meta, double code, int *groups) {
if (code_is(code, 1)) return SIM_INTERP_OK;
if (code_is(code, 3) || code_is(code, 4) || code_is(code, 5)) { if (++groups[4] > 1) return SIM_INTERP_ERR_STATE; state->spindle_mode = (int)code; return SIM_INTERP_OK; }
if (code_is(code, 2) || code_is(code, 30)) { if (++groups[5] > 1) return SIM_INTERP_ERR_STATE; state->program_end = 1; return SIM_INTERP_OK; }
if (code_is(code, 6)) { if (meta) meta->selected_tool = meta->selected_tool < 0 ? 0 : meta->selected_tool; return SIM_INTERP_OK; }
@@ -582,7 +583,9 @@ int sim_interpreter_execute(sim_interpreter *interpreter, const char *block, uin
if (next.plane == 18) segment->normal.y = 1.0;
else if (next.plane == 19) segment->normal.x = 1.0;
else segment->normal.z = 1.0;
if (meta->feed_mode == 93) {
/* LinuxCNC applies inverse-time feed to G1/G2/G3. G0 remains a
* rapid move and does not require an F word while G93 is modal. */
if (meta->feed_mode == 93 && next.motion_mode != 0) {
const double dx = segment->end.tran.x - segment->start.tran.x;
const double dy = segment->end.tran.y - segment->start.tran.y;
const double dz = segment->end.tran.z - segment->start.tran.z;

View File

@@ -81,6 +81,13 @@ int main(void) {
assert(sim_interpreter_execute(&interpreter, "G80 M7", (uint32_t)(sizeof("G80 M7") - 1)) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "M8", 2) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "M9", 2) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "(debug,optional stop disabled) M1", (uint32_t)(sizeof("(debug,optional stop disabled) M1") - 1)) == SIM_INTERP_OK);
assert(sim_interpreter_reset(&interpreter) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "G93", 3) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "G0 X16.339 Y-25.409 Z33.353 A-71.841 C-35.930", (uint32_t)(sizeof("G0 X16.339 Y-25.409 Z33.353 A-71.841 C-35.930") - 1)) == SIM_INTERP_OK);
assert(sim_interpreter_read_motion(&interpreter, &motion) == SIM_INTERP_OK);
assert(motion.motion_type == SIM_POSEMATH_LINEAR);
assert(fabs(interpreter.state.x - 16.339) < 1e-12 && fabs(interpreter.state.a + 71.841) < 1e-12);
assert(sim_interpreter_reset(&interpreter) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "G0 X30 A20 C40", sizeof("G0 X30 A20 C40") - 1) == SIM_INTERP_OK);
assert(sim_interpreter_execute(&interpreter, "G10 L20 P1 X5", 13) == SIM_INTERP_OK);