import asyncio from robot_control.src.robot.movement import RobotMovement from robot_control.src.api.grbl_handler import GRBLHandler from robot_control.src.utils.config import GRBLConfig, MovementConfig from robot_control.src.api.gpio import PiGPIO """ Interactive movement script for the robot. - Homes only once at startup. - Lets you enter X, Y, Z positions in a loop. - No restart or re-homing between moves. - Type 'exit' to quit. """ grbl_config = GRBLConfig(port="/dev/ttyUSB0", baudrate=115200) test_config = MovementConfig( speed_mmmin=15000, safe_height=10 ) grbl_handler = GRBLHandler( grbl_config.port, grbl_config.baudrate ) movement = RobotMovement(test_config, grbl_handler) pump_pin = 17 valve_pin = 27 gpio = PiGPIO([pump_pin, valve_pin], []) pump_state = 0 valve_state = 0 async def main(): await grbl_handler.connect() print("Robot ready. Enter X Y Z [speed_mmmin], 'p' to toggle pump, 'v' to toggle valve (or 'exit' to quit):") global pump_state, valve_state while True: user_input = input("Target position (X Y Z [speed] | p | v): ").strip().lower() if user_input in ("exit", "quit"): print("Exiting...") break elif user_input == "p": pump_state ^= 1 gpio.set_pin(pump_pin, pump_state) print(f"Pump {'ON' if pump_state else 'OFF'}") continue elif user_input == "v": valve_state ^= 1 gpio.set_pin(valve_pin, valve_state) print(f"Valve {'ON' if valve_state else 'OFF'}") continue try: parts = user_input.split() if len(parts) not in (3, 4): raise ValueError x, y, z = map(float, parts[:3]) if len(parts) == 4: speed = int(parts[3]) else: speed = test_config.speed_mmmin except Exception: print("Invalid input. Please enter three or four numbers separated by spaces, 'p', 'v', or 'exit'.") continue print(f"Moving to ({x}, {y}, {z}) at {speed} mm/min...") await movement.move_to_position(x, y, z, speed_mmmin=speed) print("Move complete. Enter next position, 'p', 'v', or 'exit'.") if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("\nExiting...")