Initial commit: aplicatie de cantarire si etichetare
Aplicatie Flask + SQLite pentru productie alimentara: cantarirea componentelor unui produs finit si tiparirea etichetei prin QZ Tray. - produse finite (retete) formate din componente cantarite - designer vizual de etichete (mm/px, zona sigura, campuri variabile, cod QR cu continut din mai multe bucati) - legare produs finit -> sablon de eticheta - navigare pe doua taburi: Cantarire / Setari - administrare: componente, produse finite, sabloane, campuri, istoric - backup, resetare baza de date, checklist de pregatire, /healthz - CLI de administrare si serviciu systemd pentru productie - vendor/syncpulse-scale-bridge (GPL-3.0-or-later) pentru citirea cantarului
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
"""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())
|
||||
Reference in New Issue
Block a user