# Working with the common control interface ## Local status inspection ```python from dobot.dobot_ctrl import DobotCtrl robot = DobotCtrl(dobot_ip="192.168.1.6", auto_connect=True) try: print(robot.state()) print(robot.get_current_position()) print(robot.get_current_angle()) finally: robot.disconnect() ``` This example reads status without requesting motion. `auto_connect=True` connects during initialization. Refer to the generated API documentation and implementation for return-value details. ## Motor control versus arm ownership ```python robot.take_arm() robot.turn_on_motor() # Execute operations only after the required safety checks. robot.turn_off_motor() robot.give_arm() ``` For MG400, `take_arm()` and `give_arm()` are currently no-ops because equivalent vendor ownership commands have not been established. Motor on/off maps to the MG400 enable/disable functions. This illustrates the interface, **not** a complete safe operating procedure. ## Expose the same interface through FastAPI ```bash python -m dobot.server_fastapi.server ``` `server_fastapi/server.py` instantiates `FastApiServer(device_cls=DobotCtrl, router_cls=None, api_spec=None, object_name="dobot", ...)`. The `ese774_frame` automatic dispatcher exposes the controller without redefining the device interface in a second router. ```python from dobot.config import Config from dobot.server_fastapi.client_sync import SyncDobotClient client = SyncDobotClient(config=Config()) print(client.state()) print(client.get_current_position()) ``` Default server address: `127.0.0.1:8000`; default MG400 address: `192.168.1.6`. `Config.load_yaml()` updates class settings, whereas `Config(yaml_path=...)` updates an instance. Verify how the server reads settings before choosing either mechanism. For async use, see `dobot.server_fastapi.client_async.AsyncDobotClient`. Asynchronous HTTP execution does not imply waiting for physical motion completion. Review `move()` and `wait_for_complete()` behavior before commanding motion.