_images/scaralang_logo.png

SCARA Robotics Domain-Specific Language (DSL) Toolchain & Binary Protocol CodecΒΆ

scaralang is a standalone, lightweight, GUI-independent Python toolchain and compiler for the SCARA Robotics Domain-Specific Language (DSL), combined with the official SCARA Wire Binary Protocol Codec.

Developed in python code.

The README is used to introduce the tool and provide instructions on how to install the tool, any machine dependencies it may have and any other information that should be provided before the tool is installed.

scaralang python checker scaralang python package scaralang interface checker scaralang isp checker scaralang srp checker gplv3 license apache license python version github issues documentation status github contributors

πŸš€ InstallationΒΆ

scaralang python3 build

Navigate to release page download and extract release archive.

To install scaralang type the following

tar xvzf scaralang-x.y.z.tar.gz
cd scaralang-x.y.z/
# python3
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
python3 -m pip install --upgrade setuptools
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade build
pip3 install -r requirements.txt
python3 -m build --no-isolation --wheel
pip3 install ./dist/scaralang-*-py3-none-any.whl
rm -f get-pip.py

You can use Docker to create image/container, or You can use pip to install

# python3
pip3 install scaralang

πŸ“¦ DependenciesΒΆ

scaralang requires next modules and libraries

πŸ“ Tool structureΒΆ

scaralang is based on OOP and Clean Architecture.

Tool structure

scaralang/
     β”œβ”€β”€ core/
     β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”œβ”€β”€ model/
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dsl/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ast/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_type.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ instruction.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ instruction_param.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jog_axis.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_state.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ program.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ speed_mode.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tool_orient_mode.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tool_position.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── zone_mode.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_program_telemetry.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassembled_frame.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassembly_summary.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ parsed_command_token.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ program.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── step.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compiler/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_geometry.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control_waypoint_descriptor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── scara_compiler_context.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ diagnostic/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_diagnostic.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_diagnostic_code.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── scara_diagnostic_severity.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ exporter/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ export_format.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linter/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── scara_lint_context.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ macro/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pallet_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── work_frame.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── token/
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ lexer_pattern_kind.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ scara_token.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      └── scara_token_type.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ kinematics/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ elbow_config.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ point_2d.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ point_3d.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_bounds.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── transmission_parameters.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ axis_mask.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_config.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_drive_mode.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── motor_interface_type.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ protocol/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_delimiter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_frame.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ error_code.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ joint_steps.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ message_id.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_wire_mode.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── tool_id.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl_dispatch_result.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── repl_session_context.py
     β”‚Β Β  β”‚Β Β  └── trajectory/
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ arc_point.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ axis_peak_metric.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ bottleneck_incident.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ circle_geometry.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ trajectory_cycle_report.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ validation_result.py
     β”‚Β Β  β”‚Β Β      └── waypoint.py
     β”‚Β Β  └── service/
     β”‚Β Β      β”œβ”€β”€ compiler/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ binary/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotor_frame_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_frame_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── motor_frame_builder_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tokens/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_token_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_token_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_token_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── tool/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ itool_frame_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_frame_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      └── tool_frame_builder_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibinary_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ metrics/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_metrics_calculator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_metrics_calculator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibinary_metrics_calculator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotion_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── motion_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── step/
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ istep_discretizer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ iwaypoint_step_dispatcher.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ step_discretizer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ step_discretizer_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ waypoint_step_dispatcher.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      └── waypoint_step_dispatcher_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ frame/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_transformer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_transformer_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iframe_transformer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iinstruction_pipeline.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ instruction_pipeline.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ instruction_pipeline_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iprimitive_instruction_processor.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_compiler.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ macro/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_macro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_macro_expander_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imacro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ itangent_macro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jump_macro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jump_macro_expander_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pallet_macro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pallet_macro_expander_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tangent_macro_expander.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── tangent_macro_expander_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ motion/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_move_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_move_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ builder/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_waypoint_builder_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iarc_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ calculator/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_point_calculator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_point_calculator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iarc_point_calculator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── interpolation/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ arc_interpolator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ arc_interpolator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ iarc_interpolator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β      └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cartesian/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cartesian_move_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cartesian_move_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotion_sub_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_command_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_command_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── vertical/
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ vertical_move_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      └── vertical_move_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ primitive/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control_command_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control_command_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ control_waypoint_builder_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icontrol_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iprimitive_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_command_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── state_command_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── tool/
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ itool_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_command_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_command_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_waypoint_builder.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      └── tool_waypoint_builder_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ primitive_instruction_processor.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ primitive_instruction_processor_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_compiler.py
     β”‚Β Β      β”‚Β Β  └── scara_compiler_factory.py
     β”‚Β Β      β”œβ”€β”€ disassembler/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ frame_detail_decoder.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ frame_detail_decoder_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iframe_detail_decoder.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_disassembler.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_disassembler.py
     β”‚Β Β      β”‚Β Β  └── scara_disassembler_factory.py
     β”‚Β Β      β”œβ”€β”€ dsl/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ binary/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_service.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_service_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ibinary_service.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ compilation/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iscara_dsl_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_dsl_compiler.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── scara_dsl_compiler_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_binary_compiler.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_disassembler.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_info_provider.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_linter.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_service.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_dsl_validator.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_dsl_bundle.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_dsl_pipeline_bundle.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_dsl_service.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_dsl_service_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ toolchain/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ itoolchain_info_provider.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ toolchain_info_provider.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── toolchain_info_provider_factory.py
     β”‚Β Β      β”‚Β Β  └── validation/
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ scara_script_validator.py
     β”‚Β Β      β”‚Β Β      └── scara_script_validator_factory.py
     β”‚Β Β      β”œβ”€β”€ exporter/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ csv/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ csv_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ csv_trajectory_exporter_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icsv_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ export_dispatcher_bundle.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ export_target_dispatcher.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ export_target_dispatcher_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ gcode/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gcode_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ gcode_exporter_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ igcode_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iexport_target_dispatcher.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ json/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ijson_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ json_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── json_trajectory_exporter_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iscara_plan_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_plan_exporter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_plan_exporter_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_program_serializer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── scara_source_generator.py
     β”‚Β Β      β”‚Β Β  └── svg/
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ isvg_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ svg_trajectory_exporter.py
     β”‚Β Β      β”‚Β Β      └── svg_trajectory_exporter_factory.py
     β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”œβ”€β”€ kinematics/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ default_scara_profile.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ikinematics_service.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ kinematics_service.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ kinematics_service_factory.py
     β”‚Β Β      β”‚Β Β  └── transmission/
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ ijoint_step_transmission_converter.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ joint_step_transmission_converter.py
     β”‚Β Β      β”‚Β Β      └── joint_step_transmission_converter_factory.py
     β”‚Β Β      β”œβ”€β”€ linter/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ diagnostic/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iscara_diagnostic_formatter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_diagnostic_formatter.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── scara_diagnostic_formatter_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_linter.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ rules/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iscara_lint_rule.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotion_calibration_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotion_duplicate_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_calibration_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_calibration_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_duplicate_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_duplicate_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_lint_rule.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── motion_lint_rule_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipneumatic_conflict_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipneumatic_flyby_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipneumatic_redundancy_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_conflict_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_conflict_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_flyby_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_flyby_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_lint_rule.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_lint_rule_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pneumatic_redundancy_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── pneumatic_redundancy_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotor_mode_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ istate_homing_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ istate_zone_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_mode_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_mode_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_homing_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_homing_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_lint_rule.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_lint_rule_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ state_zone_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── state_zone_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── timing/
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ itiming_blend_zone_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ itiming_dwell_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ timing_blend_zone_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ timing_blend_zone_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ timing_dwell_validator.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ timing_dwell_validator_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ timing_lint_rule.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      └── timing_lint_rule_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_linter.py
     β”‚Β Β      β”‚Β Β  └── scara_linter_factory.py
     β”‚Β Β      β”œβ”€β”€ motor/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ motor_config_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ motor_drive_mode_resolver.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ motor_interface_resolver.py
     β”‚Β Β      β”‚Β Β  └── motor_wire_mode_converter.py
     β”‚Β Β      β”œβ”€β”€ parser/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ commands/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ config/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ accel_config_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ config_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ elbow_config_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motor_config_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ override_config_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ speed_config_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tool_orient_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── zone_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flow/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disable_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ enable_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ estop_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ flow_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hold_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ resume_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ sync_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── wait_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_reset_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_set_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_parser_provider.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ macro/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jump_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ macro_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ pallet_def_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── pallet_move_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ approach_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ arc_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ home_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ jog_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ joint_move_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ linear_move_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ probe_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── retract_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ parameter/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”‚Β Β  └── parameter_extractor.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── tool/
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ pump_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_command_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      β”œβ”€β”€ tool_command_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β      └── valve_command_parser.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ instruction/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iinstruction_line_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ instruction_line_parser.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── instruction_line_parser_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ iscara_parser.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ lexer/
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iscara_lexer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scara_lexer.py
     β”‚Β Β      β”‚Β Β  β”‚Β Β  └── scara_lexer_factory.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_parser.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ scara_parser_factory.py
     β”‚Β Β      β”‚Β Β  └── splitter/
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ itoken_line_splitter.py
     β”‚Β Β      β”‚Β Β      β”œβ”€β”€ token_line_splitter.py
     β”‚Β Β      β”‚Β Β      └── token_line_splitter_factory.py
     β”‚Β Β      β”œβ”€β”€ protocol/
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ibinary_frame_builder.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ibinary_frame_parser.py
     β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ibinary_payload_unpacker.py
     β”‚Β Β      β”‚Β Β  └── __init__.py
     β”‚Β Β      └── trajectory/
     β”‚Β Β          β”œβ”€β”€ discretization/
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ ishape_discretizer.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ shape_discretizer.py
     β”‚Β Β          β”‚Β Β  └── shape_discretizer_factory.py
     β”‚Β Β          β”œβ”€β”€ __init__.py
     β”‚Β Β          β”œβ”€β”€ metrics/
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ bottleneck/
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ imotion_bottleneck_detector.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ motion_bottleneck_detector.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  └── motion_bottleneck_detector_factory.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ cycle/
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cycle_time_calculator.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ cycle_time_calculator_factory.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icycle_time_calculator.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ profile/
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ axis_speed_profile_analyzer.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ axis_speed_profile_analyzer_factory.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iaxis_speed_profile_analyzer.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ summary/
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ itrajectory_cycle_summary_builder.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  β”œβ”€β”€ trajectory_cycle_summary_builder.py
     β”‚Β Β          β”‚Β Β  β”‚Β Β  └── trajectory_cycle_summary_builder_factory.py
     β”‚Β Β          β”‚Β Β  └── trajectory_metrics.py
     β”‚Β Β          β”œβ”€β”€ plan/
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ itrajectory_mutable.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ itrajectory_plan.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ itrajectory_plan_factory.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ itrajectory_read_only.py
     β”‚Β Β          β”‚Β Β  β”œβ”€β”€ trajectory_plan.py
     β”‚Β Β          β”‚Β Β  └── trajectory_plan_factory.py
     β”‚Β Β          └── validation/
     β”‚Β Β              β”œβ”€β”€ feedrate/
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ feedrate_validator.py
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ feedrate_validator_factory.py
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ ifeedrate_validator.py
     β”‚Β Β              β”‚Β Β  └── __init__.py
     β”‚Β Β              β”œβ”€β”€ __init__.py
     β”‚Β Β              β”œβ”€β”€ itrajectory_validator.py
     β”‚Β Β              β”œβ”€β”€ plan/
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ itrajectory_plan_validator.py
     β”‚Β Β              β”‚Β Β  β”œβ”€β”€ trajectory_plan_validator.py
     β”‚Β Β              β”‚Β Β  └── trajectory_plan_validator_factory.py
     β”‚Β Β              β”œβ”€β”€ trajectory_validator.py
     β”‚Β Β              β”œβ”€β”€ trajectory_validator_factory.py
     β”‚Β Β              └── waypoint/
     β”‚Β Β                  β”œβ”€β”€ __init__.py
     β”‚Β Β                  β”œβ”€β”€ iwaypoint_validator.py
     β”‚Β Β                  β”œβ”€β”€ waypoint_validator.py
     β”‚Β Β                  └── waypoint_validator_factory.py
     β”œβ”€β”€ engine.py
     β”œβ”€β”€ infrastructure/
     β”‚Β Β  β”œβ”€β”€ cli/
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ engine.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icli.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compiler/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ irepl_single_command_compiler.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl_single_command_compiler.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── repl_single_command_compiler_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ dispatch/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ irepl_command_dispatcher.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl_command_dispatcher.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── repl_command_dispatcher_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ input/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ irepl_line_reader.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl_line_reader.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── repl_line_reader_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ presentation/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ irepl_response_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ repl_response_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── repl_response_presenter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── transmission/
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ irepl_frame_transmitter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ repl_frame_transmitter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      └── repl_frame_transmitter_factory.py
     β”‚Β Β  β”‚Β Β  └── setup/
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ bundle.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ dep_validator.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ dependencies.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ factory.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ keys.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ opt_validator.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ options.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ registry.py
     β”‚Β Β  β”‚Β Β      └── validator.py
     β”‚Β Β  β”œβ”€β”€ command/
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_bundle.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ command_bundle_factory.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compile/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compile_command_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compile_command_executor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ compile_command_executor_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ inspection/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ framing/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_header_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_header_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_trailer_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ frame_trailer_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hex_stream_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ hex_stream_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iframe_header_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ iframe_trailer_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ihex_stream_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ payload/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ijoint_steps_payload_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ipayload_dispatcher_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ itool_command_payload_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ joint_steps_payload_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ joint_steps_payload_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ payload_dispatcher_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ payload_dispatcher_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ tool_command_payload_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── tool_command_payload_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── presentation/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ frame_step_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ frame_step_presenter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ iframe_step_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ iprogram_inspection_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ program_inspection_presenter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      └── program_inspection_presenter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── telemetry/
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ compile_telemetry_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ compile_telemetry_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ icompile_telemetry_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β      └── __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble_command_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble_command_executor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble_command_executor_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ format/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble_summary_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ disassemble_summary_formatter_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ idisassemble_summary_formatter.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ export/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ export_command_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ export_command_executor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ export_command_executor_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_definition.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ icommand_executor.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ info/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ info_command_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ info_command_executor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ info_command_executor_factory.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lint/
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lint_command_definition.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lint_command_executor.py
     β”‚Β Β  β”‚Β Β  β”‚Β Β  └── lint_command_executor_factory.py
     β”‚Β Β  β”‚Β Β  └── repl/
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ repl_command_definition.py
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ repl_command_executor.py
     β”‚Β Β  β”‚Β Β      └── repl_command_executor_factory.py
     β”‚Β Β  β”œβ”€β”€ communication/
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β  └── protocol/
     β”‚Β Β  β”‚Β Β      β”œβ”€β”€ binary/
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”œβ”€β”€ binary_struct_format.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”œβ”€β”€ builder/
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_frame_builder.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ binary_frame_builder_factory.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”œβ”€β”€ checksum/
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”‚Β Β  β”œβ”€β”€ crc16_ccitt.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”‚Β Β  └── __init__.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β  └── parser/
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_frame_assembler.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_frame_assembler_factory.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_frame_parser.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_frame_parser_factory.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_payload_unpacker.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ binary_payload_unpacker_factory.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ ibinary_frame_assembler.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ __init__.py
     β”‚Β Β  β”‚Β Β      β”‚Β Β      └── parser_state.py
     β”‚Β Β  β”‚Β Β      └── __init__.py
     β”‚Β Β  β”œβ”€β”€ config/
     β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scaralang.cfg
     β”‚Β Β  β”‚Β Β  └── scaralang.logo
     β”‚Β Β  └── __init__.py
     β”œβ”€β”€ __init__.py
     β”œβ”€β”€ py.typed
     └── setup/
         β”œβ”€β”€ bundle.py
         β”œβ”€β”€ dep_validator.py
         β”œβ”€β”€ dependencies.py
         β”œβ”€β”€ factory.py
         β”œβ”€β”€ __init__.py
         β”œβ”€β”€ keys.py
         β”œβ”€β”€ opt_validator.py
         β”œβ”€β”€ options.py
         β”œβ”€β”€ registry.py
         └── validator.py

 117 directories, 545 files

πŸ— Architecture & SOLID PrinciplesΒΆ

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   CLI / Inbound Adapters                    β”‚
β”‚        (Compile, Disassemble, Lint, Info, Export, REPL)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚ Depends on Role Protocols     β”‚
               β–Ό                               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     IScaraDslLinter          β”‚β”‚  IScaraDslBinaryCompiler    β”‚
β”‚   (Validation & Diagnostics) β”‚β”‚  (Plan / Binary Generation) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚                               β”‚
               β–Ό                               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Application Services                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚     ScaraLexer     β”‚ β”‚   ScaraParser   β”‚ β”‚ScaraCompilerβ”‚ β”‚
β”‚  β”‚   (Token Stream)   β”‚ β”‚(Command Parsers)β”‚ β”‚(Macro Expan)β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚   BinaryCompiler   β”‚ β”‚ScaraDisassemblerβ”‚ β”‚ExportDispatcβ”‚ β”‚
β”‚  β”‚  (Step Generator)  β”‚ β”‚(Frame Breakdown)β”‚ β”‚(Multi-targetβ”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚ Operates on Pure Models
                               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Pure Domain Models                      β”‚
β”‚    (ScaraProgram, BinaryProgram, Waypoint, DisassemblySum,  β”‚
β”‚     InstructionParam, ScaraCommandType, MessageId, Zone)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

SOLID Principles ComplianceΒΆ

  • S β€” Single Responsibility Principle (SRP): Every module, class, and service has exactly one clearly bounded reason to change. Parser and compiler logic is decomposed into dedicated handlers (MotionCommandParser, ConfigCommandParser, PalletMacroExpander, StepDiscretizer) rather than a monolithic interpreter. Strict limit of <= 15 methods per class across the entire codebase enforced by automated Quality Gate.

  • O β€” Open/Closed Principle (OCP): The DSL parser, macro expanders, and exporters are open for extension without modifying existing code. Extensible Chain of Responsibility and dispatcher pattern allow registering new instruction handlers and export targets seamlessly.

  • L β€” Liskov Substitution Principle (LSP): Pure structural subtyping via Python @runtime_checkable Protocol definitions. Concrete classes never inherit from abstract protocols, ensuring complete structural interchangeability.

  • I β€” Interface Segregation Principle (ISP): Fat facade IScaraDslService is segregated into focused role protocols (IScaraDslBinaryCompiler, IScaraDslDisassembler, IScaraDslLinter, IScaraDslInfoProvider, IScaraDslCompiler, IScaraPlanExporter). Clients depend strictly on the minimal methods they call.

  • D β€” Dependency Inversion Principle (DIP): High-level domain services and CLI executors depend strictly on abstract protocols, never on concrete implementations. All infrastructure dependencies are injected via constructor Dependency Injection (Zero-Fallback DI).

Automated Quality Gates (run_quality_gates.sh)ΒΆ

Every build is validated against 4 strict automated quality gates:

  1. Structural Protocols Gate (``interfaces_checker.py``): Verifies 100% compliance with @runtime_checkable Protocol structural typing across concrete implementations.

  2. Interface Segregation Gate (``isp_checker.py``): Enforces ISP compliance and verifies that no bloated or unused interfaces exist.

  3. Module Limits Gate (``limits_checker.py``): Enforces file length, method count, and line length limits (<= 150 characters).

  4. Single Responsibility Gate (``srp_checker.py``): Strictly enforces <= 15 methods per class and logical method line limits.

✨ Features¢

  • High-Level SCARA DSL Toolchain: Lexer, Tokenizer, Line Splitter, AST Parser, Linter, and Semantic Validator for human-readable SCARA motion scripts (.scara).

  • Deterministic Bytecode Compiler: Direct translation of high-level Cartesian DSL trajectories into discrete stepper motor joint step blocks (JointSteps, Step, BinaryProgram).

  • SCARA Binary Wire Protocol Codec: High-performance streaming frame parser, payload unpacker, frame builder, and CRC-16-CCITT integrity verification (0xAA 0x55 header framing).

  • Multi-Target Trajectory Exporter: Export robotic trajectories into industrial G-code, CSV time-series data, JSON trajectory bundles, and SVG vector toolpaths.

  • Interactive Motion REPL Console: Terminal-based interactive console (scarac repl) for real-time single-command compilation, inspection, and frame transmission.

  • Single Source of Truth (SSoT): Seamless domain and codec foundation shared between scarajectory (Desktop Studio), scaraemu (Digital Twin Simulator), and dof2bot/scara (RP2040 firmware).

  • Zero GUI Dependencies: 100% headless, clean architecture design with zero Tkinter, Qt, or graphics dependencies.

  • Strict Quality & SOLID Standards: 100% structural protocol conformance, 99% test coverage, and 10.00 / 10.00 Pylint score.

πŸ“œ SCARA Domain-Specific Language (DSL) & .scara ProgramsΒΆ

scaralang includes a dedicated, industrial-grade Domain-Specific Language designed specifically for SCARA robotic manipulators. Programs are written in plain text files with the .scara extension and compiled into validated Cartesian trajectories via a clean AST pipeline:

  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚      .scara Source      β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ScaraLexer β”‚
               β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚      Token Stream       β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
   ScaraParser β”‚
               β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚       Abstract AST      β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
 ScaraCompiler β”‚ (Macros + Kinematics)
               β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚      TrajectoryPlan     β”‚
  β”‚(Waypoints & Discretize) β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
BinaryCompiler β”‚ (Step Discretization)
               β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚      BinaryProgram      β”‚
  β”‚(Wire Frames & Bytecode) β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

SCARA DSL Instruction ReferenceΒΆ

For the exhaustive syntax specification, boundary constraints, and compiler rules, see LANGUAGE_REFERENCE.md.

SCARA DSL Instruction ReferenceΒΆ

Category

Instruction & Syntax

Parameters

Description

Motion

MOVE_J X <x> Y <y> Z <z> [P <phi>]

X, Y, Z (mm), P (deg)

Rapid non-interpolated Cartesian joint motion.

MOVE_L X <x> Y <y> Z <z> [P <phi>]

X, Y, Z (mm), P (deg)

Linear continuous path interpolated motion.

ARC_CW X <x> Y <y> I <i> J <j> [Z <z>] [P <p>]

X, Y target, I, J center offset

Clockwise circular arc interpolation in XY plane.

ARC_CCW X <x> Y <y> I <i> J <j> [Z <z>] [P <p>]

X, Y target, I, J center offset

Counter-clockwise circular arc interpolation.

APPROACH DIST <d>

DIST (mm, > 0)

Relative vertical descent along -Z axis.

RETRACT DIST <d>

DIST (mm, > 0)

Relative vertical ascent along +Z axis.

JOG_AXIS <X|Y|Z|PHI> <step>

Axis name, step displacement

Incremental single-axis manual jog move.

JOG_JOINT <1|2|3|4> <deg>

Joint ID (1..4), angle (deg)

Incremental individual joint rotational jog.

PROBE [SPEED <s>] [DIST <d>]

SPEED (mm/s), DIST (mm)

Tactile surface contact search along -Z axis.

Macros

JUMP X <x> Y <y> Z <z> [ARCH <h>]

X, Y, Z, ARCH apex clearance

Smooth 3D parabolic pick-and-place arch motion.

PALLET_DEF <id> ROWS <r> COLS <c> DX <dx> DY <dy>

Matrix dimensions & grid spacing

Defines structured 2D Cartesian pallet matrix.

MOVE_PALLET <id> INDEX <i>

Pallet identifier, 1-based index

Direct positioning to pallet matrix cell.

Actuators

PUMP <ON|OFF>

ON or OFF

Energizes or cuts end-effector vacuum pump.

VALVE <ON|OFF>

ON or OFF

Opens or closes pneumatic release blow-off valve.

TOOL <UP|DOWN>

UP or DOWN

Actuates tool head vertical pneumatic slide stage.

TOOL_ORIENT <AUTO|TANGENT|FIXED>

Tracking mode

Configures 4th-axis tool yaw orientation mode.

Dynamics

SPEED <RAPID|WORK> <val>

RAPID or WORK, feedrate (mm/s)

Configures travel or working linear feedrate.

ACCEL <val>

val (mm/sΒ²)

Configures linear path acceleration limit.

OVERRIDE <percent>

percent (10% - 200%)

Scales path execution velocity dynamically.

ZONE <OFF|FINE|EXACT|Z1..Z50>

Corner rounding tolerance (mm)

Corner tolerance zone for trajectory smoothing.

Kinematics

CONFIG ELBOW <LEFT|RIGHT>

LEFT or RIGHT

Sets arm kinematic inverse solution branch.

CONFIG MOTOR <OPEN_LOOP|CLOSED_LOOP>

Drive control mode

Selects open-loop microstepping or closed-loop FOC.

FRAME X <x> Y <y> Z <z> [PHI <p>]

Cartesian offset coordinates

Defines user workpiece reference coordinate frame.

FRAME_RESET

None

Resets coordinate system to base world origin.

HOME

None

Triggers complete multi-axis homing routine.

Safety & Flow

WAIT <ms> / WAIT_MS <ms>

ms (milliseconds)

Dwells execution for specified hardware duration.

SYNC

None

Trajectory execution barrier (drains buffer).

HOLD

None

Trajectory feed hold; pauses running motion.

RESUME

None

Resumes previously suspended trajectory.

ESTOP

None

Immediate emergency stop and motion abort.

ENABLE

None

Energizes motor driver stages (holding torque).

DISABLE

None

De-energizes motor driver stages (free movement).

Example .scara Program: Industrial Pick & PlaceΒΆ

# ----------------------------------------------------
# Industrial Pick-and-Place Cycle with Pneumatic Grip
# ----------------------------------------------------
CONFIG ELBOW LEFT
SPEED RAPID 180.0
SPEED WORK 60.0
ACCEL 400.0
OVERRIDE 100

# Home robot to reference position
HOME

# Rapid move above pick feeder station
MOVE_J X 140.0 Y -30.0 Z 35.0
APPROACH DIST 30.0

# Engage suction cup and pause for vacuum seal
PUMP ON
WAIT 200

# Retract with part
RETRACT DIST 30.0

# Smooth 3D parabolic arch transfer to drop location
JUMP X 180.0 Y 30.0 Z 5.0 ARCH 40.0

# Release part with air pulse
PUMP OFF
VALVE ON
WAIT 100
VALVE OFF

# Retract to safe transit altitude
RETRACT DIST 30.0
HOME

πŸ“‘ SCARA Binary Wire Protocol & CodecΒΆ

All binary wire communication between scaralang, scarajectory, scaraemu, and physical robot firmware is governed by deterministic packet framing:

Frame Header & Wire FormatΒΆ

Each binary frame consists of a 4-byte header, variable payload, and 2-byte CRC-16-CCITT checksum:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  SOF1 (0xAA) β”‚  SOF2 (0x55) β”‚  Msg ID (1B) β”‚  Payload Len (1B)β”‚ Payload (NB) β”‚ ... CRC16 (2B)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Types & Payload StructureΒΆ

Binary Message TypesΒΆ

Message ID

Enum Identifier

Payload Structure

Description

0x01

JOINT_STEPS

Step[n] (8 bytes per step: Ξ”S1, Ξ”S2, Ξ”S3, Ξ”S4)

Coordinated stepper motor joint step block.

0x02

TOOL_COMMAND

ToolId (1B), Action (1B), Param (2B)

End-effector actuator trigger (vacuum, gripper, valve).

0x03

ESTOP

Empty (0 bytes)

Immediate hardware emergency stop.

0x04

PAUSE

Empty (0 bytes)

Pause execution / feed hold.

0x05

RESUME

Empty (0 bytes)

Resume paused trajectory execution.

0x06

HEARTBEAT

Sequence (4B), Status (1B)

Real-time link health and operational state beacon.

0x07

SYNC

Timestamp (4B)

Clock synchronization and timestamp alignment.

Hardware Execution & Motor Actuation TargetsΒΆ

Binary wire frames generated by scaralang stream directly over UART / USB-CDC to the physical ``scara_base`` firmware running on the Raspberry Pi Pico (RP2040), which coordinates motor actuation across two configurable drive modes:

  • Open-Loop Stepper Mode (TMC2209): Coordinated microstepping pulses generated by RP2040 PIO hardware state machines driving TMC2209 STEP/DIR stages for ultra-silent operation.

  • Closed-Loop Stepper Mode (MKS SERVO42D over CAN Bus): NEMA stepper motors equipped with MKS SERVO42D closed-loop modules communicating with the Raspberry Pi Pico over a high-speed differential CAN bus (CAN_H / CAN_L). This guarantees 100% elimination of lost steps, hardware PID closed-loop position correction, and real-time following-error telemetry.

πŸ“Š Code coverageΒΆ

Code coverageΒΆ

Name

Stmts

Miss

Cover

scaralang/__init__.py

9

0

100%

scaralang/core/__init__.py

9

0

100%

scaralang/core/model/__init__.py

9

0

100%

scaralang/core/model/dsl/__init__.py

9

0

100%

scaralang/core/model/dsl/ast/__init__.py

9

0

100%

scaralang/core/model/dsl/ast/command_type.py

47

0

100%

scaralang/core/model/dsl/ast/instruction.py

18

0

100%

scaralang/core/model/dsl/ast/instruction_param.py

57

0

100%

scaralang/core/model/dsl/ast/jog_axis.py

16

0

100%

scaralang/core/model/dsl/ast/pneumatic_state.py

14

0

100%

scaralang/core/model/dsl/ast/program.py

14

0

100%

scaralang/core/model/dsl/ast/speed_mode.py

14

0

100%

scaralang/core/model/dsl/ast/tool_orient_mode.py

15

0

100%

scaralang/core/model/dsl/ast/tool_position.py

14

0

100%

scaralang/core/model/dsl/ast/zone_mode.py

15

0

100%

scaralang/core/model/dsl/binary/__init__.py

9

0

100%

scaralang/core/model/dsl/binary/binary_program_telemetry.py

21

0

100%

scaralang/core/model/dsl/binary/disassembled_frame.py

17

0

100%

scaralang/core/model/dsl/binary/disassembly_summary.py

18

0

100%

scaralang/core/model/dsl/binary/parsed_command_token.py

16

0

100%

scaralang/core/model/dsl/binary/program.py

20

0

100%

scaralang/core/model/dsl/binary/step.py

19

0

100%

scaralang/core/model/dsl/compiler/__init__.py

9

0

100%

scaralang/core/model/dsl/compiler/arc_geometry.py

18

0

100%

scaralang/core/model/dsl/compiler/control_waypoint_descriptor.py

16

0

100%

scaralang/core/model/dsl/compiler/scara_compiler_context.py

35

0

100%

scaralang/core/model/dsl/diagnostic/__init__.py

9

0

100%

scaralang/core/model/dsl/diagnostic/scara_diagnostic.py

18

0

100%

scaralang/core/model/dsl/diagnostic/scara_diagnostic_code.py

23

0

100%

scaralang/core/model/dsl/diagnostic/scara_diagnostic_severity.py

15

0

100%

scaralang/core/model/dsl/exporter/__init__.py

9

0

100%

scaralang/core/model/dsl/exporter/export_format.py

17

0

100%

scaralang/core/model/dsl/linter/__init__.py

9

0

100%

scaralang/core/model/dsl/linter/scara_lint_context.py

22

0

100%

scaralang/core/model/dsl/macro/__init__.py

9

0

100%

scaralang/core/model/dsl/macro/pallet_definition.py

19

0

100%

scaralang/core/model/dsl/macro/work_frame.py

15

0

100%

scaralang/core/model/dsl/token/__init__.py

9

0

100%

scaralang/core/model/dsl/token/lexer_pattern_kind.py

22

0

100%

scaralang/core/model/dsl/token/scara_token.py

17

0

100%

scaralang/core/model/dsl/token/scara_token_type.py

23

0

100%

scaralang/core/model/kinematics/__init__.py

9

0

100%

scaralang/core/model/kinematics/elbow_config.py

14

0

100%

scaralang/core/model/kinematics/point_2d.py

14

0

100%

scaralang/core/model/kinematics/point_3d.py

15

0

100%

scaralang/core/model/kinematics/scara_bounds.py

29

0

100%

scaralang/core/model/kinematics/transmission_parameters.py

18

0

100%

scaralang/core/model/motor/__init__.py

9

0

100%

scaralang/core/model/motor/axis_mask.py

18

0

100%

scaralang/core/model/motor/motor_config.py

18

0

100%

scaralang/core/model/motor/motor_drive_mode.py

14

0

100%

scaralang/core/model/motor/motor_interface_type.py

15

0

100%

scaralang/core/model/protocol/__init__.py

9

0

100%

scaralang/core/model/protocol/binary_delimiter.py

15

0

100%

scaralang/core/model/protocol/binary_frame.py

17

0

100%

scaralang/core/model/protocol/error_code.py

21

0

100%

scaralang/core/model/protocol/joint_steps.py

18

0

100%

scaralang/core/model/protocol/message_id.py

41

0

100%

scaralang/core/model/protocol/motor_wire_mode.py

14

0

100%

scaralang/core/model/protocol/tool_id.py

13

0

100%

scaralang/core/model/repl/__init__.py

9

0

100%

scaralang/core/model/repl/repl_dispatch_result.py

15

0

100%

scaralang/core/model/repl/repl_session_context.py

23

0

100%

scaralang/core/model/trajectory/__init__.py

9

0

100%

scaralang/core/model/trajectory/arc_point.py

15

0

100%

scaralang/core/model/trajectory/axis_peak_metric.py

16

0

100%

scaralang/core/model/trajectory/bottleneck_incident.py

16

0

100%

scaralang/core/model/trajectory/circle_geometry.py

18

0

100%

scaralang/core/model/trajectory/trajectory_cycle_report.py

18

0

100%

scaralang/core/model/trajectory/validation_result.py

15

0

100%

scaralang/core/model/trajectory/waypoint.py

19

0

100%

scaralang/core/service/__init__.py

9

0

100%

scaralang/core/service/compiler/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/binary_compiler.py

28

0

100%

scaralang/core/service/compiler/binary/binary_compiler_factory.py

20

0

100%

scaralang/core/service/compiler/binary/command/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/command/command_compiler.py

56

0

100%

scaralang/core/service/compiler/binary/command/command_compiler_factory.py

31

0

100%

scaralang/core/service/compiler/binary/command/icommand_compiler.py

14

0

100%

scaralang/core/service/compiler/binary/command/motor/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/command/motor/imotor_frame_builder.py

14

0

100%

scaralang/core/service/compiler/binary/command/motor/motor_frame_builder.py

23

0

100%

scaralang/core/service/compiler/binary/command/motor/motor_frame_builder_factory.py

19

0

100%

scaralang/core/service/compiler/binary/command/tokens/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/command/tokens/command_token_parser.py

22

0

100%

scaralang/core/service/compiler/binary/command/tokens/command_token_parser_factory.py

18

0

100%

scaralang/core/service/compiler/binary/command/tokens/icommand_token_parser.py

16

0

100%

scaralang/core/service/compiler/binary/command/tool/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/command/tool/itool_frame_builder.py

15

0

100%

scaralang/core/service/compiler/binary/command/tool/tool_frame_builder.py

21

0

100%

scaralang/core/service/compiler/binary/command/tool/tool_frame_builder_factory.py

19

0

100%

scaralang/core/service/compiler/binary/ibinary_compiler.py

15

0

100%

scaralang/core/service/compiler/binary/metrics/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/metrics/binary_metrics_calculator.py

26

0

100%

scaralang/core/service/compiler/binary/metrics/binary_metrics_calculator_factory.py

18

0

100%

scaralang/core/service/compiler/binary/metrics/ibinary_metrics_calculator.py

17

0

100%

scaralang/core/service/compiler/binary/motion/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/motion/imotion_compiler.py

15

0

100%

scaralang/core/service/compiler/binary/motion/motion_compiler.py

28

0

100%

scaralang/core/service/compiler/binary/motion/motion_compiler_factory.py

20

0

100%

scaralang/core/service/compiler/binary/step/__init__.py

9

0

100%

scaralang/core/service/compiler/binary/step/istep_discretizer.py

16

0

100%

scaralang/core/service/compiler/binary/step/iwaypoint_step_dispatcher.py

16

0

100%

scaralang/core/service/compiler/binary/step/step_discretizer.py

42

2

95%

scaralang/core/service/compiler/binary/step/step_discretizer_factory.py

20

0

100%

scaralang/core/service/compiler/binary/step/waypoint_step_dispatcher.py

32

0

100%

scaralang/core/service/compiler/binary/step/waypoint_step_dispatcher_factory.py

20

0

100%

scaralang/core/service/compiler/frame/__init__.py

9

0

100%

scaralang/core/service/compiler/frame/frame_transformer.py

22

0

100%

scaralang/core/service/compiler/frame/frame_transformer_factory.py

18

0

100%

scaralang/core/service/compiler/frame/iframe_transformer.py

15

0

100%

scaralang/core/service/compiler/iinstruction_pipeline.py

16

0

100%

scaralang/core/service/compiler/instruction_pipeline.py

36

0

100%

scaralang/core/service/compiler/instruction_pipeline_factory.py

27

1

96%

scaralang/core/service/compiler/iprimitive_instruction_processor.py

16

0

100%

scaralang/core/service/compiler/iscara_compiler.py

15

0

100%

scaralang/core/service/compiler/macro/__init__.py

9

0

100%

scaralang/core/service/compiler/macro/frame_macro_expander.py

29

0

100%

scaralang/core/service/compiler/macro/frame_macro_expander_factory.py

18

0

100%

scaralang/core/service/compiler/macro/imacro_expander.py

16

0

100%

scaralang/core/service/compiler/macro/itangent_macro_expander.py

18

0

100%

scaralang/core/service/compiler/macro/jump_macro_expander.py

34

0

100%

scaralang/core/service/compiler/macro/jump_macro_expander_factory.py

18

0

100%

scaralang/core/service/compiler/macro/pallet_macro_expander.py

43

0

100%

scaralang/core/service/compiler/macro/pallet_macro_expander_factory.py

23

0

100%

scaralang/core/service/compiler/macro/tangent_macro_expander.py

34

0

100%

scaralang/core/service/compiler/macro/tangent_macro_expander_factory.py

18

0

100%

scaralang/core/service/compiler/motion/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/arc/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/arc/arc_move_compiler.py

40

0

100%

scaralang/core/service/compiler/motion/arc/arc_move_compiler_factory.py

29

1

97%

scaralang/core/service/compiler/motion/arc/builder/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/arc/builder/arc_waypoint_builder.py

21

0

100%

scaralang/core/service/compiler/motion/arc/builder/arc_waypoint_builder_factory.py

18

0

100%

scaralang/core/service/compiler/motion/arc/builder/iarc_waypoint_builder.py

17

0

100%

scaralang/core/service/compiler/motion/arc/calculator/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/arc/calculator/arc_point_calculator.py

35

0

100%

scaralang/core/service/compiler/motion/arc/calculator/arc_point_calculator_factory.py

28

1

96%

scaralang/core/service/compiler/motion/arc/calculator/iarc_point_calculator.py

18

0

100%

scaralang/core/service/compiler/motion/arc/interpolation/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/arc/interpolation/arc_interpolator.py

40

1

98%

scaralang/core/service/compiler/motion/arc/interpolation/arc_interpolator_factory.py

18

0

100%

scaralang/core/service/compiler/motion/arc/interpolation/iarc_interpolator.py

15

0

100%

scaralang/core/service/compiler/motion/cartesian/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/cartesian/cartesian_move_compiler.py

45

0

100%

scaralang/core/service/compiler/motion/cartesian/cartesian_move_compiler_factory.py

28

0

100%

scaralang/core/service/compiler/motion/imotion_sub_compiler.py

17

0

100%

scaralang/core/service/compiler/motion/motion_command_compiler.py

34

0

100%

scaralang/core/service/compiler/motion/motion_command_compiler_factory.py

26

0

100%

scaralang/core/service/compiler/motion/vertical/__init__.py

9

0

100%

scaralang/core/service/compiler/motion/vertical/vertical_move_compiler.py

33

0

100%

scaralang/core/service/compiler/motion/vertical/vertical_move_compiler_factory.py

18

0

100%

scaralang/core/service/compiler/primitive/__init__.py

9

0

100%

scaralang/core/service/compiler/primitive/control/__init__.py

9

0

100%

scaralang/core/service/compiler/primitive/control/control_command_compiler.py

42

0

100%

scaralang/core/service/compiler/primitive/control/control_command_compiler_factory.py

23

0

100%

scaralang/core/service/compiler/primitive/control/control_waypoint_builder.py

16

0

100%

scaralang/core/service/compiler/primitive/control/control_waypoint_builder_factory.py

18

0

100%

scaralang/core/service/compiler/primitive/control/icontrol_waypoint_builder.py

16

0

100%

scaralang/core/service/compiler/primitive/iprimitive_compiler.py

17

0

100%

scaralang/core/service/compiler/primitive/state/__init__.py

9

0

100%

scaralang/core/service/compiler/primitive/state/state_command_compiler.py

47

0

100%

scaralang/core/service/compiler/primitive/state/state_command_compiler_factory.py

18

0

100%

scaralang/core/service/compiler/primitive/tool/__init__.py

9

0

100%

scaralang/core/service/compiler/primitive/tool/itool_waypoint_builder.py

17

0

100%

scaralang/core/service/compiler/primitive/tool/tool_command_compiler.py

34

0

100%

scaralang/core/service/compiler/primitive/tool/tool_command_compiler_factory.py

23

0

100%

scaralang/core/service/compiler/primitive/tool/tool_waypoint_builder.py

20

0

100%

scaralang/core/service/compiler/primitive/tool/tool_waypoint_builder_factory.py

18

0

100%

scaralang/core/service/compiler/primitive_instruction_processor.py

24

0

100%

scaralang/core/service/compiler/primitive_instruction_processor_factory.py

20

0

100%

scaralang/core/service/compiler/scara_compiler.py

32

0

100%

scaralang/core/service/compiler/scara_compiler_factory.py

43

0

100%

scaralang/core/service/disassembler/__init__.py

9

0

100%

scaralang/core/service/disassembler/frame_detail_decoder.py

63

0

100%

scaralang/core/service/disassembler/frame_detail_decoder_factory.py

18

0

100%

scaralang/core/service/disassembler/iframe_detail_decoder.py

15

0

100%

scaralang/core/service/disassembler/iscara_disassembler.py

18

0

100%

scaralang/core/service/disassembler/scara_disassembler.py

33

0

100%

scaralang/core/service/disassembler/scara_disassembler_factory.py

20

0

100%

scaralang/core/service/dsl/__init__.py

9

0

100%

scaralang/core/service/dsl/binary/__init__.py

9

0

100%

scaralang/core/service/dsl/binary/binary_service.py

31

0

100%

scaralang/core/service/dsl/binary/binary_service_factory.py

39

0

100%

scaralang/core/service/dsl/binary/ibinary_service.py

21

0

100%

scaralang/core/service/dsl/compilation/__init__.py

9

0

100%

scaralang/core/service/dsl/compilation/iscara_dsl_compiler.py

16

0

100%

scaralang/core/service/dsl/compilation/scara_dsl_compiler.py

34

0

100%

scaralang/core/service/dsl/compilation/scara_dsl_compiler_factory.py

21

0

100%

scaralang/core/service/dsl/iscara_dsl_binary_compiler.py

19

0

100%

scaralang/core/service/dsl/iscara_dsl_disassembler.py

16

0

100%

scaralang/core/service/dsl/iscara_dsl_info_provider.py

13

0

100%

scaralang/core/service/dsl/iscara_dsl_linter.py

14

0

100%

scaralang/core/service/dsl/iscara_dsl_service.py

19

0

100%

scaralang/core/service/dsl/iscara_dsl_validator.py

16

0

100%

scaralang/core/service/dsl/scara_dsl_bundle.py

22

0

100%

scaralang/core/service/dsl/scara_dsl_pipeline_bundle.py

24

0

100%

scaralang/core/service/dsl/scara_dsl_service.py

67

1

99%

scaralang/core/service/dsl/scara_dsl_service_factory.py

50

0

100%

scaralang/core/service/dsl/toolchain/__init__.py

9

0

100%

scaralang/core/service/dsl/toolchain/itoolchain_info_provider.py

14

0

100%

scaralang/core/service/dsl/toolchain/toolchain_info_provider.py

19

0

100%

scaralang/core/service/dsl/toolchain/toolchain_info_provider_factory.py

18

0

100%

scaralang/core/service/dsl/validation/__init__.py

9

0

100%

scaralang/core/service/dsl/validation/scara_script_validator.py

46

0

100%

scaralang/core/service/dsl/validation/scara_script_validator_factory.py

21

0

100%

scaralang/core/service/exporter/__init__.py

9

0

100%

scaralang/core/service/exporter/csv/__init__.py

9

0

100%

scaralang/core/service/exporter/csv/csv_trajectory_exporter.py

19

0

100%

scaralang/core/service/exporter/csv/csv_trajectory_exporter_factory.py

18

0

100%

scaralang/core/service/exporter/csv/icsv_trajectory_exporter.py

16

0

100%

scaralang/core/service/exporter/export_dispatcher_bundle.py

22

0

100%

scaralang/core/service/exporter/export_target_dispatcher.py

44

0

100%

scaralang/core/service/exporter/export_target_dispatcher_factory.py

28

0

100%

scaralang/core/service/exporter/gcode/__init__.py

9

0

100%

scaralang/core/service/exporter/gcode/gcode_exporter.py

24

0

100%

scaralang/core/service/exporter/gcode/gcode_exporter_factory.py

18

0

100%

scaralang/core/service/exporter/gcode/igcode_exporter.py

16

0

100%

scaralang/core/service/exporter/iexport_target_dispatcher.py

16

0

100%

scaralang/core/service/exporter/json/__init__.py

9

0

100%

scaralang/core/service/exporter/json/ijson_trajectory_exporter.py

16

0

100%

scaralang/core/service/exporter/json/json_trajectory_exporter.py

18

0

100%

scaralang/core/service/exporter/json/json_trajectory_exporter_factory.py

18

0

100%

scaralang/core/service/exporter/scara/__init__.py

9

0

100%

scaralang/core/service/exporter/scara/iscara_plan_exporter.py

16

0

100%

scaralang/core/service/exporter/scara/scara_plan_exporter.py

27

0

100%

scaralang/core/service/exporter/scara/scara_plan_exporter_factory.py

18

0

100%

scaralang/core/service/exporter/scara/scara_program_serializer.py

18

0

100%

scaralang/core/service/exporter/scara/scara_source_generator.py

22

0

100%

scaralang/core/service/exporter/svg/__init__.py

9

0

100%

scaralang/core/service/exporter/svg/isvg_trajectory_exporter.py

17

0

100%

scaralang/core/service/exporter/svg/svg_trajectory_exporter.py

25

0

100%

scaralang/core/service/exporter/svg/svg_trajectory_exporter_factory.py

18

0

100%

scaralang/core/service/kinematics/__init__.py

9

0

100%

scaralang/core/service/kinematics/default_scara_profile.py

21

0

100%

scaralang/core/service/kinematics/ikinematics_service.py

26

0

100%

scaralang/core/service/kinematics/kinematics_service.py

96

0

100%

scaralang/core/service/kinematics/kinematics_service_factory.py

23

0

100%

scaralang/core/service/kinematics/transmission/__init__.py

9

0

100%

scaralang/core/service/kinematics/transmission/ijoint_step_transmission_converter.py

16

0

100%

scaralang/core/service/kinematics/transmission/joint_step_transmission_converter.py

32

0

100%

scaralang/core/service/kinematics/transmission/joint_step_transmission_converter_factory.py

23

0

100%

scaralang/core/service/linter/__init__.py

9

0

100%

scaralang/core/service/linter/diagnostic/__init__.py

9

0

100%

scaralang/core/service/linter/diagnostic/iscara_diagnostic_formatter.py

15

0

100%

scaralang/core/service/linter/diagnostic/scara_diagnostic_formatter.py

18

0

100%

scaralang/core/service/linter/diagnostic/scara_diagnostic_formatter_factory.py

18

0

100%

scaralang/core/service/linter/iscara_linter.py

18

0

100%

scaralang/core/service/linter/rules/__init__.py

9

0

100%

scaralang/core/service/linter/rules/iscara_lint_rule.py

18

0

100%

scaralang/core/service/linter/rules/motion/__init__.py

9

0

100%

scaralang/core/service/linter/rules/motion/imotion_calibration_validator.py

18

0

100%

scaralang/core/service/linter/rules/motion/imotion_duplicate_validator.py

18

0

100%

scaralang/core/service/linter/rules/motion/motion_calibration_validator.py

22

1

95%

scaralang/core/service/linter/rules/motion/motion_calibration_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/motion/motion_duplicate_validator.py

39

1

97%

scaralang/core/service/linter/rules/motion/motion_duplicate_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/motion/motion_lint_rule.py

34

0

100%

scaralang/core/service/linter/rules/motion/motion_lint_rule_factory.py

25

0

100%

scaralang/core/service/linter/rules/pneumatic/__init__.py

9

0

100%

scaralang/core/service/linter/rules/pneumatic/ipneumatic_conflict_validator.py

18

0

100%

scaralang/core/service/linter/rules/pneumatic/ipneumatic_flyby_validator.py

18

0

100%

scaralang/core/service/linter/rules/pneumatic/ipneumatic_redundancy_validator.py

18

0

100%

scaralang/core/service/linter/rules/pneumatic/pneumatic_conflict_validator.py

32

1

97%

scaralang/core/service/linter/rules/pneumatic/pneumatic_conflict_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/pneumatic/pneumatic_flyby_validator.py

25

1

96%

scaralang/core/service/linter/rules/pneumatic/pneumatic_flyby_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/pneumatic/pneumatic_lint_rule.py

45

0

100%

scaralang/core/service/linter/rules/pneumatic/pneumatic_lint_rule_factory.py

27

0

100%

scaralang/core/service/linter/rules/pneumatic/pneumatic_redundancy_validator.py

32

1

97%

scaralang/core/service/linter/rules/pneumatic/pneumatic_redundancy_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/state/__init__.py

9

0

100%

scaralang/core/service/linter/rules/state/imotor_mode_validator.py

18

0

100%

scaralang/core/service/linter/rules/state/istate_homing_validator.py

17

0

100%

scaralang/core/service/linter/rules/state/istate_zone_validator.py

18

0

100%

scaralang/core/service/linter/rules/state/motor_mode_validator.py

35

0

100%

scaralang/core/service/linter/rules/state/motor_mode_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/state/state_homing_validator.py

20

1

95%

scaralang/core/service/linter/rules/state/state_homing_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/state/state_lint_rule.py

38

0

100%

scaralang/core/service/linter/rules/state/state_lint_rule_factory.py

28

0

100%

scaralang/core/service/linter/rules/state/state_zone_validator.py

37

1

97%

scaralang/core/service/linter/rules/state/state_zone_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/timing/__init__.py

9

0

100%

scaralang/core/service/linter/rules/timing/itiming_blend_zone_validator.py

18

0

100%

scaralang/core/service/linter/rules/timing/itiming_dwell_validator.py

17

0

100%

scaralang/core/service/linter/rules/timing/timing_blend_zone_validator.py

27

1

96%

scaralang/core/service/linter/rules/timing/timing_blend_zone_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/timing/timing_dwell_validator.py

27

1

96%

scaralang/core/service/linter/rules/timing/timing_dwell_validator_factory.py

18

0

100%

scaralang/core/service/linter/rules/timing/timing_lint_rule.py

33

0

100%

scaralang/core/service/linter/rules/timing/timing_lint_rule_factory.py

25

0

100%

scaralang/core/service/linter/scara_linter.py

35

0

100%

scaralang/core/service/linter/scara_linter_factory.py

27

0

100%

scaralang/core/service/motor/__init__.py

9

0

100%

scaralang/core/service/motor/motor_config_factory.py

51

0

100%

scaralang/core/service/motor/motor_drive_mode_resolver.py

28

0

100%

scaralang/core/service/motor/motor_interface_resolver.py

30

0

100%

scaralang/core/service/motor/motor_wire_mode_converter.py

25

0

100%

scaralang/core/service/parser/__init__.py

9

0

100%

scaralang/core/service/parser/commands/__init__.py

9

0

100%

scaralang/core/service/parser/commands/config/__init__.py

9

0

100%

scaralang/core/service/parser/commands/config/accel_config_parser.py

26

0

100%

scaralang/core/service/parser/commands/config/config_command_parser_factory.py

24

0

100%

scaralang/core/service/parser/commands/config/elbow_config_parser.py

32

0

100%

scaralang/core/service/parser/commands/config/motor_config_parser.py

56

0

100%

scaralang/core/service/parser/commands/config/override_config_parser.py

26

0

100%

scaralang/core/service/parser/commands/config/speed_config_parser.py

30

0

100%

scaralang/core/service/parser/commands/config/tool_orient_command_parser.py

35

0

100%

scaralang/core/service/parser/commands/config/zone_command_parser.py

35

1

97%

scaralang/core/service/parser/commands/flow/__init__.py

9

0

100%

scaralang/core/service/parser/commands/flow/disable_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/enable_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/estop_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/flow_command_parser_factory.py

24

0

100%

scaralang/core/service/parser/commands/flow/hold_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/resume_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/sync_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/flow/wait_command_parser.py

28

0

100%

scaralang/core/service/parser/commands/frame/__init__.py

9

0

100%

scaralang/core/service/parser/commands/frame/frame_command_parser_factory.py

19

0

100%

scaralang/core/service/parser/commands/frame/frame_reset_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/frame/frame_set_command_parser.py

24

0

100%

scaralang/core/service/parser/commands/icommand_parser.py

18

0

100%

scaralang/core/service/parser/commands/icommand_parser_provider.py

17

0

100%

scaralang/core/service/parser/commands/macro/__init__.py

9

0

100%

scaralang/core/service/parser/commands/macro/jump_command_parser.py

27

1

96%

scaralang/core/service/parser/commands/macro/macro_command_parser_factory.py

20

0

100%

scaralang/core/service/parser/commands/macro/pallet_def_command_parser.py

30

0

100%

scaralang/core/service/parser/commands/macro/pallet_move_command_parser.py

30

0

100%

scaralang/core/service/parser/commands/motion/__init__.py

9

0

100%

scaralang/core/service/parser/commands/motion/approach_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/motion/arc_command_parser.py

25

0

100%

scaralang/core/service/parser/commands/motion/home_command_parser.py

22

0

100%

scaralang/core/service/parser/commands/motion/jog_command_parser.py

35

0

100%

scaralang/core/service/parser/commands/motion/joint_move_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/motion/linear_move_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/motion/motion_command_parser_factory.py

25

0

100%

scaralang/core/service/parser/commands/motion/probe_command_parser.py

24

0

100%

scaralang/core/service/parser/commands/motion/retract_command_parser.py

23

0

100%

scaralang/core/service/parser/commands/parameter/__init__.py

9

0

100%

scaralang/core/service/parser/commands/parameter/parameter_extractor.py

39

0

100%

scaralang/core/service/parser/commands/tool/__init__.py

9

0

100%

scaralang/core/service/parser/commands/tool/pump_command_parser.py

31

0

100%

scaralang/core/service/parser/commands/tool/tool_command_parser.py

31

0

100%

scaralang/core/service/parser/commands/tool/tool_command_parser_factory.py

20

0

100%

scaralang/core/service/parser/commands/tool/valve_command_parser.py

31

0

100%

scaralang/core/service/parser/instruction/__init__.py

9

0

100%

scaralang/core/service/parser/instruction/iinstruction_line_parser.py

20

0

100%

scaralang/core/service/parser/instruction/instruction_line_parser.py

54

0

100%

scaralang/core/service/parser/instruction/instruction_line_parser_factory.py

36

0

100%

scaralang/core/service/parser/iscara_parser.py

19

0

100%

scaralang/core/service/parser/lexer/__init__.py

9

0

100%

scaralang/core/service/parser/lexer/iscara_lexer.py

16

0

100%

scaralang/core/service/parser/lexer/scara_lexer.py

45

1

98%

scaralang/core/service/parser/lexer/scara_lexer_factory.py

18

0

100%

scaralang/core/service/parser/scara_parser.py

34

0

100%

scaralang/core/service/parser/scara_parser_factory.py

31

0

100%

scaralang/core/service/parser/splitter/__init__.py

9

0

100%

scaralang/core/service/parser/splitter/itoken_line_splitter.py

17

0

100%

scaralang/core/service/parser/splitter/token_line_splitter.py

29

0

100%

scaralang/core/service/parser/splitter/token_line_splitter_factory.py

18

0

100%

scaralang/core/service/protocol/__init__.py

9

0

100%

scaralang/core/service/protocol/ibinary_frame_builder.py

25

0

100%

scaralang/core/service/protocol/ibinary_frame_parser.py

18

0

100%

scaralang/core/service/protocol/ibinary_payload_unpacker.py

20

0

100%

scaralang/core/service/trajectory/__init__.py

9

0

100%

scaralang/core/service/trajectory/discretization/__init__.py

9

0

100%

scaralang/core/service/trajectory/discretization/ishape_discretizer.py

20

0

100%

scaralang/core/service/trajectory/discretization/shape_discretizer.py

35

0

100%

scaralang/core/service/trajectory/discretization/shape_discretizer_factory.py

18

0

100%

scaralang/core/service/trajectory/metrics/__init__.py

9

0

100%

scaralang/core/service/trajectory/metrics/bottleneck/__init__.py

9

0

100%

scaralang/core/service/trajectory/metrics/bottleneck/imotion_bottleneck_detector.py

17

0

100%

scaralang/core/service/trajectory/metrics/bottleneck/motion_bottleneck_detector.py

34

0

100%

scaralang/core/service/trajectory/metrics/bottleneck/motion_bottleneck_detector_factory.py

18

0

100%

scaralang/core/service/trajectory/metrics/cycle/__init__.py

9

0

100%

scaralang/core/service/trajectory/metrics/cycle/cycle_time_calculator.py

41

0

100%

scaralang/core/service/trajectory/metrics/cycle/cycle_time_calculator_factory.py

18

0

100%

scaralang/core/service/trajectory/metrics/cycle/icycle_time_calculator.py

17

0

100%

scaralang/core/service/trajectory/metrics/profile/__init__.py

9

0

100%

scaralang/core/service/trajectory/metrics/profile/axis_speed_profile_analyzer.py

46

0

100%

scaralang/core/service/trajectory/metrics/profile/axis_speed_profile_analyzer_factory.py

18

0

100%

scaralang/core/service/trajectory/metrics/profile/iaxis_speed_profile_analyzer.py

17

0

100%

scaralang/core/service/trajectory/metrics/summary/__init__.py

9

0

100%

scaralang/core/service/trajectory/metrics/summary/itrajectory_cycle_summary_builder.py

18

0

100%

scaralang/core/service/trajectory/metrics/summary/trajectory_cycle_summary_builder.py

35

0

100%

scaralang/core/service/trajectory/metrics/summary/trajectory_cycle_summary_builder_factory.py

21

0

100%

scaralang/core/service/trajectory/metrics/trajectory_metrics.py

40

0

100%

scaralang/core/service/trajectory/plan/__init__.py

9

0

100%

scaralang/core/service/trajectory/plan/itrajectory_mutable.py

21

0

100%

scaralang/core/service/trajectory/plan/itrajectory_plan.py

13

0

100%

scaralang/core/service/trajectory/plan/itrajectory_plan_factory.py

16

0

100%

scaralang/core/service/trajectory/plan/itrajectory_read_only.py

20

0

100%

scaralang/core/service/trajectory/plan/trajectory_plan.py

42

0

100%

scaralang/core/service/trajectory/plan/trajectory_plan_factory.py

22

0

100%

scaralang/core/service/trajectory/validation/__init__.py

9

0

100%

scaralang/core/service/trajectory/validation/feedrate/__init__.py

9

0

100%

scaralang/core/service/trajectory/validation/feedrate/feedrate_validator.py

25

0

100%

scaralang/core/service/trajectory/validation/feedrate/feedrate_validator_factory.py

19

0

100%

scaralang/core/service/trajectory/validation/feedrate/ifeedrate_validator.py

16

0

100%

scaralang/core/service/trajectory/validation/itrajectory_validator.py

28

0

100%

scaralang/core/service/trajectory/validation/plan/__init__.py

9

0

100%

scaralang/core/service/trajectory/validation/plan/itrajectory_plan_validator.py

16

0

100%

scaralang/core/service/trajectory/validation/plan/trajectory_plan_validator.py

44

0

100%

scaralang/core/service/trajectory/validation/plan/trajectory_plan_validator_factory.py

20

0

100%

scaralang/core/service/trajectory/validation/trajectory_validator.py

46

0

100%

scaralang/core/service/trajectory/validation/trajectory_validator_factory.py

28

0

100%

scaralang/core/service/trajectory/validation/waypoint/__init__.py

9

0

100%

scaralang/core/service/trajectory/validation/waypoint/iwaypoint_validator.py

17

0

100%

scaralang/core/service/trajectory/validation/waypoint/waypoint_validator.py

33

0

100%

scaralang/core/service/trajectory/validation/waypoint/waypoint_validator_factory.py

19

0

100%

scaralang/engine.py

60

0

100%

scaralang/infrastructure/__init__.py

9

0

100%

scaralang/infrastructure/cli/__init__.py

9

0

100%

scaralang/infrastructure/cli/engine.py

44

0

100%

scaralang/infrastructure/cli/icli.py

15

0

100%

scaralang/infrastructure/cli/repl/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/compiler/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/compiler/irepl_single_command_compiler.py

16

0

100%

scaralang/infrastructure/cli/repl/compiler/repl_single_command_compiler.py

46

1

98%

scaralang/infrastructure/cli/repl/compiler/repl_single_command_compiler_factory.py

18

0

100%

scaralang/infrastructure/cli/repl/dispatch/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/dispatch/irepl_command_dispatcher.py

17

0

100%

scaralang/infrastructure/cli/repl/dispatch/repl_command_dispatcher.py

37

0

100%

scaralang/infrastructure/cli/repl/dispatch/repl_command_dispatcher_factory.py

17

0

100%

scaralang/infrastructure/cli/repl/input/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/input/irepl_line_reader.py

13

0

100%

scaralang/infrastructure/cli/repl/input/repl_line_reader.py

21

0

100%

scaralang/infrastructure/cli/repl/input/repl_line_reader_factory.py

21

0

100%

scaralang/infrastructure/cli/repl/presentation/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/presentation/irepl_response_presenter.py

18

0

100%

scaralang/infrastructure/cli/repl/presentation/repl_response_presenter.py

25

0

100%

scaralang/infrastructure/cli/repl/presentation/repl_response_presenter_factory.py

17

0

100%

scaralang/infrastructure/cli/repl/transmission/__init__.py

9

0

100%

scaralang/infrastructure/cli/repl/transmission/irepl_frame_transmitter.py

15

0

100%

scaralang/infrastructure/cli/repl/transmission/repl_frame_transmitter.py

24

0

100%

scaralang/infrastructure/cli/repl/transmission/repl_frame_transmitter_factory.py

17

0

100%

scaralang/infrastructure/cli/setup/__init__.py

9

0

100%

scaralang/infrastructure/cli/setup/bundle.py

22

0

100%

scaralang/infrastructure/cli/setup/dep_validator.py

37

0

100%

scaralang/infrastructure/cli/setup/dependencies.py

18

0

100%

scaralang/infrastructure/cli/setup/factory.py

26

0

100%

scaralang/infrastructure/cli/setup/keys.py

26

0

100%

scaralang/infrastructure/cli/setup/opt_validator.py

35

0

100%

scaralang/infrastructure/cli/setup/options.py

15

0

100%

scaralang/infrastructure/cli/setup/registry.py

31

0

100%

scaralang/infrastructure/cli/setup/validator.py

43

0

100%

scaralang/infrastructure/command/__init__.py

9

0

100%

scaralang/infrastructure/command/command_bundle.py

16

0

100%

scaralang/infrastructure/command/command_bundle_factory.py

47

0

100%

scaralang/infrastructure/command/compile/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/compile_command_definition.py

24

0

100%

scaralang/infrastructure/command/compile/compile_command_executor.py

57

0

100%

scaralang/infrastructure/command/compile/compile_command_executor_factory.py

26

0

100%

scaralang/infrastructure/command/compile/inspection/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/inspection/framing/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/inspection/framing/frame_header_formatter.py

15

0

100%

scaralang/infrastructure/command/compile/inspection/framing/frame_header_formatter_factory.py

17

0

100%

scaralang/infrastructure/command/compile/inspection/framing/frame_trailer_formatter.py

12

0

100%

scaralang/infrastructure/command/compile/inspection/framing/frame_trailer_formatter_factory.py

17

0

100%

scaralang/infrastructure/command/compile/inspection/framing/hex_stream_formatter.py

19

0

100%

scaralang/infrastructure/command/compile/inspection/framing/hex_stream_formatter_factory.py

17

0

100%

scaralang/infrastructure/command/compile/inspection/framing/iframe_header_formatter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/framing/iframe_trailer_formatter.py

13

0

100%

scaralang/infrastructure/command/compile/inspection/framing/ihex_stream_formatter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/payload/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/inspection/payload/ijoint_steps_payload_formatter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/payload/ipayload_dispatcher_formatter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/payload/itool_command_payload_formatter.py

13

0

100%

scaralang/infrastructure/command/compile/inspection/payload/joint_steps_payload_formatter.py

23

0

100%

scaralang/infrastructure/command/compile/inspection/payload/joint_steps_payload_formatter_factory.py

18

0

100%

scaralang/infrastructure/command/compile/inspection/payload/payload_dispatcher_formatter.py

43

0

100%

scaralang/infrastructure/command/compile/inspection/payload/payload_dispatcher_formatter_factory.py

25

0

100%

scaralang/infrastructure/command/compile/inspection/payload/tool_command_payload_formatter.py

22

0

100%

scaralang/infrastructure/command/compile/inspection/payload/tool_command_payload_formatter_factory.py

18

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/frame_step_presenter.py

34

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/frame_step_presenter_factory.py

21

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/iframe_step_presenter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/iprogram_inspection_presenter.py

14

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/program_inspection_presenter.py

25

0

100%

scaralang/infrastructure/command/compile/inspection/presentation/program_inspection_presenter_factory.py

18

0

100%

scaralang/infrastructure/command/compile/telemetry/__init__.py

9

0

100%

scaralang/infrastructure/command/compile/telemetry/compile_telemetry_formatter.py

14

0

100%

scaralang/infrastructure/command/compile/telemetry/compile_telemetry_formatter_factory.py

17

0

100%

scaralang/infrastructure/command/compile/telemetry/icompile_telemetry_formatter.py

14

0

100%

scaralang/infrastructure/command/disassemble/__init__.py

9

0

100%

scaralang/infrastructure/command/disassemble/disassemble_command_definition.py

24

0

100%

scaralang/infrastructure/command/disassemble/disassemble_command_executor.py

45

2

96%

scaralang/infrastructure/command/disassemble/disassemble_command_executor_factory.py

24

0

100%

scaralang/infrastructure/command/disassemble/format/__init__.py

9

0

100%

scaralang/infrastructure/command/disassemble/format/disassemble_summary_formatter.py

14

0

100%

scaralang/infrastructure/command/disassemble/format/disassemble_summary_formatter_factory.py

17

0

100%

scaralang/infrastructure/command/disassemble/format/idisassemble_summary_formatter.py

14

0

100%

scaralang/infrastructure/command/export/__init__.py

9

0

100%

scaralang/infrastructure/command/export/export_command_definition.py

24

0

100%

scaralang/infrastructure/command/export/export_command_executor.py

46

2

96%

scaralang/infrastructure/command/export/export_command_executor_factory.py

24

0

100%

scaralang/infrastructure/command/icommand_definition.py

14

0

100%

scaralang/infrastructure/command/icommand_executor.py

14

0

100%

scaralang/infrastructure/command/info/__init__.py

9

0

100%

scaralang/infrastructure/command/info/info_command_definition.py

24

0

100%

scaralang/infrastructure/command/info/info_command_executor.py

23

0

100%

scaralang/infrastructure/command/info/info_command_executor_factory.py

22

0

100%

scaralang/infrastructure/command/lint/__init__.py

9

0

100%

scaralang/infrastructure/command/lint/lint_command_definition.py

24

0

100%

scaralang/infrastructure/command/lint/lint_command_executor.py

40

2

95%

scaralang/infrastructure/command/lint/lint_command_executor_factory.py

24

0

100%

scaralang/infrastructure/command/repl/__init__.py

9

0

100%

scaralang/infrastructure/command/repl/repl_command_definition.py

24

0

100%

scaralang/infrastructure/command/repl/repl_command_executor.py

77

2

97%

scaralang/infrastructure/command/repl/repl_command_executor_factory.py

33

0

100%

scaralang/infrastructure/communication/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/binary/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/binary/binary_struct_format.py

23

0

100%

scaralang/infrastructure/communication/protocol/binary/builder/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/binary/builder/binary_frame_builder.py

57

0

100%

scaralang/infrastructure/communication/protocol/binary/builder/binary_frame_builder_factory.py

18

1

94%

scaralang/infrastructure/communication/protocol/binary/checksum/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/binary/checksum/crc16_ccitt.py

30

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/__init__.py

9

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/binary_frame_assembler.py

27

1

96%

scaralang/infrastructure/communication/protocol/binary/parser/binary_frame_assembler_factory.py

18

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/binary_frame_parser.py

91

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/binary_frame_parser_factory.py

26

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/binary_payload_unpacker.py

48

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/binary_payload_unpacker_factory.py

18

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/ibinary_frame_assembler.py

16

0

100%

scaralang/infrastructure/communication/protocol/binary/parser/parser_state.py

20

0

100%

scaralang/setup/__init__.py

9

0

100%

scaralang/setup/bundle.py

21

0

100%

scaralang/setup/dep_validator.py

36

0

100%

scaralang/setup/dependencies.py

17

0

100%

scaralang/setup/factory.py

50

1

98%

scaralang/setup/keys.py

26

0

100%

scaralang/setup/opt_validator.py

34

0

100%

scaralang/setup/options.py

13

0

100%

scaralang/setup/registry.py

30

0

100%

scaralang/setup/validator.py

43

0

100%

Total

11454

31

99%

πŸ›  UsageΒΆ

Install package

pip3 install scaralang

CLI Tool (scarac / scaralang)ΒΆ

# Display general help and available subcommands
scarac --help

# Validate syntax and run static diagnostic lint checks
scarac lint program.scara

# Compile DSL program to packed binary execution file (.bin)
scarac compile program.scara -o program.bin

# Compile with verbose wire frame inspection and telemetry metrics
scarac compile program.scara -o program.bin --verbose

# Disassemble binary bytecode file into human-readable frame breakdown
scarac disassemble program.bin --summary

# Export trajectory to industrial G-code, CSV time-series, JSON, or SVG
scarac export program.scara --format GCODE -o program.gcode
scarac export program.scara --format CSV -o trajectory.csv
scarac export program.scara --format JSON -o bundle.json
scarac export program.scara --format SVG -o toolpath.svg

# Inspect toolchain info, supported commands, and grammar version
scarac info

# Launch interactive SCARA DSL motion REPL console
scarac repl

Python Library APIΒΆ

from scaralang.setup.factory import ScaralangBundleFactory
from scaralang.engine import Scaralang
from scaralang.core.service.dsl.scara_dsl_service_factory import (
    ScaraDslServiceFactory,
)

# Initialize full DSL service via Composition Root factory
dsl_service = ScaraDslServiceFactory.create()

# Lint a script string
diagnostics = dsl_service.lint(
    "HOME\nMOVE_J X:100.0 Y:150.0 Z:20.0 SPEED:FAST\n"
)
if not diagnostics:
    print("Syntax & static semantics: OK")

# Compile to binary wire payload
binary_data, telemetry = dsl_service.compile_to_binary(
    "HOME\nMOVE_L X:50.0 Y:80.0 Z:10.0 SPEED:SLOW\n"
)
print(
    f"Compiled {len(binary_data)} bytes in {telemetry.compilation_duration_ms:.2f} ms"
)

πŸ“š DocsΒΆ

ReadTheDocs Documentation

πŸ‘₯ ContributingΒΆ

Contributing to scaralang