Motion Trajectory Studio & Streamer

scarajectory is a standalone CAD/CAM motion planning, kinematic validation, and real-time trajectory streaming software for SCARA robotic manipulators.
Developed in python code.
The README is used to introduce the modules and provide instructions on how to install the modules, any machine dependencies it may have and any other information that should be provided before the modules are installed.
Table of Contents
Used next development environment

Currently there are three ways to install package
scarajectory is located at pypi.org.
You can install by using pip
# python3
pip3 install scarajectory
Navigate to release page download and extract release archive.
To install scarajectory type the following
tar xvzf scarajectory-x.y.z.tar.gz
cd scarajectory-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/scarajectory-*-py3-none-any.whl
rm -f get-pip.py
chmod 755 /usr/local/lib/python3.10/dist-packages/usr/local/bin/scarajectory_run.py
ln -s /usr/local/lib/python3.10/dist-packages/usr/local/bin/scarajectory_run.py /usr/local/bin/scarajectory_run.py
Navigate to release page download and extract release archive.
To install scarajectory locate and run setup.py with arguments
tar xvzf scarajectory-x.y.z.tar.gz
cd scarajectory-x.y.z
# python3
pip3 install -r requirements.txt
python3 setup.py install_lib
python3 setup.py install_egg_info
You can use Dockerfile to create image/container.
scarajectory requires next modules and libraries
Core Robotics & Language Engine Dependency (scaralang):
scarajectorydirectly integratesscaralangas its foundational domain dependency.scaralangprovides the SCARA Domain-Specific Language (DSL) lexer, parser, and AST compiler, the analytical forward and inverse kinematics engine (solve_fk,solve_ik), trajectory reachability and feedrate boundary validation, and the low-level binary wire framing protocol codecs.
scarajectory is based on OOP and Clean Architecture.
Tool structure
Click to expand framework structure</summary>
scarajectory/
βββ core/
βΒ Β βββ __init__.py
βΒ Β βββ model/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ jog/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ jog_axis.py
βΒ Β βΒ Β βΒ Β βββ jog_command.py
βΒ Β βΒ Β βΒ Β βββ jog_direction.py
βΒ Β βΒ Β βββ preferences/
βΒ Β βΒ Β βΒ Β βββ connection_preference.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ protocol/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ protocol_mode.py
βΒ Β βΒ Β βΒ Β βββ scara_response.py
βΒ Β βΒ Β βββ state/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ stream_session.py
βΒ Β βΒ Β βΒ Β βββ stream_state.py
βΒ Β βΒ Β βββ streaming/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ stream_config.py
βΒ Β βΒ Β βΒ Β βββ stream_pacing_config.py
βΒ Β βΒ Β βββ telemetry/
βΒ Β βΒ Β βΒ Β βββ diagnostics_bundle.py
βΒ Β βΒ Β βΒ Β βββ diagnostics_snapshot.py
βΒ Β βΒ Β βΒ Β βββ fault_event.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ move_event.py
βΒ Β βΒ Β βΒ Β βββ scara_status.py
βΒ Β βΒ Β βΒ Β βββ stream_progress.py
βΒ Β βΒ Β βΒ Β βββ stream_summary.py
βΒ Β βΒ Β βββ trajectory/
βΒ Β βΒ Β βββ plan_metrics.py
βΒ Β βΒ Β βββ validation_report.py
βΒ Β βΒ Β βββ waypoint.py
βΒ Β βββ service/
βΒ Β βββ barrier/
βΒ Β βΒ Β βββ iflow_barrier.py
βΒ Β βΒ Β βββ iflow_barrier_coordinator.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ classifier/
βΒ Β βΒ Β βββ iflow_status_classifier.py
βΒ Β βΒ Β βββ ihoming_status_classifier.py
βΒ Β βΒ Β βββ imotion_status_classifier.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iresponse_parser.py
βΒ Β βββ connection/
βΒ Β βΒ Β βββ ichannel_dispatcher.py
βΒ Β βΒ Β βββ iconnection.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iraw_channel.py
βΒ Β βΒ Β βββ istream_connection.py
βΒ Β βββ engine.py
βΒ Β βββ event/
βΒ Β βΒ Β βββ ibinary_frame_dispatcher.py
βΒ Β βΒ Β βββ ibinary_frame_handler.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ __init__.py
βΒ Β βββ iservice.py
βΒ Β βββ kinematics/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iscara_deadzone_calculator.py
βΒ Β βΒ Β βββ scara_deadzone_calculator.py
βΒ Β βΒ Β βββ scara_deadzone_calculator_factory.py
βΒ Β βββ manipulator/
βΒ Β βΒ Β βββ ijog_controller.py
βΒ Β βΒ Β βββ imotion_controller.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iquery_controller.py
βΒ Β βββ pacing/
βΒ Β βΒ Β βββ iflow_pacing_controller.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ packet/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ ipacket_strategy.py
βΒ Β βββ preferences/
βΒ Β βΒ Β βββ connection_preference_factory.py
βΒ Β βΒ Β βββ iconnection_repository.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ service_factory.py
βΒ Β βββ settings/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iscara_bounds_loader.py
βΒ Β βΒ Β βββ iscara_bounds_parser.py
βΒ Β βΒ Β βββ iscara_transmission_loader.py
βΒ Β βΒ Β βββ istream_config_loader.py
βΒ Β βββ state/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ istream_state_controller.py
βΒ Β βΒ Β βββ istream_state_machine.py
βΒ Β βΒ Β βββ session_factory.py
βΒ Β βββ storage/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iplan_loader.py
βΒ Β βΒ Β βββ iplan_storage_service.py
βΒ Β βΒ Β βββ iplan_storer.py
βΒ Β βββ streaming/
βΒ Β βΒ Β βββ config_factory.py
βΒ Β βΒ Β βββ ibinary_program_streamer.py
βΒ Β βΒ Β βββ imotion_streamer.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ istream_control_transmitter.py
βΒ Β βΒ Β βββ istream_dispatcher.py
βΒ Β βΒ Β βββ istream_playback_controller.py
βΒ Β βΒ Β βββ observer/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iobservable.py
βΒ Β βΒ Β βΒ Β βββ iobserver.py
βΒ Β βΒ Β βΒ Β βββ istream_observer_dispatcher.py
βΒ Β βΒ Β βββ stream_pacing_config_factory.py
βΒ Β βββ telemetry/
βΒ Β βΒ Β βββ diagnostics_snapshot_factory.py
βΒ Β βΒ Β βββ fault_event_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ move_event_factory.py
βΒ Β βββ tool/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ ipurge_valve_actuator.py
βΒ Β βΒ Β βββ itool_controller.py
βΒ Β βββ trajectory/
βΒ Β βΒ Β βββ contract/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iplan_command_service.py
βΒ Β βΒ Β βΒ Β βββ iplan_persistence_service.py
βΒ Β βΒ Β βΒ Β βββ iplan_validation_service.py
βΒ Β βΒ Β βββ history/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iplan_history.py
βΒ Β βΒ Β βΒ Β βββ iplan_history_saver.py
βΒ Β βΒ Β βΒ Β βββ plan_history.py
βΒ Β βΒ Β βΒ Β βββ plan_history_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ plan/
βΒ Β βΒ Β βββ history/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ plan_history_service.py
βΒ Β βΒ Β βΒ Β βββ plan_history_service_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ itrajectory_history.py
βΒ Β βΒ Β βββ itrajectory_mutable.py
βΒ Β βΒ Β βββ itrajectory_read_only.py
βΒ Β βΒ Β βββ mutation/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iplan_bulk_mutator.py
βΒ Β βΒ Β βΒ Β βββ iplan_mutation_service.py
βΒ Β βΒ Β βΒ Β βββ iplan_point_mutator.py
βΒ Β βΒ Β βΒ Β βββ plan_mutation_service.py
βΒ Β βΒ Β βΒ Β βββ plan_mutation_service_factory.py
βΒ Β βΒ Β βββ observer/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iplan_observer_dispatcher.py
βΒ Β βΒ Β βΒ Β βββ itrajectory_observer.py
βΒ Β βΒ Β βΒ Β βββ plan_observer_dispatcher.py
βΒ Β βΒ Β βΒ Β βββ plan_observer_dispatcher_factory.py
βΒ Β βΒ Β βββ selection/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iplan_selection_coordinator.py
βΒ Β βΒ Β βΒ Β βββ iplan_selection_manager.py
βΒ Β βΒ Β βΒ Β βββ iplan_selection_navigator.py
βΒ Β βΒ Β βΒ Β βββ iplan_selection_state.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_coordinator.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_coordinator_factory.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_manager.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_manager_factory.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_navigator.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_navigator_factory.py
βΒ Β βΒ Β βΒ Β βββ plan_selection_state.py
βΒ Β βΒ Β βββ store/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iwaypoint_bulk_mutator.py
βΒ Β βΒ Β βββ iwaypoint_mutator.py
βΒ Β βΒ Β βββ iwaypoint_query.py
βΒ Β βΒ Β βββ iwaypoint_store.py
βΒ Β βΒ Β βββ waypoint_bulk_mutator.py
βΒ Β βΒ Β βββ waypoint_mutator.py
βΒ Β βΒ Β βββ waypoint_query.py
βΒ Β βΒ Β βββ waypoint_store.py
βΒ Β βΒ Β βββ waypoint_store_factory.py
βΒ Β βββ transmission/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ itransmission_step_calculator.py
βΒ Β βββ worker/
βΒ Β βββ ibyte_sender.py
βΒ Β βββ icommand_formatter.py
βΒ Β βββ icommand_sender.py
βΒ Β βββ iexecution_service.py
βΒ Β βββ iexecution_worker.py
βΒ Β βββ __init__.py
βΒ Β βββ istream_bytes_receiver.py
βΒ Β βββ istream_line_receiver.py
βΒ Β βββ istream_loop_runner.py
βββ engine.py
βββ infrastructure/
βΒ Β βββ barrier/
βΒ Β βΒ Β βββ flow_barrier.py
βΒ Β βΒ Β βββ flow_barrier_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ classifier/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ iresponse_classification_rule.py
βΒ Β βΒ Β βββ response_classification_registry.py
βΒ Β βΒ Β βββ response_classification_registry_factory.py
βΒ Β βΒ Β βββ response_classification_rule.py
βΒ Β βΒ Β βββ response_parser.py
βΒ Β βΒ Β βββ response_parser_factory.py
βΒ Β βΒ Β βββ status/
βΒ Β βΒ Β βββ flow_status_classifier.py
βΒ Β βΒ Β βββ flow_status_classifier_factory.py
βΒ Β βΒ Β βββ homing_status_classifier.py
βΒ Β βΒ Β βββ homing_status_classifier_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ motion_status_classifier.py
βΒ Β βΒ Β βββ motion_status_classifier_factory.py
βΒ Β βββ cli/
βΒ Β βΒ Β βββ engine.py
βΒ Β βΒ Β βββ icli.py
βΒ Β βΒ Β βββ __init__.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
βΒ Β βΒ Β βββ icommand_definition.py
βΒ Β βΒ Β βββ icommand_executor.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ studio_command_definition.py
βΒ Β βΒ Β βββ studio_command_executor.py
βΒ Β βββ config/
βΒ Β βΒ Β βββ scara_geometry.json
βΒ Β βΒ Β βββ scarajectory.cfg
βΒ Β βΒ Β βββ scarajectory.logo
βΒ Β βΒ Β βββ scheme.json
βΒ Β βββ connection/
βΒ Β βΒ Β βββ channel_dispatcher.py
βΒ Β βΒ Β βββ channel_dispatcher_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ istream_raw_transceiver.py
βΒ Β βΒ Β βββ stream_connection_manager.py
βΒ Β βΒ Β βββ stream_connection_manager_factory.py
βΒ Β βΒ Β βββ stream_raw_transceiver.py
βΒ Β βΒ Β βββ stream_raw_transceiver_factory.py
βΒ Β βββ event/
βΒ Β βΒ Β βββ binary_frame_dispatcher.py
βΒ Β βΒ Β βββ binary_frame_dispatcher_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ formatter/
βΒ Β βΒ Β βββ command/
βΒ Β βΒ Β βΒ Β βββ config_command_formatter.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ jog_command_formatter.py
βΒ Β βΒ Β βΒ Β βββ motion_command_formatter.py
βΒ Β βΒ Β βΒ Β βββ query_command_formatter.py
βΒ Β βΒ Β βΒ Β βββ system_command_formatter.py
βΒ Β βΒ Β βΒ Β βββ tool_command_formatter.py
βΒ Β βΒ Β βββ command_formatter.py
βΒ Β βΒ Β βββ command_formatter_factory.py
βΒ Β βΒ Β βββ command_templates.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ gui/
βΒ Β βΒ Β βββ canvas/
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ canvas_event_binder.py
βΒ Β βΒ Β βΒ Β βββ canvas_event_binder_factory.py
βΒ Β βΒ Β βΒ Β βββ handler/
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_drag_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_event_context.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_mouse_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_mouse_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_shape_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_tool_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_mouse_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ mouse_handler_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ mouse_handler_init_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ pan/
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_viewport_pan_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_viewport_pan_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_viewport_pan_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ selection/
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_selection_mouse_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_selection_mouse_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_selection_mouse_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ icanvas.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ navigation/
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_view_navigator.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_view_navigator_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_view_navigator.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_view_target.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ observer/
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_plan_observer_bridge.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_plan_observer_bridge_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_plan_observer_bridge.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ render/
βΒ Β βΒ Β βΒ Β βΒ Β βββ forbidden_zone_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ ilayer_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ polar_grid_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ preview_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ reach_boundary_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ trajectory_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ waypoint_node_renderer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ waypoint_node_renderer_factory.py
βΒ Β βΒ Β βΒ Β βββ status/
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_status_presenter.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ canvas_status_presenter_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ icanvas_status_presenter.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ trajectory_canvas.py
βΒ Β βΒ Β βΒ Β βββ trajectory_canvas_factory.py
βΒ Β βΒ Β βββ connection/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ iport_connection_delegate.py
βΒ Β βΒ Β βΒ Β βββ null_port_connection_delegate.py
βΒ Β βΒ Β βΒ Β βββ port_connection_panel.py
βΒ Β βΒ Β βββ console/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ serial_console.py
βΒ Β βΒ Β βΒ Β βββ serial_console_builder.py
βΒ Β βΒ Β βΒ Β βββ serial_console_builder_factory.py
βΒ Β βΒ Β βββ controls/
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ controls_panel.py
βΒ Β βΒ Β βΒ Β βββ controls_panel_factory.py
βΒ Β βΒ Β βΒ Β βββ icontrols_panel.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ itabs_assembler.py
βΒ Β βΒ Β βΒ Β βββ manipulator_controllers_bundle.py
βΒ Β βΒ Β βΒ Β βββ manipulator_controllers_factory.py
βΒ Β βΒ Β βΒ Β βββ tabs_assembler.py
βΒ Β βΒ Β βΒ Β βββ tabs_assembler_factory.py
βΒ Β βΒ Β βΒ Β βββ tabs_bundle.py
βΒ Β βΒ Β βββ dsl/
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ code_editor.py
βΒ Β βΒ Β βΒ Β βββ code_editor_factory.py
βΒ Β βΒ Β βΒ Β βββ console_view.py
βΒ Β βΒ Β βΒ Β βββ document/
βΒ Β βΒ Β βΒ Β βΒ Β βββ document_manager.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ document_manager_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ example_catalog.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ example_catalog_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ dsl_editor_tab.py
βΒ Β βΒ Β βΒ Β βββ dsl_editor_tab_factory.py
βΒ Β βΒ Β βΒ Β βββ handler/
βΒ Β βΒ Β βΒ Β βΒ Β βββ execution_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ execution_handler_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ execution_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ file_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ file_handler_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ file_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ iexecution_delegate.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ ifile_delegate.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ syntax/
βΒ Β βΒ Β βΒ Β βΒ Β βββ highlighter.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ highlighter_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ ihighlighter.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ itag_applier.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ itokenizer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tag_applier.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tag_applier_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ token.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tokenizer.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tokenizer_factory.py
βΒ Β βΒ Β βΒ Β βββ toolbar.py
βΒ Β βΒ Β βββ editor/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ table/
βΒ Β βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ itable.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ selection_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ selection_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ trajectory_table.py
βΒ Β βΒ Β βΒ Β βββ waypoint_coordinate_inputs.py
βΒ Β βΒ Β βΒ Β βββ waypoint_edit_applier.py
βΒ Β βΒ Β βΒ Β βββ waypoint_edit_applier_factory.py
βΒ Β βΒ Β βΒ Β βββ waypoint_editor.py
βΒ Β βΒ Β βββ emulator/
βΒ Β βΒ Β βΒ Β βββ emulator_launcher.py
βΒ Β βΒ Β βΒ Β βββ emulator_launcher_factory.py
βΒ Β βΒ Β βΒ Β βββ iemulator_launcher.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ igui.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ layout/
βΒ Β βΒ Β βΒ Β βββ canvas_pane_builder.py
βΒ Β βΒ Β βΒ Β βββ canvas_pane_builder_factory.py
βΒ Β βΒ Β βΒ Β βββ editor_pane_builder.py
βΒ Β βΒ Β βΒ Β βββ editor_pane_builder_factory.py
βΒ Β βΒ Β βΒ Β βββ icanvas_pane_builder.py
βΒ Β βΒ Β βΒ Β βββ ieditor_pane_builder.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ itoolbar_layout_builder.py
βΒ Β βΒ Β βΒ Β βββ main_content_builder.py
βΒ Β βΒ Β βΒ Β βββ main_content_builder_factory.py
βΒ Β βΒ Β βΒ Β βββ toolbar_layout_builder.py
βΒ Β βΒ Β βΒ Β βββ toolbar_layout_builder_factory.py
βΒ Β βΒ Β βββ manipulator/
βΒ Β βΒ Β βΒ Β βββ imanipulator_action_delegate.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ jog/
βΒ Β βΒ Β βΒ Β βΒ Β βββ axis_grid_panel.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ axis_grid_panel_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ controllers_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ jog_tab.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ jog_tab_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ panel_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ power_panel.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ power_panel_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ raw_command_panel.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ raw_command_panel_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tool_panel.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ tool_panel_factory.py
βΒ Β βΒ Β βΒ Β βββ manipulator_override_panel.py
βΒ Β βΒ Β βΒ Β βββ null_manipulator_action_delegate.py
βΒ Β βΒ Β βββ menu/
βΒ Β βΒ Β βΒ Β βββ app_menu_bar.py
βΒ Β βΒ Β βΒ Β βββ app_menu_bar_factory.py
βΒ Β βΒ Β βΒ Β βββ builders_bundle.py
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ iapp_menu_bar.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ menu_hotkey_binder.py
βΒ Β βΒ Β βΒ Β βββ menu_hotkey_binder_factory.py
βΒ Β βΒ Β βΒ Β βββ menu_layout_builder.py
βΒ Β βΒ Β βΒ Β βββ menu_layout_builder_factory.py
βΒ Β βΒ Β βββ model/
βΒ Β βΒ Β βΒ Β βββ canvas_interaction_state.py
βΒ Β βΒ Β βΒ Β βββ canvas_settings.py
βΒ Β βΒ Β βΒ Β βββ canvas_tool_mode.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ viewport_transform.py
βΒ Β βΒ Β βββ preview/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ preview_tab.py
βΒ Β βΒ Β βΒ Β βββ preview_tab_factory.py
βΒ Β βΒ Β βββ scarajectory_gui.py
βΒ Β βΒ Β βββ scarajectory_gui_bundle.py
βΒ Β βΒ Β βββ scarajectory_gui_factory.py
βΒ Β βΒ Β βββ scarajectory_gui_init_bundle.py
βΒ Β βΒ Β βββ streaming/
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ handler/
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ playback_handler_bundle.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_playback_action_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_playback_action_handler_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_tool_action_handler.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_tool_action_handler_factory.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ observer/
βΒ Β βΒ Β βΒ Β βΒ Β βββ gui_stream_observer_bridge.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ gui_stream_observer_bridge_factory.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ igui_stream_observer_bridge.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ panel/
βΒ Β βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ istream_control_delegate.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_control_panel.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_progress_adapter.py
βΒ Β βΒ Β βΒ Β βΒ Β βββ stream_status_bar.py
βΒ Β βΒ Β βΒ Β βββ streamer_action_bundle.py
βΒ Β βΒ Β βΒ Β βββ streamer_controllers_bundle.py
βΒ Β βΒ Β βΒ Β βββ streamer_tab.py
βΒ Β βΒ Β βΒ Β βββ streamer_tab_factory.py
βΒ Β βΒ Β βββ theme/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ theme_button_styler.py
βΒ Β βΒ Β βΒ Β βββ theme_button_styler_factory.py
βΒ Β βΒ Β βΒ Β βββ theme_manager.py
βΒ Β βΒ Β βΒ Β βββ theme_notebook_styler.py
βΒ Β βΒ Β βΒ Β βββ theme_notebook_styler_factory.py
βΒ Β βΒ Β βββ toolbar/
βΒ Β βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ itoolbar.py
βΒ Β βΒ Β βΒ Β βββ navigation_controls.py
βΒ Β βΒ Β βΒ Β βββ navigation_controls_factory.py
βΒ Β βΒ Β βΒ Β βββ parameter_inputs.py
βΒ Β βΒ Β βΒ Β βββ parameter_inputs_bundle.py
βΒ Β βΒ Β βΒ Β βββ parameter_inputs_factory.py
βΒ Β βΒ Β βΒ Β βββ tool_selector.py
βΒ Β βΒ Β βΒ Β βββ tool_selector_factory.py
βΒ Β βΒ Β βΒ Β βββ toolbar.py
βΒ Β βΒ Β βΒ Β βββ toolbar_factory.py
βΒ Β βΒ Β βββ validation/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ validation_tab.py
βΒ Β βΒ Β βββ validation_tab_factory.py
βΒ Β βββ __init__.py
βΒ Β βββ manipulator/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ jog_controller.py
βΒ Β βΒ Β βββ jog_controller_factory.py
βΒ Β βΒ Β βββ motion_controller.py
βΒ Β βΒ Β βββ motion_controller_factory.py
βΒ Β βΒ Β βββ query_controller.py
βΒ Β βΒ Β βββ query_controller_factory.py
βΒ Β βββ pacing/
βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βββ flow_barrier_coordinator.py
βΒ Β βΒ Β βββ flow_barrier_coordinator_factory.py
βΒ Β βΒ Β βββ flow_pacing_bundle_factory.py
βΒ Β βΒ Β βββ flow_pacing_controller.py
βΒ Β βΒ Β βββ flow_pacing_controller_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ packet/
βΒ Β βΒ Β βββ binary_packet_strategy.py
βΒ Β βΒ Β βββ binary_packet_strategy_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ preferences/
βΒ Β βΒ Β βββ connection_repository.py
βΒ Β βΒ Β βββ connection_repository_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ settings/
βΒ Β βΒ Β βββ bounds/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ scara_bounds_loader.py
βΒ Β βΒ Β βΒ Β βββ scara_bounds_loader_factory.py
βΒ Β βΒ Β βΒ Β βββ scara_bounds_parser.py
βΒ Β βΒ Β βΒ Β βββ scara_bounds_parser_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ isettings_reader.py
βΒ Β βΒ Β βββ settings_reader.py
βΒ Β βΒ Β βββ settings_reader_factory.py
βΒ Β βΒ Β βββ stream/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ stream_config_loader.py
βΒ Β βΒ Β βΒ Β βββ stream_config_loader_factory.py
βΒ Β βΒ Β βββ transmission/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ scara_transmission_loader.py
βΒ Β βΒ Β βββ scara_transmission_loader_factory.py
βΒ Β βββ state/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ stream_state_machine.py
βΒ Β βΒ Β βββ stream_state_machine_factory.py
βΒ Β βββ storage/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ plan_loader.py
βΒ Β βΒ Β βββ plan_storage_service.py
βΒ Β βΒ Β βββ plan_storage_service_factory.py
βΒ Β βΒ Β βββ plan_storer.py
βΒ Β βΒ Β βββ trajectory_serializer.py
βΒ Β βββ streaming/
βΒ Β βΒ Β βββ assembly/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ stream_pacing_assembler.py
βΒ Β βΒ Β βΒ Β βββ stream_pipeline_assembler.py
βΒ Β βΒ Β βΒ Β βββ stream_transport_assembler.py
βΒ Β βΒ Β βΒ Β βββ stream_worker_assembler.py
βΒ Β βΒ Β βΒ Β βββ worker_bundle.py
βΒ Β βΒ Β βββ binary_program_streamer.py
βΒ Β βΒ Β βββ binary_program_streamer_factory.py
βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ observer/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ istream_observer_registry.py
βΒ Β βΒ Β βΒ Β βββ istream_telemetry_notifier.py
βΒ Β βΒ Β βΒ Β βββ stream_observer_dispatcher.py
βΒ Β βΒ Β βΒ Β βββ stream_observer_dispatcher_factory.py
βΒ Β βΒ Β βΒ Β βββ stream_observer_registry.py
βΒ Β βΒ Β βΒ Β βββ stream_observer_registry_factory.py
βΒ Β βΒ Β βΒ Β βββ stream_telemetry_notifier.py
βΒ Β βΒ Β βΒ Β βββ stream_telemetry_notifier_factory.py
βΒ Β βΒ Β βββ stream_control_transmitter.py
βΒ Β βΒ Β βββ stream_control_transmitter_factory.py
βΒ Β βΒ Β βββ stream_playback_controller.py
βΒ Β βΒ Β βββ stream_playback_controller_factory.py
βΒ Β βββ tool/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ tool_controller.py
βΒ Β βΒ Β βββ tool_controller_factory.py
βΒ Β βΒ Β βββ valve_pulse_worker.py
βΒ Β βΒ Β βββ valve_pulse_worker_factory.py
βΒ Β βββ transmission/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ transmission_step_calculator.py
βΒ Β βΒ Β βββ transmission_step_calculator_factory.py
βΒ Β βββ transport/
βΒ Β βΒ Β βββ bundle.py
βΒ Β βΒ Β βββ driver/
βΒ Β βΒ Β βΒ Β βββ ichannel.py
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ serial_channel.py
βΒ Β βΒ Β βΒ Β βββ serial_channel_factory.py
βΒ Β βΒ Β βΒ Β βββ serial_port_scanner.py
βΒ Β βΒ Β βΒ Β βββ tcp_channel.py
βΒ Β βΒ Β βΒ Β βββ tcp_channel_factory.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ istream_transport_connection.py
βΒ Β βΒ Β βββ istream_transport_transceiver.py
βΒ Β βΒ Β βββ listener/
βΒ Β βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βΒ Β βββ itransport_listener.py
βΒ Β βΒ Β βΒ Β βββ itransport_listener_holder.py
βΒ Β βΒ Β βΒ Β βββ null_transport_listener.py
βΒ Β βΒ Β βΒ Β βββ stream_ascii_transport_listener.py
βΒ Β βΒ Β βΒ Β βββ stream_ascii_transport_listener_factory.py
βΒ Β βΒ Β βΒ Β βββ stream_binary_transport_listener.py
βΒ Β βΒ Β βΒ Β βββ stream_binary_transport_listener_factory.py
βΒ Β βΒ Β βΒ Β βββ transport_listener_holder.py
βΒ Β βΒ Β βββ stream_transport_connection.py
βΒ Β βΒ Β βββ stream_transport_connection_factory.py
βΒ Β βΒ Β βββ stream_transport_transceiver.py
βΒ Β βΒ Β βββ stream_transport_transceiver_factory.py
βΒ Β βΒ Β βββ transport_factory.py
βΒ Β βΒ Β βββ worker/
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ itransport_reader_worker.py
βΒ Β βΒ Β βββ transport_reader_worker.py
βΒ Β βΒ Β βββ transport_reader_worker_factory.py
βΒ Β βββ worker/
βΒ Β βββ binary/
βΒ Β βΒ Β βββ binary_stream_execution_worker.py
βΒ Β βΒ Β βββ binary_stream_execution_worker_factory.py
βΒ Β βΒ Β βββ binary_stream_frame_handler.py
βΒ Β βΒ Β βββ binary_stream_frame_handler_factory.py
βΒ Β βΒ Β βββ binary_stream_loop_runner.py
βΒ Β βΒ Β βββ binary_stream_loop_runner_factory.py
βΒ Β βΒ Β βββ ibinary_stream_frame_handler.py
βΒ Β βΒ Β βββ ibinary_stream_loop_runner.py
βΒ Β βΒ Β βββ __init__.py
βΒ Β βββ __init__.py
βΒ Β βββ istream_queue_drainer.py
βΒ Β βββ istream_step_dispatcher.py
βΒ Β βββ stream_execution_worker.py
βΒ Β βββ stream_execution_worker_factory.py
βΒ Β βββ stream_loop_runner.py
βΒ Β βββ stream_loop_runner_factory.py
βΒ Β βββ stream_queue_drainer.py
βΒ Β βββ stream_queue_drainer_factory.py
βΒ Β βββ stream_step_dispatcher.py
βΒ Β βββ stream_step_dispatcher_factory.py
βββ __init__.py
βββ py.typed
βββ setup/
βββ assembly/
βΒ Β βββ app_core_assembler.py
βΒ Β βββ app_core_bundle.py
βΒ Β βββ app_presentation_assembler.py
βΒ Β βββ app_runtime_assembler.py
βΒ Β βββ app_runtime_bundle.py
βΒ Β βββ __init__.py
βββ bundle.py
βββ dep_validator.py
βββ dependencies.py
βββ factory.py
βββ __init__.py
βββ keys.py
βββ opt_validator.py
βββ options.py
βββ pipeline/
βΒ Β βββ dsl_pipeline_builder.py
βΒ Β βββ __init__.py
βΒ Β βββ plan_pipeline_builder.py
βΒ Β βββ plan_pipeline_bundle.py
βΒ Β βββ stream_pipeline_builder.py
βΒ Β βββ stream_pipeline_bundle.py
βββ registry.py
βββ validator.py
106 directories, 578 files
</details>
scarajectory is built on a strictly decoupled, Layered Clean Architecture where presentation, domain logic, AST compilation, and hardware communication are segregated through pure Python protocols:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ScarajectoryGUI β (Presenter / Main Window)
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ
β Orchestrates UI Components via DTOs
βββββββββββββββββββββββββββ¬ββββββββββββ΄ββββββββββββββ¬βββββββββββββββββββββββββββ
βΌ βΌ βΌ βΌ
ββββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββββ ββββββββββββββββββββ
β TrajectoryCanvas β β TrajectoryTable β β DslEditorTab β β StreamerTab β
β (Vector CAD) β β (Data Grid) β β(Syntax Highlighterβ β (Live Feedrate & β
ββββββββββ¬ββββββββββ ββββββββββ¬βββββββββ βββββββββββ¬ββββββββββ β Device Control) β
β β β ββββββββββ¬ββββββββββ
β β β β
ββββββββββββββ¬βββββββββββββ΄ββββββββββββββββββββββββββ β
β Observes / Modifies TrajectoryPlan β
βΌ β
ββββββββββββββββββββββββββββ β
β TrajectoryPlan β (Domain Model) β
ββββββββββββββ¬ββββββββββββββ β
β β
ββββββββββββββ΄βββββββββββββ¬βββββββββββββββββββββββββ β Uses ITransport &
βΌ βΌ βΌ β Classifiers
ββββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ βΌ
βTrajectoryValidat.β β ScaraDslService β β ScaraPlanExport β ββββββββββββββββββββ
β(Workspace Bounds)β β (DSL Compiler) β β (Plan to DSL) β β SerialStreamer β
ββββββββββββββββββββ ββββββββββ¬ββββββββββ βββββββββββββββββββ ββββββββββ¬ββββββββββ
β β
ββββββββββββββββββββββΌβββββββββββββββββββββ βΌ
βΌ βΌ βΌ ββββββββββββββββββββ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ βResponse & FlowClsβ
β ScaraLexer β β ScaraParser β β ScaraCompiler β ββββββββββββββββββββ
β (Token Stream) β β(ICommandParser) β β(IMacroExpander) β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
MotionCommandParser, ArcCommandParser, JumpMacroExpander, etc.) rather than a monolithic interpreter.ICommandParser and IMacroExpander registries dynamically.@runtime_checkable Protocol definitions. Concrete classes never inherit concrete logic, ensuring complete interchangeability.ITrajectoryValidator, IScaraLexer, IScaraParser, IScaraCompiler, ISerialStreamer, ITransport).run_quality_gates.sh)Every build is validated against 4 strict automated quality gates:
@runtime_checkable Protocol structural typing.scarajectory is the desktop CAD/CAM studio and trajectory streaming hub within the unified SCARA robotics architecture:
scarajectory uses scaralang as the Single Source of Truth (SSoT) to parse, validate, and compile Cartesian trajectories and .scara DSL scripts into deterministic binary wire protocol frames (0xAA 0x55).scaraemu for visual motion animation and validation before physical execution..scara DSL Editor & AST Compiler: Full-featured code editor with real-time syntax highlighting for industrial SCARA scripts (.scara), AST compilation, and instant bidirectional visual canvas synchronization.| Kinematic Reachability & Deadzone Enforcement: Annular geometric validation ensuring trajectories stay within reachable workspace boundaries ($R_{min} = | L_1 - L_2 | $, $R_{max} = L_1 + L_2$). |
Ctrl+Z, Ctrl+Y).<pt#X#Y#Z#PHI#SPEED#end>)./dev/ttyACM0) and TCP socket streaming with dynamic ACK tracking, auto-pause on buffer full, progress monitoring, and live Feedrate Override (10% - 200%).The robot dimensions and physical boundaries can be customized in scara_geometry.json or injected programmatically:
| Parameter | Default Value | Description | Β | Β |
|---|---|---|---|---|
l1 |
150.0 mm |
Primary arm link length (shoulder to elbow). | Β | Β |
l2 |
120.0 mm |
Secondary arm link length (elbow to wrist). | Β | Β |
r_min |
30.0 mm |
Inner singular deadzone radius ($ | L_1 - L_2 | $). |
r_max |
270.0 mm |
Maximum horizontal reach boundary ($L_1 + L_2$). | Β | Β |
z_min |
0.0 mm |
Minimum vertical height limit (bed level). | Β | Β |
z_max |
100.0 mm |
Maximum vertical stroke limit. | Β | Β |
min_speed |
1.0 mm/s |
Minimum allowable feedrate speed. | Β | Β |
max_speed |
100.0 mm/s |
Maximum allowable safe feedrate speed. | Β | Β |
.scara Programsscarajectory 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 & Protocols)
βββββββββββββββββββββββββββ
| Category | Instruction & Syntax | Parameters | Description |
|---|---|---|---|
| Motion | MOVE_J X <x> Y <y> Z <z> [P <phi>] |
X, Y, Z (mm), P (deg) |
Rapid Cartesian point-to-point motion. |
| Β | MOVE_L X <x> Y <y> Z <z> [P <phi>] |
X, Y, Z (mm), P (deg) |
Linear interpolated Cartesian path. |
| Β | ARC_CW X <x> Y <y> I <i> J <j> [Z <z>] |
X, Y target, I, J center offset |
Clockwise circular arc interpolation. |
| Β | ARC_CCW X <x> Y <y> I <i> J <j> [Z <z>] |
X, Y target, I, J center offset |
Counter-clockwise circular arc interpolation. |
| Β | APPROACH DIST <d> |
DIST (mm) |
Vertical descent towards workpiece along Z. |
| Β | RETRACT DIST <d> |
DIST (mm) |
Vertical clearance ascent along Z. |
| 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 ROWS <r> COLS <c> DX <dx> DY <dy> |
Grid dimensions & spacing | Generates structured 2D Cartesian pallet matrix. |
| Β | TANGENT_ARC RADIUS <r> ANGLE <a> |
RADIUS (mm), ANGLE (deg) |
Smooth tangential curve blending into path. |
| Actuators | PUMP <ON\|OFF> |
ON or OFF |
Actuates end-effector vacuum pump. |
| Β | VALVE <ON\|OFF> |
ON or OFF |
Opens or closes pneumatic release blow-off valve. |
| Β | WAIT <ms> |
ms (milliseconds) |
Dwells execution for specified hardware duration. |
| Β | HOME |
None | Triggers complete multi-axis homing routine. |
| 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\|Z1..Z50> |
Corner rounding tolerance | Corner tolerance zone for trajectory smoothing. |
| Config | CONFIG ELBOW <LEFT\|RIGHT> |
LEFT or RIGHT |
Sets arm kinematic inverse solution branch. |
| Β | FRAME X <x> Y <y> Z <z> [PHI <p>] |
Cartesian offset coordinates | Defines user workpiece reference coordinate frame. |
| Β | PROBE AXIS <Z> FEED <f> |
Axis identifier, search feedrate | Probes touch switch / surface sensor. |
.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
All communication between scarajectory, the physical scara_base firmware, and the scaraemu digital twin is governed by a packetized ASCII streaming protocol:
| Command Packet | Description | Response Handshake |
|---|---|---|
<pt#X#Y#Z#PHI#SPEED#end> |
Push Cartesian trajectory point to FIFO motion buffer | <RESP:ACK#QUEUE=n> then <RESP:MOVE_DONE#...> |
<CMD:JOG#axis#step> |
Incremental manual jog (X, Y, Z, P) by step mm/deg |
<RESP:ACK#JOG_QUEUED#QUEUE=n> |
<CMD:OVERRIDE#percent> |
Real-time feedrate override scaling (10 to 200 %) |
<RESP:ACK#OVERRIDE=percent> |
<CMD:WAIT#ms> |
Synchronous dwell delay pause on motion controller | <RESP:ACK#WAIT_DONE#MS=ms> |
<CMD:PUMP#1> / <CMD:PUMP#0> |
Energize / de-energize vacuum pump actuator | <RESP:ACK#PUMP_ON> / <RESP:ACK#PUMP_OFF> |
<CMD:VALVE#1> / <CMD:VALVE#0> |
Open / close pneumatic air release valve | <RESP:ACK#VALVE_ON> / <RESP:ACK#VALVE_OFF> |
<CMD:HOME> |
Execute multi-axis homing and calibrate zero | <RESP:ACK#HOMING_STARTED> then <RESP:HOMED_SUCCESS#...> |
<CMD:ENABLE> / <CMD:DISABLE> |
Energize / de-energize stepper driver stages | <RESP:ACK#MOTORS_ENABLED> / <RESP:ACK#MOTORS_DISABLED> |
<CMD:ESTOP> |
Instant emergency stop and motion queue abort | <RESP:ACK#ESTOP_TRIGGERED> |
<CMD:HOLD> / <CMD:RESUME> |
Decelerate to feed hold / resume paused trajectory | <RESP:ACK#FEED_HOLD_ACTIVE> / <RESP:ACK#MOTION_RESUMED> |
<CMD:STATUS> |
Query operational machine state and endstop flags | <RESP:STATUS#STATE=...#ENDSTOPS=...> |
<CMD:GETPOS> |
Read active Cartesian tool coordinates and orientation | <RESP:POS#X=...#Y=...#Z=...#PHI=...> |
<CMD:SET_ELBOW#LEFT\|RIGHT> |
Select inverse kinematic arm solution branch | <RESP:ACK#ELBOW=LEFT\|RIGHT> |
<CMD:GET_ELBOW> |
Query active elbow configuration branch | <RESP:ELBOW#CONFIG=LEFT\|RIGHT> |
<CMD:GET_CONFIG> |
Read persisted geometry, dynamics, and stroke bounds | <RESP:CONFIG#L1=...#L2=...#MIN_SPD=...> |
<CMD:SET_CONFIG#...> |
Update robot link lengths, stroke, and speed bounds | <RESP:ACK#CONFIG_STORED...> |
<CMD:SAVE_CONFIG> |
Commit active configuration to RP2040 Flash (CRC32) | <RESP:ACK#CONFIG_SAVED> |
<CMD:RESET_CONFIG> |
Restore factory default geometry and kinematic bounds | <RESP:ACK#CONFIG_RESET> |
| Response Packet | Category | Streamer Meaning |
|---|---|---|
<RESP:ACK#QUEUE=n> |
Acknowledgment | Waypoint accepted into ring buffer; n slots remaining. |
<RESP:MOVE_DONE#X=..#Y=..#Z=..#PHI=..> |
Move Complete | Physical execution of waypoint completed. Advances done counter. |
<RESP:ACK#WAIT_DONE#...> |
Action Complete | Hardware dwell delay elapsed. Advances streamer progress. |
<RESP:ACK#PUMP_ON\|OFF> |
Action Complete | Tool actuation complete. Advances streamer progress. |
<RESP:ACK#VALVE_ON\|OFF> |
Action Complete | Valve actuation complete. Advances streamer progress. |
<RESP:HOMED_SUCCESS#...> |
Homing Complete | Machine homed and zero-reference established. |
<RESP:NACK_BUFFER_FULL> |
Flow Control | Microcontroller queue full; streamer enters auto-pause. |
<RESP:NACK_ESTOP_ACTIVE> |
Error / Safety | E-Stop asserted; all motions rejected until reset. |
<RESP:NACK_OUT_OF_REACH> |
Kinematic Rejection | Target coordinate outside reachable arm envelope ($R_{max}$). |
<RESP:NACK_SINGULARITY_LIMIT> |
Kinematic Rejection | Target inside inner deadzone ($R_{min} = |L_1 - L_2|$). |
Click to expand code coverage</summary>
| Name | Stmts | Miss | Cover |
|---|---|---|---|
scarajectory/__init__.py |
9 | 0 | 100% |
scarajectory/core/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/jog/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/jog/jog_axis.py |
16 | 0 | 100% |
scarajectory/core/model/jog/jog_command.py |
18 | 0 | 100% |
scarajectory/core/model/jog/jog_direction.py |
14 | 0 | 100% |
scarajectory/core/model/preferences/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/preferences/connection_preference.py |
14 | 0 | 100% |
scarajectory/core/model/protocol/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/protocol/protocol_mode.py |
14 | 0 | 100% |
scarajectory/core/model/protocol/scara_response.py |
16 | 0 | 100% |
scarajectory/core/model/state/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/state/stream_session.py |
19 | 0 | 100% |
scarajectory/core/model/state/stream_state.py |
17 | 0 | 100% |
scarajectory/core/model/streaming/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/streaming/stream_config.py |
18 | 0 | 100% |
scarajectory/core/model/streaming/stream_pacing_config.py |
15 | 0 | 100% |
scarajectory/core/model/telemetry/__init__.py |
9 | 0 | 100% |
scarajectory/core/model/telemetry/diagnostics_bundle.py |
29 | 0 | 100% |
scarajectory/core/model/telemetry/diagnostics_snapshot.py |
29 | 0 | 100% |
scarajectory/core/model/telemetry/fault_event.py |
15 | 0 | 100% |
scarajectory/core/model/telemetry/move_event.py |
14 | 0 | 100% |
scarajectory/core/model/telemetry/scara_status.py |
19 | 0 | 100% |
scarajectory/core/model/telemetry/stream_progress.py |
22 | 0 | 100% |
scarajectory/core/model/telemetry/stream_summary.py |
18 | 0 | 100% |
scarajectory/core/model/trajectory/waypoint.py |
19 | 0 | 100% |
scarajectory/core/service/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/barrier/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/barrier/iflow_barrier.py |
16 | 0 | 100% |
scarajectory/core/service/barrier/iflow_barrier_coordinator.py |
16 | 0 | 100% |
scarajectory/core/service/classifier/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/classifier/iflow_status_classifier.py |
15 | 0 | 100% |
scarajectory/core/service/classifier/ihoming_status_classifier.py |
14 | 0 | 100% |
scarajectory/core/service/classifier/imotion_status_classifier.py |
16 | 0 | 100% |
scarajectory/core/service/classifier/iresponse_parser.py |
16 | 0 | 100% |
scarajectory/core/service/connection/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/connection/ichannel_dispatcher.py |
22 | 0 | 100% |
scarajectory/core/service/connection/iconnection.py |
16 | 0 | 100% |
scarajectory/core/service/connection/iraw_channel.py |
15 | 0 | 100% |
scarajectory/core/service/connection/istream_connection.py |
14 | 0 | 100% |
scarajectory/core/service/engine.py |
38 | 0 | 100% |
scarajectory/core/service/event/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/event/ibinary_frame_dispatcher.py |
15 | 0 | 100% |
scarajectory/core/service/event/ibinary_frame_handler.py |
13 | 0 | 100% |
scarajectory/core/service/iservice.py |
19 | 0 | 100% |
scarajectory/core/service/kinematics/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/kinematics/iscara_deadzone_calculator.py |
14 | 0 | 100% |
scarajectory/core/service/kinematics/scara_deadzone_calculator.py |
16 | 0 | 100% |
scarajectory/core/service/kinematics/scara_deadzone_calculator_factory.py |
17 | 0 | 100% |
scarajectory/core/service/manipulator/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/manipulator/ijog_controller.py |
14 | 0 | 100% |
scarajectory/core/service/manipulator/imotion_controller.py |
16 | 0 | 100% |
scarajectory/core/service/manipulator/iquery_controller.py |
14 | 0 | 100% |
scarajectory/core/service/pacing/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/pacing/iflow_pacing_controller.py |
18 | 0 | 100% |
scarajectory/core/service/packet/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/packet/ipacket_strategy.py |
14 | 0 | 100% |
scarajectory/core/service/preferences/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/preferences/connection_preference_factory.py |
23 | 0 | 100% |
scarajectory/core/service/preferences/iconnection_repository.py |
16 | 0 | 100% |
scarajectory/core/service/service_factory.py |
21 | 1 | 95% |
scarajectory/core/service/settings/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/settings/iscara_bounds_loader.py |
16 | 0 | 100% |
scarajectory/core/service/settings/iscara_bounds_parser.py |
17 | 0 | 100% |
scarajectory/core/service/settings/iscara_transmission_loader.py |
16 | 0 | 100% |
scarajectory/core/service/settings/istream_config_loader.py |
16 | 0 | 100% |
scarajectory/core/service/state/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/state/istream_state_controller.py |
16 | 0 | 100% |
scarajectory/core/service/state/istream_state_machine.py |
18 | 0 | 100% |
scarajectory/core/service/state/session_factory.py |
19 | 1 | 95% |
scarajectory/core/service/storage/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/storage/iplan_loader.py |
16 | 0 | 100% |
scarajectory/core/service/storage/iplan_storage_service.py |
14 | 0 | 100% |
scarajectory/core/service/storage/iplan_storer.py |
17 | 0 | 100% |
scarajectory/core/service/streaming/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/streaming/config_factory.py |
18 | 0 | 100% |
scarajectory/core/service/streaming/ibinary_program_streamer.py |
14 | 0 | 100% |
scarajectory/core/service/streaming/imotion_streamer.py |
14 | 0 | 100% |
scarajectory/core/service/streaming/istream_control_transmitter.py |
17 | 0 | 100% |
scarajectory/core/service/streaming/istream_dispatcher.py |
14 | 0 | 100% |
scarajectory/core/service/streaming/istream_playback_controller.py |
18 | 0 | 100% |
scarajectory/core/service/streaming/observer/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/streaming/observer/iobservable.py |
14 | 0 | 100% |
scarajectory/core/service/streaming/observer/iobserver.py |
15 | 0 | 100% |
scarajectory/core/service/streaming/observer/istream_observer_dispatcher.py |
16 | 0 | 100% |
scarajectory/core/service/streaming/stream_pacing_config_factory.py |
23 | 0 | 100% |
scarajectory/core/service/telemetry/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/telemetry/diagnostics_snapshot_factory.py |
18 | 0 | 100% |
scarajectory/core/service/telemetry/fault_event_factory.py |
17 | 0 | 100% |
scarajectory/core/service/telemetry/move_event_factory.py |
17 | 0 | 100% |
scarajectory/core/service/tool/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/tool/ipurge_valve_actuator.py |
13 | 0 | 100% |
scarajectory/core/service/tool/itool_controller.py |
15 | 0 | 100% |
scarajectory/core/service/trajectory/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/contract/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/contract/iplan_command_service.py |
16 | 0 | 100% |
scarajectory/core/service/trajectory/contract/iplan_persistence_service.py |
14 | 0 | 100% |
scarajectory/core/service/trajectory/contract/iplan_validation_service.py |
13 | 0 | 100% |
scarajectory/core/service/trajectory/history/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/history/iplan_history.py |
17 | 0 | 100% |
scarajectory/core/service/trajectory/history/iplan_history_saver.py |
15 | 0 | 100% |
scarajectory/core/service/trajectory/history/plan_history.py |
38 | 1 | 97% |
scarajectory/core/service/trajectory/history/plan_history_factory.py |
17 | 1 | 94% |
scarajectory/core/service/trajectory/plan/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/history/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/history/plan_history_service.py |
40 | 0 | 100% |
scarajectory/core/service/trajectory/plan/history/plan_history_service_factory.py |
21 | 0 | 100% |
scarajectory/core/service/trajectory/plan/itrajectory_history.py |
14 | 0 | 100% |
scarajectory/core/service/trajectory/plan/itrajectory_mutable.py |
21 | 0 | 100% |
scarajectory/core/service/trajectory/plan/itrajectory_read_only.py |
18 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/iplan_bulk_mutator.py |
16 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/iplan_mutation_service.py |
14 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/iplan_point_mutator.py |
17 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/plan_mutation_service.py |
63 | 0 | 100% |
scarajectory/core/service/trajectory/plan/mutation/plan_mutation_service_factory.py |
21 | 0 | 100% |
scarajectory/core/service/trajectory/plan/observer/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/observer/iplan_observer_dispatcher.py |
18 | 0 | 100% |
scarajectory/core/service/trajectory/plan/observer/itrajectory_observer.py |
14 | 0 | 100% |
scarajectory/core/service/trajectory/plan/observer/plan_observer_dispatcher.py |
29 | 0 | 100% |
scarajectory/core/service/trajectory/plan/observer/plan_observer_dispatcher_factory.py |
17 | 1 | 94% |
scarajectory/core/service/trajectory/plan/selection/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/iplan_selection_coordinator.py |
15 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/iplan_selection_manager.py |
14 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/iplan_selection_navigator.py |
16 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/iplan_selection_state.py |
17 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_coordinator.py |
27 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_coordinator_factory.py |
20 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_manager.py |
35 | 1 | 97% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_manager_factory.py |
26 | 1 | 96% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_navigator.py |
23 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_navigator_factory.py |
18 | 0 | 100% |
scarajectory/core/service/trajectory/plan/selection/plan_selection_state.py |
28 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/iwaypoint_bulk_mutator.py |
16 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/iwaypoint_mutator.py |
17 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/iwaypoint_query.py |
18 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/iwaypoint_store.py |
15 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/waypoint_bulk_mutator.py |
21 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/waypoint_mutator.py |
29 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/waypoint_query.py |
22 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/waypoint_store.py |
41 | 0 | 100% |
scarajectory/core/service/trajectory/plan/store/waypoint_store_factory.py |
27 | 1 | 96% |
scarajectory/core/service/transmission/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/transmission/itransmission_step_calculator.py |
15 | 0 | 100% |
scarajectory/core/service/worker/__init__.py |
9 | 0 | 100% |
scarajectory/core/service/worker/ibyte_sender.py |
13 | 0 | 100% |
scarajectory/core/service/worker/icommand_formatter.py |
14 | 0 | 100% |
scarajectory/core/service/worker/icommand_sender.py |
13 | 0 | 100% |
scarajectory/core/service/worker/iexecution_service.py |
16 | 0 | 100% |
scarajectory/core/service/worker/iexecution_worker.py |
18 | 0 | 100% |
scarajectory/core/service/worker/istream_bytes_receiver.py |
14 | 0 | 100% |
scarajectory/core/service/worker/istream_line_receiver.py |
14 | 0 | 100% |
scarajectory/core/service/worker/istream_loop_runner.py |
16 | 0 | 100% |
scarajectory/engine.py |
58 | 2 | 97% |
scarajectory/infrastructure/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/barrier/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/barrier/flow_barrier.py |
23 | 0 | 100% |
scarajectory/infrastructure/barrier/flow_barrier_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/classifier/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/classifier/iresponse_classification_rule.py |
15 | 0 | 100% |
scarajectory/infrastructure/classifier/response_classification_registry.py |
23 | 0 | 100% |
scarajectory/infrastructure/classifier/response_classification_registry_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/classifier/response_classification_rule.py |
28 | 0 | 100% |
scarajectory/infrastructure/classifier/response_parser.py |
32 | 0 | 100% |
scarajectory/infrastructure/classifier/response_parser_factory.py |
23 | 0 | 100% |
scarajectory/infrastructure/classifier/status/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/classifier/status/flow_status_classifier.py |
24 | 0 | 100% |
scarajectory/infrastructure/classifier/status/flow_status_classifier_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/classifier/status/homing_status_classifier.py |
17 | 0 | 100% |
scarajectory/infrastructure/classifier/status/homing_status_classifier_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/classifier/status/motion_status_classifier.py |
28 | 0 | 100% |
scarajectory/infrastructure/classifier/status/motion_status_classifier_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/cli/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/cli/engine.py |
41 | 0 | 100% |
scarajectory/infrastructure/cli/icli.py |
15 | 0 | 100% |
scarajectory/infrastructure/cli/setup/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/cli/setup/bundle.py |
22 | 1 | 95% |
scarajectory/infrastructure/cli/setup/dep_validator.py |
36 | 5 | 86% |
scarajectory/infrastructure/cli/setup/dependencies.py |
18 | 0 | 100% |
scarajectory/infrastructure/cli/setup/factory.py |
37 | 1 | 97% |
scarajectory/infrastructure/cli/setup/keys.py |
28 | 0 | 100% |
scarajectory/infrastructure/cli/setup/opt_validator.py |
36 | 5 | 86% |
scarajectory/infrastructure/cli/setup/options.py |
17 | 0 | 100% |
scarajectory/infrastructure/cli/setup/registry.py |
24 | 1 | 96% |
scarajectory/infrastructure/cli/setup/validator.py |
43 | 5 | 88% |
scarajectory/infrastructure/command/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/command/command_bundle.py |
16 | 0 | 100% |
scarajectory/infrastructure/command/icommand_definition.py |
14 | 0 | 100% |
scarajectory/infrastructure/command/icommand_executor.py |
14 | 0 | 100% |
scarajectory/infrastructure/command/studio_command_definition.py |
24 | 0 | 100% |
scarajectory/infrastructure/command/studio_command_executor.py |
37 | 0 | 100% |
scarajectory/infrastructure/connection/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/connection/channel_dispatcher.py |
46 | 0 | 100% |
scarajectory/infrastructure/connection/channel_dispatcher_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/connection/istream_raw_transceiver.py |
16 | 0 | 100% |
scarajectory/infrastructure/connection/stream_connection_manager.py |
30 | 0 | 100% |
scarajectory/infrastructure/connection/stream_connection_manager_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/connection/stream_raw_transceiver.py |
28 | 0 | 100% |
scarajectory/infrastructure/connection/stream_raw_transceiver_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/event/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/event/binary_frame_dispatcher.py |
28 | 0 | 100% |
scarajectory/infrastructure/event/binary_frame_dispatcher_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/formatter/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/formatter/command/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/formatter/command/config_command_formatter.py |
22 | 0 | 100% |
scarajectory/infrastructure/formatter/command/jog_command_formatter.py |
15 | 0 | 100% |
scarajectory/infrastructure/formatter/command/motion_command_formatter.py |
38 | 0 | 100% |
scarajectory/infrastructure/formatter/command/query_command_formatter.py |
21 | 0 | 100% |
scarajectory/infrastructure/formatter/command/system_command_formatter.py |
29 | 0 | 100% |
scarajectory/infrastructure/formatter/command/tool_command_formatter.py |
25 | 0 | 100% |
scarajectory/infrastructure/formatter/command_formatter.py |
20 | 0 | 100% |
scarajectory/infrastructure/formatter/command_formatter_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/formatter/command_templates.py |
46 | 2 | 96% |
scarajectory/infrastructure/gui/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/canvas_event_binder.py |
59 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/canvas_event_binder_factory.py |
21 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_drag_handler.py |
40 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_event_context.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_mouse_handler.py |
73 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_mouse_handler_factory.py |
36 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_shape_handler.py |
55 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/canvas_tool_handler.py |
45 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/icanvas_mouse_handler.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/mouse_handler_bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/mouse_handler_init_bundle.py |
22 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/pan/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/pan/canvas_viewport_pan_handler.py |
41 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/pan/canvas_viewport_pan_handler_factory.py |
19 | 1 | 95% |
scarajectory/infrastructure/gui/canvas/handler/pan/icanvas_viewport_pan_handler.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/selection/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/selection/canvas_selection_mouse_handler.py |
49 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/handler/selection/canvas_selection_mouse_handler_factory.py |
22 | 1 | 95% |
scarajectory/infrastructure/gui/canvas/handler/selection/icanvas_selection_mouse_handler.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/icanvas.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/navigation/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/navigation/canvas_view_navigator.py |
34 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/navigation/canvas_view_navigator_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/navigation/icanvas_view_navigator.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/navigation/icanvas_view_target.py |
14 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/observer/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/observer/canvas_plan_observer_bridge.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/observer/canvas_plan_observer_bridge_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/observer/icanvas_plan_observer_bridge.py |
14 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/forbidden_zone_renderer.py |
56 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/ilayer_renderer.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/polar_grid_renderer.py |
36 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/preview_renderer.py |
31 | 1 | 97% |
scarajectory/infrastructure/gui/canvas/render/reach_boundary_renderer.py |
31 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/renderer.py |
34 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/trajectory_renderer.py |
32 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/waypoint_node_renderer.py |
25 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/render/waypoint_node_renderer_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/canvas/status/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/status/canvas_status_presenter.py |
21 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/status/canvas_status_presenter_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/status/icanvas_status_presenter.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/canvas/trajectory_canvas.py |
68 | 4 | 94% |
scarajectory/infrastructure/gui/canvas/trajectory_canvas_factory.py |
44 | 0 | 100% |
scarajectory/infrastructure/gui/connection/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/connection/iport_connection_delegate.py |
13 | 0 | 100% |
scarajectory/infrastructure/gui/connection/null_port_connection_delegate.py |
11 | 0 | 100% |
scarajectory/infrastructure/gui/connection/port_connection_panel.py |
76 | 2 | 97% |
scarajectory/infrastructure/gui/console/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/console/serial_console.py |
39 | 0 | 100% |
scarajectory/infrastructure/gui/console/serial_console_builder.py |
30 | 1 | 97% |
scarajectory/infrastructure/gui/console/serial_console_builder_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/controls/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/controls/bundle.py |
29 | 0 | 100% |
scarajectory/infrastructure/gui/controls/controls_panel.py |
52 | 0 | 100% |
scarajectory/infrastructure/gui/controls/controls_panel_factory.py |
29 | 0 | 100% |
scarajectory/infrastructure/gui/controls/icontrols_panel.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/controls/itabs_assembler.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/controls/manipulator_controllers_bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/controls/manipulator_controllers_factory.py |
34 | 0 | 100% |
scarajectory/infrastructure/gui/controls/tabs_assembler.py |
43 | 0 | 100% |
scarajectory/infrastructure/gui/controls/tabs_assembler_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/controls/tabs_bundle.py |
22 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/code_editor.py |
36 | 3 | 92% |
scarajectory/infrastructure/gui/dsl/code_editor_factory.py |
24 | 1 | 96% |
scarajectory/infrastructure/gui/dsl/console_view.py |
27 | 3 | 89% |
scarajectory/infrastructure/gui/dsl/document/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/document/document_manager.py |
42 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/document/document_manager_factory.py |
22 | 1 | 95% |
scarajectory/infrastructure/gui/dsl/document/example_catalog.py |
35 | 4 | 89% |
scarajectory/infrastructure/gui/dsl/document/example_catalog_factory.py |
23 | 1 | 96% |
scarajectory/infrastructure/gui/dsl/dsl_editor_tab.py |
57 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/dsl_editor_tab_factory.py |
52 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/execution_handler.py |
61 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/execution_handler_bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/execution_handler_factory.py |
18 | 1 | 94% |
scarajectory/infrastructure/gui/dsl/handler/file_handler.py |
47 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/file_handler_bundle.py |
22 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/file_handler_factory.py |
18 | 1 | 94% |
scarajectory/infrastructure/gui/dsl/handler/iexecution_delegate.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/handler/ifile_delegate.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/highlighter.py |
29 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/highlighter_factory.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/ihighlighter.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/itag_applier.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/itokenizer.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/tag_applier.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/tag_applier_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/dsl/syntax/token.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/tokenizer.py |
42 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/syntax/tokenizer_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/dsl/toolbar.py |
50 | 2 | 96% |
scarajectory/infrastructure/gui/editor/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/editor/table/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/editor/table/bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/editor/table/itable.py |
14 | 0 | 100% |
scarajectory/infrastructure/gui/editor/table/selection_handler.py |
28 | 3 | 89% |
scarajectory/infrastructure/gui/editor/table/selection_handler_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/editor/table/trajectory_table.py |
87 | 2 | 98% |
scarajectory/infrastructure/gui/editor/waypoint_coordinate_inputs.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/editor/waypoint_edit_applier.py |
30 | 1 | 97% |
scarajectory/infrastructure/gui/editor/waypoint_edit_applier_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/editor/waypoint_editor.py |
68 | 0 | 100% |
scarajectory/infrastructure/gui/emulator/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/emulator/emulator_launcher.py |
40 | 0 | 100% |
scarajectory/infrastructure/gui/emulator/emulator_launcher_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/emulator/iemulator_launcher.py |
13 | 0 | 100% |
scarajectory/infrastructure/gui/igui.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/layout/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/layout/canvas_pane_builder.py |
30 | 0 | 100% |
scarajectory/infrastructure/gui/layout/canvas_pane_builder_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/layout/editor_pane_builder.py |
38 | 0 | 100% |
scarajectory/infrastructure/gui/layout/editor_pane_builder_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/layout/icanvas_pane_builder.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/layout/ieditor_pane_builder.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/layout/itoolbar_layout_builder.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/layout/main_content_builder.py |
39 | 0 | 100% |
scarajectory/infrastructure/gui/layout/main_content_builder_factory.py |
26 | 0 | 100% |
scarajectory/infrastructure/gui/layout/toolbar_layout_builder.py |
33 | 0 | 100% |
scarajectory/infrastructure/gui/layout/toolbar_layout_builder_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/imanipulator_action_delegate.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/axis_grid_panel.py |
46 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/axis_grid_panel_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/controllers_bundle.py |
22 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/jog_tab.py |
51 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/jog_tab_factory.py |
35 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/panel_bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/power_panel.py |
27 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/power_panel_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/raw_command_panel.py |
36 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/raw_command_panel_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/tool_panel.py |
26 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/jog/tool_panel_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/manipulator_override_panel.py |
60 | 0 | 100% |
scarajectory/infrastructure/gui/manipulator/null_manipulator_action_delegate.py |
14 | 0 | 100% |
scarajectory/infrastructure/gui/menu/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/menu/app_menu_bar.py |
77 | 0 | 100% |
scarajectory/infrastructure/gui/menu/app_menu_bar_factory.py |
26 | 1 | 96% |
scarajectory/infrastructure/gui/menu/builders_bundle.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/menu/bundle.py |
26 | 0 | 100% |
scarajectory/infrastructure/gui/menu/iapp_menu_bar.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/menu/menu_hotkey_binder.py |
23 | 0 | 100% |
scarajectory/infrastructure/gui/menu/menu_hotkey_binder_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/menu/menu_layout_builder.py |
40 | 0 | 100% |
scarajectory/infrastructure/gui/menu/menu_layout_builder_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/model/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/model/canvas_interaction_state.py |
26 | 0 | 100% |
scarajectory/infrastructure/gui/model/canvas_settings.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/model/canvas_tool_mode.py |
17 | 0 | 100% |
scarajectory/infrastructure/gui/model/viewport_transform.py |
47 | 0 | 100% |
scarajectory/infrastructure/gui/preview/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/preview/preview_tab.py |
33 | 0 | 100% |
scarajectory/infrastructure/gui/preview/preview_tab_factory.py |
21 | 0 | 100% |
scarajectory/infrastructure/gui/scarajectory_gui.py |
65 | 2 | 97% |
scarajectory/infrastructure/gui/scarajectory_gui_bundle.py |
27 | 0 | 100% |
scarajectory/infrastructure/gui/scarajectory_gui_factory.py |
57 | 0 | 100% |
scarajectory/infrastructure/gui/scarajectory_gui_init_bundle.py |
28 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/playback_handler_bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/stream_playback_action_handler.py |
61 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/stream_playback_action_handler_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/stream_tool_action_handler.py |
52 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/handler/stream_tool_action_handler_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/observer/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/observer/gui_stream_observer_bridge.py |
23 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/observer/gui_stream_observer_bridge_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/observer/igui_stream_observer_bridge.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/panel/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/panel/istream_control_delegate.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/panel/stream_control_panel.py |
21 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/panel/stream_progress_adapter.py |
35 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/panel/stream_status_bar.py |
30 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/streamer_action_bundle.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/streamer_controllers_bundle.py |
18 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/streamer_tab.py |
70 | 0 | 100% |
scarajectory/infrastructure/gui/streaming/streamer_tab_factory.py |
31 | 0 | 100% |
scarajectory/infrastructure/gui/theme/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/theme/theme_button_styler.py |
23 | 0 | 100% |
scarajectory/infrastructure/gui/theme/theme_button_styler_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/theme/theme_manager.py |
43 | 0 | 100% |
scarajectory/infrastructure/gui/theme/theme_notebook_styler.py |
16 | 0 | 100% |
scarajectory/infrastructure/gui/theme/theme_notebook_styler_factory.py |
17 | 1 | 94% |
scarajectory/infrastructure/gui/toolbar/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/bundle.py |
24 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/itoolbar.py |
15 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/navigation_controls.py |
32 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/navigation_controls_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/parameter_inputs.py |
56 | 1 | 98% |
scarajectory/infrastructure/gui/toolbar/parameter_inputs_bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/parameter_inputs_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/tool_selector.py |
33 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/tool_selector_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/toolbar.py |
33 | 0 | 100% |
scarajectory/infrastructure/gui/toolbar/toolbar_factory.py |
29 | 0 | 100% |
scarajectory/infrastructure/gui/validation/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/gui/validation/validation_tab.py |
35 | 0 | 100% |
scarajectory/infrastructure/gui/validation/validation_tab_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/manipulator/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/manipulator/jog_controller.py |
41 | 1 | 98% |
scarajectory/infrastructure/manipulator/jog_controller_factory.py |
23 | 1 | 96% |
scarajectory/infrastructure/manipulator/motion_controller.py |
46 | 0 | 100% |
scarajectory/infrastructure/manipulator/motion_controller_factory.py |
23 | 1 | 96% |
scarajectory/infrastructure/manipulator/query_controller.py |
36 | 1 | 97% |
scarajectory/infrastructure/manipulator/query_controller_factory.py |
23 | 1 | 96% |
scarajectory/infrastructure/pacing/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/pacing/bundle.py |
16 | 0 | 100% |
scarajectory/infrastructure/pacing/flow_barrier_coordinator.py |
23 | 0 | 100% |
scarajectory/infrastructure/pacing/flow_barrier_coordinator_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/pacing/flow_pacing_bundle_factory.py |
26 | 0 | 100% |
scarajectory/infrastructure/pacing/flow_pacing_controller.py |
77 | 0 | 100% |
scarajectory/infrastructure/pacing/flow_pacing_controller_factory.py |
30 | 0 | 100% |
scarajectory/infrastructure/packet/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/packet/binary_packet_strategy.py |
45 | 0 | 100% |
scarajectory/infrastructure/packet/binary_packet_strategy_factory.py |
28 | 0 | 100% |
scarajectory/infrastructure/preferences/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/preferences/connection_repository.py |
57 | 0 | 100% |
scarajectory/infrastructure/preferences/connection_repository_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/settings/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/settings/bounds/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/settings/bounds/scara_bounds_loader.py |
35 | 1 | 97% |
scarajectory/infrastructure/settings/bounds/scara_bounds_loader_factory.py |
29 | 0 | 100% |
scarajectory/infrastructure/settings/bounds/scara_bounds_parser.py |
19 | 0 | 100% |
scarajectory/infrastructure/settings/bounds/scara_bounds_parser_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/settings/isettings_reader.py |
14 | 0 | 100% |
scarajectory/infrastructure/settings/settings_reader.py |
46 | 1 | 98% |
scarajectory/infrastructure/settings/settings_reader_factory.py |
25 | 0 | 100% |
scarajectory/infrastructure/settings/stream/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/settings/stream/stream_config_loader.py |
27 | 0 | 100% |
scarajectory/infrastructure/settings/stream/stream_config_loader_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/settings/transmission/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/settings/transmission/scara_transmission_loader.py |
21 | 0 | 100% |
scarajectory/infrastructure/settings/transmission/scara_transmission_loader_factory.py |
22 | 0 | 100% |
scarajectory/infrastructure/state/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/state/stream_state_machine.py |
28 | 0 | 100% |
scarajectory/infrastructure/state/stream_state_machine_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/storage/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/storage/plan_loader.py |
37 | 0 | 100% |
scarajectory/infrastructure/storage/plan_storage_service.py |
33 | 0 | 100% |
scarajectory/infrastructure/storage/plan_storage_service_factory.py |
26 | 0 | 100% |
scarajectory/infrastructure/storage/plan_storer.py |
40 | 0 | 100% |
scarajectory/infrastructure/storage/trajectory_serializer.py |
39 | 0 | 100% |
scarajectory/infrastructure/streaming/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/streaming/assembly/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/streaming/assembly/stream_pacing_assembler.py |
21 | 0 | 100% |
scarajectory/infrastructure/streaming/assembly/stream_pipeline_assembler.py |
52 | 1 | 98% |
scarajectory/infrastructure/streaming/assembly/stream_transport_assembler.py |
24 | 0 | 100% |
scarajectory/infrastructure/streaming/assembly/stream_worker_assembler.py |
57 | 0 | 100% |
scarajectory/infrastructure/streaming/assembly/worker_bundle.py |
20 | 0 | 100% |
scarajectory/infrastructure/streaming/binary_program_streamer.py |
50 | 0 | 100% |
scarajectory/infrastructure/streaming/binary_program_streamer_factory.py |
21 | 0 | 100% |
scarajectory/infrastructure/streaming/bundle.py |
22 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/istream_observer_registry.py |
17 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/istream_telemetry_notifier.py |
16 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_observer_dispatcher.py |
35 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_observer_dispatcher_factory.py |
29 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_observer_registry.py |
24 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_observer_registry_factory.py |
23 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_telemetry_notifier.py |
33 | 0 | 100% |
scarajectory/infrastructure/streaming/observer/stream_telemetry_notifier_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/streaming/stream_control_transmitter.py |
42 | 0 | 100% |
scarajectory/infrastructure/streaming/stream_control_transmitter_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/streaming/stream_playback_controller.py |
78 | 0 | 100% |
scarajectory/infrastructure/streaming/stream_playback_controller_factory.py |
25 | 0 | 100% |
scarajectory/infrastructure/tool/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/tool/tool_controller.py |
50 | 0 | 100% |
scarajectory/infrastructure/tool/tool_controller_factory.py |
24 | 0 | 100% |
scarajectory/infrastructure/tool/valve_pulse_worker.py |
23 | 0 | 100% |
scarajectory/infrastructure/tool/valve_pulse_worker_factory.py |
18 | 0 | 100% |
scarajectory/infrastructure/transmission/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/transmission/transmission_step_calculator.py |
24 | 0 | 100% |
scarajectory/infrastructure/transmission/transmission_step_calculator_factory.py |
18 | 1 | 94% |
scarajectory/infrastructure/transport/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/transport/bundle.py |
16 | 0 | 100% |
scarajectory/infrastructure/transport/driver/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/transport/driver/ichannel.py |
19 | 0 | 100% |
scarajectory/infrastructure/transport/driver/serial_channel.py |
37 | 0 | 100% |
scarajectory/infrastructure/transport/driver/serial_channel_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/transport/driver/serial_port_scanner.py |
36 | 0 | 100% |
scarajectory/infrastructure/transport/driver/tcp_channel.py |
66 | 0 | 100% |
scarajectory/infrastructure/transport/driver/tcp_channel_factory.py |
17 | 0 | 100% |
scarajectory/infrastructure/transport/istream_transport_connection.py |
18 | 0 | 100% |
scarajectory/infrastructure/transport/istream_transport_transceiver.py |
16 | 0 | 100% |
scarajectory/infrastructure/transport/listener/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/transport/listener/itransport_listener.py |
15 | 0 | 100% |
scarajectory/infrastructure/transport/listener/itransport_listener_holder.py |
17 | 0 | 100% |
scarajectory/infrastructure/transport/listener/null_transport_listener.py |
13 | 0 | 100% |
scarajectory/infrastructure/transport/listener/stream_ascii_transport_listener.py |
23 | 0 | 100% |
scarajectory/infrastructure/transport/listener/stream_ascii_transport_listener_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/transport/listener/stream_binary_transport_listener.py |
23 | 0 | 100% |
scarajectory/infrastructure/transport/listener/stream_binary_transport_listener_factory.py |
19 | 0 | 100% |
scarajectory/infrastructure/transport/listener/transport_listener_holder.py |
22 | 0 | 100% |
scarajectory/infrastructure/transport/stream_transport_connection.py |
61 | 1 | 98% |
scarajectory/infrastructure/transport/stream_transport_connection_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/transport/stream_transport_transceiver.py |
54 | 0 | 100% |
scarajectory/infrastructure/transport/stream_transport_transceiver_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/transport/transport_factory.py |
35 | 1 | 97% |
scarajectory/infrastructure/transport/worker/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/transport/worker/itransport_reader_worker.py |
14 | 0 | 100% |
scarajectory/infrastructure/transport/worker/transport_reader_worker.py |
54 | 0 | 100% |
scarajectory/infrastructure/transport/worker/transport_reader_worker_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/worker/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/worker/binary/__init__.py |
9 | 0 | 100% |
scarajectory/infrastructure/worker/binary/binary_stream_execution_worker.py |
60 | 0 | 100% |
scarajectory/infrastructure/worker/binary/binary_stream_execution_worker_factory.py |
31 | 0 | 100% |
scarajectory/infrastructure/worker/binary/binary_stream_frame_handler.py |
55 | 0 | 100% |
scarajectory/infrastructure/worker/binary/binary_stream_frame_handler_factory.py |
20 | 0 | 100% |
scarajectory/infrastructure/worker/binary/binary_stream_loop_runner.py |
98 | 2 | 98% |
scarajectory/infrastructure/worker/binary/binary_stream_loop_runner_factory.py |
32 | 0 | 100% |
scarajectory/infrastructure/worker/binary/ibinary_stream_frame_handler.py |
16 | 0 | 100% |
scarajectory/infrastructure/worker/binary/ibinary_stream_loop_runner.py |
18 | 0 | 100% |
scarajectory/infrastructure/worker/istream_queue_drainer.py |
16 | 0 | 100% |
scarajectory/infrastructure/worker/istream_step_dispatcher.py |
15 | 0 | 100% |
scarajectory/infrastructure/worker/stream_execution_worker.py |
52 | 0 | 100% |
scarajectory/infrastructure/worker/stream_execution_worker_factory.py |
30 | 3 | 90% |
scarajectory/infrastructure/worker/stream_loop_runner.py |
57 | 3 | 95% |
scarajectory/infrastructure/worker/stream_loop_runner_factory.py |
38 | 1 | 97% |
scarajectory/infrastructure/worker/stream_queue_drainer.py |
40 | 1 | 98% |
scarajectory/infrastructure/worker/stream_queue_drainer_factory.py |
20 | 1 | 95% |
scarajectory/infrastructure/worker/stream_step_dispatcher.py |
49 | 0 | 100% |
scarajectory/infrastructure/worker/stream_step_dispatcher_factory.py |
22 | 1 | 95% |
scarajectory/setup/__init__.py |
9 | 0 | 100% |
scarajectory/setup/assembly/__init__.py |
9 | 0 | 100% |
scarajectory/setup/assembly/app_core_assembler.py |
33 | 0 | 100% |
scarajectory/setup/assembly/app_core_bundle.py |
20 | 0 | 100% |
scarajectory/setup/assembly/app_presentation_assembler.py |
40 | 0 | 100% |
scarajectory/setup/assembly/app_runtime_assembler.py |
33 | 0 | 100% |
scarajectory/setup/assembly/app_runtime_bundle.py |
24 | 0 | 100% |
scarajectory/setup/bundle.py |
25 | 1 | 96% |
scarajectory/setup/dep_validator.py |
36 | 5 | 86% |
scarajectory/setup/dependencies.py |
21 | 0 | 100% |
scarajectory/setup/factory.py |
72 | 4 | 94% |
scarajectory/setup/keys.py |
37 | 0 | 100% |
scarajectory/setup/opt_validator.py |
36 | 5 | 86% |
scarajectory/setup/options.py |
20 | 0 | 100% |
scarajectory/setup/pipeline/__init__.py |
9 | 0 | 100% |
scarajectory/setup/pipeline/dsl_pipeline_builder.py |
29 | 0 | 100% |
scarajectory/setup/pipeline/plan_pipeline_builder.py |
35 | 0 | 100% |
scarajectory/setup/pipeline/plan_pipeline_bundle.py |
22 | 0 | 100% |
scarajectory/setup/pipeline/stream_pipeline_builder.py |
58 | 0 | 100% |
scarajectory/setup/pipeline/stream_pipeline_bundle.py |
22 | 0 | 100% |
scarajectory/setup/registry.py |
34 | 1 | 97% |
scarajectory/setup/validator.py |
53 | 5 | 91% |
| Total | 13316 | 120 | 99% |
</details>
Install package
pip3 install scarajectory
Prepare main entry point by downloading main.py or create your own.
wget -O main.py https://raw.githubusercontent.com/vroncevic/scarajectory/main/main.py
Launch the graphical studio with default configuration:
python3 main.py studio
Launch with initial trajectory plan file, deadzone restriction, and verbose output:
python3 main.py studio --file ./trajectories/rectangle_demo.json --dead-zone --verbose
| Option | Type | Choices | Description |
|---|---|---|---|
--file |
str |
File path | Path to initial trajectory JSON plan file to load on startup. |
--dead-zone |
bool |
Flag | Enable kinematic dead zone enforcement ($R_{min}$). |
--verbose |
bool |
Flag | Enable verbose ATS operational logging. |
<pt#...#end>) under the Program Preview tab./dev/ttyACM0 (or TCP host) under the Hardware Streamer tab.scarajectory seamlessly integrates with scaraemu as a software-in-the-loop (SITL) Digital Twin. This allows you to visually simulate, animate, and validate trajectories and .scara DSL programs in 2D/3D before deploying to physical hardware.
.scara program (or select from bundled examples in examples/).--file.python3 main.py emulator
127.0.0.1:8888.python3 main.py studio
.scara script.β‘ Compile to Plan. The AST compiler compiles Cartesian paths, macros, and action commands into the active trajectory plan.127.0.0.1:8888 (Digital Twin).Streamer: Connected to 127.0.0.1:8888.<pt#X#Y#Z#PHI#SPEED#end>) stream live over the loopback TCP socket.<RESP:ACK#QUEUE=1>, <RESP:MOVE_DONE#...>) flow back to scarajectory, dynamically driving the streaming progress bar.pick_and_place.scara, engrave_spiral.scara, pallet_matrix.scara)..scara script or exported plan.json file.More documentation and info at
Copyright (C) 2026 by vroncevic.github.io/scarajectory
scarajectory is free software; you can redistribute it and/or modify it under the same terms as Python itself, either Python version 3.x or, at your option, any later version of Python 3 you may have available.
Special thanks to Google and the Google developer ecosystem for their tremendous support and innovative tools from the Google bundle that empowered the development and realization of this project. Google, you make this world a better place! πβ¨
Lets help and support PSF.