3.0 KiB
WASM CNC simulator architecture
Native code boundary
The wasm core should expose a small C ABI and hide all LinuxCNC internals. The browser should never call LinuxCNC classes directly. This keeps the UI independent from whether the backend is LinuxCNC RS274, Fanuc preprocessing, Siemens preprocessing, or a future independent interpreter.
Current ABI entry points:
cnc_sim_createcnc_sim_destroycnc_sim_resetcnc_sim_set_dialectcnc_sim_load_config_jsoncnc_sim_parse_programcnc_sim_last_error
The event callback emits normalized CncSimEvent records. JavaScript can transform those records into JSON, binary buffers, or renderable typed arrays.
LinuxCNC integration plan
- Build a native
CanonEventSinkthat implements all functions declared incanon.hh. - Link the sink with
src/emc/rs274ngcandsrc/emc/nml_intfinstead of the task controller. - Stub or remove Python remap support for the first browser target.
- Compile with Emscripten after replacing
dlopen, Python, HAL and filesystem-only features. - Compare event output with native LinuxCNC using the same G-code corpus.
Dialect expansion
LinuxCNC support should be the baseline. Fanuc and Siemens support should be implemented as dialect adapters, not by forking the simulator core.
Fanuc high-priority items:
- Macro B variables and expression semantics
G65,G66,G67macro calls- common fixed cycles
- cutter compensation and work offsets
- lathe cycles where required
Siemens high-priority items:
- named variables and arithmetic expressions
CYCLE*canned cyclesTRANS,ROT,SCALE,MIRRORTRAORIandCYCLE800- frame and workpiece coordinate transforms
Commercial simulator parity
Feature parity needs more than G-code parsing:
- exact toolpath display with modal state inspection
- configurable machine kinematics and limits
- holder, fixture and stock collision detection
- material removal simulation
- time estimation with acceleration and lookahead
- diagnostics for unsupported controller-specific words
- reproducible comparison tests for each controller dialect
Five-axis and RTCP
The first RTCP implementation is a geometry kernel, not the full LinuxCNC motion controller. It treats programmed XYZ as the tool-center point, applies A/B/C orientation to a local tool vector, and computes the compensated pivot/spindle point needed to keep the tool tip fixed.
RTCP is opt-in through config JSON. When enabled, the original motion events
remain programmed tool-tip motion and an additional rtcp-pivot event is emitted
for each rapid/feed/arc event. This keeps the ABI useful for both toolpath
display and machine-axis/pivot visualization.
Current files:
core/src/rtcp_kinematics.hcore/src/rtcp_kinematics.cppcore/tests/rtcp_kinematics_smoke.cpp
The next integration step is to add machine configuration for rotary topology, pivot offsets, tool length sources, and rotation order, then apply RTCP compensation while converting LinuxCNC Canon motion events into renderable machine/tool-tip trajectories.