Skip to content

File pyspacemouse_cli.py

File List > pyspacemouse > pyspacemouse_cli.py

Go to the documentation of this file

"""PySpaceMouse command-line interface."""

import argparse
import time

import pyspacemouse


def print_version_cli():
    """Print the pyspacemouse version."""
    print(f"pyspacemouse version {pyspacemouse.__version__}")


def list_spacemouse_cli():
    """List connected SpaceMouse devices."""
    devices = pyspacemouse.get_connected_devices()
    if devices:
        print("Connected SpaceMouse devices:")
        for device in devices:
            print(f"  - {device}")
    else:
        print("No connected SpaceMouse devices found.")


def list_all_hid_devices_cli():
    """List all connected HID devices."""
    devices = pyspacemouse.get_all_hid_devices()
    if devices:
        print("All HID devices:")
        for product_string, manufacturer_string, vendor_id, product_id in devices:
            product = product_string or "Unknown"
            manufacturer = manufacturer_string or "Unknown"
            print(
                f"  - {product} by {manufacturer} [VID: {vendor_id:#06x}, PID: {product_id:#06x}]"
            )
    else:
        print("No HID devices found.")


def list_supported_devices_cli():
    """List all supported SpaceMouse device types."""
    available_devices = pyspacemouse.get_supported_devices()
    if available_devices:
        print("Supported SpaceMouse devices:")
        for device_name, vid_id, pid_id in available_devices:
            print(f"  - {device_name} [VID: {vid_id:#06x}, PID: {pid_id:#06x}]")
    else:
        print("No device configurations found.")


def test_connect_cli():
    """Test connection to the first available device."""
    try:
        with pyspacemouse.open() as device:
            print(f"Connected to: {device.name}")
            print("Reading x, y, z values (Ctrl+C to exit)...")
            print("Move the SpaceMouse to see values")
            time.sleep(0.5)

            while True:
                state = device.read()
                if any(
                    abs(val) > 0.01
                    for val in [state.x, state.y, state.z, state.roll, state.pitch, state.yaw]
                ):
                    print(
                        f"x={state.x:+.2f} y={state.y:+.2f} z={state.z:+.2f} "
                        f"roll={state.roll:+.2f} pitch={state.pitch:+.2f} yaw={state.yaw:+.2f}"
                    )
                time.sleep(0.01)

    except RuntimeError as e:
        print(f"Failed to open SpaceMouse: {e}")
    except KeyboardInterrupt:
        print("\nExiting...")


def main():
    """Main CLI entry point."""
    parser = argparse.ArgumentParser(
        description="PySpaceMouse CLI",
        epilog="For more information, visit https://spacemouse.kubaandrysek.cz/",
    )
    parser.add_argument("--version", action="store_true", help="Show pyspacemouse version")
    parser.add_argument(
        "--list-connected",
        action="store_true",
        help="List connected SpaceMouse devices",
    )
    parser.add_argument(
        "--list-supported",
        action="store_true",
        help="List all supported SpaceMouse device types",
    )
    parser.add_argument("--list-hid", action="store_true", help="List all connected HID devices")
    parser.add_argument(
        "--test", action="store_true", help="Test connection to first available device"
    )

    args = parser.parse_args()

    if args.version:
        print_version_cli()
    elif args.list_connected:
        list_spacemouse_cli()
    elif args.list_supported:
        list_supported_devices_cli()
    elif args.list_hid:
        list_all_hid_devices_cli()
    elif args.test:
        test_connect_cli()
    else:
        parser.print_help()


if __name__ == "__main__":
    main()