Communication
This commit is contained in:
@@ -12,6 +12,7 @@ from typing import Iterable, TextIO
|
||||
|
||||
CHECKSUM_SEED = 0x5A
|
||||
FRAME_LENGTH = 6
|
||||
SERIAL_PARITY_CHOICES = ("N", "E", "O")
|
||||
|
||||
CONNECT_LCD_SEQUENCE = (
|
||||
bytes.fromhex("04000040001E"),
|
||||
@@ -202,6 +203,7 @@ def build_arg_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
parser.add_argument("--port", default="COM5", help="RS232 serial port connected to the RCP")
|
||||
parser.add_argument("--baud", type=int, default=38400, help="RCP serial baud rate")
|
||||
add_serial_format_args(parser)
|
||||
parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port")
|
||||
parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate")
|
||||
parser.add_argument("--no-power-cycle", action="store_true", help="do not send relay off/on before the test")
|
||||
@@ -233,7 +235,7 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
log_path = args.log or default_log_path()
|
||||
|
||||
if args.dry_run:
|
||||
print(f"device={args.port} {args.baud} 8N1", file=stdout)
|
||||
print(f"device={args.port} {args.baud} {serial_format_label(args)}", file=stdout)
|
||||
print(f"relay={args.relay_port} {args.relay_baud}", file=stdout)
|
||||
print(f"power_cycle={int(not args.no_power_cycle)} off={args.power_off_command!r} on={args.power_on_command!r}", file=stdout)
|
||||
for index, frame in enumerate(frames, start=1):
|
||||
@@ -248,12 +250,15 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
detector = FrameDetector(sync_mode=args.sync)
|
||||
try:
|
||||
logger.emit("CONNECT LCD bench sequence")
|
||||
logger.emit(f"device={args.port} {args.baud} 8N1 relay={args.relay_port} {args.relay_baud}")
|
||||
logger.emit(
|
||||
f"device={args.port} {args.baud} {serial_format_label(args)} "
|
||||
f"relay={args.relay_port} {args.relay_baud}"
|
||||
)
|
||||
logger.emit(f"log={log_path}")
|
||||
for index, frame in enumerate(frames, start=1):
|
||||
logger.emit(f"plan frame[{index}]={format_frame(frame)} checksum_ok={int(frame_checksum_ok(frame))}")
|
||||
|
||||
with serial.Serial(args.port, args.baud, bytesize=8, parity="N", stopbits=1, timeout=0.05) as device:
|
||||
with open_device_serial(serial, args) as device:
|
||||
relay = None
|
||||
try:
|
||||
if not args.no_power_cycle:
|
||||
@@ -319,6 +324,23 @@ def _import_serial():
|
||||
return serial
|
||||
|
||||
|
||||
def add_serial_format_args(parser: argparse.ArgumentParser) -> None:
|
||||
parser.add_argument(
|
||||
"--parity",
|
||||
choices=SERIAL_PARITY_CHOICES,
|
||||
default="E",
|
||||
help="serial parity for the RCP link; ROM SCI1 setup uses even parity",
|
||||
)
|
||||
|
||||
|
||||
def serial_format_label(args: argparse.Namespace) -> str:
|
||||
return f"8{args.parity}1"
|
||||
|
||||
|
||||
def open_device_serial(serial, args: argparse.Namespace):
|
||||
return serial.Serial(args.port, args.baud, bytesize=8, parity=args.parity, stopbits=1, timeout=0.05)
|
||||
|
||||
|
||||
def _send_frame(device, frame: bytes, logger: BenchLogger, label: str) -> None:
|
||||
device.write(frame)
|
||||
device.flush()
|
||||
|
||||
@@ -11,7 +11,9 @@ from typing import TextIO
|
||||
from .bench_connect_lcd import (
|
||||
BenchLogger,
|
||||
FrameDetector,
|
||||
add_serial_format_args,
|
||||
_import_serial,
|
||||
open_device_serial,
|
||||
_read_for,
|
||||
_relay_command,
|
||||
_relay_settle,
|
||||
@@ -20,6 +22,7 @@ from .bench_connect_lcd import (
|
||||
format_frame,
|
||||
frame_checksum_ok,
|
||||
parse_frame,
|
||||
serial_format_label,
|
||||
)
|
||||
|
||||
|
||||
@@ -42,6 +45,7 @@ def build_arg_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
parser.add_argument("--port", default="COM5", help="RS232 serial port connected to the RCP")
|
||||
parser.add_argument("--baud", type=int, default=38400, help="RCP serial baud rate")
|
||||
add_serial_format_args(parser)
|
||||
parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port")
|
||||
parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate")
|
||||
parser.add_argument("--no-power-cycle", action="store_true", help="do not send relay off/on before the test")
|
||||
@@ -79,11 +83,14 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
detector = FrameDetector()
|
||||
try:
|
||||
logger.emit("Serial ACK probe")
|
||||
logger.emit(f"device={args.port} {args.baud} 8N1 relay={args.relay_port} {args.relay_baud}")
|
||||
logger.emit(
|
||||
f"device={args.port} {args.baud} {serial_format_label(args)} "
|
||||
f"relay={args.relay_port} {args.relay_baud}"
|
||||
)
|
||||
logger.emit(f"log={log_path}")
|
||||
_emit_plan(args, logger)
|
||||
|
||||
with serial.Serial(args.port, args.baud, bytesize=8, parity="N", stopbits=1, timeout=0.05) as device:
|
||||
with open_device_serial(serial, args) as device:
|
||||
relay = None
|
||||
try:
|
||||
if not args.no_power_cycle:
|
||||
@@ -169,7 +176,7 @@ def _emit_plan(args: argparse.Namespace, logger: BenchLogger) -> None:
|
||||
|
||||
|
||||
def _print_plan(args: argparse.Namespace, log_path: Path, stdout: TextIO) -> None:
|
||||
print(f"device={args.port} {args.baud} 8N1", file=stdout)
|
||||
print(f"device={args.port} {args.baud} {serial_format_label(args)}", file=stdout)
|
||||
print(f"relay={args.relay_port} {args.relay_baud}", file=stdout)
|
||||
print(f"power_cycle={int(not args.no_power_cycle)}", file=stdout)
|
||||
print(f"prime={format_frame(args.prime_frame)} checksum_ok={int(frame_checksum_ok(args.prime_frame))}", file=stdout)
|
||||
|
||||
@@ -12,7 +12,9 @@ from typing import Any, TextIO
|
||||
from .bench_connect_lcd import (
|
||||
BenchLogger,
|
||||
FrameDetector,
|
||||
add_serial_format_args,
|
||||
_import_serial,
|
||||
open_device_serial,
|
||||
_read_for,
|
||||
_relay_command,
|
||||
_relay_settle,
|
||||
@@ -21,6 +23,7 @@ from .bench_connect_lcd import (
|
||||
format_frame,
|
||||
frame_checksum_ok,
|
||||
parse_frame,
|
||||
serial_format_label,
|
||||
)
|
||||
from .serial_table_dump import build_read_frame, decode_table_read_response
|
||||
|
||||
@@ -56,6 +59,7 @@ def build_arg_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("scenario", type=Path, help="JSON scenario file")
|
||||
parser.add_argument("--port", default="COM5", help="RS232 serial port connected to the RCP")
|
||||
parser.add_argument("--baud", type=int, default=38400, help="RCP serial baud rate")
|
||||
add_serial_format_args(parser)
|
||||
parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port")
|
||||
parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate")
|
||||
parser.add_argument("--no-power-cycle", action="store_true", help="skip power_cycle actions")
|
||||
@@ -84,9 +88,12 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
try:
|
||||
logger.emit("Serial bench scenario")
|
||||
logger.emit(f"name={scenario.get('name', args.scenario.stem)}")
|
||||
logger.emit(f"device={args.port} {args.baud} 8N1 relay={args.relay_port} {args.relay_baud} sync={args.sync}")
|
||||
logger.emit(
|
||||
f"device={args.port} {args.baud} {serial_format_label(args)} "
|
||||
f"relay={args.relay_port} {args.relay_baud} sync={args.sync}"
|
||||
)
|
||||
logger.emit(f"log={log_path}")
|
||||
with serial.Serial(args.port, args.baud, bytesize=8, parity="N", stopbits=1, timeout=0.05) as device:
|
||||
with open_device_serial(serial, args) as device:
|
||||
ctx = ScenarioContext(args=args, logger=logger, detector=detector, device=device)
|
||||
try:
|
||||
for index, step in enumerate(_scenario_steps(scenario), start=1):
|
||||
@@ -438,7 +445,7 @@ def _ack_limit_reached(ctx: ScenarioContext, ack: dict[str, Any]) -> bool:
|
||||
|
||||
def _print_dry_run(args: argparse.Namespace, scenario: dict[str, Any], log_path: Path, stdout: TextIO) -> None:
|
||||
print(f"scenario={scenario.get('name', args.scenario.stem)}", file=stdout)
|
||||
print(f"device={args.port} {args.baud} 8N1", file=stdout)
|
||||
print(f"device={args.port} {args.baud} {serial_format_label(args)}", file=stdout)
|
||||
print(f"relay={args.relay_port} {args.relay_baud}", file=stdout)
|
||||
print(f"sync={args.sync}", file=stdout)
|
||||
print(f"log={log_path}", file=stdout)
|
||||
|
||||
@@ -11,7 +11,9 @@ from typing import TextIO
|
||||
from .bench_connect_lcd import (
|
||||
BenchLogger,
|
||||
FrameDetector,
|
||||
add_serial_format_args,
|
||||
_import_serial,
|
||||
open_device_serial,
|
||||
_read_for,
|
||||
_relay_command,
|
||||
_relay_settle,
|
||||
@@ -19,6 +21,7 @@ from .bench_connect_lcd import (
|
||||
format_frame,
|
||||
frame_checksum,
|
||||
frame_checksum_ok,
|
||||
serial_format_label,
|
||||
)
|
||||
|
||||
|
||||
@@ -68,6 +71,7 @@ def build_arg_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
parser.add_argument("--port", default="COM5", help="RS232 serial port connected to the RCP")
|
||||
parser.add_argument("--baud", type=int, default=38400, help="RCP serial baud rate")
|
||||
add_serial_format_args(parser)
|
||||
parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port")
|
||||
parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate")
|
||||
parser.add_argument("--no-power-cycle", action="store_true", help="do not send relay off/on before the sweep")
|
||||
@@ -95,7 +99,7 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
log_path = args.log or default_log_path()
|
||||
|
||||
if args.dry_run:
|
||||
print(f"device={args.port} {args.baud} 8N1", file=stdout)
|
||||
print(f"device={args.port} {args.baud} {serial_format_label(args)}", file=stdout)
|
||||
print(f"relay={args.relay_port} {args.relay_baud}", file=stdout)
|
||||
print(f"power_cycle={int(not args.no_power_cycle)}", file=stdout)
|
||||
for selector in selectors:
|
||||
@@ -115,11 +119,14 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
response_rows: list[tuple[int, bytes, tuple[int, int] | None]] = []
|
||||
try:
|
||||
logger.emit("Read-only serial table sweep")
|
||||
logger.emit(f"device={args.port} {args.baud} 8N1 relay={args.relay_port} {args.relay_baud}")
|
||||
logger.emit(
|
||||
f"device={args.port} {args.baud} {serial_format_label(args)} "
|
||||
f"relay={args.relay_port} {args.relay_baud}"
|
||||
)
|
||||
logger.emit(f"log={log_path}")
|
||||
logger.emit(f"selectors={len(selectors)} command=01 write_frames=0")
|
||||
|
||||
with serial.Serial(args.port, args.baud, bytesize=8, parity="N", stopbits=1, timeout=0.05) as device:
|
||||
with open_device_serial(serial, args) as device:
|
||||
relay = None
|
||||
try:
|
||||
if not args.no_power_cycle:
|
||||
|
||||
@@ -13,7 +13,9 @@ from typing import Any, Iterable, TextIO
|
||||
from .bench_connect_lcd import (
|
||||
BenchLogger,
|
||||
FrameDetector,
|
||||
add_serial_format_args,
|
||||
_import_serial,
|
||||
open_device_serial,
|
||||
_relay_command,
|
||||
_relay_settle,
|
||||
_wait_for_ready,
|
||||
@@ -22,6 +24,7 @@ from .bench_connect_lcd import (
|
||||
frame_checksum_ok,
|
||||
label_frame,
|
||||
parse_frame,
|
||||
serial_format_label,
|
||||
)
|
||||
|
||||
|
||||
@@ -78,6 +81,7 @@ def build_arg_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("--expected-word", type=_int_arg, help="expected E000[0] readback word; default follows --preset")
|
||||
parser.add_argument("--port", default="COM5", help="RS232 serial port connected to the RCP")
|
||||
parser.add_argument("--baud", type=int, default=38400, help="RCP serial baud rate")
|
||||
add_serial_format_args(parser)
|
||||
parser.add_argument("--relay-port", default="COM6", help="Pico relay serial port")
|
||||
parser.add_argument("--relay-baud", type=int, default=115200, help="Pico relay serial baud rate")
|
||||
parser.add_argument("--no-power-cycle", action="store_true", help="do not send relay off/on before the test")
|
||||
@@ -143,11 +147,14 @@ def main(argv: list[str] | None = None, *, stdout: TextIO = sys.stdout) -> int:
|
||||
detector = FrameDetector(sync_mode=args.sync)
|
||||
try:
|
||||
logger.emit("PT2 state-map proof runner")
|
||||
logger.emit(f"device={args.port} {args.baud} 8N1 relay={args.relay_port} {args.relay_baud} sync={args.sync}")
|
||||
logger.emit(
|
||||
f"device={args.port} {args.baud} {serial_format_label(args)} "
|
||||
f"relay={args.relay_port} {args.relay_baud} sync={args.sync}"
|
||||
)
|
||||
logger.emit(f"log={log_path}")
|
||||
_emit_plan(logger, args, force_frame, expected_word, preset_note)
|
||||
|
||||
with serial.Serial(args.port, args.baud, bytesize=8, parity="N", stopbits=1, timeout=0.05) as device:
|
||||
with open_device_serial(serial, args) as device:
|
||||
ctx = StateMapRunContext(args=args, logger=logger, detector=detector, device=device)
|
||||
try:
|
||||
_prepare_device(ctx)
|
||||
@@ -639,7 +646,7 @@ def _print_dry_run(
|
||||
stdout: TextIO,
|
||||
) -> None:
|
||||
print("PT2 state-map proof runner", file=stdout)
|
||||
print(f"device={args.port} {args.baud} 8N1", file=stdout)
|
||||
print(f"device={args.port} {args.baud} {serial_format_label(args)}", file=stdout)
|
||||
print(f"relay={args.relay_port} {args.relay_baud}", file=stdout)
|
||||
print(f"power_cycle={int(not args.no_power_cycle)}", file=stdout)
|
||||
print(f"preset={args.preset} note={preset_note}", file=stdout)
|
||||
|
||||
Reference in New Issue
Block a user