"""统一命令行入口:mcm26b <子命令>。 - q1 问题一角域交会求解(P2 已完工) - sim-check 用自建模拟器复现附件计时示例(P0 自检) - run 全向闭环(P4 骨架,未实现) """ from __future__ import annotations import argparse import json import sys from .config import ProblemConfig from .geometry.__main__ import main as q1_main from .protocol.client import SimulatorClient from .protocol.rules import EXIT_USER from .sim import LocalSimTransport, LocalSimulator, Source def _sim_check(args) -> int: """附件1表2/附件2第10节计时示例:期望 105/111/194/199 秒。""" simulator = LocalSimulator([], robot_id=args.robot_id) client = SimulatorClient(args.robot_id, transport=LocalSimTransport(simulator)) client.enter() steps = [] steps.append(client.measure((300, 400), 1).virtual_time_s) # 移动500m+检测5s steps.append(client.measure((300, 400), 2).virtual_time_s) # 换频道1s+检测5s steps.append(client.clear((300, 0), 3).virtual_time_s) # 移动400m+未发现3s steps.append(client.measure((300, 0), 2).virtual_time_s) # 原地检测频道2 info = client.exit() expected = [105, 111, 194, 199] ok = [round(value, 6) for value in steps] == expected \ and round(info.virtual_time_s, 6) == 199 and info.reason == EXIT_USER print(json.dumps({"expected": expected, "got": steps, "final_virtual_time_s": info.virtual_time_s, "exit_reason": info.reason, "pass": ok}, ensure_ascii=False)) return 0 if ok else 1 def _run(args) -> int: raise NotImplementedError( "P4 全向闭环尚未实现;当前可用子命令:q1(问题一求解)、sim-check(协议自检)") def main(argv=None) -> int: parser = argparse.ArgumentParser(prog="mcm26b", description=__doc__) parser.add_argument("--config", default="", help="预留:覆盖 ProblemConfig 的 JSON 文件(参数化入口)") subparsers = parser.add_subparsers(dest="command", required=True) q1 = subparsers.add_parser("q1", help="问题一角域交会求解") q1.add_argument("input", type=str) q1.add_argument("-o", "--output", type=str, default=None) q1.add_argument("--rounding-margin-deg", type=float, default=0) q1.set_defaults(func=lambda a: q1_main([a.input] + (["-o", a.output] if a.output else []) + (["--rounding-margin-deg", str(a.rounding_margin_deg)] if a.rounding_margin_deg else [])) or 0) check = subparsers.add_parser("sim-check", help="自建模拟器复现附件计时示例") check.add_argument("--robot-id", default="2026001") check.set_defaults(func=_sim_check) run = subparsers.add_parser("run", help="P4 全向闭环(骨架)") run.add_argument("--robot-id", required=True) run.set_defaults(func=_run) args = parser.parse_args(argv) try: return args.func(args) except NotImplementedError as exc: print(f"未实现: {exc}", file=sys.stderr) return 2 if __name__ == "__main__": sys.exit(main())