#!/usr/bin/env python3 import subprocess import serial import sys from pathlib import Path print(sys.argv) # Extract port (first arg if it's not a command) commands = ["src", "lib", "ls", "reset", "follow", "db", "test"] port = None if len(sys.argv) > 1 and sys.argv[1] not in commands: port = sys.argv[1] for cmd in sys.argv[1:]: print(cmd) match cmd: case "src": if port: subprocess.call(["mpremote", "connect", port, "fs", "cp", "-r", ".", ":" ], cwd="src") else: print("Error: Port required for 'src' command") case "lib": if port: subprocess.call(["mpremote", "connect", port, "fs", "cp", "-r", "lib", ":" ]) else: print("Error: Port required for 'lib' command") case "ls": if port: subprocess.call(["mpremote", "connect", port, "fs", "ls", ":" ]) else: print("Error: Port required for 'ls' command") case "reset": if port: with serial.Serial(port, baudrate=115200) as ser: ser.write(b'\x03\x03\x04') else: print("Error: Port required for 'reset' command") case "follow": if port: with serial.Serial(port, baudrate=115200) as ser: while True: if ser.in_waiting > 0: # Check if there is data in the buffer data = ser.readline().decode('utf-8').strip() # Read and decode the data print(data) else: print("Error: Port required for 'follow' command") case "db": if port: subprocess.call(["mpremote", "connect", port, "fs", "cp", "-r", "db", ":" ]) else: print("Error: Port required for 'db' command") case "test": if port: if "all" in sys.argv[1:]: test_files = sorted( str(path) for path in Path("test").rglob("*.py") if path.is_file() ) failed = [] for test_file in test_files: print(f"Running {test_file}") code = subprocess.call( ["mpremote", "connect", port, "run", test_file] ) if code != 0: failed.append((test_file, code)) if failed: print("Some tests failed:") for test_file, code in failed: print(f" {test_file} (exit {code})") else: subprocess.call(["mpremote", "connect", port, "run", "test/all.py"]) else: print("Error: Port required for 'test' command")