121 lines
3.7 KiB
Python
Executable File
121 lines
3.7 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
|
|
from power_supply_configs import POWER_SUPPLY_CONFIGS, KEY_EXPECTED_HOST_PDOS, KEY_EXPECTED_HOST_PDOS_VOLTAGE, KEY_EXPECTED_RDOS
|
|
|
|
|
|
class CustomArgumentParser:
|
|
"""Command-line argument parser for the RDO Test CLI script."""
|
|
|
|
def __init__(self, argv):
|
|
self._test_port = None
|
|
self._dut = None
|
|
self._sn = 0
|
|
self._expected_host_pdos = None
|
|
self._expected_host_pdos_voltage = None
|
|
self._expected_rdos = None
|
|
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."""
|
|
# Handle --help_extended early, before argparse validates required args
|
|
if "--help_extended" in argv:
|
|
print(read_readme_as_help(__file__))
|
|
sys.exit(0)
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="RDO Test CLI - Tests USB Power Delivery RDO (Request Data Object) configurations on USB Hub ports.",
|
|
epilog="Use --help_extended for detailed documentation from the README.",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-t", "--test_port",
|
|
type=int,
|
|
required=True,
|
|
help="Port number under test"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-d", "--dut",
|
|
choices=list(POWER_SUPPLY_CONFIGS.keys()),
|
|
required=True,
|
|
help="Power supply to test: %s" % ", ".join(POWER_SUPPLY_CONFIGS.keys())
|
|
)
|
|
|
|
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:])
|
|
|
|
self._test_port = args.test_port
|
|
self._dut = args.dut
|
|
self._sn = args.sn
|
|
|
|
# Load power supply configuration
|
|
if self._dut not in POWER_SUPPLY_CONFIGS:
|
|
parser.error("Unknown power supply: %s" % self._dut)
|
|
|
|
config = POWER_SUPPLY_CONFIGS[self._dut]
|
|
self._expected_host_pdos = config[KEY_EXPECTED_HOST_PDOS]
|
|
self._expected_host_pdos_voltage = config[KEY_EXPECTED_HOST_PDOS_VOLTAGE]
|
|
self._expected_rdos = config[KEY_EXPECTED_RDOS]
|
|
|
|
print("Test Port: %d" % self._test_port)
|
|
print("DUT: %s" % self._dut)
|
|
if self._sn:
|
|
print("Target serial number: 0x%08X" % self._sn)
|
|
|
|
@property
|
|
def test_port(self):
|
|
return self._test_port
|
|
|
|
@property
|
|
def dut(self):
|
|
return self._dut
|
|
|
|
@property
|
|
def sn(self):
|
|
return self._sn
|
|
|
|
@property
|
|
def expected_host_pdos(self):
|
|
return self._expected_host_pdos
|
|
|
|
@property
|
|
def expected_host_pdos_voltage(self):
|
|
return self._expected_host_pdos_voltage
|
|
|
|
@property
|
|
def expected_rdos(self):
|
|
return self._expected_rdos
|
|
|