# Motion and stop API source audit This page records static verification against the supplied `dobot_ctrl.py` and `dobot_tcp.py` sources; it is not a hardware test on an MG400. ## Stop methods are not interchangeable - `DobotCtrl.halt()` delegates to `DobotTcp.halt()`, which calls `_unsupported("halt")`. **It is not an emergency-stop substitute.** - `DobotCtrl.stop()` delegates to `DobotTcp.stop()`, which calls `_unsupported("stop")`. - `DobotTcp.task_stop()` calls `_unsupported("task_stop")`; this is not synonymous with the MG400-specific `stop_script()`. - `DobotCtrl.hand_stop()` remains unsupported until a specific end-effector interface is defined. ## Motion-completion semantics - `get_motion_complete()` checks `busy_status`. It returns `False` if the status is `None`, otherwise `not bool(running)`. **This does not prove that a motion command completed successfully.** - `wait_for_complete()` calls MG400 `Sync()`, checks the command reply, and then checks `_motion_error_active("Sync", query_error_id=True)`. A successful command response alone does not establish an alarm-free preceding motion. - `DobotCtrl.wait_for_complete()` takes no arguments. Although `DobotTcp.wait_for_complete(timeout=None, interval=0.02)` accepts `timeout` and `interval`, neither is used. **Do not document this as a timeout-bounded wait.** ## Partial and unsupported behavior `drive()` supports some axis motion operations, but does not preserve `path_blend` semantics. The MG400 has no J5/J6 axes. `rotate()` does not implement conversion of `plane`, `angle`, and `center` into a robot trajectory. ## Safety Do not integrate the unsupported software `halt()` or `stop()` methods as safety-stop functions. Equipment-level safety engineering and risk assessment must follow the manufacturer safety documentation. ## Source scope - `dobot_ctrl(3).py`: `halt`, `stop`, `hand_stop`, `get_motion_complete`, `wait_for_complete`, `drive`, `rotate` - `dobot_tcp(2).py`: `halt`, `stop`, `task_stop`, `get_motion_complete`, `wait_for_complete`