
mecharmory is a standalone desktop motion planning, kinematic validation, and real-time serial controller for 6-DOF robotic arm manipulators running Raspberry Pi Pico (RP2040) C SDK firmware and PCA9685 I2C 16-channel PWM drivers.
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
Currently there are four ways to install package
mecharmory is located at pypi.org.
You can install by using pip
# python3
pip3 install mecharmory
Navigate to release page download and extract release archive.
To install mecharmory type the following
tar xvzf mecharmory-x.y.z.tar.gz
cd mecharmory-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/mecharmory-*-py3-none-any.whl
rm -f get-pip.py
Navigate to release page download and extract release archive.
To install mecharmory locate and run setup.py with arguments
tar xvzf mecharmory-x.y.z.tar.gz
cd mecharmory-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:
docker build -t mecharmory:latest .
mecharmory requires next modules and libraries
mecharmory is based on OOP and Clean Architecture.
Tool structure
Click to expand framework structure</summary>
mecharmory/
โโโ core/
โย ย โโโ __init__.py
โย ย โโโ model/
โย ย โย ย โโโ arm/
โย ย โย ย โย ย โโโ arm_config_defaults.py
โย ย โย ย โย ย โโโ arm_model.py
โย ย โย ย โย ย โโโ arm_preset_defaults.py
โย ย โย ย โย ย โโโ iarm_model.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ communication/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ serial_message.py
โย ย โย ย โโโ dsl/
โย ย โย ย โย ย โโโ ast/
โย ย โย ย โย ย โย ย โโโ imecha_instruction.py
โย ย โย ย โย ย โย ย โโโ imecha_program.py
โย ย โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โย ย โโโ mecha_command_type.py
โย ย โย ย โย ย โย ย โโโ mecha_instruction.py
โย ย โย ย โย ย โย ย โโโ mecha_program.py
โย ย โย ย โย ย โโโ diagnostic/
โย ย โย ย โย ย โย ย โโโ imecha_diagnostic.py
โย ย โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โย ย โโโ mecha_diagnostic.py
โย ย โย ย โย ย โย ย โโโ mecha_diagnostic_severity.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ token/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ mecha_token.py
โย ย โย ย โย ย โโโ mecha_token_type.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ kinematics/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ joint_config.py
โย ย โย ย โย ย โโโ joint_id.py
โย ย โย ย โย ย โโโ joint_state.py
โย ย โย ย โโโ preset/
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ motion_preset.py
โย ย โโโ service/
โย ย โโโ arm/
โย ย โย ย โโโ arm_command_formatter.py
โย ย โย ย โโโ arm_controller_service.py
โย ย โย ย โโโ arm_telemetry_parser.py
โย ย โย ย โโโ iarm_controller_service.py
โย ย โย ย โโโ __init__.py
โย ย โโโ dsl/
โย ย โย ย โโโ compiler/
โย ย โย ย โย ย โโโ imecha_compiler.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ mecha_compiler.py
โย ย โย ย โโโ imecha_dsl_service.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ lexer/
โย ย โย ย โย ย โโโ imecha_lexer.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ mecha_lexer.py
โย ย โย ย โโโ linter/
โย ย โย ย โย ย โโโ imecha_linter.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ mecha_kinematic_bounds_checker.py
โย ย โย ย โย ย โโโ mecha_linter.py
โย ย โย ย โโโ mecha_dsl_service.py
โย ย โย ย โโโ parser/
โย ย โย ย โโโ imecha_parser.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ mecha_command_parser.py
โย ย โย ย โโโ mecha_parser.py
โย ย โโโ engine.py
โย ย โโโ firmware/
โย ย โย ย โโโ firmware_command_parser.py
โย ย โย ย โโโ firmware_simulator.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ ivirtual_arm_firmware.py
โย ย โย ย โโโ virtual_arm_firmware.py
โย ย โโโ __init__.py
โย ย โโโ iservice.py
โย ย โโโ serial/
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ iserial_service.py
โย ย โย ย โโโ serial_listener_hub.py
โย ย โย ย โโโ serial_rx_worker.py
โย ย โย ย โโโ serial_service.py
โย ย โโโ storage/
โย ย โย ย โโโ iarm_storage_service.py
โย ย โย ย โโโ __init__.py
โย ย โโโ transport/
โย ย โโโ __init__.py
โย ย โโโ itransport.py
โโโ engine.py
โโโ infrastructure/
โย ย โโโ 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.py
โย ย โย ย โโโ icommand_definition.py
โย ย โย ย โโโ icommand_executor.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ studio_command_definition.py
โย ย โย ย โโโ studio_command_executor.py
โย ย โโโ communication/
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ iserial_port_scanner.py
โย ย โย ย โโโ iserial_preferences.py
โย ย โย ย โโโ itransport.py
โย ย โย ย โโโ serial_port_scanner.py
โย ย โย ย โโโ serial_preferences.py
โย ย โย ย โโโ serial_transport.py
โย ย โย ย โโโ virtual_serial_transport.py
โย ย โโโ config/
โย ย โย ย โโโ mecharmory.cfg
โย ย โย ย โโโ mecharmory.logo
โย ย โย ย โโโ mecharmory_config.json
โย ย โย ย โโโ scheme.json
โย ย โโโ gui/
โย ย โย ย โโโ arm/
โย ย โย ย โย ย โโโ arm_control_header.py
โย ย โย ย โย ย โโโ arm_control_panel.py
โย ย โย ย โย ย โโโ arm_joint_list.py
โย ย โย ย โย ย โโโ arm_panel_style.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ canvas/
โย ย โย ย โย ย โโโ arm_background_painter.py
โย ย โย ย โย ย โโโ arm_canvas_painter.py
โย ย โย ย โย ย โโโ arm_canvas_preview.py
โย ย โย ย โย ย โโโ arm_canvas_style.py
โย ย โย ย โย ย โโโ arm_hud_painter.py
โย ย โย ย โย ย โโโ arm_kinematics_2d.py
โย ย โย ย โย ย โโโ arm_linkage_painter.py
โย ย โย ย โย ย โโโ arm_pedestal_painter.py
โย ย โย ย โย ย โโโ arm_pose_2d.py
โย ย โย ย โย ย โโโ arm_tool_painter.py
โย ย โย ย โย ย โโโ arm_tube_painter.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ console/
โย ย โย ย โย ย โโโ console_command_entry.py
โย ย โย ย โย ย โโโ console_header_toolbar.py
โย ย โย ย โย ย โโโ console_log_viewer.py
โย ย โย ย โย ย โโโ console_panel.py
โย ย โย ย โย ย โโโ console_panel_style.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ dsl/
โย ย โย ย โย ย โโโ imecha_editor_tab.py
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ mecha_code_editor.py
โย ย โย ย โย ย โโโ mecha_console_view.py
โย ย โย ย โย ย โโโ mecha_document_manager.py
โย ย โย ย โย ย โโโ mecha_editor_tab.py
โย ย โย ย โย ย โโโ mecha_editor_toolbar.py
โย ย โย ย โย ย โโโ mecha_example_catalog.py
โย ย โย ย โย ย โโโ mecha_stream_runner.py
โย ย โย ย โย ย โโโ mecha_syntax_highlighter.py
โย ย โย ย โโโ gui_event_mediator.py
โย ย โย ย โโโ gui_window.py
โย ย โย ย โโโ gui_window_style.py
โย ย โย ย โโโ igui_window.py
โย ย โย ย โโโ __init__.py
โย ย โย ย โโโ joint/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ joint_control_widget.py
โย ย โย ย โย ย โโโ joint_entry_control.py
โย ย โย ย โย ย โโโ joint_step_buttons.py
โย ย โย ย โย ย โโโ joint_widget_style.py
โย ย โย ย โโโ preset/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ preset_panel.py
โย ย โย ย โย ย โโโ preset_panel_style.py
โย ย โย ย โโโ serial/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ serial_bar.py
โย ย โย ย โย ย โโโ serial_panel_style.py
โย ย โย ย โย ย โโโ serial_port_selector.py
โย ย โย ย โย ย โโโ serial_status_badge.py
โย ย โย ย โโโ theme/
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ theme_manager.py
โย ย โย ย โโโ workspace/
โย ย โย ย โโโ arm_workspace.py
โย ย โย ย โโโ __init__.py
โย ย โโโ __init__.py
โย ย โโโ storage/
โย ย โโโ arm_storage_service.py
โย ย โโโ __init__.py
โโโ __init__.py
โโโ setup/
โโโ bundle.py
โโโ config_resolver.py
โโโ dep_validator.py
โโโ dependencies.py
โโโ factory.py
โโโ __init__.py
โโโ keys.py
โโโ model_resolver.py
โโโ opt_validator.py
โโโ options.py
โโโ registry.py
โโโ validator.py
40 directories, 171 files
</details>
mecharmory is built on a strictly decoupled, Layered Clean Architecture where presentation, domain logic, and hardware communication are segregated through pure Python protocols:
@runtime_checkable Protocol definitions. VirtualSerialTransport seamlessly substitutes SerialTransport.IArmControllerService, ISerialService, ITransport).run_quality_gates.sh)Every build is validated against 4 strict automated quality gates:
@runtime_checkable Protocol structural typing./dev/ttyACM*)..mecha): Declarative scripting language for automated robotic trajectories, variable definitions (VAR), Cartesian/joint 6-DOF points (POINT), kinematic motion primitives (MOVE_P, MOVE_J, MOVE_REL, PRESET), timing (WAIT_MS, SYNC), velocity profiling (SPEED, SPEED_JOINT, OVERRIDE), and tool actuation (GRIPPER, TOOL_ROLL, HOME, STOP).MechaEditorTab): Full-featured IDE tab within ttk.Notebook with syntax highlighting (Catppuccin Mocha theme), line numbers, file open/save, live execution console, and preloaded example catalog.J0โJ5), undefined variables, argument type mismatches, and syntax errors with clear diagnostic severity (ERROR, WARNING, INFO).mecharmory features Mecha, a dedicated domain-specific language designed for robotic manipulation, automated pick-and-place routines, calibration routines, and continuous trajectory execution. Mecha scripts are saved with the .mecha extension and can be authored, linted, compiled, and executed directly within the integrated Mecha Script Editor tab.
VAR): Declare numerical values for velocities, angles, and wait intervals.
VAR approach_speed = 45.0
VAR place_delay = 500
POINT): Define 6-DOF joint postures (J0 Base, J1 Shoulder Left, J2 Shoulder Right, J3 Elbow Roll, J4 Pitch Tilt, J5 Tool Flange).
POINT pick_pos = 45.0, 40.0, 40.0, 90.0, 70.0, 90.0
MOVE_P): Move all 6 joints simultaneously to a named point.
MOVE_P pick_pos
MOVE_J, MOVE_REL): Target an individual joint by ID or apply relative angle increments.
MOVE_J 0 90.0
MOVE_REL 4 -15.0
PRESET): Navigate instantly to predefined arm postures (home, park, inspect, ready, etc.).
PRESET inspect
SPEED, SPEED_JOINT, OVERRIDE): Configure global velocity, per-joint velocity limits, and global override scaling factor ($0.05 \le f \le 1.0$).
SPEED 50.0
SPEED_JOINT 0 30.0
OVERRIDE 0.8
GRIPPER, TOOL_ROLL): Control end-effector aperture and wrist orientation.
GRIPPER 85.0
TOOL_ROLL 90.0
WAIT_MS, SYNC, HOME, STOP): Introduce millisecond dwell times, synchronize with physical motion completion, return to home, or trigger an emergency stop.
WAIT_MS 1000
SYNC
HOME
| Command | Arguments | Description | Example |
|---|---|---|---|
VAR |
<name> = <val> |
Declare a numerical variable | VAR speed = 40.0 |
POINT |
<name> = <j0>, <j1>, <j2>, <j3>, <j4>, <j5> |
Define a 6-DOF joint target posture | POINT pick = 90, 45, 45, 90, 80, 90 |
MOVE_P |
<point_name> |
Coordinated 6-DOF simultaneous move | MOVE_P pick |
MOVE_J |
<joint_id> <angle> |
Move single joint (0โ5) to target angle | MOVE_J 0 45.0 |
MOVE_REL |
<joint_id> <delta> |
Relative angle adjustment for single joint | MOVE_REL 4 -10.0 |
PRESET |
<preset_name> |
Move to built-in posture preset | PRESET inspect |
SPEED |
<deg_per_sec> |
Set global default joint motion speed | SPEED 60.0 |
SPEED_JOINT |
<joint_id> <deg_per_sec> |
Set joint-specific velocity limit | SPEED_JOINT 1 45.0 |
OVERRIDE |
<factor> |
Global speed scaling factor (0.05 โ 1.0) | OVERRIDE 0.75 |
GRIPPER |
<angle_or_val> |
Command end-effector gripper aperture | GRIPPER 80.0 |
TOOL_ROLL |
<angle> |
Set wrist / tool roll orientation (J5) | TOOL_ROLL 90.0 |
WAIT_MS |
<millis> |
Dwell/pause execution for specified milliseconds | WAIT_MS 500 |
SYNC |
None | Synchronize and wait for physical motion completion | SYNC |
HOME |
None | Move all joints to factory neutral / home position (90ยฐ) | HOME |
STOP |
None | Immediate emergency stop for all joints | STOP |
pick_and_place.mecha)# Pick-and-Place Demonstration Routine
VAR approach_speed = 45.0
VAR place_speed = 30.0
POINT pick_approach = 45.0, 60.0, 60.0, 90.0, 80.0, 90.0
POINT pick_pos = 45.0, 40.0, 40.0, 90.0, 70.0, 90.0
POINT drop_approach = 135.0, 60.0, 60.0, 90.0, 80.0, 90.0
POINT drop_pos = 135.0, 40.0, 40.0, 90.0, 70.0, 90.0
HOME
SPEED approach_speed
MOVE_P pick_approach
SYNC
SPEED place_speed
MOVE_P pick_pos
SYNC
GRIPPER 85.0
WAIT_MS 500
MOVE_P pick_approach
SYNC
SPEED approach_speed
MOVE_P drop_approach
SYNC
SPEED place_speed
MOVE_P drop_pos
SYNC
GRIPPER 30.0
WAIT_MS 500
MOVE_P drop_approach
SYNC
HOME
The GUI provides a dedicated tab [ ๐ Mecha Script Editor ] alongside [ ๐ฎ Manual Workspace ]:
#cba6f7, points/variables in blue #89b4fa, numbers in peach #fab387, comments in overlay #6c7086).| Joint ID | Channel | Name | Safe Angle Range | Neutral (Home) | Pulse Width (ยตs) | Role in Mechanism |
|---|---|---|---|---|---|---|
| J0 | Ch 0 | Base Rotation |
0ยฐ โ 180ยฐ | 90ยฐ | 500 โ 2500 ยตs | Base turntable yaw rotation |
| J1 | Ch 1 | Shoulder Lift Left |
15ยฐ โ 165ยฐ | 90ยฐ | 600 โ 2400 ยตs | Shoulder lift (Left servo, tandem drive) |
| J2 | Ch 2 | Shoulder Lift Right |
15ยฐ โ 165ยฐ | 90ยฐ | 600 โ 2400 ยตs | Shoulder lift (Right servo, symmetrical tandem) |
| J3 | Ch 3 | Elbow Roll |
0ยฐ โ 180ยฐ | 90ยฐ | 500 โ 2500 ยตs | Elbow aluminum tube axial roll |
| J4 | Ch 4 | End-effector Tilt |
15ยฐ โ 165ยฐ | 90ยฐ | 500 โ 2500 ยตs | End-effector wrist pitch tilt |
| J5 | Ch 5 | Tool End Rotation |
0ยฐ โ 180ยฐ | 90ยฐ | 500 โ 2500 ยตs | Tool flange / steering wheel rotation |
| Command | Arguments | Description | Example |
|---|---|---|---|
SET |
<joint_id> <angle> |
Move specific joint with default speed | SET 0 90.00 |
SETP |
<j0> <j1> <j2> <j3> <j4> <j5> |
Move all joints simultaneously | SETP 90 90 90 90 90 90 |
SPEED |
<joint_id> <deg_per_sec> |
Set maximum joint movement velocity | SPEED 1 45.0 |
HOME |
None | Return all joints to home position (90ยฐ) | HOME |
STOP |
None | Immediate emergency stop for all joints | STOP |
STATUS |
None | Query current joint angles | STATUS |
PING |
None | Heartbeat ping | PING $\to$ PONG |
Click to expand code coverage</summary>
| Name | Stmts | Miss | Cover |
|---|---|---|---|
mecharmory/__init__.py |
9 | 0 | 100% |
mecharmory/core/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/arm/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/arm/arm_config_defaults.py |
15 | 0 | 100% |
mecharmory/core/model/arm/arm_model.py |
45 | 0 | 100% |
mecharmory/core/model/arm/arm_preset_defaults.py |
32 | 0 | 100% |
mecharmory/core/model/arm/iarm_model.py |
23 | 0 | 100% |
mecharmory/core/model/communication/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/communication/serial_message.py |
24 | 0 | 100% |
mecharmory/core/model/dsl/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/dsl/ast/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/dsl/ast/imecha_instruction.py |
22 | 0 | 100% |
mecharmory/core/model/dsl/ast/imecha_program.py |
23 | 0 | 100% |
mecharmory/core/model/dsl/ast/mecha_command_type.py |
29 | 0 | 100% |
mecharmory/core/model/dsl/ast/mecha_instruction.py |
34 | 2 | 94% |
mecharmory/core/model/dsl/ast/mecha_program.py |
36 | 0 | 100% |
mecharmory/core/model/dsl/diagnostic/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/dsl/diagnostic/imecha_diagnostic.py |
24 | 0 | 100% |
mecharmory/core/model/dsl/diagnostic/mecha_diagnostic.py |
39 | 3 | 92% |
mecharmory/core/model/dsl/diagnostic/mecha_diagnostic_severity.py |
15 | 0 | 100% |
mecharmory/core/model/dsl/token/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/dsl/token/mecha_token.py |
17 | 0 | 100% |
mecharmory/core/model/dsl/token/mecha_token_type.py |
21 | 0 | 100% |
mecharmory/core/model/kinematics/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/kinematics/joint_config.py |
22 | 0 | 100% |
mecharmory/core/model/kinematics/joint_id.py |
17 | 0 | 100% |
mecharmory/core/model/kinematics/joint_state.py |
18 | 0 | 100% |
mecharmory/core/model/preset/__init__.py |
9 | 0 | 100% |
mecharmory/core/model/preset/motion_preset.py |
15 | 0 | 100% |
mecharmory/core/service/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/arm/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/arm/arm_command_formatter.py |
29 | 1 | 97% |
mecharmory/core/service/arm/arm_controller_service.py |
75 | 2 | 97% |
mecharmory/core/service/arm/arm_telemetry_parser.py |
35 | 3 | 91% |
mecharmory/core/service/arm/iarm_controller_service.py |
24 | 0 | 100% |
mecharmory/core/service/dsl/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/dsl/compiler/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/dsl/compiler/imecha_compiler.py |
14 | 14 | 0% |
mecharmory/core/service/dsl/compiler/mecha_compiler.py |
138 | 49 | 64% |
mecharmory/core/service/dsl/imecha_dsl_service.py |
21 | 0 | 100% |
mecharmory/core/service/dsl/lexer/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/dsl/lexer/imecha_lexer.py |
14 | 14 | 0% |
mecharmory/core/service/dsl/lexer/mecha_lexer.py |
53 | 3 | 94% |
mecharmory/core/service/dsl/linter/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/dsl/linter/imecha_linter.py |
16 | 16 | 0% |
mecharmory/core/service/dsl/linter/mecha_kinematic_bounds_checker.py |
33 | 1 | 97% |
mecharmory/core/service/dsl/linter/mecha_linter.py |
119 | 31 | 74% |
mecharmory/core/service/dsl/mecha_dsl_service.py |
49 | 0 | 100% |
mecharmory/core/service/dsl/parser/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/dsl/parser/imecha_parser.py |
15 | 15 | 0% |
mecharmory/core/service/dsl/parser/mecha_command_parser.py |
71 | 3 | 96% |
mecharmory/core/service/dsl/parser/mecha_parser.py |
69 | 8 | 88% |
mecharmory/core/service/engine.py |
33 | 1 | 97% |
mecharmory/core/service/firmware/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/firmware/firmware_command_parser.py |
89 | 15 | 83% |
mecharmory/core/service/firmware/firmware_simulator.py |
83 | 7 | 92% |
mecharmory/core/service/firmware/ivirtual_arm_firmware.py |
16 | 16 | 0% |
mecharmory/core/service/firmware/virtual_arm_firmware.py |
25 | 0 | 100% |
mecharmory/core/service/iservice.py |
21 | 0 | 100% |
mecharmory/core/service/serial/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/serial/iserial_service.py |
21 | 0 | 100% |
mecharmory/core/service/serial/serial_listener_hub.py |
30 | 6 | 80% |
mecharmory/core/service/serial/serial_rx_worker.py |
38 | 3 | 92% |
mecharmory/core/service/serial/serial_service.py |
67 | 4 | 94% |
mecharmory/core/service/storage/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/storage/iarm_storage_service.py |
17 | 0 | 100% |
mecharmory/core/service/transport/__init__.py |
9 | 0 | 100% |
mecharmory/core/service/transport/itransport.py |
17 | 0 | 100% |
mecharmory/engine.py |
64 | 64 | 0% |
mecharmory/infrastructure/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/cli/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/cli/engine.py |
41 | 9 | 78% |
mecharmory/infrastructure/cli/icli.py |
15 | 0 | 100% |
mecharmory/infrastructure/cli/setup/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/cli/setup/bundle.py |
22 | 1 | 95% |
mecharmory/infrastructure/cli/setup/dep_validator.py |
36 | 5 | 86% |
mecharmory/infrastructure/cli/setup/dependencies.py |
18 | 0 | 100% |
mecharmory/infrastructure/cli/setup/factory.py |
37 | 0 | 100% |
mecharmory/infrastructure/cli/setup/keys.py |
28 | 0 | 100% |
mecharmory/infrastructure/cli/setup/opt_validator.py |
36 | 5 | 86% |
mecharmory/infrastructure/cli/setup/options.py |
17 | 0 | 100% |
mecharmory/infrastructure/cli/setup/registry.py |
24 | 0 | 100% |
mecharmory/infrastructure/cli/setup/validator.py |
43 | 5 | 88% |
mecharmory/infrastructure/command/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/command/command.py |
16 | 0 | 100% |
mecharmory/infrastructure/command/icommand_definition.py |
14 | 0 | 100% |
mecharmory/infrastructure/command/icommand_executor.py |
14 | 0 | 100% |
mecharmory/infrastructure/command/studio_command_definition.py |
24 | 1 | 96% |
mecharmory/infrastructure/command/studio_command_executor.py |
49 | 26 | 47% |
mecharmory/infrastructure/communication/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/communication/iserial_port_scanner.py |
14 | 0 | 100% |
mecharmory/infrastructure/communication/iserial_preferences.py |
14 | 0 | 100% |
mecharmory/infrastructure/communication/itransport.py |
17 | 17 | 0% |
mecharmory/infrastructure/communication/serial_port_scanner.py |
35 | 1 | 97% |
mecharmory/infrastructure/communication/serial_preferences.py |
51 | 3 | 94% |
mecharmory/infrastructure/communication/serial_transport.py |
60 | 36 | 40% |
mecharmory/infrastructure/communication/virtual_serial_transport.py |
67 | 2 | 97% |
mecharmory/infrastructure/gui/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/arm/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/arm/arm_control_header.py |
36 | 0 | 100% |
mecharmory/infrastructure/gui/arm/arm_control_panel.py |
30 | 0 | 100% |
mecharmory/infrastructure/gui/arm/arm_joint_list.py |
41 | 1 | 98% |
mecharmory/infrastructure/gui/arm/arm_panel_style.py |
34 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_background_painter.py |
17 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_canvas_painter.py |
48 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_canvas_preview.py |
46 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_canvas_style.py |
54 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_hud_painter.py |
17 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_kinematics_2d.py |
41 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_linkage_painter.py |
22 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_pedestal_painter.py |
22 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_pose_2d.py |
24 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_tool_painter.py |
30 | 0 | 100% |
mecharmory/infrastructure/gui/canvas/arm_tube_painter.py |
27 | 0 | 100% |
mecharmory/infrastructure/gui/console/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/console/console_command_entry.py |
41 | 6 | 85% |
mecharmory/infrastructure/gui/console/console_header_toolbar.py |
36 | 0 | 100% |
mecharmory/infrastructure/gui/console/console_log_viewer.py |
70 | 25 | 64% |
mecharmory/infrastructure/gui/console/console_panel.py |
39 | 4 | 90% |
mecharmory/infrastructure/gui/console/console_panel_style.py |
51 | 0 | 100% |
mecharmory/infrastructure/gui/dsl/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/dsl/imecha_editor_tab.py |
18 | 18 | 0% |
mecharmory/infrastructure/gui/dsl/mecha_code_editor.py |
36 | 3 | 92% |
mecharmory/infrastructure/gui/dsl/mecha_console_view.py |
38 | 3 | 92% |
mecharmory/infrastructure/gui/dsl/mecha_document_manager.py |
47 | 28 | 40% |
mecharmory/infrastructure/gui/dsl/mecha_editor_tab.py |
97 | 28 | 71% |
mecharmory/infrastructure/gui/dsl/mecha_editor_toolbar.py |
40 | 5 | 88% |
mecharmory/infrastructure/gui/dsl/mecha_example_catalog.py |
18 | 0 | 100% |
mecharmory/infrastructure/gui/dsl/mecha_stream_runner.py |
43 | 21 | 51% |
mecharmory/infrastructure/gui/dsl/mecha_syntax_highlighter.py |
54 | 0 | 100% |
mecharmory/infrastructure/gui/gui_event_mediator.py |
70 | 0 | 100% |
mecharmory/infrastructure/gui/gui_window.py |
100 | 17 | 83% |
mecharmory/infrastructure/gui/gui_window_style.py |
22 | 0 | 100% |
mecharmory/infrastructure/gui/igui_window.py |
16 | 0 | 100% |
mecharmory/infrastructure/gui/joint/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/joint/joint_control_widget.py |
80 | 22 | 72% |
mecharmory/infrastructure/gui/joint/joint_entry_control.py |
40 | 6 | 85% |
mecharmory/infrastructure/gui/joint/joint_step_buttons.py |
29 | 0 | 100% |
mecharmory/infrastructure/gui/joint/joint_widget_style.py |
45 | 0 | 100% |
mecharmory/infrastructure/gui/preset/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/preset/preset_panel.py |
28 | 0 | 100% |
mecharmory/infrastructure/gui/preset/preset_panel_style.py |
22 | 0 | 100% |
mecharmory/infrastructure/gui/serial/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/serial/serial_bar.py |
61 | 9 | 85% |
mecharmory/infrastructure/gui/serial/serial_panel_style.py |
51 | 0 | 100% |
mecharmory/infrastructure/gui/serial/serial_port_selector.py |
60 | 8 | 87% |
mecharmory/infrastructure/gui/serial/serial_status_badge.py |
32 | 5 | 84% |
mecharmory/infrastructure/gui/theme/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/theme/theme_manager.py |
29 | 0 | 100% |
mecharmory/infrastructure/gui/workspace/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/gui/workspace/arm_workspace.py |
45 | 0 | 100% |
mecharmory/infrastructure/storage/__init__.py |
9 | 0 | 100% |
mecharmory/infrastructure/storage/arm_storage_service.py |
49 | 1 | 98% |
mecharmory/setup/__init__.py |
9 | 0 | 100% |
mecharmory/setup/bundle.py |
23 | 0 | 100% |
mecharmory/setup/config_resolver.py |
35 | 2 | 94% |
mecharmory/setup/dep_validator.py |
36 | 5 | 86% |
mecharmory/setup/dependencies.py |
19 | 0 | 100% |
mecharmory/setup/factory.py |
60 | 1 | 98% |
mecharmory/setup/keys.py |
35 | 0 | 100% |
mecharmory/setup/model_resolver.py |
29 | 1 | 97% |
mecharmory/setup/opt_validator.py |
36 | 16 | 56% |
mecharmory/setup/options.py |
20 | 0 | 100% |
mecharmory/setup/registry.py |
24 | 0 | 100% |
mecharmory/setup/validator.py |
48 | 5 | 90% |
| Total | 5071 | 632 | 88% |
</details>
To start the motion studio:
./run.sh
Or when installed:
mecharmory
Sphinx documentation is hosted on Read the Docs:
To build documentation locally:
cd docs
make clean && make html
Please see CONTRIBUTING.md and CODE_OF_CONDUCT.md.
Copyright (C) 2026 by vroncevic.github.io/mecharmory
mecharmory 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.