# Motion command: synchronous and asynchronous source audit This document records static inspection of the supplied `DobotCtrl` and `DobotTcp` source, not an MG400 hardware test. ## Public contract `DobotCtrl.move(target, *, motion_mode=None, coord_type=None, path_blend=None, offset=None, pose=None, speed=None, accel=None, decel=None, is_async=True)` delegates to `DobotTcp.move()` with the same arguments. `is_async` does **not** denote a Python `async def` or asynchronous HTTP request. It selects whether the call returns after command acceptance or waits for queued motion via `Sync()`. ## Dispatch | Condition | Command | Note | | --- | --- | --- | | `coord_type="J"`, `motion_mode="PTP"` | `JointMovJ` | Public six-component joints mapped to four MG400 joints | | `coord_type="P"`, `motion_mode="PTP"` | `MovJ` | Public six-component pose mapped to four MG400 components | | `coord_type="P"`, `motion_mode="LINE"` | `MovL` | Linear motion | | `motion_mode="CIRCLE"` | Unsupported (`False`) | A single target cannot define an arc | | `motion_mode="SPLINE"` | Unsupported (`False`) | Not implemented | | Joint coordinates with non-PTP mode | Unsupported (`False`) | Joint semantics cannot be preserved | `pose` is unsupported. `offset` is accepted only for P coordinates. Non-`None` `path_blend` depends on unsupported blending configuration. Speed is mapped to `set_jspeed()` for PTP/joint motion and `set_speed()` for LINE. Acceleration and deceleration settings are applied before dispatch; previously applied settings are not rolled back if a later step fails. ## Return values and error handling 1. `_handle_command_reply()` checks command acceptance. A zero response code is **not** proof of completed physical motion. 2. `is_async=True` invokes `_wait_motion_start_or_error()` with default 0.25 s observation and 0.01 s interval. A `True` result **does not prove success over the entire motion**. 3. `is_async=False` invokes `wait_for_complete()` using `Sync()` and then `_motion_error_active(query_error_id=True)`. Existing error-handling paths may fail to distinguish communications failure from absence of alarm. A `True` result must **not** serve as a safety completion guarantee. 4. `get_motion_complete()` returns `False` when `busy_status` is unavailable, otherwise `not bool(busy_status)`. It does not track success per command. ## `drive()` and limits `drive()` accepts axis/value pairs, builds a joint target from current joint positions, then calls `move(..., motion_mode="PTP", coord_type="J")`. Axis numbering is 1-based, nominally 1–6, but nonzero motion on nonexistent MG400 axes J5/J6 fails. `relative=True` adds the requested value to the current angle. Failure to obtain current angles returns `False`. `rotate()` is unimplemented. ## Scope This audit covers static branches and delegation only. It does not test live TCP behavior, competing commands, timeouts, emergency stop, or safety interlocks.