"""Utilitar CLI pentru identificarea unui cantar nou. python -m cantarire.tools.monitor --list python -m cantarire.tools.monitor /dev/ttyUSB0 --seconds 8 python -m cantarire.tools.monitor COM3 --scan --seconds 2 python -m cantarire.tools.monitor COM3 --baud 9600 --framing 7E1 --save bizerba """ from __future__ import annotations import argparse import sys from ..probe import BAUD_RATES, FRAMINGS, ProbeError, list_ports, probe_port, save_capture, sweep def _print_ports() -> int: ports = list_ports() if not ports: print("Niciun port serial detectat.") return 1 for p in ports: chip = f" [{p['chip']}]" if p.get("chip") else "" print(f"{p['device']:<20} {p.get('description') or ''}{chip}") if p.get("note"): print(f"{'':<20} ! {p['note']}") return 0 def _print_result(result: dict) -> None: print(f"\n{result['settings']} ({result['seconds']}s)") print(f"bytes: {result['bytes']} cadre: {len(result['frames'])}") if result.get("error"): print(f"eroare: {result['error']}") for frame in result["frames"]: print(f" {frame['hex']:<56} {frame['text']}") if result["guesses"]: print("\nprotocoale recunoscute:") for g in result["guesses"]: print(f" {g['protocol']:<18} {g['kind']:<10} {g['value']} {g['unit']} " f"({g['count']} cadre)") elif result["bytes"]: print("\nNiciun protocol cunoscut. Salveaza captura si adaugam parserul.") def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Monitor port serial cantar") parser.add_argument("port", nargs="?", help="ex. /dev/ttyUSB0 sau COM3") parser.add_argument("--list", action="store_true", help="listeaza porturile si iese") parser.add_argument("--baud", type=int, default=9600) parser.add_argument("--framing", default="8N1", choices=FRAMINGS) parser.add_argument("--seconds", type=float, default=5.0) parser.add_argument("--scan", action="store_true", help="incearca toate vitezele la framing-ul dat") parser.add_argument("--save", metavar="NUME", help="scrie captura in instance/captures") args = parser.parse_args(argv) if args.list or not args.port: return _print_ports() try: if args.scan: rows = sweep(args.port, seconds=min(args.seconds, 3.0), framings=(args.framing,), bauds=BAUD_RATES) hits = [r for r in rows if r.get("bytes")] if not hits: print("Niciun byte primit la vitezele incercate.") for row in rows: if row.get("error"): print(f" {row['baud']} {row['framing']}: {row['error']}") return 1 for hit in hits: names = ", ".join(g["protocol"] for g in hit["guesses"]) or "necunoscut" print(f"{hit['baud']:>7} {hit['framing']} {hit['bytes']:>6} bytes {names}") return 0 result = probe_port(args.port, args.baud, args.framing, args.seconds) except ProbeError as exc: print(f"eroare: {exc}", file=sys.stderr) return 2 _print_result(result) if args.save and result["frames"]: target = save_capture("instance/captures", args.save, result["frames"]) print(f"\ncaptura: {target}") return 0 if result["ok"] else 1 if __name__ == "__main__": raise SystemExit(main())