102 lines
3.1 KiB
Python
Executable File
102 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import sys
|
|
import os
|
|
|
|
# Add utilities to path for readme_helper import
|
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
utilities_dir = os.path.abspath(os.path.join(script_dir, "../utilities"))
|
|
sys.path.insert(0, utilities_dir)
|
|
from readme_helper import read_readme_as_help
|
|
|
|
|
|
class CustomArgumentParser:
|
|
"""Command-line argument parser for the Speed Test CLI script."""
|
|
|
|
def __init__(self, argv):
|
|
self._test_ports = None
|
|
self._sn = 0
|
|
self._automatic = False
|
|
self._parse_arguments(argv)
|
|
|
|
@staticmethod
|
|
def _parse_serial_number(value):
|
|
try:
|
|
return int(value, 0)
|
|
except ValueError:
|
|
try:
|
|
return int(value, 16)
|
|
except ValueError:
|
|
raise argparse.ArgumentTypeError("'%s' - use decimal or hex (0x...)" % value)
|
|
|
|
def _parse_arguments(self, argv):
|
|
"""Parse command-line arguments."""
|
|
parser = argparse.ArgumentParser(
|
|
description="USB Hub Speed Test CLI - Tests device enumeration speeds across multiple ports and data rate configurations.",
|
|
epilog="Use --help_extended for detailed documentation from the README.",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-t", "--test_ports",
|
|
type=int,
|
|
nargs="+",
|
|
default=None,
|
|
help="List of ports to test. If not specified, automatic port discovery is used."
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-s", "--sn",
|
|
type=self._parse_serial_number,
|
|
default=0,
|
|
help="Serial number of the device to connect to (hex or decimal, default: 0 = first found)"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"--help_extended",
|
|
action="store_true",
|
|
default=False,
|
|
help="Show extended help from the README file and exit."
|
|
)
|
|
|
|
args = parser.parse_args(argv[1:])
|
|
|
|
# Handle --help_extended
|
|
if args.help_extended:
|
|
print(read_readme_as_help(__file__))
|
|
sys.exit(0)
|
|
|
|
self._sn = args.sn
|
|
|
|
# Handle test_ports - if not specified, use automatic mode
|
|
if args.test_ports:
|
|
# Manual mode - use provided ports
|
|
self._automatic = False
|
|
self._test_ports = args.test_ports
|
|
print("Testing ports: %s" % (self._test_ports))
|
|
else:
|
|
# Automatic mode (default)
|
|
self._automatic = True
|
|
self._test_ports = None # Will be populated during automatic discovery
|
|
print("Automatic port discovery enabled")
|
|
|
|
if self._sn:
|
|
print("Target serial number: 0x%08X" % (self._sn))
|
|
|
|
@property
|
|
def test_ports(self):
|
|
return self._test_ports
|
|
|
|
@test_ports.setter
|
|
def test_ports(self, value):
|
|
self._test_ports = value
|
|
|
|
@property
|
|
def sn(self):
|
|
return self._sn
|
|
|
|
@property
|
|
def automatic(self):
|
|
return self._automatic
|
|
|